Coding Blocks - Clean Architecture – Are Microservices Truly Decoupled?

Episode Date: March 19, 2018

We're back with our last deep dive into Robert C. Martin's latest book, Clean Architecture, while Allen suffers from sleep deprivation, Joe shows us his dance moves, and Michael's mind is blown on how... to unit test.

Transcript
Discussion (0)
Starting point is 00:00:00 You're listening to Coding Blocks, episode 77. Subscribe to us and leave us a review on iTunes, Stitcher, and more using your favorite podcast app. This is CodingBlocks.net, where you can find show notes, examples, discussion, and a whole lot more. Follow us on Twitter at CodingBlocks or head to www.CodingBlocks.net and find all our social links there at the top of the page. With that, I'm Alan Underwood. I'm Joe Zach. And I'm Michael Outlaw. Freelancers and small business owners, I feel for you.
Starting point is 00:00:31 Tax season is here and there's a good chance that many of you are trying to dig your way out from underneath a pile of receipts and spreadsheets. Do yourself a huge favor and stop digging. Before you completely disappear under that abys of paperwork, go and check out FreshBooks cloud accounting software. Not only is it going to save you a ton of time and stress, it might actually change the way you feel about dealing with your taxes. Need to send your accountant a quick summary on the amount of texts you collected last year? How about pulling together a profit and loss summary? FreshBooks can generate these reports in seconds instead of the hours it would take you to do them manually. You can even set up FreshBooks to import expenses directly from your bank accounts, which means next time you use your debit card for that meal,
Starting point is 00:01:14 tank of gas, or new computer, boom, the purchase is recorded instantly in FreshBooks. All this and FreshBooks is ridiculously easy to use. It's made especially for people who don't like dealing with numbers and their taxes. Right now, FreshBooks is offering a 30-day unrestricted free trial to our listeners. To claim it, just go to freshbooks.com slash coding and enter coding space blocks in the how did you hear about us section. All right. With that, it's time for our podcast news, and we always like to start off with reviews.
Starting point is 00:01:48 And with that, Jay-Z, you want to take iTunes? I do. So, iTunes, thank you big time to Frodo McNuggets, 007 Benny. I'm already packing up. Likely Suspect, Marcus Raspich, Alex13CP, The Clink Family, packing up likely suspect marcus raspich alex 13 cp uh the clink family especially big thank you to the clink family that was awesome uh chris sean hayes uh deleted grim for two and zach reeves Yep. And on Stitcher, we have Roka88. These trucks. The code itself.
Starting point is 00:02:32 Joe is dev for life. Huge thank you, guys. Great names, too. Some awesome ones in there. I really appreciate it. So it's that time of year again where Stack Overflow announces their 2018 survey results or their survey results for 2018. Did either of you guys see this yet? I have not looked at it.
Starting point is 00:02:56 There are some really interesting things that came out of it. What do you think the most popular framework, library, or tool is? Well, hold on. Let me go ahead and open this up and I'll tell you. Oh, geez. I'm going to guess Node.js. Go ahead. Node.js, I'd probably go with that as well.
Starting point is 00:03:14 Yep, yep. Yeah. But here was the one that I didn't expect to come out on top for second place. Angular beat out React. We saw that in the survey we did for JetBrains licenses not too long back. Yeah.
Starting point is 00:03:29 I guess it doesn't surprise me because Google's had quite the fight. And remember, React just recently went to a more accessible license. So a lot of companies probably wouldn't even touch them for that reason. So, yeah. Maybe.
Starting point is 00:03:44 It was a pretty big one though but um man i'm trying to think what were some other things in here like uh you know most most popular database i thought that one kind of went you know i was more i expected number one yep my sequel was number one okay i was actually kind of surprised to see SQL Server was the second most popular. And Oracle was like way down the list. Postgres was number three, I take it. Yep. Yep.
Starting point is 00:04:15 I have not cheated. I've got three. You've got three what? I've got three things I was going to call out on the survey. Okay. Okay, go ahead. So if you were still scrolling through, I was going to go ahead and go. How much time do developers spend on a computer?
Starting point is 00:04:29 You guys want to guess an hour? Is this per week or what? Oh, gosh. You know, it doesn't say. I assume it was per day. No, it was per day. I remember that one. Per day?
Starting point is 00:04:38 I'm going to say 11 hours. Outlaw? I remember looking at that one, but I i don't remember i think it was in like the it was a range given it was given as a range if i remember right so it was like 9 to 12 or something like that yep okay yeah that makes so yeah 9 to 12 uh 52 percent of developers spend 9 to 12 hours a day at a computer yeah that's crazy but i i mean i totally do so yeah and and along that one too i thought this was interesting that um kind of we'll get to the survey results from the last one but uh you know healthy habits how often do you exercise right like we asked the same type of
Starting point is 00:05:20 question not worded the same way but i thought like oh that's that's uh interesting timing yeah i mean i'm sure we influenced their their course we did right right i mean surely they they're like stack overflow is not that big all right i mean how that one end up um i will save that conversation for uh later but um yeah there was another one here i was trying to get in here too like most dreaded framework or language most dreaded objective c there's a basic visual basic six really what about kobol number two okay yeah um i don't know what number one might be. JavaScript, it hit number one in all the categories. Wouldn't that be amazing? Well, here's one, though, because most dreaded framework,
Starting point is 00:06:14 we said that Angular was number two. Angular was number four for the most dreaded framework. But they're probably referring to version 1.x. Oh, that's funny. Yeah, man. Well, I mean, Stack Overflow didn't specify because also on that list was Node.js. Really?
Starting point is 00:06:31 Which Node.js was number one before. Yeah. Wow. I mean, it's fair. So JavaScript kind of is sprinkled in there. Most dreaded database? Mongo. Mongo and what did you say, Joe?
Starting point is 00:06:45 DB2. Yep, DB2. Really? Wow. And number two was Oracle. Oracle, really? Yeah. Awesome.
Starting point is 00:06:53 Yeah. What do you think the most popular IDE is? Stack Overflow. Know your audience. I know the answer. It's going to be Visual Studio. Visual Studio? Yeah. You're wrong to be Visual Studio. Visual Studio? Yeah.
Starting point is 00:07:07 You're wrong. Really? It was Visual Studio Code. Code. Yeah. But not by much. Visual Studio was number two, and it was close. Now, here's where it gets.
Starting point is 00:07:18 We've had this conversation before. Let's round out the top five. What do you think number three, number four, and number five were? These are going to be hard, right? Jet Brains, Jet Brains, Jet jet brains jet brains okay there's his answer sublime okay uh what's the is it adam the okay adam yeah sublime adam and vim okay well you did really good man you got two out of those three and i did not expect that. I did not see that coming. Sublime was number four. Okay. And Vim is number five. And we've had
Starting point is 00:07:50 this conversation about like, hey, is it just a text editor? Are these things just text editors or are they IDEs? They're in this IDE conversation. Notepad plus plus is the one you forgot at number three. That makes sense. I mean, it's a great little tool. I wouldn't call it an IDE, but, you know.
Starting point is 00:08:06 Wow. Where are the Java developers that aren't answering the survey? Like, what are they using? Well, IntelliJ was number six. It was on the list. And Android Studio was next. And Eclipse was. So your next three, so six, seven, and eight,
Starting point is 00:08:20 were all Java development platforms. Awesome. Okay. So they were there Java development platforms. Awesome. Okay. So they were there. All right. How about we've asked a question about multiple monitors? Oh, yeah. What do you think the stack overflow respondents?
Starting point is 00:08:36 60% yes. No, no, no. Do they have one, two, three, four, five monitors? I'm going to say two is the predominant. The norm? Yeah. 51% two. Yeah. Okay. Yeah. have one two three four or five monitors i'm going to say two's the the predominant the norm yeah 51 two yeah okay yeah what's the next one uh that's what i would think that yes one monitor was was definitely the uh the next one yeah there there were a bunch of interesting things on here though i don't what were the other ones that you were going to bring up joe uh most popular technologies uh what do you think the top three were for most popular on
Starting point is 00:09:08 stack overflow survey c sharp this could be language this could be javascript is definitely going to be a javascript javascript number one at 70 and there's there's overlap 70 yes but 70 i mean 70 of people said yes the javascript was multi-select. C Sharp. HTML and CSS were number two and three. Oh, really? Wow. So it's literally all web. It's almost predominantly web. Yeah, and it's funny to think.
Starting point is 00:09:34 If you're on Stack Overflow, you're probably a web developer, and you probably work with Microsoft and JavaScript. Yep. It's kind of interesting. Okay, I'm sorry. Go ahead. Oh, I just have one more all right what is it uh what do developers use to stay comfortable while working and this is another multi-select but i thought the numbers were were really uh interesting so 52 percent of respondents
Starting point is 00:09:59 said they had an ergonomic keyboard or mouse so okay higher than was 10 years ago five years ago i would say yeah 50 with sandy desk really that's a lot dude yeah because that's not a cheap investment right places yeah man yeah so i thought that was crazy like wow like where where's everybody working i need to go there no i am standing right now at my standing desk. That's awesome. Wrist hand support is 22% and fatigue relieving mat, which I also have 12%. Those are important. Those really are.
Starting point is 00:10:34 I even wear shoes on my mat. Yeah. What do you think the most popular way developers learn on their own is video video okay like getting started guides getting started the official documentation and or standards for the technology was number one wow Two was questions and answers on Stack Overflow. And then three were books from O'Reilly or other public... So video wasn't even in the top three. That's interesting. Yeah, no. I was actually kind of surprised by that one too.
Starting point is 00:11:15 So yeah. What about why do people participate? What do you think the number one answer people participate, why they participate in a hackathon? Networking. Nope. You're way down the list. That would actually be the fifth answer.
Starting point is 00:11:30 So it's actually to learn skills. Nope. That would be the number two answer. Come on. Number one answer. Prizes. No, that was actually the last place answer. Come on. You guys are all over the map here.
Starting point is 00:11:44 This is great. The seventh answer was actually the last place to answer. Come on. You guys are like all over the map here. This is great. That would have been like what, the seventh answer was for the prizes. I think Joe and I have said the same thing for every slot. I think he's just watching your mouth and he's like, what was he going to say? Number of prizes. Yeah, I don't know, man. No, the number one answer was because I find it enjoyable. Okay.
Starting point is 00:12:02 Yeah. Do things because you love it. That's fine. Yeah, yeah. it enjoyable okay yeah do things because you love it that's fine yeah yeah what do you think about like um how many developers are students is this a number of students right now percentage this is a percentage percentage of the respondents to the survey 12 12 are students 35 35 are students well um you're closer but you're still off dog on it uh developer students 74 were no so 26 yeah the remaining 26 ish percent were in the yes either full-time or part-time categories that's that's cool stuff
Starting point is 00:12:46 i'm gonna go check out that thing uh well uh if you guys have anything interesting that you find on there drop us a comment on the show notes because i mean it is fun stuff and and actually so all right i know jay-z's got something up next but mine flows well into this one so i'm going to steal this particular slot so So this kind of goes hand in hand with what we had talked about on the previous episode where like languages that are dying, you know, those types of things. And we got several comments on that particular thing that we spoke about on, on episode 76, like Joseph Keegan, Nicholas. So I think one thing to note, and we've mentioned this before, right? Like at no point are we
Starting point is 00:13:25 actually meaning any kind of dogging on any particular language. And to a certain degree, I do also believe that predicting which languages are going to die is sort of silly, right? Like I think it was Nicholas who actually said that this is silly. And I agree. It is interesting, though, to take a look at what the trends are in the market so that if you go to learn something, you know, what are the hottest ones? Right. Like, do you want to invest your time in something that may not be as marketable? Now that I think that's not silly, but predicting whether or not something's going to be around in a year or whatever, like it's hard to say. Right. I mean, it's almost like predicting whether or not your Bitcoin's going up or down today. So, you know, I wanted to say that just kind of to put it out there, like, you know, we talk about these things because we find these articles and it's just interesting stuff to talk
Starting point is 00:14:13 about. But by no means take that as a hit to, you know, if you're working in a company, you're doing great things with Haskell or whatever, right? Does that mean you should stop doing it if some survey out there said, hey, this is no longer relevant? No, man. That doesn't make sense. Just wanted to put it out there because I know people have gotten upset about us playing around with PHP or something like that in the past. And that's by no means what we intend to do. We're going to joke about it. We joke about C Sharp, right?
Starting point is 00:14:39 Well, not as much because we love it. Do we? I do. I mean, you got to diversify, right? It just makes sense. You think of it like an investment. So, it makes sense, no matter what language you're in,
Starting point is 00:14:49 to at least have some JavaScript on your resume. Apparently, 70% of developers are working with it. Man, that's amazing. So, that would be a good one. Yeah. But, I mean, especially if you're on this list, like, it doesn't mean it's a bad language. It doesn't mean it's right, whatever.
Starting point is 00:15:00 But it's something to consider, you know, for managing your career that, you know, you do want to make sure that you've got, like, something that you could pivot if you need to. Yeah. All right. So now back to yours, seeing as I leapfrogged you. Yeah, all good. This past weekend, I had the, the honor of hosting a productivity and tech roundtable. We got a couple of people on Zoom, which is what we're using right now. And we talked about differences between programmers and management and
Starting point is 00:15:30 what it meant for programmers who want to move to management or maybe why programmers don't want to go into management. So it was a really interesting talk. We had Will from Complete Developer, also Darren, we talked about several times, of course, hosts the show. So if you're
Starting point is 00:15:45 interested in that topic then you should go check out this youtube video we'll have a link in the show notes awesome man i wish i made that it was just kind of at an inconvenient time on saturday because i would have loved to have been a part of that topic what were you what were you doing uh the week before man come on i was a little bit busy right uh out at the uh microsoft mvp summit which basically just drained you of, it's an amazing time. You meet some awesome people. By the way, if anybody knows Brandon Sargent,
Starting point is 00:16:11 you know, seek him out or Brandon Padgett. I'm sorry, not Sargent. Brandon Padgett, seek him out and ask him to show you some yo-yo tricks. Like, it's amazing. We had great conversation, but dude, like I was like a little kid watching him. So, but yeah, I mean, just an awesome time and drinking through a fire hose of information,
Starting point is 00:16:29 but coming back and losing three hours from Seattle to the East coast and then getting kicked in the teeth with daylight savings time has been a little rough, but you know, it was, it was an awesome week and we might have a tip or two in the, in the tip section here that kind of came from some of that information so hang around all right and uh can you guys hear my mouse by the way i know it's been kind of loud lately is there anything i can do about that oh man so check the suggestions for me all right so check this out guys if this came up because outlaw was like man in the previous episode your mouse was just like a shotgun going off right i mean i didn't sound like that he might
Starting point is 00:17:09 have said that hey man your mouse is like really loud hey i don't have that much space in my voice all right so at my house like i i literally have my pc in front of me and then right next to me is my wife's gaming pc slash whatever. Right. And my kids will want to play arc. And if you know anything about arc or any game that a kid plays, it's literally, they just want to keep biting and shooting and hitting things. Right. And so they just click, click, click, click, click. And I literally almost lost my mind one day. And I was like, there's gotta be such a thing as a silent mouse. And sure enough, there is. So I ended up buying one. I'll have a link to the amazon
Starting point is 00:17:45 thing i think it's like 16 bucks or 17 bucks it's not 20 bucks all right so maybe it went up since um but man oh i can't even hear it it is blissful it's right next to me i know they're clicking into the thousand times per minute and i don't hear it And it is the most amazing feeling on the planet not to hear that thing. So it looks cool too. Yeah. The shape of it isn't great. I don't like anytime I've used it. It doesn't, I don't know. It doesn't feel substantial, but it serves its purpose. So, you know, if you want a silent mouse, I've got, I've got a link for you. Oh, the promotional pictures got like a guy and a laptop in bed next to his spouse and he's here clicking away. Yeah, I don't know if I'd do that.
Starting point is 00:18:32 Where are you looking at, honey? Oh, nothing. I thought this was quiet. Go to sleep. This is the last episode, for reals, about clean architecture. This is your last chance probably for a while to, uh, leave comment on the episode and when that particular book. So we'll probably be doing cool stuff in the future. I don't know.
Starting point is 00:18:52 Stay tuned. But if you want to win a picture of a picture, a copy of, um, clean architecture and that's international too. You guys are awesome. Yep. And,
Starting point is 00:19:01 uh, yeah, just leave a comment and we will pick one and we will email you a picture of the book yeah so be prepared so i mean i'm extra awkward tonight and by the way we've mentioned this before if you do have anything like if you're you know pining for that pro site subscription or you have any books that you're interested in go check out our coding blocks.net slash resources we put things up there that we personally really like and use. And if you are planning on buying any of that stuff, you know,
Starting point is 00:19:32 please click those links on that page. It won't cost you any more. In some cases, it might actually save you money, and you'll be helping support the show. So, you know, thank you for that. And with that, it's time to start. Yeah. Yep. So let's get started with services, great and small. So there's this little buzzword out there about, you know, well, there's a couple of them,
Starting point is 00:20:10 service-oriented architectures and microservices, right? And they're all the rave, right? Or I think we've talked about how like maybe there's the backlash now on the microservice architecture. Yeah, and you'll typically see this thing listed as like SOA for service-oriented architecture. And I don't know, is there an acronym for the microservices? I don't know that I've ever seen that thing abbreviated. Yeah, but it's really small, so you can't see it.
Starting point is 00:20:38 Great point. So, yeah, man, there's definitely a backlash, right? Like at one point it was, hey, microservice all the things. And it's like, wait a second, this's definitely a backlash, right? Like at one point it was, hey, microservice all the things. And it's like, wait a second, this makes everything really hard. So back off that. Let's go mono again. And, you know, there's probably a balance somewhere in between. In fact, I feel like there was a talk given along those times.
Starting point is 00:21:01 I'll have to find it now. Where like Uber, didn't they have a talk where they went completely microservice with everything this was a few years back oh i don't know spotify weren't they the one everyone always talks about okay well oh did they go microservice and then backed off of it oh no they didn't do the back off they just wrote a big article about kind of splitting their teams up and organizing organizing around services. Actually, I found it. The title was, and it is Uber, What I Wish I Had Known Before Scaling Uber to 1,000 Services.
Starting point is 00:21:36 Ouch. We'll include a link to that. That would be painful for anybody. In the show notes. So I definitely think that if your company or your organization or a programmer is telling me about their organization and they mention that they've got microservices i just naturally kind of assume that that means that there's been someone who's been kind of steering that and thinking about architecture at a high level and that to me or as well i'm reading
Starting point is 00:22:03 this chapter it made me kind of realize that I have this kind of bias of thinking like, oh, well, if you're microservicing, then you've put a lot of thought into your architecture and you're probably splitting stuff off. Well, you've done a really good job and you've handled the deployment issues and your DevOps and you've really got your stuff together. After reading that chapter, he kind of makes a distinction
Starting point is 00:22:22 and says, you know, basically services and particularly microservices don't mean that you have any sort of architecture right which i thought was awesome it was a great call out because you have a bunch of services they must be decoupled right right yes that's i guess that's one of the uh the fallacies of that kind of thinking is that you think of services and micro architecture or microservices and service-oriented architectures you think of these things as being strongly decoupled and that you can develop them and deploy them independently of one another or of their
Starting point is 00:23:00 you know quote users yep but then you actually take a step back and you say, are these things truly decoupled? Like if I, if I release my new, if I release an update to my microservice, does it have any impact downstream? Like I added a new field to mine or something like that. All of a sudden you start realizing these things are way more coupled than what you thought they were because now you can't independently deploy this thing because it's going to break everything downstream of it, right right like all these other services that were depending on that thing it now has a different set of data types that are coming in and it's like well i don't know what to do with this i mean the only thing i could think of is if you have like a if
Starting point is 00:23:36 you're a truly large service you know if you're a provider of some service and it's truly large like massively at scale like a google or a Facebook or something like that, and you might have versions of your service running concurrently, then I could see the argument where it's like, oh no, I can have multiple versions of my service running and everything, and it's not going to be a problem. But for the average company, because going back even to the Stack Overflow survey, when they talked about the size of the companies, right, like most people were in companies
Starting point is 00:24:10 larger, less than 100 people, right? That was the largest category, you know, that the respondents picked, highest percentage. So, you know, most of us aren't working in an organization where we're supporting thousands upon thousands upon thousands of users where we might be doing that. Realistically, are you going to have multiple versions of your service in use? Maybe not so much. So then you get into what you're saying where like, hey, I added a new field or we needed to deprecate the use of a field.
Starting point is 00:24:46 Yeah, I think that microservices are definitely a solution to certain problems but it's not the default answer for organization by by any means so yeah i think you need to justify that decision before you make it and we actually had some really good advice from uncle bob in an earlier chapter where he said don't start out with microservices start you Start out and build your stuff as if they've got nice boundaries and services and manage your dependencies and work towards the interface so that you can split things off if you need to. So don't shut that door, but you don't have to dive into it immediately. And actually, I got to start a really great talk from Facundo,
Starting point is 00:25:23 which I'm going to be checking out here at Orlando CodeCamp again. He's a developer here in Orlando who does some consulting and he's done a lot of moving companies to microservices or moving away from or helping them get them to the cloud, just working with microservices. He had a really great talk on some kind of QA around it and he definitely wasn't pushing it. You know, he was, he took a very practical approach and really liked it.
Starting point is 00:25:50 So I'm hoping to find a link and I'll throw that in the show notes if I can find one for that talk. But I thought it was really good. It kind of changed my thinking on microservices. And so I think if you can build your app, if you can, I don't want to say monolith, you know, because that kind of implies things I don't mean here. But if you can build your app, if you can, I don't want to say monolith, you know, because that kind of implies things I don't mean here.
Starting point is 00:26:06 But if you can build your applications such that they have these nice clean boundaries and layers, then you're leaving yourself open to future expansion. But you're not forcing that upon anyone. Yeah. Yeah. So basically, this is kind of goes back to I think we had this conversation before where he's like, services are not an architecture. There was a similar conversation from several chapters back where it was something along those same kind of lines. I can't recall it exactly,
Starting point is 00:26:32 but any services that separate these application behavior, that do nothing more than separate these application behaviors are just expensive function calls. Isn't that beautiful? You're just adding latency for the sake of it, but it, you know, you're not necessarily improving your architecture. Latency and complexity, right? Because now these things all have to be managed and deployed.
Starting point is 00:26:54 And did this thing die? Does it need to fail over to another version of it? Like there's, I mean, when you really start thinking through it and how you have to, to keep these things alive and all in good health, man, it's not a small problem to solve. Yeah, I think a lot of organizations put off the actual deployment of it until kind of near the end. They don't really think about it until things are getting ready to launch like a version 2 or a new project or something.
Starting point is 00:27:21 I definitely think that some of the problems that you encounter with microservices can be kind of solved, or at least you can recognize them early on by getting a nice CI pipeline going and deploying these things and make sure that it makes sense to deploy them independently. And you're not just always having to push all these things up at all at once because they're actually totally tightly bound to each other. You just got a really complicated monolith. Now, he does make the point though to call out that just because you might want to break these things up into services it doesn't mean that necessarily every service has to be architecturally significant and that you know it needs to be strongly decoupled or anything like that like you know sometimes you you could break those
Starting point is 00:28:02 things apart into services and that doesn't necessarily make it wrong or bad. Right, right. Just like if you have a function that's dependent on something else, it doesn't, again, he drew the parallel there, you know, not everything's going to be perfect and you do have to make trade-offs for, you know, time versus productivity versus, you know, whatever else you got to do for maintaining the thing. Yeah, I mean, he calls that like, you know, even if you're breaking the dependency rule here, sometimes there are benefits to this where having that functionality separated out might benefit your particular use. Maybe it's a scale problem. Maybe breaking that one piece out, you can now horizontally
Starting point is 00:28:40 scale that one service, which for whatever problem you're trying to solve might help even though you're still strongly coupled to it, right? Maybe you didn't do it in like the most, you know, quote, ideal way. Yeah. And if you remember the dependency rule, it was that source code dependencies can only point inwards. And it's really important, not only is inwards, inwards, and not outwards, but also means not to the side, right? So that means these services shouldn't be calling each other because then they're tightly bound to each other. They need to be going through a layer of indirection.
Starting point is 00:29:10 And an example to kind of bring this to the real world for what they just said was when they don't, the benefits might be horizontal scaling, right? So let's say that you have just, for instance, a database behind the scenes that can take, you know, thousands of transactions per second. That's not a problem. But let's say that you have a web server that sort of maxes out at a thousand transactions
Starting point is 00:29:33 per second, but you need more of these things coming in, right? It might make sense to break that service across multiple boxes that could then take in, you know, multiple thousands of those requests, right? So that's a case to where, you know, I mean, you could make multiple thousands of those requests, right? So that's a case to where, you know, I mean, you can make up all kinds of things, but like credit card processing, right? You don't want to be bottlenecked by a particular server if you have to handle a high amount of transactions. So it might make sense to break apart that one service from your application so they can take in as many of those things as possible, right? And then maybe queue it up and
Starting point is 00:30:03 add it to the database or something. So that's sort of an example of when that might matter, even though you don't care about drawing these specific boundaries, you just need something that will scale, right? Yep. And I really like on the next section here talking about the benefits of services, and there are plenty of benefits of services, but decoupling is not one of them. And I's that's one that we kind of like instantly go to but there are others you
Starting point is 00:30:30 know like being able to independently scale or deploy or whatever but if these services are calling each other and they're absolutely coupled just like your code can be coupled it is funny because like you said when you hear microservices or service oriented architectures you just automatically assume oh well they you know they architected this thing to be just amazing and all separate and independently runnable. And that's not the case, typically. Yeah, I almost think like I meet somebody and they're like, oh, yeah, we do use microservices. I'm like, oh my gosh, do you work at Google? Right? Or Amazon, AWS? Yeah, exactly. Let me ask you guys this. When you think of using microservices,
Starting point is 00:31:10 what is your thinking behind it? Why you would want that? Why that was needed? I'm curious if your go-to answer is the same as mine. Mine? Or thought. Go ahead, Joe. What's yours?
Starting point is 00:31:22 For me, it's being able to independently release and independently scale, but primarily just the ability to release one part without having to release the others. So if you've got these things tightly bound, then to me, you've lost the primary benefit, at least from my understanding. So mine would be reliability. Mine's so I know most people would think that I would think scale. But mine is more along the lines of you have two of these things standing up. So if one fails, it can, you can easily swap over to the other one.
Starting point is 00:31:50 Like I would think that reliability would be the primary benefit and scale would probably be next. So scale reliability in Joe's was what again? Independent deployability. Independent deployability. Yeah. Or being able to work at things in kind of parallel and like being able to release things and,
Starting point is 00:32:04 you know, like updating the version number but not necessarily affecting any existing behavior. You're basically treating your services like third parties. Right. That is not, like neither of you were thinking, it's interesting how the three of us each
Starting point is 00:32:20 had a different takeaway. Mine is just that if I think that there's a need for microservices because you have some idea that you might want to reuse that by other applications. So you're thinking like an external API? I'm thinking of it as like it's part of an external API, yeah. Okay.
Starting point is 00:32:43 So I was just curious, you know, a little, little side tangent topic there. Yeah, that's cool. Yeah. That's really interesting. Yeah. I'm looking at a list here and like all our stuff is in there in the top,
Starting point is 00:32:53 whatever this, this article has like 30 different pros for it though. So I'm not going to get into that. Yeah. There's a few, but yeah, we hit the high points. Yeah.
Starting point is 00:33:01 And we talked about just a minute ago, like they are tightly bound because of the data they share, right? If you typically, you don't have just some central app that calls out to a service and then it gets something back and calls out to another service. Typically, it's almost like a waterfall effect, right? Like you call service A and then it's going to call service B and then it's going to call service C.
Starting point is 00:33:19 And that's how you end up. That's how they all become tightly bound because they are all aware of each other to some certain degree and the data inputs and outputs that they have to publish. So an example might be, and I'm thinking off the top of my head, so maybe this would be a messed up example. But if you wanted to do some kind of an authentication, right, then maybe your first iteration, you're like, you know what, I only need you to pass in a username and a password, and I will verify from there.
Starting point is 00:33:51 But then on a subsequent one, you might think, you know what? We've changed the way we handle our encryption, and so we don't want the salt necessarily right next to the encrypted version, so you're going to pass me in your salt as well. That's probably a really messed up... Anybody who knows encryption is probably like, what? You don't pass your salt around, but whatever. Yeah, I'm thinking the point is you would pass in
Starting point is 00:34:16 now suddenly you need to pass in a third thing. You're like, hey, we have to deprecate the use of that other one because we've changed the way we're handling the encryption or something like that. What if you went two-factor? Okay, two-factor. I like that one better. Multi-factor.
Starting point is 00:34:30 You have to pass in the multi-factor authentication code as part of the authentication at the time, right? Because you've changed that strategy, now any applications that were using the old authentication service now have to know, they have to be updated at the same time
Starting point is 00:34:52 and released at the same time as this new authentication service. So the deployability and the developability are both impacted by that service. Yeah, you can't just release that thing, assuming that you don't just release that thing, assuming that you don't just create a V2 of it, right? Or something like that. But you can't just say, all right, well, I'm updating the authentication service because that will now bust everything else.
Starting point is 00:35:15 Well, you're saying the V2 though, that means that now assumes that you have concurrently two versions of the service running. Right, that's what I'm saying. Let's not assume that. Yeah, and maybe that might not be an option for your particular organization, right? currently two versions of the service running. Right. That's what I'm saying. Let's not assume that. Yeah. And maybe that might not be an option for your particular organization, right? You might not have the option of running two versions of the service because maybe in the
Starting point is 00:35:34 background, there might be like schema changes that are forced on the first version of the service that's like, I can't allow this version anymore. That database doesn't exist that way or whatever. Maybe the way you were storing the passwords, for example, maybe you didn't have them encrypted good enough. And so you've had to force, maybe because of some government regulation, like a HIPAA regulation or something like that, you have to absolutely do away with the old way that you were doing the
Starting point is 00:36:05 password so you've like gone and deleted from that and you know you force all your users to change their password they have to go through the new version of the service so it's not an option to run the new both and i do like the having the ability with microservices to be able to spin those up those two different versions of other times i definitely think it's a benefit to be able to do that and then it buys you flexibility on like how to upgrade stuff but yeah it may not be an option which and that's another point like if you've only got three servers or one server you know microservicing it's just another you know it's it's a premature optimization yep and we touched on some of these other things but one of the things that they say here is service interfaces
Starting point is 00:36:42 are not any more formal rigorous rigorous, or defined than functions. And that's interesting, right? Like when you think about that, still, if it changes, everything else has to change, right? Yeah, and I've definitely been on the receiving end and also the giving end of making changes to services. Oh, I forgot to tell you. It's not a string anymore. Oops. Yeah, I've definitely been on the receiving end of some bad documentation related to services too.
Starting point is 00:37:07 Oh, man. So I would have much rather have had a function that I could go reading rather than bad documentation that leads me down the wrong road. Right. They start talking about here the independent, what Joe's thought of a service was, was the independent development and deployment.
Starting point is 00:37:26 And they say that it's been proven that large enterprise systems can exist in the form of a monolith. Services-based or component-based doesn't really matter. It can all be one, right? As a matter of fact, there was a, I want to say it might have been a Software Engineering Daily or Software Engineering Radio podcast episode a while back where they had on the the the guy who created uh base camp i think is the name of it it's a it's a
Starting point is 00:37:52 ruby on rails thing and david hansel hireman and and he was like yeah man ours runs as a monolith and we have you know i forget how many users ridiculous i remember you talking about this yeah it was amazing like the dude's like look man we have a monolith, I forget how many users ridiculous. And Marie talking about this. Yeah. It was amazing. Like the dude's like, look, man, we have a monolith and he's like, hardware is cheap. Add more of it. Right. Trying to scale this thing out in software is going to be a super
Starting point is 00:38:15 expensive engineering problem. And he's like, and ours runs fine. Right. Like we've, we've never really had a problem. So it is interesting. It's not saying that everybody should go monolith, but it does make you at least step back and say, do we need this? Need is a very important word. Yeah. I mean, I have been in some places where microservices were employed and it does kind of
Starting point is 00:38:36 make you question, is this a micro optimization that we're making before we know that we need it? Yeah. I mean, we said architecture is all about deferring those sort of implementation details and this is definitely an implementation detail so why start there yeah okay and i did find the link i'll share this in the in the show notes it was software engineering radio episode 261 and his name is david heinemeier and yeah he talks yeah and he talks about the state of Rails monoliths and all that stuff. So it was a really interesting episode. He's a great person to follow on Twitter too. He is not afraid of saying controversial things.
Starting point is 00:39:17 Awesome. Uncle Bob says that because these services are tightly bound to the data that they ingest or output, they are still tightly coupled to their dependencies and their deployments must still be coordinated with those external systems. Here's a downside that wasn't mentioned, though, is that if it was just a function, have compile time checking you know error compile
Starting point is 00:39:45 time errors versus runtime errors and we've talked about the benefits of you know prefer compile time error over runtime error they're a whole lot easier to handle because you know about them yeah what's wrong with your kitty tell me about your kitty problem what you gotta do all right so i don't know if you guys remember way back, you know, a couple months ago, we talked about a taxi service as an example of an application. And you've got a user who could basically say, hey, I need a taxi. And your app would be in charge of dealing with the various companies and making sure that your qualifications as a rider are met. Like, you know, it's maybe a certain certain price or certain quality of cab or some such and it would go out find the cab and get it to you and we had like a little sample app that
Starting point is 00:40:30 we worked on well in the meantime in those last couple months marketing came back to those those programmers and said hey you know what in addition to all that other stuff we also want to start delivering kitties around the city and because of that we need to be aware of other people's allergies particularly the drivers also anyone any cab that has delivered a kitty needs to take a couple days off before letting one ride in it just in case and so they basically uh they do what pm does right they um they took things in a direction that would have been difficult to predict ahead of time. And what did that do to our functional decomposition? Somebody else. So, yeah, I mean, that was the thing is all of a sudden you had this simple, you know,
Starting point is 00:41:20 pick up somebody and deliver them from one place to another as a taxi service. And now you have all these additional rules, like, you know, can the cat go with this person? Can the cat be taken to this location? All this kind of stuff. If all that was in some sort of microservice architecture, how much of that stuff would have to change? Probably all of it, right? Like every bit of it. So that architecture that you used, quote unquote, at the time that you created that thing originally, it doesn't support these new use cases. And so you got to redo it all anyways. Right. This is a cross-cutting concern of, you know, fundamentally to how this service is going to work. What was once just a taxi service is now a, also a
Starting point is 00:42:02 kitten delivery service, right? That's a cross-cutting concern that impacts the entire application. So everything is going to be affected. And you know the funny part is, I think the last time we mentioned this, we're going to call it a vocabulary term, which by the way, Joe Zach, didn't you create a GitHub vocabulary thing for cutting blocks? Like we need to start updating this thing. Yeah, Joe, of course, Joe had a great idea and said, hey, why don't you put up some of the vocab?
Starting point is 00:42:30 Yeah, he really does. Joe, you're awesome. And anyway, I made a little GitHub page. It's really scant right now, but hey, you could totally fork it and add stuff to it. So I'm going to take a little note here to add cross-cutting concerns. Because I always think of logging or something else.
Starting point is 00:42:43 It was interesting to see a functional requirement considered cross-cutting because because i always think of like logging or something else it was interesting to see like a functional requirement considered cross cross-cutting because it really does have effects on ui i mean every single layer of the diagram we won't go over the diagram but every single component was like oh yep that needs to change because this and that needs to change because of that yeah so cross-cutting concerns for anybody that's not aware that's basically something that that that touches like all different parts of your application, right? It could be, it's easy to say logging because typically you want to log things if there's errors or warnings or whatever.
Starting point is 00:43:12 So that's an easy one that you kind of want everywhere. A lot of times there's retries and that kind of stuff. So yeah, cross-cutting concerns is a good vocabulary for anybody who's not heard of it. And functional decompositions. Yep. And so he says know care needs to be taken so that these new features don't cut across all of your services yeah so how the heck do you do that and i feel like that that's kind of been what the whole book has been about it's like well how do you do that what you do is you create a bunch of
Starting point is 00:43:45 interfaces to interact between these different parts of our application and then we can side load this jar or dll or library or service whatever and then we can inject this logic into various other places by basically configuring our current application our current services to go through that and to incorporate the pieces as needed. So it's writing our own logic for this specific problem and then kind of configuring it into the flow and utilizing tools like dependency injection and configuration management to make it all work. And by the way, this is something that is going like we're not even going to try and describe how he broke it down and change it in the book because like he's got pages of diagrams to where he's re architecting, reconfiguring these boundaries and
Starting point is 00:44:29 all that kind of stuff. So like, this is literally one of those things that if you want to be able to follow along with this one, you'll need the book. So again, if you want your chance to win it, you know, leave a comment here, but this, this is where having the book can add some value to, to some of these conversations and before reading this i was like as soon as i heard the problem was like well you know yeah you had to change everything and then kind of reading the explanation of how they kind of broke it about and how they kind of made it happen it's like oh crap that's pretty good but i still kind of i'm like my mind is boggling because if say you know the next day like hey we're now we're
Starting point is 00:45:03 a parrot delivery service too i think like okay now we're going to need to sideload the parrot stuff and then we're going to have to configure this stuff and kind of pile it on top of the kit like how do you do that without having the bird stuff aware of the kitty stuff aware of the driver you know it's my mind is still kind of melting over that um but i'm gonna take his word for it and that's not an easy problem right and that's one of those things, like, I think he said, it might have been our last episode where he was talking about, don't try and guess everything up front, right? Like, if something like this comes along, yes, take a step back and look at all of it because architecture is an iterative approach. So don't try and figure out all this stuff to make it the most flexible system on the planet when you started out delivering people, right? When this next requirement comes up that kind of blows up your whole world, at that point, say, all right, well, where can I draw these boundaries?
Starting point is 00:45:53 Where are the things that are in common? Where are the things that aren't? And then go from there. So like, you know, your next step, you'd probably do the same thing. You back up, you try and draw it out like on a sheet of paper of all things and say hey where can i draw these lines well i think it was also mentioned too in like the last episode that those pain points those those those points of friction uh are going to be the ones that you're going to re-evaluate right you know um because you're not going to like take a look at it you
Starting point is 00:46:21 know all up front you're not going to like break it apart into all of its individual granules you'll you'll do a little here a little there and you know each time you you iterate on it again it's going to be on like what's the next pain point and i will say like going to a real life use case of this thing if you find yourself start writing a bunch of if else statements we've used this in in in payment processing before because it's a pain that we've all felt. If you start seeing yourself doing if PayPal than this, if credit card, if this, if other payment instrument than this, then you really, really need to take a step back and think about how do I abstract this better? Yeah, same with switch statements and same kind of thing. Yep. Switch, if else, any of that kind of stuff where you start really complicating your code
Starting point is 00:47:08 and really introducing a lot of potential maintenance problems and just bugs because you have all these if-else statements, that's when you need to think about how do I break this down to where it's just something that can be plugged in, right? If you can train your mind to think of how can I plug this in and it work, then you've taken a step in the right direction. Well, here's something that some might consider controversial. If I remember clean code correctly, Uncle Bob said that your switch statements should only be used in factories.
Starting point is 00:47:37 Yes, he did. That's the only time you're allowed to use a switch statement. Yep. switch statement. So getting back onto the topic here about the cross-cutting concerns, he says that these architectural boundaries don't run between the services, but rather through them. So this is kind of, you know, at first like that statement, I'm like, wait, what? What does that mean? But this is kind of building on what Joe was talking about with, you know, using solid principles and interfaces between these things to, you know, as to like, well, how do you fix this problem? Right. And that's what he's trying to get at here is that, you know, the, these interfaces are what's going to run through the different, you know, from the service and the user of the service.
Starting point is 00:48:21 Yep. And we got the dependency rule coming up again which is saying that the dependencies need to point inward to uh higher or lower layers depending on the diagram you're looking at the easiest way to remember it is your applications business logic is the innermost circle right so that's everything should be pointing towards that the top of the ziggurat or the cone yes awesome diagram yes see the architecture is defined by the boundaries within the system and the dependencies that cross those boundaries yeah it's not defined by the physical mechanisms of how the code communicates and runs. That's so important.
Starting point is 00:49:08 Don't think about the underlying storage. Don't think about the communication channels. Don't think about that stuff. It's literally how they interact. Yeah. Your architecture, here's another one too. Like if you were to go to like a conference, you know, and you were to ask somebody like, hey, what's your architecture?
Starting point is 00:49:22 You know, you might often hear people refer to the tech stack. Yeah, definitely. Not the architecture. Definitely. I definitely feel like microservices was a common answer for the organizations that are using microservices. Like, hey, which architecture? Like, microservices, everything. Right.
Starting point is 00:49:34 But how do you... Next is the language. Okay, so backing up then, if somebody asks you about the architecture of your system, what do you say? Because that's typically your go-to. It's microservices or I have three tiers or whatever. Like everything we've talked about in this book over the past, what, three months,
Starting point is 00:49:53 it is not, it's not got anything to do with the technical nitty-gritty hardware, none of that. It's literally drawing lines between between functional components i keep in my wallet a folded up diagram of of all the functionality and objects within uh you know and so i can physically show like here are the lines between my apple this is what my architecture looks like these little bubbles over here they communicate through here so so when somebody asks you like you hold like, hold, hold please. Right. You pull that wallet out.
Starting point is 00:50:27 You unfold that thing. You uncrinkle it, lay it on the floor, and you're like, bam. It takes me a little bit. It takes me a minute. There it is. Yeah. You can see how a database-focused person might generate a schema diagram when asked about the architecture. I think what he's getting at is the answer should be,
Starting point is 00:50:44 like in the taxi kitty example, it should be, well, we've got a user interface that takes input from a user and it goes out to a taxi dispatcher. And we've got a couple of rules there and it goes out and it figures out based on those rules, which taxi services are eligible to send a car. We go ahead and get that scheduled for the user who pays us somehow and we have abstractions here and you know just it's definitely more of a technical software talk than it is a
Starting point is 00:51:13 oh we have three tiers it's pretty interesting i almost just described the business not the right the app actual application it's because those things have gotten to be really close. And if we go way back, the whole purpose of software is to enable the business to automate and do things. Make money. Yeah, in a computing way. It's about the business. The only value you really have is what you're adding to the business through your application. So then your short answer is, if somebody asks you what the architecture is at your job, then you should either describe your business or say something short like, our architecture is designed to support the business.
Starting point is 00:51:51 Or after reading this book, you just say, oh, we have a clean architecture. Don't lie. Okay. Well, I mean, I'm assuming our listeners probably have clean architecture. And that's what I'm assuming. That's why they're all listening right now. I mean, you want to sound good, so clean architecture. And that's what I'm assuming. That's why they're all listening right now. Yeah, I mean, you want to sound good. So don't tell them the truth.
Starting point is 00:52:09 That's right. But, you know, like an e-commerce site, you might say something like, well, we've got a website front end where users can place orders through a queue that gets picked up and processed by processing. And then accounting does this. And I mean, you really are describing the business and just like we said when we first started out on this journey with this book we want the scope to max to match the structure and what we meant by that was the actual business need and what the code looks should be like a reflection and the closer that reflection is to being accurate to like both sides you know match like looking in a mirror then the less strife there's going to be between the two and the easier it's going to be to
Starting point is 00:52:49 change things because remember that was the big problem business said we want a checkbox that a checkbox that you know undoes your entire world like well we can't do that because that's actually a big change for us because even though it seems like something little for you are the way we've written these rules doesn't line up with the way you think about these rules. And that's what we're trying to fix with clean architecture. Hey, before we go into the resources,
Starting point is 00:53:14 there was a really good, and I want to find who did it. There was a really good comment from, oh man, it was an episode discussion on this podcast. And it was from, I cannot find it. Doggone it. Man, I hate that.
Starting point is 00:53:34 At any rate, it was brought up. We had mentioned in the last episode this whole thing about, what was it? Partial decoupling or partial boundaries. Partial decoupling or partial boundaries, partial boundaries. So what we said is, you know, in a fully implemented boundary, you might have your interfaces in a separate project, separate jar, separate whatever, right. Or assembly that both sides that are going to use that thing will implement. Right. And the discussion was, well, if you go the partial boundary route, then you might skip breaking that thing out into its own assembly or jar or whatever.
Starting point is 00:54:10 And then that way, you don't have as many things to manage when you're deploying, right? So you might bundle it in with a particular layer, we'll say, or a particular component, I think is how it was put. And man, it drives me crazy that I can't find them because it won't scroll back far enough right now. But the thing that was said was, well, why not just put it in the application layer? Because that's your most central, so things can use it. And I wanted to reply to that because it's a really good statement. If you don't have that many layers outside of that, then maybe that's fine, right?
Starting point is 00:54:47 Maybe, maybe you make things depend on that interface in there. The only problem I see with that is, and I tried to reply in the thing and I, and it's hard to describe this stuff, just, you know, writing back about thoughts, right? But what I was saying is, if that application tier doesn't actually implement that interface, then it doesn't make sense to put it there. You know what I'm saying? So, so for instance, if you put the interface in there, because you want everything
Starting point is 00:55:17 to be looking in, and basically anything can look in there and say, implement the interfaces in this particular application component. Well, if that application component isn't using that interface in any way, shape, or form, then you're probably putting it in the wrong place because now it's just sort of a dumping ground. There's no cohesion there. There's nothing that says this application tier belongs to this interface. So I want to redefine how you described partial versus fully. Okay. Because I think it might help clear this up a little bit. Okay. Is that from what I recall, and you tell me if I can be way off base,
Starting point is 00:55:52 but a fully implemented boundary was where everything was in its own separate component, separately deployed component, right? A partially one is you, it's all deployed together, but maybe in the source code code it's broken out into separate projects so that later it could be broken out and independent so what you're describing is like you might still have that other project for that interface right and other projects that want it might reference that interface either for implementing a version of that interface or just, hey, I want a instance of this interface.
Starting point is 00:56:35 But it would still be in its own thing and not in some other project that has nothing to do with it. Right. And that's really the key, right? So whatever abstraction, and we say interface because it it's easy to just, you know, think about things that polymorph to that. It could be an abstract class, whatever. But what I'm saying is that thing should at least be where it's being used, right? Or where it's being implemented, because it doesn't make sense to say, hey, put everything in the application tier, just because you know, everything's going to be pointed in that way, right? If there's no implementation at that level of that particular interface or that abstract class or whatever it is, then that's probably not the right place to put it.
Starting point is 00:57:16 Bring it out to where it is being used by whatever's on both sides of it. So, Joe, I see you sort of looking. Does that make sense yeah i was just thinking like by putting in the core then you're kind of applying that this is kind of like a core feature a core part of the system but if it's you know you've got the interface there but the functionality is really not it's really one of these lower layers and you're kind of lying to your users or you're right slating and that's what i was getting at. This isn't a part of your core logic. Yeah, and again, I mean, it's easy to talk about these things in hypotheticals, but you'd probably see it. Like if you ever saw some sort of class that's buried in your application
Starting point is 00:57:55 and nothing's really using it there, then you probably need to figure out where that thing should actually live. Because you don't want to just say, hey, what's the innermost here? Put everything here because I know everything can use it right that just doesn't make sense so yeah yeah that makes sense to me i'm on board all right so with that um if you haven't already left us a review we would greatly greatly appreciate it if you would puts a huge smile on our face uh you can head to www.codingblocks.net slash review and you can find some helpful links there to some of the main uh aggregators but uh i think we've said it before like i don't care how
Starting point is 00:58:39 many reviews we have every new one that i read is a smile. I enjoy reading every one of them. So don't think that you're too late to leave yours. It'll still mean just as much to us as the first one. Definitely. And by the way, I want to give credit where credit was due. It was not in the episode discussion channel. It was in the podcast chat and it was henry cogan who left that message it was reached aloft and a great great point so thanks for for sharing those thoughts in there which is also a great segue into like if you haven't joined this slack wait wait wait oh what were you saying i had another segue all right but i was just saying don't forget that we're sending out free stickers if you send a review. So you don't need to go back and screenshot anything.
Starting point is 00:59:28 Like we're doing honor system here. But if you have left a review in the past, and we really appreciate it, we want to send you stickers. So go ahead and shoot us a message or an email or something, and we'll hook you up, especially if you're international. Yeah. you up even if you're uh especially if you're international yeah and uh you know if you haven't already um joined the slack community you really should um so you can hit us up there at uh codingblocks.net slash slack if if you haven't already joined i was actually telling arlene earlier today that believe it or not slag is actually the best way to contact me because i get the whole notification number like email definitely not twitter like not you know not so much like we all kind of
Starting point is 01:00:14 check it sometimes so that those notifications kind of get lost but uh slack i will eventually see it and i'm still not very good at that though but But you do get a little ding on your phone, on your computer, all three of them. Yeah, but email works too. So whatever you're comfortable with, we're there. Go ahead and contact us about those stickers. We'll hook you up. I know email too gets a lot of spam and notifications and stuff. So Slack is preferred, but we'll hook it up.
Starting point is 01:00:42 Definitely. All right. So let's get into my favorite portion of the episode. Survey says... Outlaw family, step on up. Right? I would try to sing the music right now, but it would come out horribly wrong. Dun-dun-dun. Dun-dun-dun-dun-dun. Yes. right i would try to sing the music right now but it would come out horribly wrong okay there i did it for you we haven't sang in a while so we have you did that with the creepy host although now it's steve harvey so that's not so much creepy it's just hilarious
Starting point is 01:01:18 yeah right he's kind of mean isn't he man don't be the person that's... Have you seen some of the people on there, though? Yeah, true. Mommy. Yeah, that was different than mommy. Okay, so I mentioned earlier that there was some similarity between our recent survey and some other site's recent survey. In the last episode, we asked, when you're not coding for work or school in your free time, do you eat, sleep, code, repeat coding is all that matters. Or you gotta be well-rounded, get outside, ride a bike, climb a mountain, hike a trail or netflix gotta binge watch everything or rocket league or insert favorite
Starting point is 01:02:09 video game title here i feel like that should have been call of duty seeing as how that's what we used to talk about all the time used to be man times have changed haven't they no man i love some call of duty no really man on xbox one i used to love it man i don't even know what happened like somehow it just it was literally like a light switch like years of call of duty and just finally i was like i'm done well that was me last year last year i didn't play it and then this year i just i had the itch and i was like i i need this in my life i don't know how much came out and i was like oh this is different and new and also good like what else is out there? I did see that they already have announced the pre-order for Black Ops 4, and I did get a little excited when I saw that.
Starting point is 01:02:52 I can't lie. I was like, oh, yes. So, I don't know, man. All right, sorry for derailing us. All right, so let's go Joe first. Which one do you think is the most popular? Coding is all that matters. Get outside Netflix or Rocket League.
Starting point is 01:03:09 This is tough. Um, if it was, it was a multi-select, it would definitely be Netflix. Cause like everybody has Netflix, right? I would say, Oh, you know, a large percentage of people. And, uh, Oh, geez, this is tough. I'm going to say, I'm going to say Netflix with, netflix with uh 37 wow you went high nice i did i think i'm going low on this one i'm going to go man this one is hard because honestly i could see every one of these being like 25 of the vote i'm gonna go rocket league because i think we got some
Starting point is 01:03:40 gamers yeah i want to say rocket league and we're not talking about the percentage of time they do doing this we're just talking about the percentage of people you have free time and this is your go to way to spend that free time i'm going to give this 20 20 rocket league okay well done all right 20 rocket league and 37 netflix and survey says you're both wrong. Oh man. Don't tell me people are lying. They said they get outside. I don't believe it. Yep.
Starting point is 01:04:09 Get outside is the number one answer with 43% of the vote. Man, that's awesome. I get for you. That's, I would have never guessed that high. And I think that's awesome. That's what I'd hoped everybody would say.
Starting point is 01:04:20 Yep. Now you, you had number two, Alan. Okay. Rocket league or, or any kind of gaming was definitely uh you know 20 that was number two how far was it though was it truly 20 uh no it was like almost 21 oh i was really close how about that all right yeah had that been the most popular answer you
Starting point is 01:04:41 would have definitely won by prices right nice um and then yeah netflix was actually last last place yeah i would have said rocket league but my subs keep getting destroyed in subnautica so i gotta get back to it glanks uh hooked me up he threw out a little time capsule so i gotta go find it but yeah i'm always puttering out with something yeah i mean it was kind of interesting comparing our results with the Stack Overflow results because they worded theirs as like, well, how often do you exercise, right? They didn't give it a choice of like, hey, do you exercise or do you just Netflix or Rocket League? Right. Because basically, like, Eat Sleep Code Repeat, Netflix and Rocket League, for example, could all be done in front of your computer.
Starting point is 01:05:25 Yep. In fact, you could do those maybe even somewhat concurrently. I don't know about all three of them. There's definitely two of them you could definitely do. Yeah. So theirs was just how often do you exercise, period. The choices were I don't typically exercise one to two times a week, three to four times a week, three to four times a week or daily or almost daily care to take a stab at what you think those were two to three,
Starting point is 01:05:51 two to three. Wait, no, that wasn't a choice. It was one to two or three to four. Hmm. One to two, one to two is the number one.
Starting point is 01:05:59 Yeah. Care to put a percent on it. 27, 27. Joe, one to two, 60 60 one to two no way no i don't typically exercise was 37.4 ouch percent one to two was the number two choice at 29 man i'm really close yeah yeah so i will say for me like this these answers here it's cyclic like i'll literally find myself for weeks at a time all i do is code all day right yeah and then i'll be like i gotta get out and i gotta get some exercise i need some physical
Starting point is 01:06:38 exertion right yeah so i mean and then there's times where i need some call of duty in my life right it's just yeah yeah i would say that exercise's times where i need some call of duty in my life right it's just yeah yeah i would say that exercise is probably a little extra hot this time of year yeah all right we're still coming off that january 1st yeah so if you take a look at like you know we had uh 43 we're saying they get outside when they have their free time if you take all of the ones from stack overflow all the all of the exercise ones and combine them in to one choice of like, you know, do you exercise or not? Then it was like 60% of the respondents exercise at least weekly.
Starting point is 01:07:13 Interesting. Right. That's cool. I mean, it's good to hear because it's, I mean, honestly, in this profession, if you don't get some physical exercise in your life, you will eventually just get to a point where you feel and and i mean sitting is the news is the smoking of our generation right yep so you know if i finally had my first full standing day oh i had meetings all day so that wasn't so nice but it
Starting point is 01:07:41 was nice that i stood all day and i wasn't uncomfortable so i first started standing standing, even after like two hours, I remember being like, oh my gosh, I'm standing two hours a day. My feet hurt. Yeah. So now like I can do a whole day and it's no big deal. Awesome. Man, I got to get me a standing desk. How often do you use yours?
Starting point is 01:07:56 Not as much as I should. Probably a few times a month. I mean, I'm not good about it. Yeah. Only a few times a month. Yeah. I'm not, I should be. The thing is I'll get coding and I'll just forget that I even have it.
Starting point is 01:08:06 Right. I can see that. Yeah. The meeting is great because I don't like typing a lot while I'm standing. But in the meeting, no problem standing. I don't like to be dancing and stuff to kind of keep awake. Yeah. It's good.
Starting point is 01:08:19 Nobody even knows I'm dancing right now. I can see you. All right. So this episode, we're going to ask, while we watch Joe dance and raise the roof. That's right. We, oh, man. We got to have a sprinkler next.
Starting point is 01:08:40 If you're not watching this also on video, you should, because the dance moves that I'm seeing right now are just amazing. And you owe it to yourself to check it out. I've seen Joe sprout into a flower or something before. Head to codingblocks.net slash YouTube to get to our YouTube channel. And you'll be able to find this in all of its video glory. I do a lot of dancing. So we talked about licenses before earlier and I forget the exact context of
Starting point is 01:09:16 it. Something, one of the things that you brought up earlier, I think in the beginning of the show, Alan, but so this episode we're going to ask, do you pay attention to third-party licenses and your answer, your choices are your answers. I was going to answer it for you, but instead I digress and I'll just give you your choices.
Starting point is 01:09:36 Your first, your first choice is yes, because my company forces me to, Or yes, because it's a good habit. Or no, wait, you actually read those things? Or lastly, no, wait, am I supposed to? Yeah, this will be interesting. I bet there will be things in here that will be scary. Yeah, I think it depends a lot on where you work, what kind of software. Yeah, we'll see. A quick question for all of you trailblazing freelancers.
Starting point is 01:10:15 If you could reclaim up to 192 hours a year of your precious time, would you? Our friends at FreshBooks who make ridiculously easy to use cloud accounting software for freelancers are the architects behind this question, and for good reason. By simplifying tasks like invoicing, tracking expenses, and getting paid online, FreshBooks has drastically reduced the time it takes for over 5 million people to deal with their paperwork. If that's not enough incentive, the FreshBooks platform has been rebuilt from the ground up. They've taken simplicity and speed to an entirely new level and added powerful new features. Oh, and if you're doing the math,
Starting point is 01:10:57 192 hours works out to two working days per month. When tax time does roll around, you'll find tidy summaries of your expense reports, your invoice details, your sales tax summaries, and a lot more. If you're a freelancer listening to this and not using FreshBooks yet, now would be a good time to try it. FreshBooks is offering a 30-day unrestricted free trial to our listeners. To claim it, just go to freshbooks.com slash coding, that's C-O-D-I-N-G, and enter coding space blocks in the how did you hear about us section. Hey, and check this out. One of our buddies just signed up for it and they even have little interesting tools to start the clock when you start working and stop the clock so there's there's a ton of other little features to make it really nice for you as you're keeping up with your expenses very nice all right so coming back
Starting point is 01:11:54 in here the next thing that we're going to talk about are test boundaries and yes they are a part of your architecture that's the test right the tests are part of your architecture. That's the test, right? The tests are part of your architecture. The tests are, yes. They should not be an afterthought, basically, right? We talked about it in clean code and other things. They need to be there. And here's the interesting thing, right? Like we've talked about all these abstractions and everything.
Starting point is 01:12:17 That's not the case with tests. They need to be very detailed and very concrete. They are following the same dependency rule that everything else is, and they're pointing inwards. there was yeah oops dang it all right okay there was probably gonna say the same thing that tests are not immune to all the rules we've been talking about they're not some like sort of side thing where you get to do whatever you want it's really important to write those well or else they end up being fragile and discarded yeah except i did want to come back and explore on that though but um he said one part here that i hadn't really thought about it like he said like think of your your test as your outermost circle right and i'd never really
Starting point is 01:12:57 thought of them like that but it makes sense when you when you do and if i remember right when they fall into the zone of uselessness or something, it's something ridiculous. It might not have been uselessness, but basically... Zone of pain, maybe? Zone of pain. They are very concrete and very not abstract,
Starting point is 01:13:15 and that's what it was, zone of pain. So, yeah. I mean, but that's the way they're supposed to be, right? They're supposed to be there to test what you have, not be used by... Yeah, they're consumers of your code. Right. Not be used by consumers of your code right not be used by
Starting point is 01:13:25 anything else right i'll remember the dependency rule means the dependencies go inward so the test still shouldn't be dependent on say a database of you know of course if you do an integration test or something then you're you're going to end up testing some sort of database or some sort of mock of one but yeah just the idea the tests are part of that boundary and they're part of that layer that are outside and past all of that because they can kind of reach in and that made me kind of think about a discussion that we had way way back maybe like episode nine way in the beginning we were talking about unit testing when we talked about testing internal classes and methods or package or private or basically you know some sort of non-public entity with unit tests and we both
Starting point is 01:14:06 said i think outlaw and i both said i don't remember where you were at alan but we both liked that idea and we kind of struggled with the notion that maybe you shouldn't test you know anything but the public layer i was wondering uh like how you thought about that now outlaw that we've kind of like read this chapter well i mean this chapter was like you might think that okay you might think that hearing us talk about test boundaries you're like oh god not this again i've seen so many take talks on unit unit testing and tdd and bdd blah blah blah you're like okay i'm done i don't need this but this chapter was actually like seriously eyeopening. It made me like reconsider everything that I've ever done about, uh, unit testing was probably
Starting point is 01:14:51 wrong. And it actually like flies in the face of a lot of the, like how you should structure your unit test kind of topics and conversations that are out there. Um, so, you know, I would say that uncle Bob would definitely argue that you shouldn't be going after, you know, anything that's not public, that you should only be testing the public layer. Um, and that makes sense. But the reason why I say that it, it was so mind blowing for me was that, you know, you mentioned earlier a moment ago, Alan, about them being in the zone of pain because they are so concrete and fragile, right? He refers to it as like, you need to create a testing, a test API, right?
Starting point is 01:15:42 And I think we've talked about this in the content in some other context before where it was like a test language, right? And I think we've talked about this in the content in some other context before, where it was like a test language, right? If I remember, right. But he basically says like, you're you're testing architecture needs to have its own API. That's a that's a super set of these interfaces so that you can decouple your tests from the application themselves so that testing, you know, refactoring the application doesn't mean necessarily mean that the tests themselves have to be rewritten. Yeah. That was a really cool takeaway. And I've never thought of it like that. Like, you know, even, um, I think when we've talked about, testing before, and in fact, I think there was a previous episode where I had posted like, hey, here's how I like this.
Starting point is 01:16:32 There was this article that Phil Hack put out about how he likes to structure his unit tests and so that it shows up nice inside of that IDE. And then Roy Oshirov, I think is how you pronounce his name, that wrote The Art of Unit Testing. He had a particular format on how to structure your unit tests and even, you know, as far as from the naming perspective, so that, you know, regardless of what test runner you used, you could immediately see what class was being tested, what method was being tested and what use case was being tested. Right.
Starting point is 01:17:10 And, you know, I, and in that episode, uh, where I, you know, merged those two concepts into one, it was like, Hey, here's how I like to do it. Right. Would totally go against everything that Uncle Bob is telling us here. Because having those class names and those method names in the unit test names and the unit test method names, he would probably want to slap me with this book if he saw that. Because they call this the fragile test problem.
Starting point is 01:17:44 Basically, as those those um concrete classes change you could have like depending on how complex your project is you could have a thousand unit test fail right it's like whoa yeah it's it's really funny like reading this chapter i felt like i kind of had like uncle bob on one shoulder and like roy osher over the other and you know as soon as i would start like leaning one way, the other would kind of smack me. And so I, you know, my initial first thoughts coming in were, well, of course my test files should match, you know, match up like one for one for the test or the files that are under test. Right. And, um, same with the assemblies and everything. It should all just line up because I'm testing classes, right. I'm testing these smallest units. And then,
Starting point is 01:18:23 you know, reading this chapter i've got uh you know it feels like a little bob slapped me on the back of the head saying hey wait no this is the outermost consumer like why would you cheat and suddenly start having all these concrete dependencies and uh you know like why would why would you do that that's totally anti-everything are you trying to make this stuff really fragile like why would you have it totally this mirror image of everything that's under test so that you you know like kind of by definition every time you change one you have to go change the other like are you crazy so every time i would kind of start leaning towards one i would
Starting point is 01:18:54 get smacked together so i still i don't i don't know where i ended up still figuring that out yeah honestly i'm with you on that yeah i i still got to try to sort this out in my mind now because it was a little bit of a mind-blown moment. I've had so many years of extremely smart, well-respected people in the developer community. We named a couple already that are saying, hey, here some like really good ways to structure your tests and everything like good patterns and then this comes along and i'm like oh man and it's not how do i incorporate that right it's not that it just comes along and you're like oh it makes sense right like yeah
Starting point is 01:19:41 that made sense exactly it's like how. Exactly as how Joe put it. Why would you cheat? This is the outermost circle. So why would you suddenly decide that it's okay to cheat the system here? Yep. And if you go back to what we talked about, I think, on the last episode when we thought we were going to have both of them in one, we talked about the main program, the main method, right? Being the thing that scaffolds it or puts all the things together,
Starting point is 01:20:06 right? That's basically what your unit test should do, right? There should be some things that new up everything and inject all your dependencies at the first place and use the abstractions. And now you're in a spot to where if you want to test it slightly different, if you have another pluggable feature, guess what? You just test that way too. And it was funny just the other day on Twitter, I saw someone talking about how they gave some advice for somebody on, on unit testing and they pasted like the, what they typed to the person in Twitter.
Starting point is 01:20:36 And I read it and I was like, Oh, this person is going to get a beat down. Like they, they don't know the rules and what you're supposed to say about unit testing because they were advocating for outside in unit testing. And I thought maybe they had just come up with this this or this was just kind of like a novel idea that they had and i was like oh boy you're gonna get it right got the popcorn and i hit the replies and man reply after reply after reply was like man i finally get it this actually makes so much more sense to me i'm actually testing this stuff how i use it it's not so fragile it's really great
Starting point is 01:21:03 and i started kind of Googling this whole outside in and saw that there's a little bit of talk. I don't know if I'm maybe not getting the right terminology or what it is. So I'm not finding people recently talking about it. But I do see this term of outside in testing sprinkled throughout blog posts over the last five years or so.
Starting point is 01:21:20 But now I'm kind of wondering, it's like, well, crap, maybe I need to reevaluate and look at some of the newer thinking on unit tests. And, you know, maybe I've been kind of stuck in my ways. I don't know. It's easy to do. We've talked about it. We did the same thing with databases for years, right?
Starting point is 01:21:36 Like it was your source of truth. It was the core. It was what everything depended on, only to look back and go, oh, wait a second. That really shouldn't have mattered, right? Yeah. So and we kind of skipped over it. These should be independently deployable, right? And the most isolated system component,
Starting point is 01:21:51 meaning that it really only relies on everything else. Nothing should be touching that. So you can push it out there and run it at any time. And they already are deployed like that. They already are independently deployed. If you think about it, you don't deploy the test version of your code to a production environment. Typically, that's a debug version that's just deployed to whatever you're going to run the tests are, even if that, quote, deployment is just locally on your own file system.
Starting point is 01:22:20 But that's it. Well, let's talk about that real quick. It depends on what language you're talking about, right? Because if you talk about something like C Sharp, that'll be in a separate project that you don't deploy, right? If you're talking about things like, for instance, in the JavaScript world,
Starting point is 01:22:34 it is typically a best practice to have your test spec in the same folder as the files that it's using. But you'll have something in the bundling or the building of your application that will say, hey, skip all the spec files or whatever. So it depends on which world you're talking about, right? Like it still doesn't get deployed.
Starting point is 01:22:55 Well, that's what I meant by deployed even like on your local file system, right? It would be like, you know, if you're skipping the spec files versus if you're building a separate dll or jar file it is interesting because like in the c-sharp world it does kind of frustrate me that you can't put the test next to it like you have to put it in another project and now it's not really clear to see hey did i test these things right like it is are there tests for this are there tests like
Starting point is 01:23:19 there might not be and and that's the one thing i really do like about at least the JavaScript ecosystem and how that stuff evolves is it's nothing to put it right next to it. It's just another statement in whatever your build setup is to say, hey, skip these things. So, yeah. Yeah, and I always thought it'd be neat to have the tests in the files too. I don't do that. I know that's against the rules or whatever but uh just imagine the idea of like you know going into your class and you see you know you're one of two methods there and then you scroll down a little bit and then there's like 10 tests that kind of show you like what the you know the rules are what it means i bet you could
Starting point is 01:23:57 do directive things it's especially a hassle in like large yeah projects yeah where there's a lot of individual um components or projects within the overall solution you know how frustrating is like when you would have like two files open they're you know the same file name basically are very similar except for maybe the word test in them and they're even arranged kind of similarly and like one's way over here one's way over there so you're like okay let me open the next file and let me go up down over left turn around three times open the other file uh turn turn the other way three times go right go down go up you know and then find the same file that's kind of mapped there and then open that up and now like every time you open a file you've got two files opening up with very similar names you know it's just
Starting point is 01:24:44 annoying i felt like he was trying to hunt the wumpa says he was trying to open his files Like every time you open a file, you've got two files opening up with very similar names. You know, it's just annoying. I felt like he was trying to hunt the wumpa since he was trying to open his files. I mean, the interesting thing with that is the fact that they get very disorganized unless you are super, you know, hyper aware of what the file structure is. But then it sucks, right? Like if you move your class from one place to another, you're going to go unit test from one location to another and so it's just it's a mess but anyways yeah wasn't that a benefit of unit testing like isn't it supposed to free me up to refactor more freely right and now we're saying like well actually it's a big pain in the butt if you move anything so you know refactor but just don't rename anything but unlike unlike the other parts
Starting point is 01:25:23 of your of the code, though, in your application, your tests support development, and that's it. Right. Everything else is about operation, but your unit tests are not. They have nothing to do with operation. They're purely about supporting the development
Starting point is 01:25:37 and giving you the confidence to do any kind of refactoring or to know that this works the way i intended it to work this next now i'm wondering like me you know maybe all this time like i thought unit testing was just really hard to do maybe i've just been doing it wrong so i'm gonna have to do some experimenting i'm gonna have to try um kind of creating my own test boundary keeping it as part of the the architecture and just kind of see how that works on a project and see how i feel about it yeah i mean it doesn't sound like a bad thing no if anything it'll make it easier and better going forward right although it's going to be painful it's a it's a mind bender right but um yeah so he has a statement here where you know
Starting point is 01:26:16 if you think about what we said so far about you know these are the most detailed and concrete they're the outermost circle uh nothing depends on them nothing depends on them that's a key and that you know they support the development he says all code should be modeled like the tests isn't that crazy you know layers upon layers i mean i i have to see what this looks like i've never seen anything like this so um if there's an open source project or something that's got like this kind of test layer, then I'd love to see it. And you're coming up the next chapter. I think we've got a nice example of what layers like this could look like, though not specific to testing. Yep. Yeah, I want to see a test layer.
Starting point is 01:26:59 Yeah, so ultimately, this kind of goes back to like a TDD conversation where, you know, the solution to this test boundary is to design for testability from the start. Right. Which is very TDD in thought. Right. Like if you can't write a test for it, then you can't be writing the code for it either. And their next statement is something that we hit on several chapters back, which is don't depend on the volatile things. So your databases, your file storage, that kind of stuff, like that's not is don't depend on the volatile things. So your databases, your file storage,
Starting point is 01:27:25 that kind of stuff, like that's not things you should depend on the clock, right? You should, you should mock those things as much as possible. And then that way, you know, you don't have these things that are so brittle.
Starting point is 01:27:41 And yeah, go ahead. Yeah. So rather than writing, okay. So going back to like my mind being blown here you know typically the way i would have thought about like writing unit tests would be like okay i have this set of classes i need to write you know as joe put it like there's this one-to-one mapping you know for the the classes and then the unit test to make sure that all the functionality in that class is tested right and basically what Uncle Bob was saying here is rather than writing these unit tests against all
Starting point is 01:28:10 of the production classes, instead write your tests against the API, allowing this primary application to change without worrying about breaking that many unit tests because you're not necessarily going after any individual one class necessarily but but more the overall function of some purpose and this whole api thing is basically coding to the contract is really all he's saying right code against the abstraction whatever whatever public interface was made it not to the class. Because then the class can change and you don't care about it. As long as that class is fulfilling whatever that contract said it had to, you don't care what the implementation was.
Starting point is 01:28:54 Well, kind of going backwards to our conversation at the start where we were talking about the authentication microservice, right? So you might have some code within that service that handles the decryption or encryption. Well, I guess you would be doing Well, I think where you're going with this Let's say if this authentication was to create, if this microservice was to save these credentials, then you might want to do the initial encryption
Starting point is 01:29:29 insulting right and you wanted to make sure that like you were producing the same you know given the same uh you know inputs that you were always producing a consistent output right so you might be tempted to just test that one thing right isolation and say, hey, does this encryption layer work the way I think it does? And what he's saying here is that rather than even bothering with that low-level detail, instead you would just focus on writing a test that's about the API of, hey, if I try to save a credential, does it get saved? Right. Period. Did it work? Right? a credential, does it get saved? Right. Period. Did it work? Right.
Starting point is 01:30:07 Does the overall intent of the thing work? And not focus on the minutia of it. Which is interesting because you hear a lot about people saying code coverage, right? And it's a thing even in tools that will measure how much code coverage you've got with your tests. And this flies
Starting point is 01:30:24 in the face of that too. This is, no, just test against what your interface is, your contract, so that you need to. Well, I don't know that I would necessarily word it that way because you could still have code coverage that goes across all of the intent of it without necessarily writing classes that focus in on a particular thing, right? So you could still focus in on like,
Starting point is 01:30:45 you still have a test that's like, hey, I called my authentication service to create these credentials, right? And to save those credentials. And did that work? Okay, fine. And part of that path may still include encrypting the password with some salt, right?
Starting point is 01:31:06 And making sure that that works rather than having a class, a test class specifically for, hey, encrypt this and make sure that the output is right. So, I mean, it's still the same coverage. But isn't code coverage, doesn't that usually count how many methods have not been tested against? And that's what I'm getting at. Yeah, but you could still be calling all of those methods,
Starting point is 01:31:26 but not specifically. You're getting them implicit rather than explicitly calling them. Well, you could also configure the coverage tool. So you say, here are my unit tests, and only calculate the coverage for this public API layer because we've got a separate layer for it. So now we tell it to kind of ignore the other stuff because we say, well, it doesn't really matter that's just how the sauce
Starting point is 01:31:47 implementation details right yeah nobody cares about how the sauce is made yeah okay yeah i mean this still i'm still chewing on this chapter yeah honestly that's a good way to put it you know he says that this testing api should have superpowers outside the normal powers of a regular system user therefore it's probably best if it's deployed separately and never ships with your product. I love this one, by the way, because what they're saying is in your test, you're bypassing everything. You can assume that you've got super user rights. You can assume that you don't have any rights. You can assume whatever you mock all that stuff out, right? So you definitely don't want to ship this code because now you could be potentially giving away the keys to the castle with some sort of hole, right?
Starting point is 01:32:31 And it's interesting. It makes a lot of sense. You shouldn't be, if you run on a Windows network, you shouldn't be relying on AD in your unit test, right? You should be able to mock that user out to say that, yeah, you're a member of X, Y, and Z group and you've got God rights to everything. So I really liked this one. It was an interesting take on it that I don't know I've seen embraced anywhere. Yeah. Basically what I want is after having read this book, I want Roy Oshirov to write the art of Unit Testing 2.0 as it relates to the testing API that Uncle Bob is suggesting
Starting point is 01:33:08 here, and then maybe I'll be able to wrap my head around it more easily. I think you can write that book. You just call it The Art of Unit Testing with Good Architecture. I think that's a good title. With good, not clean, but good. With good architecture. Yeah, we don't want to see anybody's title. Right, right. Just the first one.
Starting point is 01:33:26 This chapter sort of came with a disclaimer, like, we'll rock your world. Yes. We'll hurt your brain. All right. So now we get into something that I don't think any of us have a ton of experience in. I may be wrong. I think Outlaw, you're probably the closest. I don't know.
Starting point is 01:33:40 Well, I would have said no until I kind of read some of the generating SQL type stuff. Oh, yeah. Oh, yeah, totally. That's a good point. Yeah. So the name of this one was Clean Embedded Systems. So, man, it's funny. When I first read the title to this particular chapter, I was like, eh.
Starting point is 01:33:59 And then I started reading it. I was like, okay, well, this is way more applicable than I thought it was going to be. Yeah. So like the first one, I love this statement that he makes. Software doesn't wear out, but it can be destroyed by unmanaged dependencies on firmware or hardware. And you're about to, and I'll let one of these guys get into it, you're about to get your head twisted around a little bit on what he means by firmware. I had to look it up.
Starting point is 01:34:23 I feel like I've used the word firmware for routers and all sorts of stuff but like when he kept like talking about the differences between the hardware and firmware i had to go look it up and what he means by firmware is um i lost i lost this is the very next line here you okay so uh no that's not what i was looking for someone else has to say it okay well i well, I'll say this part then. He says that firmware isn't firm because of where it is stored. Rather, what it depends on and how hard it is to change as the hardware changes. Okay, and actually, I found the line I was looking for.
Starting point is 01:35:00 I was like, well, what the heck is firmware to begin with? And what I ended up finding in Wikipedia is that they call it the low level control for the device's specific hardware. So an example here might be some sort of call to blink the power light. Right. So it's the things like that that can be controlled via, I don't want to say software, because it's kind of in between software and hardware, right? So it was on read only memory generally, not necessarily, but for the most part, this is software that isn't going to change so much.
Starting point is 01:35:33 All right. So here's the part that kind of drove it all home. And this is, this is where if you hear this and it doesn't make you twitch a little bit, then maybe you've been doing things great all these years. But this is where I was like, okay, we're not just talking about embedded systems on a chip. Non-embedded developers also create firmware when they embed SQL statements in your code. That's so true.
Starting point is 01:36:01 Same type thing if you're embedding HTML in your SQL when you're returning stuff. Same type thing. You are making hard, fast decisions on what your architecture, not your architecture, on what your hardware, what your application is using and what it's doing. You've now basically created firmware because it is extremely hard to pivot off that. Maybe you're entrenching yourself, depending on the software itself, you could be limiting yourself to particular hardware, as you mentioned, like ARM or, you know, whatever other kinds of hardware there is. But also your operating system, your tech stack,
Starting point is 01:36:36 all sorts of stuff. You're cementing your position. Yep. Yeah, I was going to embellish this a little bit, because it doesn't just have to be like embedding your SQL statements. We've talked about this as, you know, if you aren't careful and don't abstract away some of those dependencies, then you further tie yourself or marry yourself to them. So for example, if in your code, it's, you know, like a quote known thing by some kind of dependency there
Starting point is 01:37:03 that you're using SQL server, for example. Well, you've now, you know, it's become firmware because it's now hardened to SQL server, right? Yep. And we've talked about entity framework. If you use entity framework with link to SQL, guess what? You've now, and we are not picking on any framework. We all know and have loved and used Entity Framework. But if you don't draw those boundaries properly, then you have created firmware because you have tightly coupled your application to SQL Server via the Entity Framework, you know, bus, we'll call it. So it's really interesting when you think about it like this. That statement of software doesn't wear out. I mean, think about it. It can't. It this. That statement of software doesn't wear out. I mean, think about it.
Starting point is 01:37:47 It can't. It's ones and zeros. It doesn't wear out, but it can completely be destroyed. And that's, man, that's powerful. And Kent Beck, famous for a lot of unit testing, writing, and a lot of other stuff, had some really nice rules here that I think a lot of developers follow to some extent. And the first one was first, get it working. I've definitely been there where like the first thing you're just trying to do is get something to show on screen that looks roughly like, you know, some approximation of what you're supposed to do. Then you try to make it right.
Starting point is 01:38:17 That's step two. And then after that, you try to make it fast. And a lot of developers will just kind of stop after number two or sometimes number three but there's no keep it clean step here right and that's true the make it right doesn't mean make it make it clean doesn't mean make those boundaries it just means okay it's not as crapified as it was initially right right and yeah i guess you could define right to be different things right you could say right to be different things, right? You could say a right does mean clean, I suppose. I just kind of interpreted it as actually correct, but maybe I'm wrong there. Well, and nowhere in here does it say to make it perfect. Like,
Starting point is 01:38:56 we're not talking about perfection. No, no. And you should, I mean, this is probably a bad thing to say. You should never strive for perfection in your code. And the only reason I say that is chances are it's going to change tomorrow or the next day or the next day. Like, I mean, we've all done it. We've created code that we're super proud of. And then it's like, oh man, I didn't think about this edge case. And then, and then you go in and, and it's not as pretty as it was before. So don't strive for perfection. Strive for really good. Like don't ever walk away from a steaming pile and be like, that's it. I'm done. But, you know, perfection is a tough one in programming.
Starting point is 01:39:37 Yeah, no one would win to call win. Yeah, exactly. Yeah. Remember we talked about the gold playing anti-pattern? Oh, yeah. But I do want to go ahead and make a retraction on a statement made two minutes ago. So, first, make it work. Second, make it right.
Starting point is 01:39:53 I think to make it right does imply getting it clean and making sure that the things are maintainable. And then the third, making it fast. Like, you know, I made the statement that uh there was no fourth step but i think that was implicit there in step two all right then yeah he says that if you're only going to focus on making it work then you're doing everyone a disservice totally agree because you're going to have to maintain that thing and there is more to software development than just making it work that's actually where it you can draw the line between a good developer and somebody who's just getting paid to get the job done, honestly.
Starting point is 01:40:32 So going back to a conversation we've had in the past about what's the difference between a junior and senior? That's a big one. That's a big one. The junior would just make it work? Yep. I got it done. Whoa, what is that?
Starting point is 01:40:50 Did you? Yeah. All right. would just make it work yep i got it done whoa what is that did you yeah uh all right so uh where were we at here so so there's much more getting it to just work okay so intermingling your software and your firmware is an anti-pattern so what does that mean and by the way i pretty much hate the term anti-pattern so what does that mean and by the way i pretty much hate the term anti-pattern but it has relevance because i i feel like some people just use the words to to make it sound cool right oh that's an anti-pattern well i don't okay i think it was bad habits it's a bad habit right yes so so the where i got kind of confused on this, though, was that, like, well, if you intermingle the software and the firmware, then it's no longer intermingling. The firmware is a virus. If your software intermingles with the firmware firmware then the software has become firm
Starting point is 01:41:45 yep the firmware has infected it and it's become firmware that's a good point it's no longer soft so there is no such thing as intermingling software and firmware that's so awesome what we need to do here is create a humble layer that will do all the talking to the uh the firmware and then we can sit on top of that humble layer and now we're protected from that virus and we'll be able to use this code more you know more well yeah potentially other places and be able to test it and do all sorts of other good stuff with it nice way to bring back in the uh humble layer that was good job never forget humble objects oh never forget so yeah intermingled let's say, infected code resists changes.
Starting point is 01:42:29 I actually like the infection because that's really, if you picture that, that's beautiful. And the worst are these make the entire system almost impossible to test, right? Or the changes are dangerous and require full regression tests. Which is going to make it even more difficult. If you start embedding your dependencies, now you've got integration tests instead of unit tests, which we've talked about in the past are really hard to do. So, yeah.
Starting point is 01:42:59 It also makes it really slow to work on too. Like, you know, I've talked to people who work at New Cash Register, NCR. And, you know, obviously it's not like this because it would be too slow to work on. But I, you know, I've talked to people who work at New Cash Register or NCR. And, you know, obviously, it's not like this, because it would be too slow to work on. But I've kind of joked about like, every time you make a code change, you got to publish to the ATM machine that you've got sitting next to your desk. And you've got to get out your debit card and work on. And obviously, that's a silly way to work because it's just too slow. But, you know, a lot of us do kind of put up with that sort of stuff in other situations where we're relying on that hardware that website that whatever really bring up the
Starting point is 01:43:29 website click click click click click wait wait wait wait click click didn't work start over again so we're introducing these cycles that are dependent on the bottleneck and that's because we don't have these kind of good abstractions, good boundaries, good layers that we can kind of mock and play with in order to test more granularly. Yep. It's funny you bring them up as an example. I've actually been in their labs before. Oh, really? They really do have a room of all the various ATMs.
Starting point is 01:43:59 Wow. At some point, you kind of got to, right? You can't just say, like, works on my machine machine, and then roll it out to Bank of America. Now, in fairness, for what he's saying, you want to write your software in a way that it's abstracted away from the hardware so that you can write your software independently of the hardware, but it's not a bad idea to test it on the hardware afterwards, right? So we're not saying that you shouldn't have it.
Starting point is 01:44:21 We're just saying that it should be done in a way that you don't you don't have that bottleneck yeah you don't want to publish to that atm because you're trying to get the uh logging you know the pin screen to be pixel perfect so the grant is too slow right so this is where the how comes in i don't remember this boundary between the software and the firmware and so immediately you should think space odyssey 2001 uh you know the how 2000 the how is the hardware abstraction layer and this is where you abstract that hardware so that your firmware can be tested off hardware all right so you're making a firmware a little less firm that's the that's the objective here It provides the service without revealing how. Yeah.
Starting point is 01:45:06 An example here I really liked is that you might have methods like indicate low battery or indicate error rather than LED blink 5 or LED blink 3, which I'm sure you've at one point had some sort of hardware device where, you know, the different blinkings or maybe the different lights meant different things. Like why have that kind of blinking light code, you know, invade your code and poison your code? That is a perfect example. You can have a layer here that you can use to interact between. And then if you need to move this code, give it a life outside of this device, maybe the device is upgraded or, you know, something else changes, then it's really easy to see exactly what needs to change in order to support that new hardware.
Starting point is 01:45:44 So if you're on board with the concept then of the hardware abstraction layer, then this is where things get like rinse and repeat type of patterns. Again, every time the goal is to make the firmware a little less firm. And so you'll bring in a processor abstraction layer where you're trying to further decouple that, that firmware and the hardware from, uh, so that, you know, you want to, you don't, you don't want anything to know about the hardware registers, for example. Um, and again, you're just trying to, your goal here is to be able to test off hardware as much as possible. And take that a step further to an operating system abstraction layer so that the OS can just be treated as a detail to protect yourself against for many dependencies that you have on it, right? So you keep putting these abstraction layers
Starting point is 01:46:46 between your firmware and ultimately the hardware. I mean, if you think about it, that's kind of what they probably did with the Windows subsystem for Linux, right? They just stuck an abstraction in there and said, hey, treat this just like you would a Linux system. We don't care about the underlying architecture. Just make it fit, right?
Starting point is 01:47:06 Here's the interface. Let's make this work like it. Well, just the window. Yeah, now PowerShell. Say again? Oh, PowerShell now, it can be run on multiple different platforms as well, cross-platform.
Starting point is 01:47:18 So same type of thing. I forget where they have it, but they basically have an abstraction layer now that sits on top of the operating system and everything runs through that and it just works magically. Awesome. So that was PAL and the same thing for operating system, OSAL, but either way, access layer.
Starting point is 01:47:35 Yep. And yeah, we've said layers many, many times tonight and many times throughout the book. Layer architecture is premised on the idea of programming to interfaces. It lets you do cool stuff like work vertically or horizontally or test your APIs or kind of slice stuff off and support multiple devices for embedded architecture. So it just seems like a really good idea. I mean, you can even use the layers for the testing, which still, you know, wrapping my mind around. But it definitely seems like the layers for the testing which still you know wrapping my my mind around but it definitely
Starting point is 01:48:05 seems like the layers have been really core layers and dependency injection have been core to the whole concept of clean architecture yeah he he wrapped this up in a different way instead of saying dependency injection but substitutability right right by programming to the interfaces that you allow for substitutability. Which is the same thing as the whole plug-in notion and all that, right? Literally being able to swap things in and out. Yep, so a clean embedded architectures software is testable off of the target hardware,
Starting point is 01:48:39 off of the target operating system, and within layers because the modules interface through interfaces. Interface inception. Someone had to say it. I'm sorry. And this is funny right here. They even say that if def, so your, what are they called? Pound of fines. Yeah, your directives.
Starting point is 01:48:59 Yeah. Like your processor directives and that kind of stuff. They violate the dry principle when you have this wrinkled all over your code. We've never seen that. So, yeah, keep those isolated to a single file. And now that only, it's like the switch statement or the if statement. That is only going to work if you've got that dependency injection or, you know, some sort of substitutability set up. So you can actually swap classes in and out because if you just do an if
Starting point is 01:49:26 statement in each of those functions and you're repeating yourself you know the same thing right you're you're spreading that poison so whether it's a if def there and if either way you're doing the wrong thing according to clean architecture ideally you're going to be able to swap those things in and you're still going to have those if def somewhere but you're going to keep in one spot and it's going to control which set of classes or which set of components gets used yeah and this whole if def thing just so for people who have no idea what we're talking about those are things like uh compiler directive so that if you're in debug mode then do this if you're in production mode do this yeah i was going to give
Starting point is 01:50:02 like a really good uh or actually i guess really bad example that i was guilty of a long time ago where like in my c code or even c++ code i might do something like if def debug uh and then log out some kind of message or print out some kind of message either to the console or to the law to a log right and you know i'd have this stuff just sprinkled all throughout the code and it was like really easy for me for a debugging purpose you know if def debug if def debug like just sprinkled all throughout it but it did you know it goes against what he's saying here because i probably you know thinking back to it now i would look at it and be like oh you know what i should just have the one method that's going to print out whatever I wanted to print out.
Starting point is 01:50:45 And inside of that one thing, then maybe it should be making the decision about like, hey, you know, if def, you know, debug, then do this. Maybe that's the answer. But, you know, another downside of that kind of thing, having those if def statements in your code, whether it be for this debug scenario that I'm describing or if def uh you know core i7 if def core i5 it breaks up the readability of your code which isn't one of the topics necessarily mentioned in here but definitely uh you know going back to clean code right you know the whole point is to make your functions readable immediately right then uh that totally interrupts the flow of
Starting point is 01:51:27 the reading and there's a complexity score in things like independent or any kind of static analysis things that will show you the the number of like uh uh what are they called decision paths or whatever that they can shoot up the complexity and that would probably do it as well right i don't know if the if defs do though because they get compiled and the static analysis you're talking about is going to go on the compiled version that's a good point so your code is hard to read yeah all right yeah that's a fair point all right so yeah the next thing we got here is we say letting all code become firmware is bad for the obvious reasons that we just stated before it's a virus yeah so going back to the example that alan started with about like um you know if you start embedding your sql into your
Starting point is 01:52:11 code well we know that that's a bad thing right uh for one you're doing like string construction of your sql statements like we know that's a bad thing right but now we can phrase that in a different way because we can say it as, oh, you've infected it. It's now become firmware. It's no longer soft. You can't change this thing. You've gone down this path. Only being able to target or test on the target hardware is bad, right?
Starting point is 01:52:38 That makes a lot of sense. If you've got to have the ATM sitting next to you everywhere you go, how are you going to do that at home? What if you've got a late night that you've got to do something atm sitting next to you everywhere you go how are you going to do that at home what if you got a late night that you got to do something you know away from the office right and hooked up to the bank too right oh yeah every time i need to test it costs me 20 bucks yeah and another way to think about that though is that it that also implies that you don't have unit test at all right and we we know from past experience that like not having unit test is a bad thing so if you can only test on the, then that means that you don't have it. And because you don't have those unit tests,
Starting point is 01:53:09 now you've got to remember all of the use cases that have to be tested on the hardware. Yes, a little bit. So you've got to have a running punch list of, here are the things I need to make sure I do. That you know, or that Joe knows, or whoever worked on the system for the past 10 years knows. Right.
Starting point is 01:53:28 That some person has to manually go through and do. And not only that, but they got to be diligent that they do the exact input or, you know, and make sure that they get the exact output.
Starting point is 01:53:38 And don't get lazy or don't mess up. way to do it because humans, we are definitely fallible. You know, we're going to make mistakes. So if you're relying on a person to do it because humans we are definitely fallible you know we're going to make mistakes so if you're relying on a person to do that it's going to fail yeah and the thing is is typically when you're working on a mundane task like that your mind has a tendency not to focus as much i mean there's even there's a netflix we've talked about this there's a program on netflix called
Starting point is 01:54:01 like uh uh brain oh brain games is it brain games i think it is i don't know where you're going and so there's a show on netflix that i highly recommend it's called brain games and it just shows you how your mind fills in the blanks when your mind's bored it literally just i'll make this up and and it's a real thing. Like it will blow your mind, you know, pun. But if you, if you watch it and you see some of this stuff, you're like, wow, I never realized that because my mind disengaged, you just start making mistakes. Well, here's a, here's taking this from a different angle. I believe it was an MIT study that said that as long as you had all of the consonants in order, that you could remove any or all of the vowels out of the words and still
Starting point is 01:54:54 write the sentence and it would still be readable and you wouldn't even trip over trying to read it. You would immediately know what that sentence is trying to say and so that's an example of what you're describing where in our minds will automatically fill in the gaps right but it might be critical to our application that we actually print out you know something exact and you know we need the software we need that unit test to make sure that the exact thing was printed without some human's brain just going oh well i can easily fill in the gaps and move on yep so and actually that's a nice teaser for the we talked about doing a practice episode next i'm not sure it'll be the next one but we're going to be uh i'm gonna be talking about that exact thing in my presentation talking about how your brain takes shortcuts for for good and for bad and that's why it's really important to build up good habits because
Starting point is 01:55:41 when your brain is it's so desperate to take those shortcuts and it desperately wants to be on autopilot that if you don't kind of have that good muscle memory built, but if you haven't codified good habits, then it's really easy to slip into really bad habits. And if you're in Orlando, this coming, well, this probably won't be out by the time you do it.
Starting point is 01:56:00 Ah, doggone it. Well, hopefully you did an awesome job by the time this is released, but yes. I'm going to make some videos eventually. So if you're listening to this and you want to hear or see the video, you should like come kick me
Starting point is 01:56:11 and make sure I get it done. That's right. And then, so wrapping this all up, what have we learned in this book? So there are more chapters, just as a heads up. But I think we've fairly thoroughly covered, I think what are the most important and, and just really main points that this book tries to drive home. And so following
Starting point is 01:56:35 the principles outlined in this will help make your architecture and your code clean and maintainable for the, you know, foreseeable future. Yeah. The only section we didn't get to is the, the detail section. And there's a few things section we didn't get to is the details section. There's a few things we skipped along the way, but the details just kind of dives into more specific examples of how to handle some weird situations that come up.
Starting point is 01:56:53 And it probably covers a lot of the weird things that we brought up too. So I'm going to keep on reading. And if, you know, again, I highly recommend picking up the book. If you're not one of the winners, by leaving a comment on one of these, you know, pick it up, check out our resources page. It's there. It's excellent. I mean, it'll make you think about
Starting point is 01:57:13 code in a different way, not just something that you write in your codes clean, but thinking about maintainable systems overall. So, uh, you know, obviously it's one of the resources we really like clean architecture, surprising. And then brain games. I found the link to it on Netflix. I've put that link in the resources as well. Super fun show to watch, man. It will absolutely blow your mind. And yeah. And I found the story about that. I had it wrong. It wasn't that their vowels were removed. It was just that you could replace, you could move them in any order and it was a cambridge university not an mit study that did it so we'll include some links to that as well the link is fun yeah
Starting point is 01:57:54 well yeah i i'm trying to find the original story but that was like a fox news story where it's all everything is misspelled and it is hilarious it's beautiful well you will include that link in your mind really does just pick it up like it's nothing yep all right so now it's my time for the favorite part of the show joe never did pick one by the way still it's the tip of the week yeah i sure did i remember would you you picked this one too didn't you uh no it's the dankest memes oh is that is that still a thing all right someone erased the rules we need to get those back in there sorry slack inside joke all right i know some people hate those all right what you got all right my tip of the week is uh this is a suggestion from arlene because i've been talking
Starting point is 01:58:42 about it non-stop forever in the Slack. Why not hackathon? I know being a card carrying introvert that I've been kind of scared of in the past. But after seeing some of our friends over at Wales this past weekend, done really, really awesome, cool, fun, neat things. I figure I need to do it, too. So I'm going to be signing up for one in Orlando and I'm going to be giving a shot. It's kind of like this weird health app slash game jam. So if you got an idea, let me know. And I'm just going to, I guess I'm going to show up stag
Starting point is 01:59:14 and just kind of see what happens. So it may turn out terrible. But I have really good resources to read on what to bring. Both cynical developer, James from Wales and Jamie, made videos and slash podcasts about what they kind of brought. And it's really kind of interesting
Starting point is 01:59:32 just to see what kind of things and tools and prep they did for these hackathons. And just watching that YouTube video or listening to that episode, it's like, oh man, I really want to do this now. It's almost like a camping trip, but way nerdier. Awesome. I i'm gonna watch that video too all right so for my tip of the week i encourage you to sign up for a new feature that is right now uh you can sign up for early access for visual
Starting point is 02:00:01 studio live share now you might say, wait a minute, but I like Visual Studio Code. Well, guess what? This works for that too. What this allows for is real-time remote pair programming within Visual Studio or Visual Studio Code. So, you know, Alan could have his environment already set up and running.
Starting point is 02:00:26 You know, maybe he's got the connection to a database or whatnot, and he can send me the link. I can connect to his system. And in my instance of Visual Studio, I can edit his code. He can see me editing his code and I can run it against his system. But we can both work on it together. Yeah. I mean, it is incredibly cool. And there's, there's a couple of things to point out on this because I love this tip. One is it's your environment. If I send you a link, a share for mine, you load up your visual Studio or your Visual Studio code, either one, doesn't matter, with your theme, with your font size, with your layout,
Starting point is 02:01:12 your solution explorer could be in a different spot. It doesn't matter. It's yours, right? And then the other really cool part of this that I don't want to gloss over is he has to have no dependencies. Like if my app depends on no JS and it's got to have Bower and it's got to have Grunt and Gulp and 5 million other dependencies, he doesn't have to have any of them. Like you are literally running off my system with whatever code changes you want to make. Yep. So we're going to include that link in there and encourage you. We should all flood Microsoft with signup requests to this so that this thing can come out as soon as possible,
Starting point is 02:01:51 because this might be like one of the most exciting technologies that have come out. I'm not joking. Like I'm super stoked about the idea of remote pair programming becoming super easy and plausible. Oh, it's so cool. And now one thing to note, you can download the extension. If you go into Visual Studio Code, you can actually look for the extension and you'll be able to download it, but you will not be able to use it
Starting point is 02:02:15 because it'll want you to log in and it'll say, hey, you're not a part of the beta program or the preview. So make sure that you do hit one of these links and go and try and get your signup approved for the preview. That's a killer tip.
Starting point is 02:02:30 I agree. Like when I saw this, I was like, whoa. It's amazing. All right. So mine, there was another thing that was just sort of mind blowing. So if you haven't heard about WebAssembly, it's basically compiled code that will run in a browser in a nutshell, right? Like I don't think,
Starting point is 02:02:49 and it's, and it runs way faster than anything else that loads in because it's literally system level type calls that are, that are working. So small, really efficient subset of JavaScript. Right, man.
Starting point is 02:03:04 It is, it is crazy fast And again, it's compiled like it runs off if you're using dot net code It's it's dlls if it's you know, something else who knows what comes down, but Let's say let's back up just a moment. Let's give a Maybe a super brief overview on web assembly. Okay It's a like joe said it's a subset of javascript But if you take a look at like how
Starting point is 02:03:25 your JavaScript works today, you go to amazon.com, you download some JavaScript. The first thing that your browser has to do is compile that so that it can run. So when Alan says that it's compiled, compiled binary that you're pulling down, what he's referring to is the JavaScript compilation has now been moved from the client back to the server so that the compilation is only happening the one time and getting shipped as in that binary form so that's where it makes up its speed because you get to skip the compilation step yep and here's the really cool part so microsoft has been putting in some effort called blazer b- B-L-A-Z-O-R. And what this is,
Starting point is 02:04:10 is basically being able to write your entire web application with C Sharp and doing your templates, like your view templates within Visual Studio. Like basically, bye-bye React, bye-bye Angular, bye-bye all these other front-end client frameworks or GUIs or views or whatever, literally you can have, if you want to boil it down to kind of
Starting point is 02:04:32 what it is, it's basically ASP.NET MVC that gets compiled into WebAssembly and it just runs on the web. So you still have your CSHTML files that are like, I don't know if they're using Razor syntax. I think they are.
Starting point is 02:04:46 I think that's why it says they are. Yeah. So you've basically got those templates and then you've got your C sharp that you write that works with the data and pushes it in and out of the views. But then everything else is handled for you. If the browser supports WebAssembly, it'll publish it in a web assembly app if it doesn't it supposedly falls back so for older browsers like ie8 or 9 or whatever supposedly it'll fall back and use the regular java script route like you're talking about being
Starting point is 02:05:16 able to write full-blown applications and nothing but c-sharp and some html templates with some razor syntax that's cool you know i was originally kind of pessimistic about it i was like you know i've seen stuff that generates javascript before i've seen stuff that generates uh you know html and it's never been real great because it's separating me from the stuff that i want control over but then i remember well what about you know how unity generates web assembly and i'm able to do like to generate a full on JavaScript game from anything I do in Unity that's like 3D, 2D
Starting point is 02:05:49 that's really cool and it's been really great and so I'm still kind of like wrapping my mind around what this can mean for the future but it's really cool to think that like I can write something in C Sharp that runs you know over here maybe it's even a website and now all of a sudden I'm maybe running my website all in the browser.
Starting point is 02:06:08 I mean, I'm still trying to kind of understand it. Obviously, I think that the main thing that they're after there is replacing those or enabling those other frameworks to do kind of cool HTML stuff. But it can also mean really big, other interesting things, just kind of like the opening up the 3D capabilities
Starting point is 02:06:24 or translating 3D capabilities or whatever other capabilities of.NET into the browser so it's gonna be cool yeah I think WebAssembly is like one of the most exciting things happening in the in web development right now the fact that you can you know we will that there's this roadmap to where we're going to be able to do, use strongly typed languages to write this code. If you want, you don't have to, but, you know, because there's other languages that'll support it. I just think, I just find that exciting. Yeah, it's cool.
Starting point is 02:06:58 And on top of it, again, the speed, like I've seen full on 3D apps running in the browser. That's just like if it was running in an application an exe that you fired off on your computer which is cool um go ahead well i was going to say that you know you can see that they they came up with the name blazer because it was kind of like a a play on the razor part of this which anyone that's not familiar with.NET development, Razor is the engine for using in.NET to create your MVC app.
Starting point is 02:07:35 But because it's like C Sharp and Razor, they could have gone like Crazer or just Crazy crazy but i guess they didn't i guess the from a marketing point of view they were like that's probably not so good yeah so but but i'm sure the blaze was on the speed though thinking about it right oh i'm sure so a couple of things to note here this is this is open source you can go to go to GitHub and go to the page. You could put in a pull request. You can take a look at all this stuff, which is amazing, right?
Starting point is 02:08:10 Like the fact that companies are doing more and more of this, especially Microsoft being more open is awesome. If you want to play with this, what I would suggest, because this requires ASP.NET Core 2.0.4, or no, 2.1.4, which is bleeding edge stuff. What I'd recommend is probably go get a Docker image that has Ubuntu, like the latest version of Ubuntu on it. And then that way you can install.NET Core or get one of the images. Microsoft actually has Docker images that you can download with this already in it and run it that way, right?
Starting point is 02:08:46 Don't pollute your system with, you know, something that might not be ready for prime time, but definitely go play with it, man. Like, it's really cool. You can go spend this thing up and download the Git repo and then run the thing. They've even got a demo up on the site and they've got a YouTube video.
Starting point is 02:09:02 So I highly recommend checking it out. It's exciting where this stuff's headed. Definitely. All right. Who's doing the summary? Well, I guess me, this episode,
Starting point is 02:09:15 we talked about services, test layers, embedded architecture, and some tips of the week. And that's it for the clean architecture. It's the pen ultimate episode here there's still a lot of stuff in the book a lot more to it so we heartily recommend wait no this isn't the pen ultimate isn't that what pen ultimate means no i think that's like the best of the best
Starting point is 02:09:35 no pen ultimate would be the second to last is it second to the last last but one in a series of things i was wrong too. Wow, you're totally right. Yeah, I guess I should have just said the ultimate. This is the last. The last episode was the penultimate. By the way, we're done. Well, I mean, the way we worded it last time
Starting point is 02:09:57 is we might come back to some of these topics in the future because there's still a lot of book left with a lot of great topics, but we do want to move on to other topics so um you know hey if you want to read the rest of this then you should definitely leave a comment on this episode you'll be able to find it at www.codingblocks.net slash episode 77 and you can leave a comment there on that episode for your chance to win a copy of this book. And with that, if you haven't already, subscribe to us on iTunes, Stitcher, or more
Starting point is 02:10:32 using your favorite podcast app. Be sure to leave us a review by heading to www.codingblocks.net slash review. Yep, while you're up there, go ahead and check out all our show notes, examples, discussions, and more. And send your feedback, questions, and rants to the Slack channel, we have channels like books and episode discussion and podcast chat, where we talk about all the sorts of stuff that we talk about on the show and architecture and this and that.
Starting point is 02:10:58 So if that's interesting to you, then you can send yourself an invite to that Slack and hop on in. Hey, make sure to hey no keep going just gonna say follow us on twitter at coding blocks they're heading over to cutting blocks that never can find all our social links at the top of the page sorry i had a i had a uh a moment of of i need to say this before i forget it yeah if you guys are going to be in any of our areas orlando or the atlanta area or something and you want to hook up you know holler at us let us know we you know we'll get out of the house area or something and you want to hook up, holler at us. Let us know. We'll get out of the house. We'll come meet you.
Starting point is 02:11:27 We're not totally socially awkward, so it might be alright. I'm so ready to get out of this house. You look like you have something to say. I was very tired. I was just kind of thinking when you said about the socially awkward,
Starting point is 02:11:43 I was like, okay, I'm probably going to be socially awkward, but, you know, that's just me. Yeah, it's all good. So, yep, that's it. Thanks.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.