Coding Blocks - Clean Architecture – Keeping Your Options Open

Episode Date: January 23, 2018

Joe drinks too much coffee, Allen spits his coffee out, and Michael feels vindicated as the discussions about Robert C. Martin's latest book, Clean Architecture, continues....

Transcript
Discussion (0)
Starting point is 00:00:00 You're listening to Coding Blocks, episode 73. Subscribe to us and leave us a review in iTunes, Stitcher, and more using your favorite podcast app. And check us out at codingblocks.net where you can find show notes, examples, discussion, and more. Send your feedback, questions, and rants to comments at codingblocks.net. Follow us on Twitter at Coding Blocks or head to www.codingblocks.net and find all our social links there at the top of the page.
Starting point is 00:00:25 With that, I'm Alan Underwood. I'm Joe Zach. And I'm Michael Outlaw. Freelancers and small business owners, I feel for you. 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 abyss 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 taxes you collected last year? How about pulling
Starting point is 00:00:58 together a profit and loss summary? FreshBooks can generate these reports in seconds instead of hours. It would take you to do them manually. You can even set up FreshBooks can generate these reports in seconds instead of 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 can use your debit card for that meal, 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 blocks in the how did you hear about us section. All right, so today we will be talking about the responsibilities of the architect and how best to express the intent of a system.
Starting point is 00:01:48 But before we get there, let's have some news. What's up? Yep, so first that we always like to start off with are the reviews and a big thanks to all who left them. So first, starting off with iTunes, we got M. Baumbach, Raldo, JeremyRose22, SipplyYoung, Arbinger, DanMarshall909, AndrewScottVT, Gopher, and FearGalWash. All right, and on Stitcher, we've got M. Baumbach,
Starting point is 00:02:26 MadJack, GotSkillsNowGiveMeJob. And one of those was twice. Did you catch it? Yep, M. Baumbach. That's awesome. Thank you very much. GotSkillsNowGiveMeJob. That's amazing.
Starting point is 00:02:38 Yeah, that was a good name. All right, so in other developer news, one thing that was of interest, I don't know when JetBrains snuck this in, but for the longest time, the free tier of TeamCity has been limited to only allowing you to have 20 total configurations. right and uh recently they they with one of their recent updates they've increased that up to 100 configurations now which is awesome yeah that's a lot of configurations yeah that is yeah so i again they also snuck in a cool feature too like um a while back where you know it used to be such a hassle every time you needed to upgrade team city, you know, cause it was always a manual process. You know, you'd log into whatever your build server was and, and, you know, reinstall it from scratch every time. And now, uh, I think it was the last thing. It was the 2018 or 2017.02 or something like that. Like it was like the two
Starting point is 00:03:43 releases ago. I think it's when they introduced the feature where now in the admin portion of the site you can just click a button and it upgrades itself so awesome i feel like 10 years ago somebody would have said you know like who would ever need more than 20 build configurations that's absurd here we are, 2017. Yeah. Only 100? 20 steps forward, 80 steps back. Right. Yeah, so a little bit of news for me.
Starting point is 00:04:15 I have volunteered to speak at the next Orlando.net meetup. I'm going to be doing a little kind of micro talk on dedicated practice, kind of gearing up for potential talk at CodeCamp. And I'm pretty nervous about it. I've done lots of presentations, you know, work work and even the podcast group. I've never done one at a tech meetup. And for some reason I'm shaking in my Nikes. So, you know, wish me luck. Cross your fingers
Starting point is 00:04:33 for me. That's coming up February 8th. Awesome. Everybody go out and watch them. Help them. Yeah. Everyone should, if you're not already in the Orlando area, just go ahead and fly. Make reservations now. You can see some Disney World while you're there. But, you area, just go ahead and fly. Make reservations now. You can see some Disney World while you're there. But most importantly, you can go see Joe Speak.
Starting point is 00:04:50 Migrate on down there. I was hoping more for nobody, but hey. We want standing room only. I mean, I'm going to be drunk anyway, so who cares? Just kidding. Hey, if you want to win a book, we're going to be giving away another copy of clean architecture so uh as we've been doing um just go ahead and leave a comment on the episode and we will hook you up yep and make sure if you're listening to this check your email because
Starting point is 00:05:16 that's how we typically contact you for the winner so uh somebody who won for last episode waiting to hear back so and also if you want to help us out while getting stuff that you want anyways, like things like Pluralsight or the books or anything, a place that we've set up for that is codingblocks.net slash resources. So you can see all the things that we recommend and that we like and we use and all that. And it'll help the show out. You don't get charged anymore. It's the same price if you're going to go buy it on your own.
Starting point is 00:05:44 But we'll get a few pennies here and there and it helps us keep the things rolling. So much appreciated. So with that, let's get into the show and decide what is architecture or maybe we should learn what is architecture. It's kind of weird to be talking about that starting in chapter 15. I thought the same thing too same thing too right yeah and obviously we've been talking about architecture the whole time i just thought it was kind of interesting to kind of um you know draw the line in the same now and say like okay now padawan we're ready to discuss what this all means we're halfway through the book and we can tell you we can wax on wax on, wax offing until now. Although I will say, like, the way this starts out, it's more like what is an architect as opposed to architecture. So, yeah.
Starting point is 00:06:32 And the first thing they say is it makes us think of weighty decisions and deep technical prowess, right? Like, it's the architect. Like, you almost think about the dude in the Matrix or, you know, Gandalf gray or somebody you know like this all-powerful being and right they're really still just programmers right yeah and i thought they'd really hammer the home that like the architect is really still a programmer you are still down in there otherwise you're going to be separated from the problems that you're trying to solve and you're not going to be attached to it yeah it's important that the architect feels the pain. And that's, man, that's huge.
Starting point is 00:07:11 Yeah, that part right there is how can an architect be doing things to improve the overall system if they don't know the state of the system in the first place? Now, I can imagine being an architect and not having a program along and be like, yeah, sure, DI all the things. What's this, you know, a new, like, where's your test coverage? It's so easy to say, you know, like, where are all the best practices? But once you get in there and actually try to start doing some things,
Starting point is 00:07:30 everything changes. Yeah, he does say that the architect might not write as much, though, as the other developers. Right, but they still have their hands in it. They still see, because it's all about, and we talked about in the previous chapters, this is about the shape of the software and and if the architect's not seeing that then they can't make decisions or any informed decisions on how to improve things
Starting point is 00:07:53 do you think the architect has to be held to a higher standard like do you think all the programmers are like oh check out what mr architect did today i certainly hope not yeah that's right like the architect's code has to have all of the best practices oh man like it has to be amazing scrutinizing your variable names i i mean i will say like having the title architect one of the things that i do take on upon myself is like some of the things that i hear that people complain about, like I really try and make sure that I try and move us in a better place. Right. Like I'll even take extra time on something that I'm working on to say, well, we're feeling the pain because we have this one huge project. Right. Like how can I break this thing up into meaningful chunks so that so that maybe we start evolving some patterns so that other people can do that, right?
Starting point is 00:08:46 So, I do try and take it upon myself to look at the pains and hear the pains that people are saying and see them myself and try and move away from some of those pains, you know? You do a great job about doing presentations after doing something interesting. So, I really appreciate those kind of tech talks and brown bag lunches. And I think all organizations should consider doing that sort of thing. So that's actually, go ahead, Mike. Well, I was going to say like another way that we could put that then is that the architect kind of leads by example. Yeah. I mean, that's sort of what in my role as architect that I try and do. I will say that is what you just said, Joe. That is actually one of the more frustrating things is when you do make
Starting point is 00:09:31 changes, how do you communicate that out effectively, right? I think we've talked about it in the past about how you can talk about system scaling and all that kind of stuff, but how do you scale communication? When you have a team of 25, 30, 40, 50, 100 developers, how do you communicate stuff effectively, right? And that's actually really hard. I mean, I think with the clean architecture, we talk about breaking things up into components that teams work on. And that's nice.
Starting point is 00:09:59 But then once that component's ready, how do you communicate that out in any kind of meaningful, effective manner? That's actually a hard problem. Well, part of what the, you know, one of the other themes though here was not just breaking things out into components, but it was like the chains of communication among the teams, because that would be a dictator in, you know, somewhat as to how things might, how the pieces may fall. Yeah, definitely. So we're actually going to talk about that here in a little bit. But rolling along here, the nodes, one of the things that we have here is, and we talked about previously, is the purpose of the shape of software is to facilitate the development, deployment, operation,
Starting point is 00:10:38 and maintenance of the software itself. The strategy that they keep pushing for in these two chapters is to leave as many options open as late as possible, which I really thought was interesting. We'll be going into some techniques on how to actually achieve that later. But they also really hammer home the point that software architecture is not about the correctness of the system. It's just about maintaining that
Starting point is 00:11:05 development, deployment, operation, and maintenance. Yeah, that was really interesting. I love the fact that they were like, yeah, it doesn't matter if the software works. That's not what you're trying to solve with the architecture. You're trying to solve how do you improve the ability to move forward on it. And one key point is they say that architecture has almost nothing to do with the behavior of the software, right? It's just about how the pieces fit together. It's all about that life cycle. So another way to say that then would be the non-functionals is what we're saying. Yeah.
Starting point is 00:11:39 There's the functional requirements, which is how the system behaves, but then there's the non-functional requirements. And that's more about where the architecture comes into play. Yep. Well, there's that. And there's also, we'll get into it in the next section here, but also about expressing the intent of the system. So I think the non-functionals are really important and it's really important that we leave those options open.
Starting point is 00:12:02 But we also want you to be able to tell what our system is about by looking at the code. So we want to make sure that the intent of the system is kind of reflected throughout the code. Yep, great point. And as we all know, hard to develop software equals unhealthy software. The harder something is to do, we find ourselves taking shortcuts. Like, you know, I don't really know how this works.
Starting point is 00:12:24 It's really fragile. So I'm just going to add add a little function try to change as little as possible and that's how things kind of you know grow even worse and more complicated over time yeah and he says that you know small teams probably don't think about or need to think about the architecture because they can work well and create a well system without having to draw lines between these different components. But I wonder too, if that in part plays because it is a small team, it's easier to communicate. Yeah, I'd lay money on it. Yeah, totally. But you know, the funny part is the very next thing he says is this is probably why most software systems aren't architected. Well, it's because they'll start out with that small team,
Starting point is 00:13:06 right? Like think about it. You're, you're a startup company. You write your software, you're, you're doing it fast. You're doing it agile.
Starting point is 00:13:12 You got, you know, three or four of your buddies next to you. And then all of a sudden the thing takes off and now you scaled your team out to 20 people. And now what worked for a small team doesn't work for that large team. And so it's not architected well, because now you have different concerns. Yeah. Think about how we teach people to
Starting point is 00:13:31 program. You go to a four-year university, maybe you'll have a big project by the end of the year, maybe not. If you go to a bootcamp, you usually start with a blank notepad. They encourage you to do small little projects on your own time, throw them up on a GitHub page. But all this small, small, small doesn't really leave a lot of room for getting experience with maintaining large systems or maintaining an architecture, which is a shame, but I don't know how to fix it. Yeah, so he goes, continuing along with this, this idea, he says that systems developed by multiple decently sized teams need to have dividing lines, you have to split up the concerns, you have to split the components. And, and, you know, those dividing those lines goes i'd like say even if you're on a team of 20 people it kind of is implying that hey um maybe we shouldn't keep spreading people around so that they're everyone's familiar with everything like maybe we should kind of keep people in the
Starting point is 00:14:33 same area so they can kind of build and develop those systems and and uh enforce those lines yeah it's interesting because they even say a lot of times what will happen is if you have split up teams, typically your number of components ends up being the number of teams, right? And that may not necessarily be the best thing to do either. And we'll get into how you can actually slice those things up better further on here. So the next session that we get into is the deployment. And this might seem like a shocker, but software should be deployable. And he wasn't being facetious about it. Basically, what he was saying is it's usually an afterthought, right?
Starting point is 00:15:17 So software that is harder to deploy is usually not as useful because if you're spending all your time trying to get something deployed then you're not spending time developing the functionality and making the system better and i remember working on the early days of dynamic languages there was a like a really strong culture of working sometimes even in production because you didn't have data or whatever you needed in the staging environment so you would work in production and then hopefully you remember to bring that down to source control hopefully yeah visual source safe yeah he also makes me feel better though too because he he mentions that the deploy the deployment of it or the deployability of it is something you don't really ever consider up front. Yep. And it's funny because there's a little buzzword
Starting point is 00:16:07 that we'll talk about in a second. But he even goes on to say, and Outlaw has a lot of experience with this, is software should be easily deployable with one action. And he can even tell you, I mean, you've done quite a bit of DevOps type stuff. That's not a small task, is it? No way, man.
Starting point is 00:16:29 I mean, like, just think, just think of some of the tools that are out there to handle it. Just in like a.NET world, you know, there's some common ones like there's JetBrains, there's Octopus Deploy. There's, you know, the stuff built into team services, for example. And I'm not even, I'm not even scratching the surface yet. I haven't even gotten into like all the other languages, you know, tools that are out there for them too, you know? So yeah, I mean, there's each one of those tools that you gotta learn and then understand this configuration, but then trying to piece together the right way to build in there,
Starting point is 00:17:04 you know, and then figuring out like what pieces had to be deployed in the right way to build in there, you know, and then figuring out like what pieces had to be deployed in the right way. And then trying to automate that to where it's repeatable. And now there's just a simple button to click to do that one time to a new instance. That's no small task, but it is an extremely valuable task. But at least you do it once and you're done forever, right? No. That's the sad part. and you're done forever, right? No. That's the sad part. Like that's the hope, right?
Starting point is 00:17:30 Like you would, you would like it. Yeah. When you start digging into it as well, you know, he just mentioned some of the technologies that he has to use, but then you have to think about things like, well, how do you keep artifacts around? You know, how do you orchestrate these things? How do you like, there's, there's tons and tons of things. There's a reason why DevOps people get paid a lot because you're a developer for developers, right? It's a really important role that enables teams to move faster. It's almost like you got to treat configuration
Starting point is 00:17:57 as code, right? So that's why it's not going to be like a configure slash write once and then forget about it. And then there's your build system forever. And you never have to think about it a second time because you just as your code evolves, so are the configurations as to how you're going to build that system. So you are going to keep evolving it. Yeah. I mean, it was worth a little sidebar because it's something that if you're interested in it, you know, definitely get into it. It's, it's a, it's a huge world and there's a lot to learn and it's kind of fun and it's a little frustrating and it's always changing. One of the things that I loved and, and we've talked about this in the past is microservices, right? There was a huge move towards them without the knowledge of some of the pitfalls to them. right? And they even talk about in the book
Starting point is 00:18:45 or Uncle Bob talks about in the book that when people decide they want to go the microservice route, typically deployment is the very last thing they think of. And it is probably the one thing that will cause you more pain with the microservice architecture than just about anything else.
Starting point is 00:19:03 You can imagine a new team starting off on a new project, getting the microservices set up, you know, finally getting to where they need to deploy something. And you realize like, crap, we're three months into this project and we're still kind of messing around the pipeline. We haven't really made much progress towards the future goals. Yeah. And then when a microservice fails, how does that thing get deployed back out? How does it get started back up?
Starting point is 00:19:23 Like there are so many moving parts when you work on a microservice architecture. So I thought that was really interesting. Yeah, it's really important that the architect consider the deployment. And so as the architect role, you're responsible for thinking about this sort of stuff up front. And if you didn't think about it up front, it's kind of steering you back to a good spot after the fact. So it's not to say that microservices are bad because I feel like they get kind of picked on. But it's just that you got to realize that the more variables that you introduce into your overall system's ability to work, to function correctly from, you know, from end to end end then each one of those variables is is going
Starting point is 00:20:07 to introduce complication of some sort and with a microservice i mean it's its own system so yeah it's called micro but really is it i mean it's still it's still the functional equivalent in terms of like configuration and everything as another system. Right. Right. So now you're just like multiplying out all the, you know, you're just, you're just adding on additional variables, uh, to your overall systems configuration,
Starting point is 00:20:33 which is why it becomes more painful or can be more painful. You know, our buddy, uh, will, um, he sent me something about, uh, like a, a go framework for protocols, but I only glanced at it quickly, but it looked like it was a good way of being able to deal with local code as if it was a service. So if you want to microserve it later, it's easy to break up, but you don't have to deal with a lot of those complexities first.
Starting point is 00:21:02 And I think that could be a really good option. And I think that more and more frameworks and more and more people are thinking about sort of ways to kind of start with that monolith, but do it in such a way that you're not pinning yourself into a corner. Yep. And next we're going to get into the operation of software. And when I first read the title of this, it wasn't clear to me what they were talking about really what it what he's getting into is the how efficiently the software runs like is it fast enough does it is it not destroying your servers or whatever the case may be or even your desktop it was desktop app right this is usually never the first thing you think about when you're like never a problem yep and it's because a lot of times they even say don't micro optimize right like don't don't consider it because you
Starting point is 00:21:50 need it yeah hardware is cheap and and they even talk about it in this like typically the answer is throw more hardware at it right throw more ssds throw more networking bandwidth whatever the case may be just add more cpus and yeah that's true and the reason they say it is because it's way cheaper than a software developer working on the system trying to micro optimize something and i think especially with the rise of cloud competing and you know for a long time it's just throw more hardware as virtualization is kind of taken over i think it seems to be more of a concern back when you would go ahead and buy and provision servers months ahead of time.
Starting point is 00:22:28 But then again, we've got Meltdown and Inspector. So with the cloud costs shooting through the roof, we'll see how that applies to developers over time. Yeah, your efficiency of your computer went down like 30% overnight. Yeah, if my bill is 50% higher, then we're going to be talking to those devs about getting those loops under control.
Starting point is 00:22:48 Right. Yeah, so one way that he summed this up that I liked was he's referring to the fact that the hardware is cheap and that the people are expensive. So he says that architectures that impede operation are not as costly as the architectures that impede the development and the deployment and the maintenance. Because that's where your people time is spent, right?
Starting point is 00:23:08 That's where your man hours are going to be spent and therefore your cost. Who cares if it takes a second server to run? Exactly. Because that's a fixed cost. One time and you're done, you never have to think about it again. Well, that's the hope, right? Ideally, though, a good architecture should communicate the operational needs of the system. You know, what I think it means by that is by just looking at the various components and breakdowns,
Starting point is 00:23:35 like you should be able to kind of see where the brains are needed, at least at a high level. Yep. Yeah, he says the architecture, another way he phrased it, because he said that point a couple times, and he phrased it a second time as the architecture should reveal operation. And I'm still trying to like kind of wrap my head around exactly what does he mean by that? Like when he says reveal operation, does that like oh hey uh we're gonna use kafka so then you think oh okay well i gotta i gotta use kafka so there i know what that architecture is going to look like and you know like what i don't understand i'm still trying to figure that one out i'm glad i wasn't the only one that read that and was like well it makes it itself apparent
Starting point is 00:24:19 to the developer the only thing i could think is is the breakdown of maybe your projects or your jars or whatever will communicate, you know, like, I don't know, maybe you have something that's like, you know, high bandwidth or, or, you know, a gazillion new processing per second types. I don't know what it is, but somehow it should jump out at them so that they know what they're dealing with. Yeah, I was in the same boat until reading the second chapter. And then I at least kind of rationalized it back to myself and thought like, oh, I think what he was kind of saying here ties into the idea of horizontal layers. And so ideally, your components would kind of reflect that layered approach. And so that, you know, if you kafka involved and a website involved you shouldn't ideally have a component that kind of ties the that in your middleware all together and so you've got kind of one component that spans three different layers because that obfuscates the
Starting point is 00:25:15 operational layers and so it's not a clean line between the different layers that you can use to kind of scale independently and so that's kind of where my head was at after reading that chapter correct or not okay i mean i like that it's much better than what my original go-to was because originally when i first read it i immediately thought like oh he he's referring to like um you know your your system exposing like its apis right like it's it's rest endpoints and things like that but But then I'm like, wait, wait, wait, wait. This is operation. This isn't development. Right.
Starting point is 00:25:49 Man, random side note here. If you hear the scratching, that's my dog. You guys have dogs that try and dig a hole through China in their beds? What is that? They'll sit there and do it for five minutes, and then they're like, well, that's good. Nothing changed. They'll just lay down. i don't get it not not exactly like that but i did once have a dog that would
Starting point is 00:26:10 pretend he was digging and burying his toys and he would even take the time to to cover the whole back up yeah it was hilarious to watch he's like you can't see that right dad you get you get so mad if you just like it's right there i picked it up yeah i'm doing my due diligence i mean you know i'm pretty i'm pretty sure that was on like some lsd or something oh man that's awesome all right so next up we have maintenance and this shouldn't be surprising to anybody who's been a software developer for a while maintenance is the most costly aspect of software yeah and it's also uh horrible i think this is the hardest part right like being able to make changes to things and do it
Starting point is 00:27:00 doing it in a good and clean way and fast um Yeah. And just to, to expand upon that a little bit, like typically when we think about maintenance, you think about something in your house, right? Like, oh, the, the pipes burst or, you know, my, my faucet's leaking or something. We're not talking about that kind of maintenance. When he talks about maintenance here, he's talking about making changes to a system. So as, as things go on, it's not just fixing things that are broken. It's how rough it is to add something new. And they say the reason why maintenance is the most expensive is because you're typically spelunking through the code, right? Like you were exploring the code to find the best place to add something.
Starting point is 00:27:41 And then there's always a risk when you do that right and i do love the use of the word spelunking as a way to describe how we work because i'm like that's so true it is it's an exploration right like you're walking through a cave in the dark trying to figure out okay well i see how they did this what's how do i add something to it so that it's not completely you know foreign like how do i fit some sort of pattern in here and and anytime you add something you add risk and and so that's why you know you potentially introduce a regression or whatever and hopefully you've been adding unit tests so that that's less of a problem but you know maybe not yeah based on our survey results probably not
Starting point is 00:28:26 walking through the cave is optimistic like my cave the caves that i write you're going to be crawling upside down like which way is up you're going down you're going up who knows spirals so you know going back to that about the most um the primary reasons for it being the most costly are the spunking and risk, I want to throw a possible amendment and see if you guys agree with this statement, though. of any software is because that's the longest time cycle of the software's life cycle. That's the longest period of time of its life cycle. I don't, I maybe depends on the software because I mean, some software,
Starting point is 00:29:20 like I don't, I can't think of anything off the top of my head, but maybe it just runs for years and years and you never change it right let me just phrase this a different way um your initial version of windows was created decades ago everything after that has just been you know adding on new features and main maintaining that to extend it but going forward right does that sound anything that's changing totally yeah i could see that well most software is changing right like most software doesn't just get written and thrown away in a closet and you never look at it again or if you do that then
Starting point is 00:29:58 it's probably like super hacked by now that's i guess you'd call that machine a honeypot yeah that's probably right you know i think machine a honeypot yeah that's probably right you know i think about like starting a new project though and like you know that first week you're just making amazing progress let's say you're making some sort of application website or something you got 17 pages like week one you've got 17 pages out there and they're roughly in shape and they're like week two well you still got 17 pages and i mean some things aren't working week three week four well you know next thing you know you're in week six and you're still like working on stuff and you know someone says add a checkbox or rearrange this and you're like that's gonna take a day and
Starting point is 00:30:31 like it took you a week to do the whole thing what do you mean it's gonna take a day to move this thing around it's so true well to put this a different way i mean we've talked about um greenfield applications and brownfield applications, the majority of the software that you're going to work on is going to be brownfield, meaning you're not creating something from scratch. It was already created, right? So, you know, you're adding a feature or maintaining like that. I consider adding a feature a form of maintenance, right? It is. If you're complying with a new standard that's a new fan a new a new uh
Starting point is 00:31:06 feature right but it's also kind of maintenance right yeah you're you're plugging it into the old system somewhere so it might be greenfield for that one little component but you're still having to make sure that it fits into the existing app somewhere so yeah and and the whole key of this part that they talk about is a well thought out architecture greatly reduce these costs or risks. And we'll be getting into why here in just a minute. So in other words, going back to like the Windows example, right? Because you could break things out into, say, separate DLLs, separate applications, you can mitigate those risks by keeping, as you mentioned, that new feature is the greenfield component, even though it's fitting into a
Starting point is 00:31:53 larger overall brownfield application or system. And going back to the previous chapters, if you try and keep those couplings between those new features in a good state, then you can stay in that. What was it? Zone of usefulness and stay away from the zone of pain or the zone of uselessness. And really, that's looking at those is how you'll do that over time. Stay along the main sequence. Yes. Which reminds me, we got a lot of feedback about our
Starting point is 00:32:26 description of graphs again. Sorry about that, guys. We're working on it. But if you do head to the show notes for that episode, we do have a nice picture there that sums up very quickly what our thousand words had a hard time with. Yeah. I mean, honestly, that's the thing, right? Even in major companies or even small companies, dashboards are all the rage because a picture tells a thousand words. So we try and describe it as best we can, but talking about lines and graph points and all that stuff, unless you've got your TI-82 in front of you, is there even a thing anymore? Yeah, and they cost the same. Are they really? They're still there?
Starting point is 00:33:02 Yeah, I sold mine actually not that long ago and got $60 for it. I'm like, what the heck? This thing's like 20 years old. That's amazing. So the next portion in what we've tentatively titled the show after is keeping options open. Because this seems to be the big thing. Software has two types of value value the behavior and the structure yeah and he says it's the structure that's what makes it soft the soft and software yeah i remember the whole advantage of software over hardware is yeah it's slower but it's so much easier to
Starting point is 00:33:39 change and malleable and we can roll this stuff out quicker. So the softer we can keep our where the better. And it's funny because they talk about by, by keeping the option options open as long as possible. They even say things like when you're designing the software, you're doing something, you know, don't make that decision that it's SQL server or it's my SQL or whatever, you know, think about it in a way to where it doesn't matter what it is. You can plug in the thing, right? It could be an RDBMS like those two mentioned, or it could be a horizontally scaling thing like Cassandra or, you know, DynamoDB or something like that. But really the thing shouldn't be, how do I design my software to work to this particular application, right? Like, think about how can I make the software work in the proper layers so that that's just a detail that's plugged in at the end.
Starting point is 00:34:34 Well, first, make it work, right? But yeah, there was this great summation of that where it was, you know, options that can be left open are the details that don't matter. And it seems weird, right? Like to say something like that, especially in terms of a database, because if you've been working in software for any amount of time, chances are you've been working with things that are backed by some sort of database storage, right? And almost always, that's the first thing that's done, Right. I mean... Well, I mean... I'm sorry. No, go ahead.
Starting point is 00:35:07 Well, I was going to say this in like another way, like, you know, taking your database example, like you might be fine from reading from the database and not realize like, oh, maybe we should bring in some kind of streaming technology. Or we've talked about caching before in previous episodes. Like in the beginning, you're like,
Starting point is 00:35:20 who cares if I reread that value from the database every time that it's needed right until you realize like okay fine this thing has scaled out to the point where it's like i should probably cache that thing and and you know read it from memory because it's a lot less expensive to read it from the memory um you know those are the details they don't matter until they do right and once they do that's when you you take the time to invest into those technologies in in the time but you know leaving that option open for as long as possible allows you to delay that decision as to how you might even solve that problem and then by the time you
Starting point is 00:35:58 are you you are ready to solve that problem you have a lot more information at your disposal so that you can make a proper decision as to what's the appropriate way to tackle that problem. Yeah. And think about it like this. When you go to describe your product to, you know, say an investor or to a customer or whatever, you don't say it's a SQL server app running on C sharp, but you know, you know, you don't spend that 30 seconds describing your, your tools, you talk about the features unless, unless it's one of two areas that I know about in which you are very likely to mention, uh, mention them in your company pitch. And one is machine learning. I feel like every company, if you've got like 1% machine learning code, then that machine learning is in your business description.
Starting point is 00:36:43 I agree. that buzzword is so hot yeah and uh the other i can think of is blockchain in which it's the technology itself is so hot right now that not only will you have it in your business description right you'll have it in the name of your company now it's when when technology becomes buzzwords that's basically what you're describing i remember like back in the 90s, like when Java became the thing. Do you remember that? Like you literally see it advertised on TV. And I just found it hilarious because I'm like, wait, why do we care?
Starting point is 00:37:17 Why does that matter? Why is that important? Man, I just saw an article the other day. And it's funny that you mentioned that about like machine learning. I think the co-founder of Google, I can't remember which one it was, but he said that machine learning is going to, or artificial intelligence or machine learning, I can't remember which one it was, was going to be more important than fire and electricity to mankind. That's a pretty bold statement. And that's why these buzzwords go off like they do, right? Yeah.
Starting point is 00:37:46 I mean, it's kind of ridiculous. So next up, they say that all software can be broken down into two themes, the policy and the details. And for the life of me, I think because it's early, I can't remember what the policy was. Reading on the notes, it says the policy is the true value of the system that sums it all uh not really all right it's up to you to save this all right you're welcome so the details would be like the configuration things like that like um where where are you going to have your database it's going to be on this other server we're going to keep it separate from the app server those are those are details right policy would be more like the overall function how things are work like how are we going to authenticate a user? Like that's policy,
Starting point is 00:38:29 right? Like how are we going to validate an order? That's policy. Those are the things that truly matter. Like you want to make sure that the user who logs into the system is who you think they are and they are who they say they are. And when they place an order, that order is legit and that they actually intended to place that order and that you're charging them the correct amount and the correct amount of tax, and you're going to ship it to the correct place. Those are all the, but how you do it is the details. Those are the policies that matter. The details are all the other things like, Hey, are we going to use SQL server? Or are we going to, is my SQL good enough? Or maybe we don't, maybe a no SQL solution is the the thing way to go maybe a document db right like those are
Starting point is 00:39:05 details that are that aren't as that's not the value going back to what uh the example joe gave those are the details that you're not going to go to a customer and say like hey you know you should shop with us because uh we use mongo db said no one ever right and that's not a jab at mongo db i'm just saying like those are the type of details that nobody cares about right right said no one ever. And that's not a jab at MongoDB. I'm just saying those are the type of details that nobody cares about. Right? Right. Nobody should care about that stuff if at all possible.
Starting point is 00:39:34 So yeah, they say the goal of the architect is to shape the system so that the policy, which is equal to the behavior of the system, is the most important aspect while making the details irrelevant to the behavior of the system is the most important aspect when making the details while making the details irrelevant to the policy. So loosely couple those things. Yeah. Your, your, how that order gets placed should not care if the system is going to save that data to SQL server, for example, or MySQL or Mongoongodb like that that should be irrelevant so this also kind of goes along with our our discussions about domain driven design too right
Starting point is 00:40:11 if you think about that right because then you're keeping the domain which you know in one book it's the domain and then this book it's the policy right you're keeping those things separate from the details of the system so know, like maybe in our domain driven design discussions, it was the repository pattern, right? So that you could, it didn't matter what the underlying architecture was. You're just going through some repository to do your reads and writes. Yep. And that's where things become pluggable, right? Like, you know, that you're going to have an order. Okay. Where's that thing get fed from or where does it get stored at? Who cares, right? Figure
Starting point is 00:40:45 that out at the time that you need to. There was this really great quote that I loved from this section of the book that I wanted to include where he says, a good architect maximizes the number of decisions not made, which seems so counterintuitive, but yet it really sums up what he's trying to say here, which is like, just leave as many options open as possible. Don't make those decisions yet until you have, until you're armed with the proper information to make them. Yeah,
Starting point is 00:41:18 I really like that. And it reminds me of the notion of the last responsible moment, which you can see kick up on the blogosphere once in a while,, but it's just the idea of deferring decision until you have as much information as possible. So don't make decisions early, make, don't make them too late either. So it's about figuring the right time to defer this is until you have as much information as possible, but it's not too late to make any wrong decisions. Um, however, don't tell your, you know, your boss don't tell your hiring manager that um you specialize in deferring decisions so that's not going to go
Starting point is 00:41:50 very well i'll tell you i'm gonna put that as a skill on my resume defer decisions yeah my significant other does not appreciate this uh this idea either well let's let's bring this back in house then um so not to pick on alan but i mean we've joked quite often about like alan will start a side project and it goes off in like you know a random tangent because it has to support a billion concurrent users before the first line of code is written so like you know it gets um you know caught up in all of these details that don't matter because, you know, making the system functional is the policy. That's the number one goal, right? And I mean, I know it's a joke, but, you know, I mean, that's the kind of idea here is like, don't get caught
Starting point is 00:42:35 up in trying to support a concurrent, you know, some insane concurrent number of users yet. Who cares about their operation of it yet? Just make it functional and then we'll worry about those problems when they become a problem. Yeah. And let's be clear, when we're talking about real software that you really have to write, you should definitely take these to heart. When you're doing something on the side, if you're trying to explore some technology because you have an interest in it, you know, and that's what your goal is, do whatever the heck you want. But definitely true. When you're definitely true when you're, when you're actually trying to accomplish something, there's a, there's a goal that
Starting point is 00:43:08 you have to achieve. Then, then yeah, man, don't get, don't get tied up in stuff that doesn't matter. You know, do what you need to do to get the thing done. And then you can revisit the other details later. Yeah. So wrapping up this section. Oh, go ahead. No, no no that was it go oh wrapping up the section good architects separate the policy from the details so thoroughly that the policy has no knowledge or dependency of the details what does that really mean it's just uh to me it almost sounds like the the ddd like domains uh domain driven design ubiquitous language like the policy is the language of the users it's the language of the system it's person logs in does this thing does that thing and the details are
Starting point is 00:43:50 the sql servers it's the configuration it's the you know how the the nuts and bolts work and so the idea for the architect is to basically keep those keep those things abstracted and keep clean lines which is the thing that keeps returning, keep those clean lines up. I do love how a lot of our previous conversations and episodes are like all sort of coming together, right? Like it's all these little building blocks and these pieces that start to make more sense when put in the context of, well, why does this matter, right? Like it's easy to see why clean code matters because everybody's going to be coding behind you. But then why does it matter that you have a domain? And why does it matter that you have these other things?
Starting point is 00:44:30 It all really starts to make sense, especially as teams grow. So with that, we would love to beg you guys to, if you haven't already, please leave us a review. We say it all the time. We read them. We love them. Even the ones that are painful, we read and we take into consideration. You probably noticed that our news section is a little bit shorter now.
Starting point is 00:44:54 And it's weird. We're not going to be able to please everybody, right? Like some people love the banter that we have because it's more personal, right? And then some people just want a lecture. And we try and, we try and walk the line. So, you know, please do, if you have a moment, go out there. If you haven't already leave us a review for the most part, it makes our day. Some of them don't, but you know, we, we do take them to heart. So you can do that by going to codingbox.net slash review. All right. And with that, we'll go into my favorite portion of the show.
Starting point is 00:45:28 Survey says, all right. That was very important. So I love that. So last episode, we asked, how often do you shut down your computer and your choices were shut down daily every week every month only when the updates force me who shuts down their computer or my favorite i don't shut down often but when i do it's because it blue screened or Colonel panicked. And then they ride in only right before taking some much needed time off. All right. So let's go. Who wants to go first? Anyone?
Starting point is 00:46:17 Me. All right. Joe wants to go first. He sounded like Roadrunner when he did that. Me, me. Me, me. Yeah, sorry. I'm at peak caffeine right
Starting point is 00:46:25 now we're actually recording this episode in the morning i've got my coffee right here i am flying right now i haven't been beat down by my own code mistakes yet yeah you and my dog that does the imaginary digging are flying yeah i think alan almost spit out his coffee he disappeared off camera all right so what do you think joe uh i'm gonna say uh only right before taking some much needed time off because i think you can disable those updates from automatically restarting your computer. And I think that a lot of programmers are like me. All right, go ahead. Sorry.
Starting point is 00:47:09 And we're going to go, and I'm going to go with the write-in that I annoyingly snuck in last time. At what percentage? 26%. 26%, all right. That's pretty high. But you can't disable that in Windows 10, can you?
Starting point is 00:47:22 Man, no, it's really hard to. Like that was, that's what i remember was that especially if you did the free upgrade you absolutely can't only on like the enterprise levels you get some that the administrators can have some controls over it but it's still kind of forced they just get some um discretion as to like when they roll those out was like the way i thought it worked with yeah we're in windows we're developers you know you know what's funny before i answer mine here is it is ironic that every other device you own has these forced updates to some degree right and people don't get that mad about them but
Starting point is 00:47:56 there's a difference right typically when you're working on a computer you're being a producer of some sort when you're on another device you're a consumer so you're like ah whatever if it restarts it's not going to kill me but if you're in the producer of some sort. When you're on another device, you're a consumer. So you're like, ah, whatever. If it restarts, it's not going to kill me. But if you're in the middle of writing some code and you left it up overnight and all of a sudden your computer shut down, you're like,
Starting point is 00:48:12 oh my God, you know what just happened? Like it's a different world. But so for me, I'm going to say who shuts down their computer and we'll go with, uh, I'll go with 30 all right so we have only right before taking some much needed time off at 26 of the vote and who shuts down their computer at 30 of the vote right we're either of us even close i feel so vindicated no people don't do it not every day
Starting point is 00:48:47 no my brethren daily for the win how much it it had uh it was over 37 of the vote wow it was strong like the two options that you guys said weren't even close not even close it was number two weekly number two was uh shutdown was like 37 and a half percent shutdown daily was 37 and a half percent only when the updates forced me was 36 those were far and away the top two choices weekly was a distant third wow man yeah and people be crazy i got time to shut down everything started all back up that's ridiculous we need to create a profile for like the average survey responder to coding blocks we know you got a busted a busted phone well there was actually a restart your computer there was actually a comment that came in, and I don't remember who wrote it now, but he was saying that he took his to more extreme where he'll reboot throughout the day.
Starting point is 00:49:52 Every time he would start a new, he would start a clean slate anytime he was starting a new task, right? So anytime he would context switch, he'd be like, okay, let's clean slate, start it all over. Yeah. And I mean, that's why I like to do it. That's a Windows developer. They are on Windows for sure. Yeah. Nah, man. No, honestly, Mac with VMware, you're doing it every two hours. I mean, I like the kind of idea of keeping it from a clean slate, but also part of my reason is just battery management. Like if i'm not using the laptop because that's what i typically work on i'll just go ahead and shut it down when i'm done for the day so that i can just unplug it because i don't want to leave it charging you know when
Starting point is 00:50:36 i'm not using it and then the batteries swell they've gotten so much well you've had the swelling problem i've never had that so so I haven't been as worried. But I mean, generally, that's what kills laptop batteries though, right? It's just like overcharging them. Yeah. All right. So for this episode survey, we ask, is it okay for a site to open links in a new tab or window for you. And your choices are, absolutely. No one's got time for holding extra keys. Or yes, but only for links to external
Starting point is 00:51:18 sites. Or yes, but the site better warn me first. Or, lastly, no, nope, never, nuh-uh. That's what control or command click is for. I'm going to reserve my thoughts on this one. I don't know if I want to bias anybody's opinion. I definitely have strong feelings about this. I can't wait. I can't wait.
Starting point is 00:51:48 I can't wait to see these results. I'm actually twitching a little bit inside because of some of these and it's so hard it's so hard not to say something i just realized i feel differently based on whether i'm using my mobile phone or a browser oh man yeah we must defer these yep put that on your resume. I defer decisions and discussions. But seriously, nope, not ever. Who's had to leave this time? Small business owners, it's time to be honest about how you feel when dealing with your day-to-day admin work. Admit it, you can't stand it. It's a total grind. The truth is over 5 million small business owners felt exactly the same way until they discovered FreshBooks.
Starting point is 00:52:40 FreshBooks is the dead simple cloud accounting software that's transforming how small business owners handle their paperwork. Invoicing? No problem. Using Fresh Books to create and send an invoice literally takes about 30 seconds. There's no formula or formatting, just perfectly crafted invoices every time. Online payments? Your clients can pay you online, which means you end up getting paid a lot faster.
Starting point is 00:53:06 How about project deposits? There's a super handy deposit feature, so you can invoice for a payment up front when you're kicking off that next project. Insights? Freshbook can even show you whether or not a client has looked at the invoice you've emailed. This is only a fraction of what FreshBooks can do for you. You owe it to yourself to feel the full effect of FreshBooks on you and your small business. For a 30-day free trial, just go to freshbooks.com slash coding, that's C-O-D-I-N-G, and enter coding blocks in the how did you hear about us section. All right, so recapping what we've already covered here,
Starting point is 00:53:47 an architect must support use cases in operation, maintenance, development, and deployment of the system. And so let's go ahead and get back in here, and let's talk about some of the use cases where the architect must support the intent of the system. And this is what we kind of referenced a little bit earlier. The idea here is that a shopping cart system should look and feel like a shopping cart. You should have big, obvious kind of reflections of the intent. So what I'm trying to say is like a shopping cart system,
Starting point is 00:54:23 you should have a big obvious chunk of code for adding items to cart tracking the state of that placing orders removing items like these are the kind of things that should jump out at you when you see the system as opposed to having shopping cart system you double click in there and you see a bunch of um you know i factory factory i abstract you know a bunch of um god i'm doing you know, a bunch of, um, God, I'm doing terrible. Well, how about I put it this a different way? How about, how about to say that the shopping cart application supports the intent, the architecture of it supports the intent. Then you might think that, um, that you would have a component for order handling, uh,, a component for customer authentication or customer management, a component
Starting point is 00:55:09 separate for product listing and product searching, right? And fulfillment. Each of those components, right? Because before I described where I got kind of confused about something he said as it related to operations about, you know, my mind immediately went to thinking about like, okay, well, the APIs are exposed, right? But this, we still haven't even gotten there necessarily. Like we're, or maybe we have because we are talking about use cases. So, yeah, what do you think?
Starting point is 00:55:37 This is exactly what Joe said to me earlier was this is when you start getting into things like domain driven design, right? Like, so if you're thinking about, you know, a project like a.NET project or solution, you'll have projects in that solution, right? One would be just like you said, order processing, one might be product listing, another one might be, you know, order fulfillment. There's all these different things. And if you have these projects named properly, the intent of the system should jump out at you, right? Like you should be able to look at it and say, oh, okay, this is a shopping cart or this is an order management system. Are payments fulfilled? They're in my payment project. Yeah, exactly.
Starting point is 00:56:17 And I think that's what they're getting at here is, you know, what Joe was saying is, you know, you shouldn't just have a ton of folders called factory and whatever else. Like don't have a project called, you know, factory project. This thing should be, this is an order management or this is whatever. At a high level, the next time you open up your favorite IDE, Visual Studio, Eclipse, does anyone use Eclipse anymore? They still use Eclipse. It's still highly recommended, by the way. That's why I was making the joke. But yeah, at a high level,
Starting point is 00:56:55 you should see those use cases at a high level by the projects that you might see in that application. Yeah, and the first thing that kind of jumped out to me was back in the day, I would do a lot of stuff with ColdFusion frameworks or even a lot of the SPAs and a lot of like, I've seen this a lot with Java programs. But you go into, you get this, you know, you download this project, you go in there and you see, oh, models use the same with ASP. Here's my models, my views, my layouts, my, you know, whatever.
Starting point is 00:57:21 It's basically the framework. Okay, well, what the heck is this website about? So you kind of like open out the layout and you see main and a lot of times especially if it's like a really dynamic website like you don't even know what the heck you're looking at you couldn't tell just from looking at the source code for 15 minutes like what your website is even supposed to be doing right and i don't really know how to fix that in terms of like you know asp and i know that um you know the the frameworks opinions are are so strong that that could be really tougher in the case of java you can have um you
Starting point is 00:57:51 know so many layers and different folders of you know uh package names basically that it can be really hard especially if you're using something like a spring to know what the heck is going on and how things are moving about and so i don't know how to necessarily fix this, but I definitely recognize the problem. And I think a lot of my hate for things like spring and things I've had bad experiences with this because I've gone and downloaded the package and said, all right, let me get started. And I can't figure out how things are put together and what it's supposed to be doing. Yeah. It's interesting because that's what he says here. And I love it. And you just hit all those points is screaming architecture should emphasize the purpose, right for bloggers out there or people that create content or anything like that. Like a lot of times if you go to a page and you're looking for information, how many times have you guys gotten frustrated where it'll be like, oh, here's the code. And you have no idea what the context of that code is inside the app, right?
Starting point is 00:59:01 Like what file is this thing in or how does this thing get laid out? Like it's nice to be able to have one huge file that does something. inside the app, right? Like what file is this thing in or how does this thing get laid out? Like it's nice to be able to have one huge file that does something, but at the end of the day, that's not how it's going to live. And so having some sort of guidance to where does this thing actually exist, right? Like where does it live within the structure of the application? And I feel like it's a hugely overlooked component of teaching in most cases. And I feel like it's a hugely overlooked component of teaching in most cases. And I feel like we probably all have projects like this where there are those tasks that you get asked to work on to where occasionally you'll be like, oh, man, I dread working on that area because it's just going to be painful to even find the right place to work in it, to put it, whatever. But, you know, it's very refreshing when you're like, oh, hey, we've decided to change the way ad rotations are going to be displayed on the site. Oh, look, I can open up the project and there's the ad project. There's
Starting point is 00:59:56 where ads are served. Okay, I can just, I know exactly where I got to go, right? Even at the top most level of the project structure. Yep. It's way more important than what it sounds like. And I mean, we talked about it in the past, you know, naming is one of the hardest things, you know, organizing things in a way that's meaningful is also it like, you know, the framework thing, a lot of whatever your, your development language of choices, you know, you'll see these MVC models or the MVVM models, and they'll say, put all your views in one folder. That's to me, completely useless. Please don't do that. Right? Like don't put every single view in a view folder, break it down by its component and, and then put a view folder inside that if you want, and then put a model folder inside that if
Starting point is 01:00:41 you want. But at least that's meaningful as opposed to just having a hundred files that are all views that doesn't it doesn't tell you the true intent of what's going on a lot of this oh sorry joe oh you a lot of this is the common theme though it's also about like how do you draw the lines where do you draw the lines right because how you draw those lines about like okay um i've segregated all the ad portion of the site that responsibility is in the project right so you've drawn the you know the circle around that kind of going back to some of the drawings that we we looked in with the domain driven design right it's like how do you draw those lines around the various components to express that intent of like this thing is just that don't don't go adding caching capabilities site-wide into the the ad project or the customer management
Starting point is 01:01:33 project right like those aren't related yeah i just pulled up a couple of my projects just to kind of look at how i've done this in the past and i'm looking at color mine which i've had around for years now and in the top level namespace where things actually start happening, I've got three main folders, one for comparisons, one for conversions, and one for like math utilities
Starting point is 01:01:52 called utility. In that case, I feel okay about utility because it literally is like very specific, like, you know, converting angles to radians or, you know,
Starting point is 01:02:00 whatever kind of stuff. So I feel pretty good that like if you come into here, you can see like, oh, this is a library for comparing and converting and doing some math and i'm looking at my uh my little game project here uh after i i introduced dependency inversion a framework just to kind of see what would happen see what i liked about it but actually i found after i did that it was really easy for me to um chunk components by their, by their, what do you call it their
Starting point is 01:02:28 subject, I guess. So I've got a namespace for audio, which is all around playing sounds and another one for scoring, which is all about scoring. I'm working on breaking out another one for behaviors. I feel pretty good about that too. Like I go and I look in my scripts folder and like, I can tell like immediately, oh, okay, we've got playing sounds, we've got scoring, we've got behaviors. And at the top level, i got a bunch of stuff called like game bootstrapper or game session things like that like i know i'm looking at a game so i'm not saying that i'm good about this all the time but i do like that um the idea that what the things that i consider kind of good and clean code do seem to have this format as opposed to a lot of projects i've worked
Starting point is 01:03:04 on and written where you can go in there and uh not know what the heck's going on yeah you end up hitting you know navigating through code just to figure out your way through it right or debugging through code and if you're doing that to find out where something lives then chances are it hasn't been broken out in any kind of meaningful way and i think this does get a lot harder as like projects get bigger. You know, I feel like if I went and looked at the Firefox source code that maybe this wouldn't be the case, but it's just got so much stuff going on. It's got rendering engines. It's got all sorts of other what I would call weird stuff. But just because it's really complex and hard.
Starting point is 01:03:40 I'm going to try and pull that up right now. Oh, yeah. It's like it's in 10 different repos, you know. So, yeah, it's tough. And, you know, it's for great reason, I'm going to try and pull that up right now. Oh yeah. Look, it's like it's in 10 different repos, you know? So yeah, it's, it's tough. And I'm,
Starting point is 01:03:48 you know, it's for great reason. I'm sure. Oh my gosh. Is it SVN? Say it ain't so. Delete and Firefox. Dude.
Starting point is 01:03:59 I actually, speaking of which I will say, I mentioned it, I think as a tip or something in a couple episodes ago about the new Quantum Firefox. It's really good. I truly like it a lot. I've heard nothing but rave reviews about the performance of it. Man, I've been using it almost exclusively.
Starting point is 01:04:19 And I mean, there's some things that just don't work because some things were made for Chrome or whatever. But man, it's really good. I've been impressed with it. Are you referring to, like, extensions when you say made for Chrome? What do you mean? Yeah, like some extensions. Or if you go to, like, for instance, a frustrating thing is I have, you know, I've gone without cable and all that stuff because I got mad at the cable company. As you do.
Starting point is 01:04:43 Right. As everybody does eventually right so i have chromecast and you can't cast to your device if you're watching youtube from firefox it won't let you do it yeah because there's not an extension for it for fire right so it's just kind of frustrating that there's little things like that but other than that like i've been i've been super happy with it so so anyways, yeah, go ahead. I did go, I did find a mirror on Git so I can actually understand it because I forgot how to use SVN of Mozilla.
Starting point is 01:05:12 And just like, you know, as you might imagine, there's a lot of weird folders in there for things like international or the mobile app that kind of shares components. And so it's pretty hard to see what's going on. But they also have a folder called browser. And if I go in there, I see things like branding and components and experiments and extensions and fonts. And so I do really feel like I actually, you know, as complicated as I'm sure it is, like it's pretty easy for me to see like the structure.
Starting point is 01:05:37 So if I want to see how extensions work, like I'm clicking into extensions and I see all sorts of interesting stuff. So this does look like a browser when you look at the code. That could be a fun little website to put together that I'll never actually do. But you can imagine like take various source code projects and then have people guess as to what the project does just by looking at the code in like say two minutes or whatever. Oh, that's fun. Cool. Well, jumping back in here, the next thing that we talk about is operation and what they say is sometimes it can be tempting to rearrange the architecture
Starting point is 01:06:12 of a system around processing requirements and an example they give is a high throughput system they need to take great advantage of independent scaling and parallelism and you shouldn't your your architecture shouldn't be based around that right yeah your architecture should be abstractions around um you know the the actual like domain of your code and should be screaming that uh scream that architecture and intent so if you see things like we're talking about large components so if you see like something like the order queue then we're telling you something about the operation of that uh code which is maybe not that important maybe it's an implementation detail that we've kind of raised to the top level because of our naming scheme and uh it's maybe not such a good idea because those things are
Starting point is 01:07:01 details and that may change so today it may be a queue and tomorrow it might be, you know, sort of like weird serverless, whatever that has nothing to do with queues anymore. And, and I think just that doesn't mean you can't have files in your application named order queue, right? Like you, you might very well have that, but at your architectural level, looking at the components or that kind of stuff, you probably shouldn't have an order queue project, right? Like, and maybe I'm missing some things there, but in my mind, you know, we're not saying you have to skate around exactly everything that you're doing, but you should at least abstract those things out so that, you know, maybe if you have an order processing pipeline,
Starting point is 01:07:45 you know, that order processing could use an order queue, or it could just write straight to a database, or it could, you know, write out to some service out somewhere, you know, maybe you have implementation details of that, that are going to be those separate files, right? But at the higher level architectural view of this thing, you shouldn't have a order queue processing project, right? Or something like that. I think that's really what they're getting at here. So in other words, to expand on your example, the act of fulfilling the order shouldn't care what it's writing to. Correct. Yeah. There was another statement here where he says that an architecture that provide that properly isolates its components will be easier to change over time as the operational needs change.
Starting point is 01:08:34 So true. I feel like we all just like poured one out, you know, like, yeah, I feel your pain. I mean, you know, this goes back to what one of your favorite topics is, Mike, and that's unit testing, right? If you have things broken out into smaller chunks, it's a whole lot easier for you to say, hey, let's make sure that this one little thing is tested very well, right? When you have everything in this one huge project and everything's just kind of touching everything else, it becomes very difficult. And so breaking those out into meaningful pieces or components, not only does it make it easier to see just from an architecture level, coming in and anybody can look at it and say, hey, I know what this does. But it also makes it to where it's easier for you to break out some of those dependencies so that you can test things better. So another example to this, though, might be like if you have properly abstracted away your database from the rest of your application and your code.
Starting point is 01:09:37 Right. So today you're running on, say, SQL server and everything's fine but then over time you decide hey you know what um that's not good enough we need it's time that the sql server isn't scaling to what we need we need to be able to horizontally scale out uh the the data layer you know much wider than what we can with SQL Server. So we need to go to some sort of DocumentDB that will allow us to index it differently or whatever. But because you already took the time to apply some sort of a repository in front of that database and you already drew that line of what was responsible for reading and writing the data, then when it did come time to replace that with some DocumentDB type solution, right,
Starting point is 01:10:31 you only have the one place where your changes are isolated to. So you only have that one place to focus on for the effort. So it makes it easier to focus and concentrate your effort on that one thing, right? And now you could scale that out to like, you know, other, other types of scenarios as well. Right. And I want to point out like a detail of that, that, that in a real world example, and we've seen it and we've done it. I mean, pretty much anybody's done a bad practice at some point in time, if we're all being honest, but like entity framework, uh, if, if anybody's used entity framework in.net, they have this whole, you know, entity to SQL type stuff, which is really cool, right?
Starting point is 01:11:11 Like you can, you can write any kind of I queryable to do, to do joins at an object level. When you use something like a repository, you kind of cut it off there. And the reason is, is because that entity framework, that entity to query or to SQL thing exposes your storage technology. And so the problem is, if you let that abstraction leak out into your application code past the repository, then now you've got something that you can no longer break, right? Like if you do need to go to something that scales more than SQL, you can't easily do it, right? And you've got something that you can no longer break, right? Like if you do need to go to something that scales more than SQL,
Starting point is 01:11:46 you can't easily do it, right? And you've got this abstraction that is no longer an abstraction. It's now an implementation detail that's leaked throughout your code. So it's fine for your repository to use the entity to SQL code behind the scenes, because if you ever wanted to swap out the implementation of that repository, you can swap out that entire thing, right? And that entity stuff hasn't leaked into your code. So it's one of those things that seems really small until it's not, right? Like once it starts leaking out into your code, you start realizing that, man, people are doing crazy
Starting point is 01:12:22 stuff all over the place, right? We're not enforcing business rules anymore because now people are just querying the objects directly and they have no idea that there's even a business rule around this thing. New developers might not even realize that a query is being executed. Right, right. There's all kinds of things. And so it's just one of those things that not only does it make it to where your system is easier to reason about and change in the future, but it'll also protect you from having a bunch of stuff leak into your system that you have no control over over time. So basically, it's not that you're saying don't use entity framework. You're saying only let the repository level use entity framework.
Starting point is 01:13:01 Nothing that is using the repository pattern should know or care how it's communicating with that data. Exactly. And I love entity framework and I've heard many, many people like PooPoo and many other ORMs out there. And that's because typically what happens is they end up getting all mingled into the code and then you have performance issues because people don't realize what's happening behind the scenes and you can control all that. So yeah, use the tools, but use them in a way that benefits you. Yeah. And push those dependencies out to the edges whenever you can. Yes. So that takes us into the next section, which was development. And right away he starts off with Conway's law, which maybe I shouldn't be embarrassed.
Starting point is 01:13:46 I hadn't heard of this one until reading this. But he says, any organization that designs a system will inevitably produce a design whose structure is a copy of the organization's communication structure. That's interesting. I hadn't heard this one either. Yeah, I thought it was so awesome because I was like, structure. That's interesting. I hadn't heard this one either. Yeah, I thought it was so awesome because then I was like, man, he's right. Like this Conway guy really knows his stuff because he also has the game of life.
Starting point is 01:14:17 You know, because it's like, if you think about it, like if you have a hodgepodge code, right? Then is that, ask yourself, like like honestly is that also how the structure the communication among the entire development team is right is it just like you know is the if the communication is a free-for-all then so is the code right but if there's clear lines clear boundaries between how you would interact with another team then so are those deliverables going to be, right? I mean, like, thinking back in my past, right, there were times where, like,
Starting point is 01:14:49 I would work with, you know, someone from research, for example, right? And there was a very clear line, like, we were in different organizations, very clear line of communication, and so the code would be delivered in a similar format that matched that. But I never thought about that until reading this law. Yeah. And I kind of wonder if I'm fixing one or the other, we'll kind of have effects on one or the other. So, you know, the idea is if your, if your code looks like it's been really additive, it's really hodgepodge, it's a mess of things that look like they were quickly done with loose requirements um you know maybe you could start by focusing on those you know requirements
Starting point is 01:15:30 and fixing those business processes but also kind of wonder too if like if you start pushing back on the code quality angle and trying to do a better job there about organizing your requirements up front and figuring out um how to kind refactor things, if that would also have some influence back on the business, just because of the perspective you're kind of, you're coming from. I don't know if that's true or not, but I just thought it was kind of an interesting idea of like this, just the idea that like, if you start pushing back on code quality, maybe we'll have some other effects on the actual business processes as well. It's interesting. Maybe it would work that way.
Starting point is 01:16:03 Yeah, probably not, but you know impossible yeah i like the idea of we need like um a coder focused phoenix project where uh the coder starts with the code and by refactoring the code and making things cleaner and writing unit tests they somehow fix and save the business i know the person to write it dance and i we need you yes i mean it was kind of interesting too because like one of the other themes that we've we've come across several times in this book though have been not just about the structure of your code uh or your your application but the the um relationship between that and the organization of the teams and how to structure the teams right and i don't think in any other conversation about architecture i've ever
Starting point is 01:16:56 heard those two um you know mentioned at the same in, right? Yeah, I would agree. It's almost always about code or it's always about organization, not the two together. And I think, you know, coming up here in one of the other sections, I think it hints it weighs to where you can do things and then maybe teams become responsible
Starting point is 01:17:20 for some of these things. So I am kind of curious to get into that one. So the next step we have is deployment and the goal should be immediate deployment. And it's funny, and I'm curious to get your thoughts on this one, Outlaw. They say not a hodgepodge of scripts and FTP. This is achieved by proper partitioning and isolation. So basically they're saying that your deployment shouldn't just be a bunch of cobbled together stuff. And I feel like some deployment kind of is that,
Starting point is 01:17:56 and I'm curious your thoughts on this. Yeah. I mean, I really kind of struggled with this one because at one point i guess the way i interpreted some of this part and i i could have been wrong but when he was talking about like you know the hodgepodge of scripts or um you know dozens of little configuration scripts as he puts it and property file tweaks is that um if you manually have to go in and change those things, then that's where he's saying is wrong. But as long as you have those things automated, right, then that's okay. So for example, the deployment using an installer, yeah, there might be, you know, several configuration files
Starting point is 01:18:37 for different parts of the overall application or system. But as long as you have an installer that is consistently making those changes, that's okay. It's okay that those configurations exist, right? Okay. Okay. So like in putting that in scope of like DevOps, like builds and deployments and all that stuff then. So it's expected that you're going to have multiple properties and configurations and all that kind of stuff. But really the goal is there should be an easy way to run that whole thing. I think the key here is reproducibility. Okay. Right. If your deployment can be going back to one of the other comments, which was like, you know, one, a one action to kick it off, right? You know, if you can kick that off in one action and it'd be reproducible every time in the same way, then that's okay. It doesn't matter that there might be, you know, I mean, because think about it, you know, you,
Starting point is 01:19:29 you have to lay down dozens of files into different locations, you know, when you're installing any kind of application, right? Like take an operating system, for example, like think of the, you know, insane amount of files that are getting laid down in the different destinations and structures, like of like of where it's putting stuff and the decisions that it's making it where to put stuff like of course it has to do that right so it's not it's not that it's bad to have those things it's just that it has to be automated it has to be reproducible if if it requires human intervention and that's when there's the problem if you have to manually transfer a file you know if you're ftp'ing
Starting point is 01:20:05 or well first if you're ftp'ing anything these days you know shoot yourself ssh but yeah but uh but if you have to like manually connect to your web server to transfer a file over in order to fix a change or to put down a new feature or something like that that's what he's saying is wrong from a deployment or at least that's my take on that section yeah something like that that's what he's saying is wrong from a deployment or at least that's my take on that section yeah i like that i do think uh things have gotten so much easier in this arena over the last say 10 15 years i mean back in the day like even wordpress it would be like okay uh first you got to set up php here's instructions for windows here's for debbie and here's for red hat and then here's your instructions if you're using apache if you're on apache 2.2 here's your you know it was just tough and you had to go configure
Starting point is 01:20:49 multiple spots you had to make things make sure things were familiar um were all set up and then you had to you know check the various faqs because it would never work the first time something like setting a wordpress could potentially take hours and um i i think a lot of that was because people had such varied setups and so if you were doing WordPress, there's a good chance that you were running other websites. It wasn't just the same thing on the server. Things like that used to be more common. And nowadays, it just kind of seems like everyone's just kind of gone with it. Like the Docker approach, we're like, just keep everything self-contained, keep it to you.
Starting point is 01:21:18 And that way, if you make some adjustment to Apache or Nginx or whatever for this project, it's not going to break your other projects that would normally have been running under the same web server. So I think the Docker and DevOps mindset has made this so much better. Yeah, containerization is amazing. I mean, the big thing is you almost don't have to worry about hardware infrastructure as much, right? You just think about, hey, what do I want to deploy?
Starting point is 01:21:47 And if it's just a little piece out here, then it's almost like a module that we're talking about in the architecture for the software, right? You plug it in and it's an appliance that you use as opposed to, oh man, I have to go configure 900 things to get this one piece up. Yep. I think-
Starting point is 01:22:03 I remember- Go ahead, Joe. I was going to say, I remember going to Linux things to get this one piece up yep i think i remember uh go ahead joe i was gonna say i remember going to linux after many years of windows and um you know being introduced to yum which is like a popular package installer at the time it's being amazed because that you know at the time i had been doing so much stuff on windows like installing java setting the home pass setting that you know whatever and just to have like some sort of package manager take care of that was just amazing to me and i never thought that uh you know i was like okay this is why linux is for for hosting things uh and things have obviously come a long way but i still have
Starting point is 01:22:34 yet to see like a a really truly amazing experience in windows for package management like chocolatey is really good one get uh it works i haven't seen i haven't ever used one get uh i haven't seen i haven't ever used one get is that even a thing it is yeah i mean it it uses chocolatey it can use chocolatey behind the scenes but it's like a it's like a higher level on top where it can have multiple um like if you want to think of chocolatey as a repository of packages right you can have like multiple repositories and chocolatey can be one of those that it pulls from and installs from but i how do i use it like what would i one get yeah i still think like you know if i'm going to install a like a elastis search or something like now it seems like everything is kind of docker assuming i'm on the appropriate
Starting point is 01:23:18 version of windows but i i've yet to use one guy i don't even know how to get started or to browse what's available here's the beauty though about docker um and i kind of made some kind of reference to this earlier when the devops part came up but it was um you know treating your configuration as code right you can go out in um on github for example and find repo after repo after repo of people's Docker configurations for various things, right? I'm trying to think of good examples, but I found one guy who works for Microsoft, and he must have had like 200 different repositories up there in his GitHub account for different Docker configurations for things within Windows, like all the different ways that you might want to use parts of Windows. That's awesome.
Starting point is 01:24:18 And that's just treating your configuration as code then, because now you can check that in and that becomes you know, becomes reproducible. That environment becomes reproducible, which is great. Excellent. All right. So the next part that we're going to jump into is leaving options open. And, and we talked about this a little bit earlier is good architecture balances these concerns, right? It, it all sounds really easy. Like that's the whole thing. Everything that we talk about here sounds really easy, but in practice, it's not. It's not because there's too many pressures coming from outside your department, inside your department
Starting point is 01:24:55 for timelines, whatever, right? Like these are not just super easy things to do. And here's the reason why. There are things that we don't know up front like all the use cases right sounds ridiculous but that's always the case right and then those things change too yeah yeah or maybe the use case doesn't change but the details around it do so yeah i mean the requirements for it um and we don't know the operational constraints yet. We don't know that caching needs to be a thing yet. We don't know that SQL Server isn't going to be good enough yet. We don't know that we need to horizontally scale the data layer out to 100 servers yet, because right now we're just trying to build the thing.
Starting point is 01:25:50 Right. And then you have your team structure, right? That's a, that's another one of these things that you just don't know how everybody's going to be split up on these, um, your deployment requirements. How does this thing need to be pushed out? Is it an installer? Does it have to get pushed out to five different servers? What, whatever the case may be. Like all these things are things that you typically just don't know yet. And so it's hard to come up with something that's going to work within all those necessary pieces, right? Yeah. And as Joe said, the worst part about all of this is that all of these things are going to change consistently over time. They will always be evolving. So basically what this means though is you're always trying to hit a moving target with whatever system you're trying to build, whatever architecture you're trying to design,
Starting point is 01:26:37 it's always going to be a moving target. So that's why you want to defer those decisions for as long as possible until you know that you need to make a decision on that so that you have the most information for that moment in time. I do want to say something for anybody that's – because we have listeners that are all across the spectrum, right? Brand new in college to have been doing this for five years to people who have been doing it for 20 years. A piece of advice I would like to give anybody that is wanting to get into this or is in it and gets frustrated by it. Is to use tabs. That too. But this is the world.
Starting point is 01:27:21 You are always going to be working on a moving target. If you're a person that is extremely inflexible and you need to have everything laid out in front of you before you can get started, this is going to be a struggle, right? Like this is going to be a real problem. You need to be flexible with this because business needs change. We write software to, to solve problems, whatever those problems may be. And those problems sometimes change, right? The face of that problem changes a little bit. And so it's on us to be flexible enough to work within this.
Starting point is 01:27:55 Yeah, totally. Next up is talking about decoupling layers. The goal is to support all necessary use cases, even the ones we don't know about. And as we just said, those cases often change too. Now, the architect should know the basic intent of the system. Like, are we here to place orders? Are we here to take refunds? Are we here to browse the internet?
Starting point is 01:28:19 And so as long as we know that and we focus on the single responsibility theorem, which is each thing should only do one thing and have one reason to change. And the common closure principle layers which is to say a front-end website a middle tier like a service tier a data layer um a mobile app layer things like that in order to separate these different concerns and so that they can change and scale independently. This kind of makes me think of what we've been talking today about Vue.js. Like, I don't know how it is now. I don't have a lot of experience with the new front-end frameworks.
Starting point is 01:29:21 But I know back in the day, like, it wasn't so difficult to move between, say, like, Prototype.js and jQuery. You know, you would change your selectors a little bit. But for the most part, your HTML was separate. Your CSS was separate. It wasn't really, it didn't matter what glue you were using. I don't know how easy it is to move from like Angular to React. Right. But I'm kind of wondering with something like Vue.js where like everything is in one file.
Starting point is 01:29:38 You've got your CSS, you've got your HTML, you've got everything kind of bundled together in little components. How easy is it to change that framework? Well, actually, Vue is very similar to React in that regard. You can bundle as much of that stuff as you want into the one file as you want. So if you want to put all the CSS in there, you can, but you don't have to. It's treated more like web components in the general sense so that so
Starting point is 01:30:06 that you can truly break that stuff out i i know outlaws probably spend a little bit more time writing the view stuff than i have but but it looked very similar to react in that regard so it felt like a mixture it felt like a mixture of like let me take the best out of angular and the best out of out of react and um i think if I remember right, we discovered that the guy who started Vue was actually from the Angular team. Does that sound right? I think so. Yeah. And here's the thing though, Joe. I would argue that changing any of those was never easy, right? If you went from jQuery to Prototype, you were doing straight up DOM manipulation, right? So it wasn't pretty.
Starting point is 01:30:44 I would actually almost argue that with something like Vue, it would be much easier to go between Vue and React than it would have been from jQuery to prototype. Because at least now with these front-end frameworks, something like Vue and React, you're dealing with a component. And all the DOM manipulation is happening for you under the covers, right? So you might have to tweak some properties on your component if you
Starting point is 01:31:10 were to move from one to the other, but I think that you'd find that it'd be less of an overhaul. I think anyways. That said, going back to this whole layer thing, this is where I really started liking where this was getting into some, not implementations, but some guidance in terms of where these layers should be. And so they point out, and we've probably all seen these things, right? A decent set of layers is you have your UI. So if we're thinking about a web app, that's going to be, you know, whether you choose Vue or React or Angular or something like that. Then underneath that, you're going to have another layer that is going to be your UI business rules. We'll call it that. That are things that drive things that should happen in the UI as data comes in and back and forth, whatever. Then beneath that one, you're going to
Starting point is 01:32:02 have your core business rules. And that's going to be probably some server technology. If we're thinking about like a website, that's probably going to be your server technology that enforces data coming to and from the system and how things change state. And then after that, you're going to have your database layer. And so it's easy to see those four layers, right? Because now you can see, okay, yeah, I could, I could totally separate these things out because they all sort of do things independently. Yeah. And so let's talk about decoupling use cases. Use cases are narrow vertical slices
Starting point is 01:32:38 that cut through those horizontal layers. So if a horizontal layer is like the database layer, then the use case would be place in order, which is something that goes through each one of those. And what I thought was particularly interesting here was the book seemed to be advocating, no seeming, it definitely advocated for keeping those features as separate as possible. So if you have something for deleting an order or adding an order, treating those as separate use cases, which is obvious, but also trying to keep the code completely isolated.
Starting point is 01:33:13 And that goes all the way up to the UX layer. So even having a different web page for adding and a different web page for removing, which I thought could kind of be antagonistic towards the owner, because now we're talking about changing the user experience to make things easier for programmers. And I didn't love that idea. But I don't think he was, you know, slamming the gavel down saying this is how it must be done. I think he was saying like, this makes it easier for us. But I don't think that's necessarily the right answer, depending on our situation, the kind of decisions we want to make, because the customer service person may love to have both of
Starting point is 01:33:48 those features on there. Because if they need to cancel an order and add a new one, like it might be really convenient for them to be able to have both sets of information up there at the same time. And so I do think that the user kind of wins in this case, and we as programmers just kind of have to suck it up. But maybe you you're thinking of it as too granular though because he says that he does say that the use cases are a natural way to divide the system but maybe the use case of those two things that you're talking about are just under an umbrella of order management right and maybe that's the you know bringing back in the domain driven design conversation maybe that's the domain and back in the domain-driven design conversation, maybe that's the domain. And so that's its independent thing.
Starting point is 01:34:29 Yes, it crosses all of the layers, UI and business rules and database and things like that. But within that domain, it has a set of use cases like add an order or delete an order or fulfill an order. Yeah, I think I might have had just kind of a knee jerk reaction because I just listened to a fantastic episode on Eat Sleep Code with Sarah Ford, who's a UX expert. I think she's working on PowerPoint team at Microsoft now. But she was talking about how when she was working on a project, she worked really hard on the time she kind of published it. She realized when other people started to try and use it, that the program is really organized around her testing the program, like while she was working on it. So it was really optimized for her to work on it. And then when other people came in, they didn't know where to start, they were confused, there was this this learning curve. And she kind of had this, you know, revelation, like, oh, crap, I designed
Starting point is 01:35:24 this for me, not for the thousands of people that are actually going to be spending their time with this. So I thought that was a great episode, first of all, but I think it just right after listening to that episode, and then reading this book, I was like, oh, crap, this is a little scary to me, because I don't want to change my UI based on, you know, what makes sense for me. And, you know, maybe I'm kind of thinking about it too much. You know, she obviously wasn't talking about the code level. She was talking about the experience level, but I think it's something to think about. Well, that's, I mean, it's really important though, to distinguish that in the fact that
Starting point is 01:35:58 if you have these layers separated properly, then that UX should be able to change freely and then just leverage that next layer under it, right? Like that's really the goal is, and that's the same thing that we talked about with the database earlier, is if you have a repository fronting those storage mechanisms, then it's easy to swap that out. Well, your UI should be somewhat swappable, right? Like if you want to have add and edit and delete all on the same page, fine. It should just know to call the underlying, you know, business layers for each one properly when it's, when it's done. So yeah. I was just imagining, like, say you're working with a PayPal or something, which we always love
Starting point is 01:36:40 to talk about. Um, if you end up making your UI, your UI over and just, you know, complete developer land, like you're probably going to model that user experience based around the even the objects that PayPal expects. So you might have a screen for gathering this information, a screen for gathering that information, the screen for putting the order through. And you're not necessarily thinking about it as a user because you're thinking about it as like, how do I get to the next step in this development process to make sure that integration is actually happening and if i don't have a ui as a programmer it can be really difficult for me to script that kind of stuff out because it does involve like web hooks and going back and forth and stuff like that
Starting point is 01:37:14 and then someone you know actually tries to use it and they're like well why are we doing this you're like well that's how paypal works you're like yeah but that's not that's not what i want that's not what makes it to me i don't care if it's paypal or not i just want to place my order so you better make it as easy as possible for me right yeah so i kind of thought of an example as you were describing like a real world example that maybe people can um relate to uh if you are a last pass, for example, as a user, it's very nice when you go to whatever page you're trying to log into and both the username and password are right there on the same field.
Starting point is 01:37:57 LastPass is very good about handling that situation. But when you start dealing with logins where the username is on one page and then you have to click a button to take you to another page and maybe that page is the password, maybe it's a token, or maybe it's going to ask you for a security question. That's where LastPass sometimes gets confused, right? And so that's where it's like, I know that those are two separate systems we're describing, but just as the usability of the system is, you know, in one example versus like the ideal way that we would like it where it's, you know, all on one page, just ask me at one time and I'll enter it in, right? Yeah, a great example is Microsoft. Like you enter your username and depending on how things might be set up, you enter your username it's like wait is this a work or personal account right and it's pros you got both and they don't want to ask your password because maybe you're already
Starting point is 01:38:51 locked into one or the other maybe they don't even need your password but for me it's like every time i go to microsoft it's like here we go yep yeah here we. And I don't know which ones, which, you know, I'm going to end up logging into both more often than not. So the, the, the gist of this whole part, this part here with the decoupling, the use cases is the benefit is doing that makes things easier to add and change over time because you've got a very small discrete area that you're working in. And so it's easier to test, make sure that you don't have regressions, you have limited risk by doing so. Yeah. Maybe, you know, to mention Sarah Ford again, the idea is that if we design this in a good way that we can make it easy to modify it, we can go ahead and get V1 out there,
Starting point is 01:39:41 make sure it's working and then,, and then continuously adapt to that user experience over time. We just have to make sure that we budget some time and think about that experience evolving to make things better. Yep. And so the next thing that we're getting into is the decoupling mode. So having your components divided up into layers makes it easier to scale those layers separately, which is interesting because now you can deploy those things separately as well. It's important to point out that by decoupling mode, we're really talking about operation. Yes. Yeah. So if something's parallel or if you've got, you know, you need more database servers or more front end servers, stuff like that. Yeah, that definitely ties into the operation over deployability, your intent.
Starting point is 01:40:28 Yep. And so this whole decoupling of your code, breaking things into projects like DLLs or jar files or whatever the case may be. Now those things can be deployed out individually. And so your ability to scale or use other architectures or hardware or whatever has opened up now because you left your options open. Yeah. So independent developability and deployability, horizontal layers make it easier for teams to be organized based on what makes sense for the business. So you can have your teams
Starting point is 01:41:05 organized around features, say customer service, payment, like all those things touch the database, all of them have user interfaces. Alternatively, having these things divided into layers also obviously makes it easier to organize the teams around layer. So you can have a middleware team, a database team. The horizontal layers don't dictate how your team should be organized. It's just kind of a good thing to do. It buys you deployment flexibility and it buys you the ability to separate things either way. It's funny. The more that I've thought about this one,
Starting point is 01:41:44 I like the idea of you know we talked about you had your horizontal layers right and then if you think about drawing lines through those so you're slicing it up right like now you got a tic-tac-toe board i like that because especially as being a full stack developer typically you're a full stack developer because you want to be, right? Meaning that you like to touch the database and you like to touch the middleware and you like to touch the UI. You like playing in all those different playgrounds. And by drawing those vertical slices through those horizontal layers, now you can have the best of both worlds, right? So that you're not stuck on a middleware team or you're not stuck on a database So that you're not stuck on a middleware team, or you're not stuck on a database team, or you're not stuck on the UI team. You can now, you can compartmentalize some of those
Starting point is 01:42:29 pieces, right? So if you're working on an order management system, right? That doesn't necessarily mean that, oh, well, you're only going to be working on the backend portion of this. Like, you could work on the backend portion of this, you know, with a team of people, right? And then if there's somebody working on the front end portion of that, maybe you work on that part or maybe you don't, but that's bundled as part of a component as well, right? So I like it because you almost have like these, I don't want to call them quadrants because, you know, there could be more than four, but if you did picture that, like you could be working on the top left and the bottom right, you know, it doesn't have to be that you're working on the entire vertical section completely,
Starting point is 01:43:08 although it might make sense, right? Like if you're working on the back end order management stuff, maybe it makes sense for you to work on the front end portion as well, but those things should be bundled separately, right? Like that's their own component. That back end piece is a component. The front end piece is a component. They shouldn't be treated. And I'm curious what you guys think about this. I almost feel like sometimes working on the entire vertical thing, you almost have tunnel vision. And so you might make bad decisions along the way simply because you're like, well, I know that this has to hit this and this has to go to this database table, right? It was almost like the PayPal exam. Say what?
Starting point is 01:43:47 You could have tunnel vision the other way. You could. You totally could. So it's almost nice to have teams of people that, like maybe having somebody that didn't work on the back end one also work on the front end one and vice versa, right? And then that way you have people thinking about the problem differently along the way. But you still compartmentalize some of those
Starting point is 01:44:05 things. Yeah, I think the reason why technologies like ColdFusion and the way we used to do like ASBNet Classic and, you know, the old school PHP, it was very common to have all your work in basically an HTML file. So you kind of threw your tags in there, code mingled stuff. But what that meant is that every single person who works on that was a full-stack developer because there's sql code over here there's loops over here there's html and css over here and so there was no way to subdivide that everyone was organized around features because there was no flexibility you know you didn't have like a middleware tier that was responsible for lines 20 through 40 and 117 through 200 and it just it didn't really make sense because it was so easy for somebody to uh you know enter a character that was invalid or something and break the break the asp or whatever
Starting point is 01:44:52 which happened all the time if you did pound symbol in the cold vision file you know like your your designers had to be aware of that sort of thing and i think that's why those have kind of fallen out of favor so horizontal layers doesn't take away full stack. It's very easy to still be a full stack developer. It just buys you that flexibility to say, hey, we could also have a designer who gets to focus on CSS and HTML full time without having to worry about, you know, their pound symbols. Right. Yeah. I mean, this was, you know, know yet again another part of the book where
Starting point is 01:45:25 the teams were discussed right and and how that might be structured you know he's whether it be feature or component or layer teams and i know that for me that's been something i've kind of like struggled with like just trying to think about like okay what's the appropriate structure or organization for teams right like what what does make sense because at some point some part of me is like okay if you're talking about like a a large enterprise then yeah i could see where you have highly specialized people who only ever focus on the database, for example. That's all they care about is the database. They're really good at it. It doesn't matter how that database is being used for, they can walk in and in a matter of minutes, they can just totally own that thing, right?
Starting point is 01:46:20 And find performance tweaks that you didn't even know about, right? Versus smaller organizations where everyone has to wear many hats, right? So, you know, I mean, you know, another way that you said that was as a full stack developer, but I mean, it's more than just being a full stack developers, the two, right? In terms of wearing many hats. So then it's like, how do you structure a situation like that where it's like, well, you know, on the flip side, the enterprise example, where you have the highly specialized people, then that's where I think that the layer teams make sense, right? Because you could have people who are only focused on like, you know, AIX, for example, like they know how to build those systems out, how to configure them properly. They're, you know, that that's their wheelhouse.
Starting point is 01:47:15 Right. And then somebody else is going to come down on top of it and lay down, you know, a database like a DB2 or something like that. Right. Who use a DB2? People do use it. But then in that smaller organization, that's not going to make sense. So does it make sense to have those layer teams in a smaller organization? Where do you draw the line? When do you decide that it's appropriate to have those layer teams or it's not appropriate to have those layer teams or maybe um maybe it's just a matter of scale so like in the enterprise that layer team for um just the database uh the
Starting point is 01:47:52 size of that team is relative to the size of the enterprise but when you get to a smaller team that quote team might just be a single person you know this is a, I think, and there's no right or wrong answer to this one, I don't believe. But I think that you have to look at, at what point are you experiencing pains, right? The real pains. And then from there, how do we how do we fix some of those pains? And I think that's really how you have to approach it. Because it's like, like we said, at the beginning of this, you know, a project starts out with five people and you work fine. Right. And then at some point there there's that inflection point where it's like, OK, this is no longer easy. Right. Like everything we do is is negatively impacting something that had been previously done. And I think that's where you have to start thinking
Starting point is 01:48:45 about, okay, now we've hit this part. What can we do to take a step back from this and restructure some things so that we can work in ways? And it may not be as granular as what we were talking about with the various different slices and all the pieces. Maybe it's a little bit bigger chunks at that point, but at least you start breaking them out. And I think that's really the answer. And again, it's still not an easy thing to do because especially like you said on a smaller company, like everybody wears many hats because smaller companies have to be more agile and they have to respond to the market and all that kind of stuff it's just it's a hard hard question to answer is a frustrating question to answer too and that's like i said uh you know i i struggle with trying to think of like what what is the right shape of that what is it what does the right size look like yeah and yeah go ahead
Starting point is 01:49:42 just thinking like we need to start organizing teams based around the single responsibility theorem and the whatever, the CCP, you know, so the things that change together should stay together and trying to draw cleaner lines between teams because you can't have 20 people talking to 20 people. It's like having a method with, you know,
Starting point is 01:49:59 10,000 lines in it. You've got to be able to break stuff up, have clean lines to minimize that overhead. Otherwise, you just end up spending all your time in communicating. And just like anything else, I think the more communication and the more complicated the communication is can often lead to negative results. Yep. But even single responsibility teams, though, the things that change together, stay together, right? That could be interpreted multiple ways, too, there, right? Like, initially, I was thinking like, okay, well, that would just be a together, right? That could be interpreted multiple ways too there, right?
Starting point is 01:50:25 Like initially I was thinking like, okay, well that would just be a feature, right? Like if the team that is responsible for say order fulfillment, right? They would all work together and that's the feature that they're delivering. But you could also say, well, then there's the layer, which is the, you know, going back to the database is our canonical reference. You know, that that is the thing that changes together. That, yeah, I don't know.
Starting point is 01:50:55 I still struggle with that. But I do like the idea of trying to think of teams as like single responsibility teams, though, that's interesting. I like it almost on a per project basis. It depends, right? Like if you have different departments, like if you have teams working in an accounting department, then that's
Starting point is 01:51:08 easier, right? But when you have teams that are all broken apart, but they all work on the same product, you know what I'm saying? That's when things get a little bit murkier, but I almost like the idea of, of like you said, a feature or a project based type thing. And then that way, everybody's focused on the one and they can bundle that, but then it doesn't take in the overall architecture of the system. It's such a hard thing, man. Yeah.
Starting point is 01:51:32 Well, let's move on to the next section, which I really enjoyed this section, duplication. And he says that architects will often fall into the trap of the fear of duplication. And I thought, that's a really very true statement, right? Like it was, it kind of hit home. Yeah, I definitely have had that. Like, well, if you break up things into different silos,
Starting point is 01:52:01 then everybody's going to be writing the same code. Yeah, and that's the thing. We've absolutely had this conversation before in past episodes. So he says, you know, generally duplication is a bad thing, right? And when we find that duplication as professionals, we are honor bound to reduce it, right? But he points out that there are different kinds of duplication. And I think this is what we tried to discuss in previous episodes, where there's true duplication versus
Starting point is 01:52:35 accidental duplication. And true duplication is, have you ever seen that code where you'll go to change something and above it, there'll be a comment section that says, hey, any changes to this portion of the code, you got to go change these other five files, right? That is true duplication, right? That is code that, you know, should probably, as painful as it might be, figure out a way to eliminate that duplication and break it down into one component, right? But then there's accidental duplication, which is what you were just alluding to, Alan, where it, you know, yeah, there might be code that is duplicated or seems duplicated, but it could have just been, it could have been written totally by accident or maybe it
Starting point is 01:53:25 wasn't written by accident and it you know originally was just a copy and paste of something else but the point is is that it's accidental because those two things change at different rates and or for different reasons yep and that that's really the part right there that sort of hits home is yeah okay so they look similar but they're different enough to where they should be separate and you shouldn't worry about the fact that some of that code's duplicated right and that's that's sort of hard to internalize especially when you see it right you're like well like, well, everything could use this. But then he even goes on to point out that, okay, he says, resist the urge to eliminate this duplication until you know that it's true duplication, because what if they look like they're similar, but they really serve slightly different use cases. And then you'll find yourself in a situation where you
Starting point is 01:54:20 tried to unify that code. And now when something needs to go in one direction for one, then the other one does. Now you're going to, you're almost going to be wanting to just put a hack in, right? Because, oh, well, I need to support those use cases. So now you're going to have this branch of SLFL stuff in there. And that's not true duplication now you've actually probably introduced some some some technical debt just by the fact that you tried to cram them all into the same thing right yeah i got two things that are the same but they're both special cased like well they're they're not the same but that doesn't mean that there isn't you know that like there could be two things that are special case that are also the same.
Starting point is 01:55:05 So you have to be careful of whether it's the same by coincidence or by design. Like should these things really move together or are these totally separate notions? So, yeah, I'm going to do the same thing. Like I see the same three lines in two places. I'm like, oh, this should be a thing somehow. And if it's not a thing, I feel like I'm, you know, dirty and doing things wrong. Somehow. Yeah. Somehow. Yeah.
Starting point is 01:55:25 Somehow. I mean, I wish I could remember the examples that we've talked about in the past. Because I remember I used Microsoft as an example where it was like something along the lines of, of course, there's going to be some piece of code that somebody else wrote that was the same, just coincidentally. But that doesn't mean that it was a bad thing that it exists. Right. Or that you have to go in and cut it out to dedupe it uh that it was okay to like split that split that code out and um i think maybe it was related to the domain driven design conversations it probably was so it's funny because they even say here and it it's so easy to do, is don't get lazy.
Starting point is 01:56:08 L-A-Z-Y. Don't get lazy. No, Lassie. Don't get Lassie. Don't get Lassie. And simply pass an entire row from the database directly to your UI. Right? Doing that, you've now circumvented the layers that were in place
Starting point is 01:56:25 to help you abstract those things. And it might seem completely innocent and not harmful at all to do it, but it will cause you a problem. At some point in time, trying to skip going through the proper channels, you're going to miss something, right? Yeah. And it's so tempting to do that too because it's so easy. And it's so nice to be able to say, hey, you just changed it over here and it just flows through and everything's magical and dynamic. But what kind of inevitably happens is like,
Starting point is 01:56:55 someone says, well, we have to do this one special thing with the column. So, like, okay, so now I've got my view model and things are still dynamic. Except I also kind of dynamically append this thing and format this thing and remove this thing. then i have to do it for export and it just um if you're not careful with that and you don't uh abstract and break it away at the proper time then you end up just you know setting landmines for yourself yeah you start bolting on and hacking things into place to make them work the way that they would have already if you had
Starting point is 01:57:23 just gone through the proper layers right right yeah i was curious alan because when we were putting the notes together for for this portion of the show like it i don't remember exactly what you said but it was something along the lines of like uh it was almost like you had some kind of aha moment or something when do you remember what i'm talking about because i was really curious for you to expand on it man we were talking about it before the show they were like this is good for the show and i was like okay yeah yeah i totally forgot about it i wish i could remember to help you but there was something you said i don't remember about it but all right we'll move on yeah it's gone so so we previously talked about decoupling mode which again was operation and so he revisits this portion
Starting point is 01:58:08 of the this topic again in this chapter and says that we can decouple at many levels so there's the source code level there's the deployment level and there's the execution level and previously when we talked about decoupling. We were talking about the different layers. But now we're talking about like, well, what does that look like in more detail? And source control means packages. So that changes in one thing doesn't necessarily require another because we can set that dependency at a higher level. Well, it doesn't force a recompile is what he says.
Starting point is 01:58:43 It doesn't force a recompile. Now, I got a question about that. How does that work? level well it doesn't force a recompile is what he says right force a recompile right now i got a question about that how does that work because immediately i was like wait a minute if if if you're all right so the note that i wrote here and maybe i interpreted it wrong because it sounds like you're talking about packages but he's saying source control not packages so i'm like well if you're accessing the raw source control you know you're accessing the raw source control, you know, you're accessing the raw source as part of your application, you're using someone else's raw source and there's changed. How do you not, how do you avoid a recompile of yours? Or did I interpret that portion wrong?
Starting point is 01:59:17 I think, I think it was more along the package, right? So if you have a NuGet or you have a JAR or you you have a dll then it doesn't have to recompile those and so i think it did blur the lines but i believe that's where it was supposed to be headed i mean i don't because he definitely gets into dlls and packages later in the deployment level right and but even if it was a dll how you know you would still have to recompile right well and what am i thinking i kind of thought about it was like DLL, you know, you would still have to recompile, right? And what am I thinking? The way I kind of thought about it was like, more like, say, if you have a library packet or a logging package and you make some updates to it, I don't have to go and do anything, right? I'm still depending on, you know, whatever older version of it. And that's not a big deal.
Starting point is 02:00:01 Yeah. And it's not recompiling the source. So if you think about it, right? Like if you have a solution that has 50 projects in it and it's all the raw source code, it has to recompile those, right? Like if you do a clean and build, it's going to recompile everything. Whereas if it's just dependencies in there, it's not recompiling those dependencies. It's just recompiling the source that leverages those dependencies. So it'll be faster, right? And less prone to risk and break and change and all that. Yeah, I think in.NET world, it doesn't make as much sense because you kind of have to explicitly update your NuGet packages. But in something like a Ruby or a JavaScript, you can say like, you know, npm install Express, and you don't even know what version you're specifically on. And so when I NPM start or NPM install, like the version of Express that I get may be different from the versions of Express
Starting point is 02:00:53 that you guys are getting. I don't treat that as source code modules then. What am I missing here? He says that we can control the dependencies between source code modules. So the changes to one module do not force changes or recompilation to others. If you're talking about you're accessing the source code, then you're not using a package manager to get that source. Is my interpretation. I guess so. But I mean, you could think like if you've got like a front end project, a middleware project, a database project, if somebody changes a store procedure, I don't have to recompile. Somebody changes the CSS, like I don't need to recompile. I guess it depends on the type of changes they make, though, right?
Starting point is 02:01:38 Yeah. If they change columns, that's a different story. Yeah, I mean, yeah, we can move on but that that that one definitely confused me um but i did find it interesting though he brought up the monolithic structure in this section yep um you know where you just he i think maybe we've even talked about like monolithic repos um things things along that lines but you know keeping everything into a single executable or a single address space as he sometimes refers to it in the in the book um and refers to that as a monolithic structure
Starting point is 02:02:19 yep um the second layer was the deployment layer which is similar but independently deployed and i think it gives examples here of like jars or dlls um i don't typically deploy those kind of things separately though so i guess if you had like a you know like a plug-in architecture or something then that would make sense that you could just drop the dlls that actually changed those plugins but yeah overall um i guess you're right like i'm not feeling really too strongly about what the distinction is between those okay now i'm glad you said plugin because that because because i actually had a note here about the dll ones because i was like wait a minute have you ever like added a new dll to your project without recompiling right to like
Starting point is 02:03:01 make sure that it still works or things like that. But, you know, the example that you gave with the plugin architecture actually makes a lot of sense, because then if you're, say, notepad plus plus, right, or a sublime, and you've you have a well established plugin architecture, just because somebody deploys a new JSON formatter plugin for that works with your UI doesn't mean that you got to recompile your UI. So now I kind of get that example better. That makes a little bit more sense. And the Java world, the Java world that I when I used to work in a little bit, you'd have like a server container. And then in that case, it would be very common sometimes to go and drop a jar or a war or a car or your you know
Starting point is 02:03:45 whatever in order to update that and it was very common to do you know do something like just redeploy a part of your whole i don't want to say application but part of your whole system like you might update your cold fusion server independently of your code or vice versa yeah it's like a hot swap almost right yeah so if I think of deployment level as like plug-in architecture, then I think I can get that one. Yep. And then we have the service level, which is separated by network and it's completely independent deployment.
Starting point is 02:04:23 Okay, yeah, we get into that in a minute. So I'll skip on that. Yeah. And so I can get that. Like if we've got two services that talk to each other and then that makes sense, like even though they may end up on the same box together, I'm still kind of communicating between those two, like with HTTP or some other, you know, protocol buffer or something like that. see a buzzword coming yeah uh which is best uh hard to know during the early phases of a project so um we'll get into a recommendation here in a minute but um yeah you know deciding if something is going to be a service or not up front uh it's kind of just tough decision especially as those use cases are really taking shape yeah so microservices uh are or were all the rave
Starting point is 02:05:07 for some period but that service level decoupling is expensive both in terms of the time of the developers and the system resources that it would take to do that did you just say all the rave well weren't they i mean wasn't there a period of time like i feel like it's kind of gone back now like the wave has crashed on it to where it's not so much now but it definitely felt like there was a period of time where it was like microservice all the things and now it's like don't oh yeah but you said all the rave rage i always thought it was all the rage but i just googled it and apparently this is quite contentious on the internet like there are things called all the ray there's uh all the rage um
Starting point is 02:05:53 yeah okay so urban dictionary rabbit hole someone saved me no we need to know where this ends okay so yes you don't let me rephrase this microservices are all the rage against the machine um but actually that's probably pretty accurate yeah no matter what we're still just rats and cages right yes you know what was interesting though and this is what i really liked so you know he wasn't trying to say that microservices are horrible or anything like that, but he did say push the decoupling to the point to where a service could be formed. Right. Should it is a different question, right? But could be. And so if you make your applications architecture in a way to where that thing could be leveraged and deployed as a service
Starting point is 02:06:44 later, awesome, right? But that thing could be leveraged and deployed as a service later. Awesome. Right. But that shouldn't be where you start. Yeah. Cause you know, that, and that's really the point that he's making now. It's like, Hey, if you tried to start with that, um, microservice before you even realize that you need it, it's really expensive. So why would you spend the time and money on that, um, beforehand? So defer that decision. Yeah. So again, it kind of comes back to drawing hard lines and pushing your dependencies out to the edges. Yep. And this was a pretty good one too. I thought good architecture will allow systems start as a monolith, then grow independently to multiple deployable units. And then if it
Starting point is 02:07:23 needs to come back into a monolith at some point in time, it can. So it's interesting when you think about that, if you build it in a way to where you can chunk out things over time, then you've won, right? You didn't lose anything by doing it up front, and you probably made it more readable and easier for people to maintain and add to over time. But you've also set yourself up for future expansion if need be so i actually had a note here in the book about that part because i was like wait a minute you start as a monolithic repository and application you decide to break it apart into independently deployable parts and developed independently and whatnot they version independently and then you're like okay decide to break it apart into independently deployable parts and
Starting point is 02:08:05 developed independently and whatnot, they version independently and then you're like, okay, let's just bring this all back down into one monolithic application, repository, whatever, right? Has that ever happened? I doubt it. And like, what might be an example? Wait, did you say monolith to microservices
Starting point is 02:08:24 or the other way monolith i don't want to say microservice but let's just say monolithic to micro something micro units back to monolithic yeah i don't know i know twitter was kind of famous for you know taking their quote of a monolith to microservices that was the first was kind of famous for, you know, taking their quote-unquote monolith to microservices. That was the first I kind of heard about it. But I don't know. I feel like I heard something recently about them bringing things back together. But I don't know if I made that up or not. I thought of some examples that might be.
Starting point is 02:08:56 And two that, well, I only really had one before. But then two just came to mind as I was talking, which was we've talked about in the past, we've referenced both Google and Microsoft with the scale of their repositories, right? And so if I recall correctly, before those things were not in, they were, I think they were individual repositories and whatnot, but then they ended up getting pulled together over time because they found that it was easier to do the development to avoid like dependency diamonds and things like that. Right. If I, if I'm remembering those stories, correct. But another example, if I could take this to, uh, back to gaming is that maybe in like, um, say the, uh World War II comes out, and it's wildly popular.
Starting point is 02:09:52 And so in the beginning of that thing, the application started out as like, okay, let's just get the application working. So it's monolithic. Let's get the infrastructure for everything in place. It's monolithic. And then, okay, it's release time. So now, you know, leading up to the release time, they start breaking things apart so that it can scale. But then after the game has been out for a few years, the popularity declines, there's less of a need to have all that scale. So they start to like, okay, we can bring it all back in together so that, yeah, we'll,
Starting point is 02:10:26 we'll still put out updates or we'll still support the service, but it can be a much smaller entity now. Right. Maybe. I don't know. Yeah, that's possible. That makes sense.
Starting point is 02:10:39 I mean, I don't know of any real ones off the top of my head, but, but that does make sense. All right. So that wraps up. I mean, we just talked about a lot more about architecture in terms of how do you do this and what are the right balances as you're going through and figuring out the way to break up your application so that it becomes more maintainable over time. Yeah, we really had a big focus on what the architect is responsible for and how they,
Starting point is 02:11:12 you know, how they affect those things. Yep. And so now there's some resources we like, obviously, clean architecture, as we mentioned up here at the beginning. You know, if you want to go leave a comment on coding blocks.net slash episode 73, you know, you'll be entered for your chance to win a copy of the book. And also, so recently I'd been, I don't know how I came across this one, but there there's a plural site video or course called feature toggles and package deployment and versioning. And this is by Marcel DeFries, I think is his name. Uh, man, I can't remember anyways. Yeah. Marcel DeFries,
Starting point is 02:11:54 the dude's really good. He did, he did another, uh, another course on using Docker with visual studio so that you can do, um do your entire Visual Studio application in Docker, both the database and your application. He does an excellent job. Well, this one kind of fit into our talk today because he also gets to talking about package management and versioning, at least for Microsoft and VSTS. So it's kind of interesting, like a topic that's come up is, you know, how do you break things out into packages so that they can be deployable and be part of your code in a way that's not a pain? So I left a link for that one here. And you do see feature toggles being used in the wild, too. apart the latest version of say an ios um and they'll start finding hints of like oh hey here's
Starting point is 02:12:47 the hints of what the next uh iphone is going to look like or the support the specs that it's going to support for example yep because they'll decompile the stuff yep yeah and there's there's actually in this video they have nu-git packages for feature toggle libraries. So I wouldn't say that there's a ton baked in to make it happen, but it does force you through a standardized way of doing things. So anyway, really, really good video. I'm about halfway through it and hopefully finish it up here pretty soon. But with that, now it's time for my favorite part of the show, and it's the tip of the week. So Outlaw, what you got all right so
Starting point is 02:13:27 uh for my tip of the week i will give you a get tip uh so have you ever found yourself where you have um changed multiple parts of the same file and you're ready to stage portions of that file but not you don't want to give up the other stuff just yet uh, but not, you don't want to give up the other stuff just yet. So you don't, you don't want to remove those changes, but you also don't want to commit them or even stage them, right? So Git will allow you to interactively stage portions or chunks, as it calls it, of a file or a path. So you can say, get add minus P, and then whatever your file is, or the path spec, and it will prompt you for the parts. And it'll give you like, you know, hey, do you want to do you want to stage this part? Do you want not or
Starting point is 02:14:20 whatever. And it's basically a short for dash P would be short for like a dash dash interactive effectively. That's pretty cool. There have been times that I've wanted to do things like that. And I didn't even know that existed. Yep. It's super awesome. Excellent. All right. So I've got a couple of this time only because as my mind goes, as I get older, I didn't want to forget one of them. So here's, here's two, one is SQL operation studio. So if you work on a Mac and you've been annoyed by the fact that there's no SQL management studio for Mac to work with SQL server, uh, you know, fear no more. You can download SQL operation studio, which is sort of like your
Starting point is 02:15:03 SQL server management studio on windows. And you can work directly with SQL server. And they just released, um, the January version of this thing. And I think it might still be in beta, but really cool stuff. You know, the lines are getting blurred even more now with Microsoft where you can sort of work on just about any platform you want. So that one's really cool. Love that. The next one is, so we've talked about TypeScript a little bit on the show. I mean, we definitely do in Slack channels and various places. I'd never heard of this one. There's one called Flow and it is a way to strongly type your JavaScript or it's a static type checker for JavaScript. And so we'll have a link for that as well. It's flow.org. And this came up in our JavaScript Slack channel the other
Starting point is 02:15:52 day, never heard of it, thought it was pretty cool. So, um, you know, go check it out. I don't know that I'd use it over TypeScript, but it's nice to know that there's different options out there. Awesome. Um, so for my tip, I wanted to mention a new show that actually they don't have a feed yet, but probably by the time that you are hearing this episode, that we'll have an independent feed. And that's Application Security Weekly. And you can listen to it now. It's part of Paul's Security Weekly network, which has a bunch of different shows in the security space. But this one is actually focused on coders. And it's hosted by Keith Hudlitt, who's a super sharp guy, really knows his stuff, and is coming from a space that I understand, right? He's speaking from the coder perspective. So I'm really loving the show. They'll
Starting point is 02:16:34 probably have an independent feed right soon, and you can get it right now via Paul's feed. But I will be updating the show notes whenever there is an independent feed there just to make things a little bit easier for you now in the meantime you can listen to the first two episodes up now and we'll have a link in the show notes but it's a really good show and if you are interested in application security weekly like this week they just talked about the new OWASP changes in 2017 and just have some great recommendations so So you should check it out. Excellent. And apparently I jumped the gun with the show summary earlier.
Starting point is 02:17:10 So yeah, we already did that. Yeah. All good. The responsibilities and techniques for isolation. Sorry, I'm still like I have passed peak caffeine. Like this was just too much for me. I've been like jittering the whole time. So sorry, guys.
Starting point is 02:17:26 Good thing you're standing up. Yeah, it's awesome. Yeah, my feet, it doesn't look like it, but I've actually been running the whole time underneath. Meet me. All right. Hula hooping. So with that, subscribe to us on iTunes, Stitcher, and more using your favorite podcast app. Be sure to leave us a review. You can head to www.codingblocks.net
Starting point is 02:17:47 slash review to find links to all your favorite podcast sources. Oh, yes. Sorry. My bad. I totally... We always forget if you want stickers or some swag, hit us up at codingblocks.net
Starting point is 02:18:02 slash swag and send us a self-addressed stamped envelope. While you're up there, check out all our show notes, examples, discussions, and more. My favorite is our show notes. Show notes. Those are good ones. We have good ones. Have you had too much caffeine?
Starting point is 02:18:17 I have had no caffeine. And if you are curious or confused about how to send a self address stamp envelope or what kind of swag options we have you can always send a feedback question or rant to us on twitter or over at the slack channel codingblocks.slack.com you can actually send yourself an invite and come on in and lurk
Starting point is 02:18:38 or participate as you like make sure to follow us on twitter at codingblocks or head over to the website codingblocks.net where we have amazing show notes and other random stuff. So you'll find all our social links at the top of the page. You can find our YouTube, you know, our other blog articles, all sorts of stuff that we're up to. Check it out.

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