How many of us still almost exclusively use
console.log() when trying to debug something? It's okay, plenty of us do it that way, but you could be saving yourself a lot of pain and suffering by using the debugger and stepping through the execution.
There are several advantages to using a debugger, you get a tighter feedback loop, a lot more information, and it allows you to go into places you wouldn't have even thought about.
Now debugging can take you far, but there are times when we need another human to help us. Asking questions is anxiety-inducing, "what if this is something I should already know?" "am I being annoying?" "am I interrupting them from doing something important?"
The key is to remember that there is no such thing as a dumb question, but there are questions that haven't been thoroughly vetted. Stack overflow has an excellent wiki on asking good questions. Learn how to form good questions, and everything will end up being okay!
Justin is doing good work in bringing awareness to Atlanta's rich culture and advocating for people who are under-represented in technology. Be sure to check out the Render(ATL) conference upcoming in May 2020.
"It's a good combo though. Computers, business, and teaching people, and passing on information. I think it's a trifecta, right? It's a killer combo."
"I feel like when you use the debugger, that invokes a curiosity. It allows you to go into places that you wouldn't have even thought about. It also gives you a sneak peek of what's going on underneath the hood."
"So you'll always have three lanes, I call it. You either know what you do know, or you know what you don't know, or you don't know what you don't know. And I'm like, 'Okay, I could get past the first two.' But the last category of you don't really know what you don't know is scary all the time."
"You have to learn how to formulate a question that engineers are going to be able to be like, 'Oh, here's your problem.'"
Joel Hooks: Hey Justin.
Justin Samuels: What's going on? What's going on? What's up?
Joel Hooks: How you doing today?
Justin Samuels: Good, man. Just can't complain, just making it. Another day, another dollar.
Joel Hooks: So I'm really excited, you're organizing a conference and I want to get into what you're doing in Atlanta, and what's going on with your conference, but I kind of wanted to take it back a second and just ask you, how did you get into web development? How did you become a web developer and what was your path?
Justin Samuels: I went the more traditional route, kind of. I went the college route where I started school at the University of New Haven in Connecticut. I started school as a chemistry major actually.
Joel Hooks: Oh, okay.
Justin Samuels: Yeah. So I was like completely off of the whole IT route. Just for some context, I did grow up in the MySpace days, so I used to be one of them kids who used to charge people to make themes and everything like that. I was just writing CSS and editing at the time, but I didn't really know that though. So a couple years later ... Not a couple years, but a whole decade after that, that's when I began school, and I was a chemistry major like I said. And I was like, "Okay, this is cool and all, but I really can't picture myself doing this for the rest of my life."
Joel Hooks: Being a chemist, right?
Justin Samuels: Yeah. Because it got pretty boring. I was getting A's in the classes, but I was like, "This is boring as hell to me."
Joel Hooks: Mm-hmm (affirmative).
Justin Samuels: So I ended up switching to business, and then I ended up switching schools to Mississippi State University. So after I switched there, I was in School of Business, and I remember I was like, "Okay, this is cool but I don't really like this." Then I switched over to a major in culinary, and I was doing culinary, and I was like, "This is cool as well, and-"
Joel Hooks: You were really trying to find yourself, weren't you?
Justin Samuels: Yeah, man. So to make a long story short, I switched an additional three more times. And I recall the day, it was me and a friend named Chris Butler. And both of us were walking past this poster, and he was a computer engineer major at the time there. And the poster was like, "Do you like to do CSS, and do you like to do HTML and everything?" And I was like, "Yeah, that sounds dope as hell." And I went and talked to my academic advisor and said, "I want to switch to that." And it was business information systems. So I ended up switching into that, and I ended up getting a minor in computer science too.
Joel Hooks: Oh, okay. So what's business information systems? Is that like web development for business, or like enterprise web development? What is a business information system?
Justin Samuels: So I call it the art of business and computer science blended. So you're going to learn business-y stuff, like how to do like accounting, how to do payroll, how to do thread analysis. But at the same time, you're going to learn how to do like computer science-y things. You're going to learn how to program. You're going to learn how to be an analyst, things like that.
Justin Samuels: So you learn the middle ground, that way no one could really get over on you on either side of the coin. But the only issue is that while the business side, you learn a crap ton, the IT side of it or the program side you don't learn as thorough. So that's why I did the whole a minor in CS, so I could go back and forth with other engineers too.
Joel Hooks: Yeah. And then I know you worked a little bit on a master's degree, and you kind of switched to something described as instructional technology. So that's almost another flip of what you're pursuing and learning too. Is that true?
Justin Samuels: Yeah. So what happened with that was, I actually got employed by the school my first day after graduation.
Joel Hooks: Oh, nice.
Justin Samuels: Yeah. So they hired me one day after graduation as a full time web dev. I highly recommend to anybody listening, do not go to work ASAP after you graduate, because I about burned out.
Joel Hooks: Take a little time?
Justin Samuels: Yeah. I was burned out. I kid you not. I had graduated on a Friday. I began working that Monday, and honestly it's because I had bills to pay.
Joel Hooks: Yeah.
Justin Samuels: So once you graduate, you can't work for the school in the same capacity as prior, because I was a student worker in the IT department. So I started working there, and they were like, "Hey, we like everybody who works for us to be highly educated, so why don't you get your master's degree?" I was like, "Nah, I'm done with school." And then they were like, "Well it's free of charge." And I was like, "Yeah-"
Joel Hooks: "Oh, okay."
Justin Samuels: Yeah. "But I got to take a test, and I got a place in," and then they were like, "No, you really don't got to. There's a couple fields that you could just choose to get into." So I was like, "Okay, I got the business side down, I got the computer science side down, I need to get the IT side down now. I mean, not the IT, but the teaching IT side down."
Joel Hooks: Yeah, instructional technology, right?
Justin Samuels: Yeah. So I was like, "Cool." I could kind of teach people now how to do things and how to use tech basically, which I enjoy doing to this day because I still mentor people in. Even when I was in school, I was a party association for computer machinery, and I was the head tutor for a good year and a half, I want to say.
Joel Hooks: It's a good combo though. Computers, business, and teaching people, and passing on information. I think it's a trifecta, right? It's a killer combo.
Justin Samuels: Yeah.
Joel Hooks: Yeah.
Justin Samuels: That was my goal, and I didn't complete it, because I ended up quitting that job and working for a private company now.
Joel Hooks: You're a web developer, and I suspect you have opinions, and I'm wondering, what are you using in terms of your stack now? What's your preferred set of tools?
Justin Samuels: Cool. Yeah, so at my job right now I do, React is on the front end of anything that we do. Back end wise, we use a C Sharp. So I do a lot of C Sharp, when I have to, but mostly my team keeps me on the front end of things. Other than that, I'm pretty open to everything else, man. I mean, I don't have no strong opinions on this language is better than this, or this or that. I will give a full transparency though that I am not a big fan of Angular, because I came from Angular One. So I began my journey, truly, when I was about to graduate, and I started in Angular. And I had terrible time in it. And yeah, that's how I discovered React. So I've been in React since 2014 about.
Joel Hooks: Yeah. So you were working in Angular, and then you see React, and it spoke to you. It felt better to you, I guess?
Joel Hooks: Yeah. I've heard the argument Angular is more of a framework, where React is a toolkit, which I think the lines are so blurred. On Egghead, we actually call React a framework because ... Whatever. But at the same time, React gives you immense freedom with way less constraints. I think that's one of the big appeals.
Justin Samuels: Yeah. I mean that's very true. And for me, so going back to my friend, Chris Butler, he ran into an issue when he worked at Peavey. So if anybody don't know, Peavey is that guitar company that makes the amplifiers and all that other cool jazz.
Joel Hooks: Oh, okay. I seen them.
Justin Samuels: Yeah. And he actually engineered their app where it can talk across the wire, to where he could control a amplifier across the room or so. He was doing it all in Angular, and Angular has this feedback loop, and he couldn't get past the feedback loop. I think it's really called the digest loop. But when it came to React, React updates so quickly that he didn't run into that problem. And he was like, "Yeah, the way they make these things called life cycle methods, it allows for things just to get done, and you don't got to worry about two way data bindings, or figure out which way the data's coming or which way the data's going. It just all in one uni direction pretty much.
Joel Hooks: Yeah. They gave us the idea of the virtual dom and dipping a virtual dom versus the idea of data binding, which was heavy in Angular One. And I think it feels like most frameworks are kind of doing the virtual dom, even if they present as binding, because View in particular, which is kind of the spiritual successor to Angular One. It's like Angular One, the good parts. It has a virtual inaudible 00:09:19, but it still gives you that kind of feeling of binding.
Justin Samuels: Right. He explained it to me, and I was like, "I kind of get what you're saying, but I don't really get it." And this is in 2014, January. So I come on React in its infancy days, and he was like, "Think of a functional inaudible 00:09:39 machine from micro processors class that we had." And I was like, "Oh this makes complete sense." And that's when the light bulb gone off and I was like, "Okay, I enjoy this now." So yeah.
Joel Hooks: Yeah. That's pretty cool when you can let ... Well, one to have a friend that that has been with you and can present that metaphor to you like that. That's pretty awesome. You go by @Thugdebugger on Twitter, and I've noticed a pattern and debugging is something that you are personally passionate about. Is that a fact?
Justin Samuels: Yeah, man.
Joel Hooks: So debugging's something that you enjoy personally, that's your skill set. You identify as a debugger.
Justin Samuels: Yeah.
Joel Hooks: So I only use Console Log to debug, and I was wondering how can I improve? I've been doing this a long time, I've had success as a developer, and I literally use Console Log every time. What am I missing out on? What should I do? How can I improve and grow as a developer? I'm old dude set in my ways, but I want to change and get better. What should I be doing? How can I improve that?
Justin Samuels: So the reason why I'm such a big advocate Authority debugger over the Console is because I feel like by time the Console prints, out you probably missed some critical data, or you probably missed some transition that you wouldn't have caught. I feel like when you use the debugger, that invokes a curiosity. It allows you to go into places that you wouldn't have even thought about. It also gives you a sneak peek of what's going on underneath the hood. I guarantee you if you ask people, "Have you ever opened up React and actually checked out how it does its thing? Have you actually stepped through a life cycle method trying to figure out what's going on? And 80% or even 90% of people are going to be like, "No, I really haven't ever thought about that."
Justin Samuels: But when you're using the debugger, you get the opportunity. And people are going to argue like, "Well you could just go into the node module and check it out if you actually care that much," but where do you even know where to begin? When you use the debugger and you put these breakpoints in, it's going to guide you down a path, and you could start to really speak the framework ordeal language of what's going on. Like, "Oh, here's why this is not working. Here's how the engine inaudible 00:12:00 it to actually work. Here is what I'm trying to do," versus getting mad with your Console Log, and you're only seeing a tiny bit of data.
Joel Hooks: Yeah. I also use the debugger statement. So I will drop into the debugger, but then I'm doing it kind of ... I'm not using breakpoints and that kind of thing. And I know, I've seen modern development tools and they're amazing, and I wonder often if it's like you start at a certain point in kind of technology history, right? And you know, console log is what was there, but now we have this robust tool, but I don't touch those tools. And I'm wondering what's the kind of entry level when you get into that? Which browser do you think is the strongest right now in terms of debugging and tooling in that regard?
Justin Samuels: When people ask me how to use it, I always say start in a visual studio if you can, but typically, a visual studio code has a pretty good debugging setup.
Joel Hooks: Okay.
Justin Samuels: Where you can easily drop in break points on that particular line that you're trying to target. And then when the code executes, you could actually go in to that code in a environment that you feel comfortable with at that time. Versus trying to figure out how to do it in Chrome. I've seen people get confused when I try to explain to them in Chrome. You take the exact same experience and you put it in visual studio code people are like, "This is much easier. I actually grasp this on what's going on."
Joel Hooks: Yeah, that's pretty cool. And honestly, I've never done that. So I've done it in Chrome, I've done it in Firefox and Safari, those tools. But I've never even dropped into a debugging session and VS code.
Justin Samuels: Yeah. And then the cool thing about VS code is they have that live share option now. So I could make a breakpoint on my end and not say, "Damn it. I don't know what's going on. I need some help." And then I can say, "Hey, Joel, can you chime in?" And then you could actually watch that happen live.
Joel Hooks: Yeah. Get a live mutual debugging session going.
Joel Hooks: Yeah. And then you figure it out, and you get there quicker than you would. Obviously, I think quicker than you would if you were just trying to piece meal put log statements around and figure out what's going on. At that point, you're in the code, and you're able to to get a better vantage of the whole process.
Justin Samuels: Right. And it goes back to ... I have two senior engineers at my job that used to be on my team, and I used to not be a really big advocate for the debugger. But then they were like, "Think about your feedback loop. Think about how much time you are taking to actually write the console log, get back on the page, execute that again." I'm like, "Okay, yeah. That's very true." Versus going to the code, dropping the breakpoint, and then you hit the same breakpoint again, and again, and again. And the cool thing is that if you can catch the error, you could start tweaking it at that time, and then do it again and again.
Justin Samuels: Man, that's crazy. You said Action Script? I haven't heard that name in a long time.
Joel Hooks: Yeah, rest in peace.
Justin Samuels: I mean, that's crazy. The other day I was at this meetup, the React ATL meetup, and I was talking to some people, and this guy said, "Yeah, I'm a Flash dev." And I was like, "What? You're a who dev?"
Joel Hooks: Yeah, still?
Justin Samuels: Right. And when he had said it, I was like, "Oh you mean past tense?" And he was like, "No, currently." And I was like, "How? Where? Who?" But then when you dig pretty deep, you could tell that Flash has such a crippling effect on the industry, because it's such a dependency. That there's a whole lot of companies who just couldn't get it completely out of their code base. So now, those are the people making $300,000 every single year.
Joel Hooks: Maybe I should have stuck with it. No, I'm pretty happy. I'm about to be honest.
Justin Samuels: Yeah. I'm pretty happy too. Because even in college, they taught us COBOL. So I do know COBOL too. And they're-
Joel Hooks: It's like they're trying to make people not like computers is the goal, sometimes I feel like. Who's going to ... COBOL is just like a history class I suppose, but it's still ...
Justin Samuels: Most people don't know this. Our school was one of the only couple schools left teaching COBOL, which they don't at this time. The program at MSU taught it because we have two big fields that use COBOL. Banking, and then the other ones is Dillard's, like the clothing manufacturer.
Joel Hooks: Yeah. Dillard's makes all their employees take COBOL training, all their developers. They still have to use it. So yeah, there's industry. There's people out there using it. But I just can't even imagine.
Justin Samuels: Yeah. I mean that was a way of giving us job security, quote unquote was like, "Hey, if you can't find a job elsewhere, you can always get one with COBOL."
Joel Hooks: So what are you learning now? What's got you excited in terms of web development and new things that are happening?
Justin Samuels: I've been playing with this idea where it's called Dynamic Reducer Allocation.
Joel Hooks: Mm-hmm (affirmative).
Justin Samuels: So what I'm talking about is if you have two components on the screen, and you want to render a brand new component, which is the same incarnation of component A and B, how do you get component C to inherit the same exact actions as component A and B, but dynamically update the store inside of every ducts without causing conflicts for component A and component B?
Joel Hooks: It would almost be like syncing offline state to database state, it sounds like. It kind of reminds me of that in a way.
Justin Samuels: Yeah, because if you want the same actions ... Well if you fire the same action on component C, technically component A and component B, would be like, "Oh, well I could talk about that action, or I could respond to that action." But if you do it on component C, you're like, "No, it's only for component C, not for component A and B."
Justin Samuels: So I've been running into this problem at my job now and I'm like, "Okay, how can I get past this?" So I think I found a way, but that's really been the only thing that's keeping me up at night, on the tech side. On the other side of life, I've been reading some books on habits, and how to break habits, and how to improve your memory. And it's pretty cool, so.
Joel Hooks: Yeah, my favorite habit book in the last year or so, I love Power of Habit. It's kind of been out for a while, but there's Atomic Habits by James Clear. It just blew my mind when I listened to it on an audio book, and he narrates it and really good in general. But it's kind of like the successor to Power of Habit, which is kind of the classic habit book. I love reading about that kind of stuff too. Your brain's a muscle, right? How do we exercise it, and grow it, make it stronger?
Justin Samuels: That's exactly right.
Joel Hooks: So what's something you personally think you need to get better at as a web developer? In terms of broader skills, and how you approach your work.
Justin Samuels: Honestly, not being scared to say I don't know what you're talking about.
Joel Hooks: Yeah. That's hard.
Justin Samuels: Yeah. And I'm not scared per se, but I'm scared of not knowing what I don't know.
Joel Hooks: Being surprised, right? Something jumping out at you?
Justin Samuels: Yeah, because it's like ... So you'll always have three lanes, I call it. You either know what you do know, or you know what you don't know, or you don't know what you don't know. And I'm like, "Okay, I could get past the first two." But the last category of you don't really know what you don't know is scary all the time.
Joel Hooks: Yeah. It's chaos, right?
Justin Samuels: Yeah. And I'm running into that problem now at my job, where I'm doing C Sharp, where I don't know what I don't know sometimes. And I'm like, "Okay, how do I ask a question on what I don't know?" It goes back to using the debugger again. I just drop breakpoints everywhere, and then I try to formulate what's going on. But for the most part it's hard, man, trying to figure it all out.
Joel Hooks: I think one of the things that's difficult, too, is also knowing when you should stop and just ask, right? When you should stop and tap somebody on the shoulder and ask. I like to figure things out on my own, but at the same time, when do you just stop doing that, and approach somebody that probably has the answer?
Justin Samuels: Yeah. Because at my job, I don't want to feel like a burden, per se. I have a good team. The team I work on ... So I'm the scrum master of the team, and we're a complete agile engineering force, where we do two week sprints right now. And I don't want to feel like I'm slowing down the team, so sometimes I get scared to ask, because I don't want to impede anybody else progress. But at the same time I'm like, "Okay, if I do ask, what do I need to ask?" And that's the hardest thing.
Joel Hooks: Asking a good question. Right?
Justin Samuels: Right. Because there is no such thing as a dumb question, but there are such a thing as questions that haven't been thoroughly vetted.
Joel Hooks: Yeah. My favorite resource, Stack Overflow, has an entire Wiki section devoted to asking good questions, and it's one of my favorite resources and I send it to people, just like, "Hey just check this out, okay?" Because there's two different ways. There's lots of ways to ask questions, and there's definitely good ways and there's bad ways, and it provides a framework for asking good questions. And it's funny, because in the process of asking a good question, and preparing to ask a good question, you can often answer your own question.
Justin Samuels: That's the funny thing, is that I feel like Stack Overflow gets a bad rap because of how you have to ask the question. A lot of people don't know, because they can see the polished side of me now, but I was one question out from being banned off of there. Because I would always ask questions, questions that obviously had answered. And back to my old friend, Chris Butler, he was like, "Hey, you have to learn how to ask a question." And I was like, "Well, I'm asking a question, people just don't want to answer it." He's like, "No, no, no. You have to learn how to formulate a question that engineers are going to be able to be like, 'Oh, here's your problem.'"
Justin Samuels: And I would tell people the exact same thing, like, "Hey, have you checked the board on how to ask a question?" And the usual response is, "No, I don't get how come I have to." I'm like, "Well, if you check the board first, then you would figure out how to ask a question so that you'll get the answer that you seek."
Joel Hooks: Yeah. And to me, it's the more I get comfortable with sales, and marketing, and that kind of thing, I think it's almost like a sales and marketing process. And it feels disconnected, but at the same time that's what you're ... You're trying to sell somebody on giving you some of their time to answer your question and-
Justin Samuels: That's very true.
Joel Hooks: ... And you're going to want to come back and be able to have the capital with them to ask again. Right? You want to be somebody that they're enthusiastic about helping, so you have to do your part to get to that point.
Justin Samuels: Right. Right.
Joel Hooks: So Atlanta ... I don't think people necessarily think of Atlanta and think of a tech hub, but it is in fact a metropolis, and there's a lot of tech going on, and you are bringing a conference to Atlanta next summer. And can you tell us about what you're doing, and what your conference is?
Justin Samuels: Man. So this is the part I get happy about, because-
Joel Hooks: Nice.
Justin Samuels: ... People are always like, "Why ATL? You could've did it in Cali, you could of did it in Texas. Why ATL? I mean, even do it up North," and I'm like, "If you come visit ATL, and you just hang out downtown for a couple of days, you could see the culture changing." You could see how enriched the culture already is, but you could see it moving in a more progressive manner to where I feel like Atlanta is the next ... I don't want to say Silicon Valley, but the next major tech hub.
Justin Samuels: But the cool thing is, I feel like it's going to be a NYC situation, where all the crossroads, or all the people of the of world are going to gather here. So I'm trying to get ahead of the curve, and I can already see it coming.
Joel Hooks: The conference is Render Atlanta, right?
Justin Samuels: Uh-huh (affirmative).
Joel Hooks: And what are the goals of your conference?
Justin Samuels: So the goals, honestly man, it's kind of personal, but at the same time it's about representing for ATL.
Joel Hooks: Mm-hmm (affirmative).
Justin Samuels: So I got tired of traveling, and going places to just go see a decent talk, or just to go hang out with other React engineers, because I do know that they're here, but we're so scattered. And people would always say stuff to me and like, "Hey what's going on in ATL? Why isn't there anything going on there? I don't think ATL has all that great of engineers."
Justin Samuels: People will say stuff like this to me. And I will be like, "No, you all just have never came. You're just judging a book by past history of it's in the South, so what can they have?"
Justin Samuels: So I was like "Okay, I'm going to go on this mission to bring awareness to what's going on in ATL," because like I said, we have great engineers, they're just in so many different neighborhoods of ATL. Because you got a lot of neighborhoods. You got Midtown, you got Buckhead, Five Points, I mean you have all over ATL.
Joel Hooks: Yeah, it's spread out.
Justin Samuels: Yeah, but I'm trying to bring everybody together. At the same time I was like, "Well this is what I consider the cultural melting pot of the South," and there never has been a major React focus conference here. Of course, we got Connect Tech but that's like a conglomerate of 20 other things going on.
Joel Hooks: Yeah.
Justin Samuels: I was like, "I want something that's going to bring awareness to ATL, that's going to show off the culture, that's also going to advocate for people that are under-represented in technology, because ATL has a huge population of minorities." So then, okay, I definitely want to include that too, but I want the best speakers possible. And just to give a shout out to my boy, Ken Wheeler, he was the one that honestly pushed me. Because he was like, "Hey, why don't you do something in ATL? I mean I get that you know people, so you should probably leverage that." And I was like, "That sounds expensive as hell, you know."
Joel Hooks: And like a lot of work too. Expensive and a lot of work.
Justin Samuels: Right. But I'm not afraid of the work part, because I used to do a video game tournaments.
Joel Hooks: Oh okay, cool. You've done this before.
Justin Samuels: Yeah. So I have a event planning background, and I did do Smash tournaments and inaudible 00:28:49 tournament, so I get the whole planning side of it.
Joel Hooks: Yeah. The logistics, you got that covered.
Justin Samuels: Right. But the whole .... It's much easier to keep Smash players fed, because you give them cookies and pizza.
Joel Hooks: Doritos.
Justin Samuels: Right, it's much easier. Engineers are like doctors, they want a world class service.
Joel Hooks: They want cuisine.
Justin Samuels: ... And even if they don't want that, I don't want them to feel like they're coming to some conference that, "Okay, they skipped on everything else, but we got good talks."
Joel Hooks: Yeah. You want to put on a good show, right? You want the whole thing to be an experience for people, and really showcase what Atlanta has to offer, and what's going on in the ATL.
Justin Samuels: Exactly. Because ATL man, give them an additional five more years, and it's going to be crazy. It's going to be a boom. I mean, they were in the top of five for the new Amazon office. So I mean, they have the potential. We have a tiny bit more work to do, but I think ATL is on the right path. And I'm even a member at this private club called The Gathering Spot, where it's a place for like-minded entrepreneurs to come gather.
Justin Samuels: And every time I go in there, I'm always running into somebody of prominence that I can talk to, and I'm like, "Hey, here's what I'm trying to do, can you help me?" And it's always a yes, because I want to help ATL be this beaming icon of progress.
Justin Samuels: That was the goal, man, was to have a world class conference with the best speakers, which if you ask me, I could tell you now, because by the time this comes out, we'll have dropped it, and with the best atmosphere possible, and go above and beyond so that people could know what they should expect from every other conference.
Justin Samuels: And at the same time hammer home, "Hey, this is ATL. We are a progressive city filled with some of the best engineers that you know, a majority are from under represented groups. Come here, help us, hire us, and we could do great things."
Joel Hooks: Yeah, that's awesome Justin. And I think the work you're doing with Render ATL, and I'm just looking forward to this conference quite a bit and seeing what you get up to even after that. And I really appreciate you taking the time out of your day to come chat with me. It's been great. Thank you very much.
Justin Samuels: No problem bro, no problem.