Stop Pretending You Understand Your Codebase
Read full transcript 21 segments
-
I got a hot take for you guys. If you I got a hot take for you guys. If you truly fully understand all of the code truly fully understand all of the code truly fully understand all of the code in the projects that you're working on, in the projects that you're working on, in the projects that you're working on, you're probably not working on things you're probably not working on things you're probably not working on things that are that important or serious. The that are that important or serious. The that are that important or serious. The bigger the codebase and the more bigger the codebase and the more bigger the codebase and the more important the work you're doing is, the important the work you're doing is, the important the work you're doing is, the less likely it is that you understand less likely it is that you understand less likely it is that you understand everything going on in it. Realistically everything going on in it. Realistically everything going on in it. Realistically speaking, the code bases that matter the speaking, the code bases that matter the speaking, the code bases that matter the most, the ones that power things like most, the ones that power things like most, the ones that power things like the operating systems we use or the the operating systems we use or the the operating systems we use or the platforms that we go to every day or platforms that we go to every day or platforms that we go to every day or even the foundational technologies and even the foundational technologies and even the foundational technologies and frameworks and libraries we use, things frameworks and libraries we use, things frameworks and libraries we use, things like Postgress itself. Nobody like Postgress itself. Nobody like Postgress itself. Nobody understands all of the code in these understands all of the code in these understands all of the code in these things. And I feel like we pretend things. And I feel like we pretend things. And I feel like we pretend that's not the case. As an industry, that's not the case. As an industry, that's not the case. As an industry, we've always liked to think of the best we've always liked to think of the best we've always liked to think of the best programmers as these super geniuses that programmers as these super geniuses that programmers as these super geniuses that know exactly where everything is in the know exactly where everything is in the know exactly where everything is in the codebase always. And those people feel codebase always. And those people feel codebase always. And those people feel like they exist, but I'm going to be like they exist, but I'm going to be like they exist, but I'm going to be real with you, they don't. What they real with you, they don't. What they real with you, they don't. What they have is different. What they have is a have is different. What they have is a have is different. What they have is a good intuition for where things would good intuition for where things would good intuition for where things would go. And it's not just based on go. And it's not just based on go. And it's not just based on memorizing where every single file is memorizing where every single file is memorizing where every single file is and every line of code that's in it. It and every line of code that's in it. It and every line of code that's in it. It comes from a higher level understanding comes from a higher level understanding comes from a higher level understanding of how good software is architected and of how good software is architected and of how good software is architected and where things should go. And with that where things should go. And with that where things should go. And with that comes certain patterns that make those comes certain patterns that make those comes certain patterns that make those developers better. Moving things around developers better. Moving things around developers better. Moving things around to get stuff where it should be to make to get stuff where it should be to make to get stuff where it should be to make it easier to make good decisions about it easier to make good decisions about it easier to make good decisions about it as you work in this codebase. And it as you work in this codebase. And it as you work in this codebase. And importantly, as less familiar people importantly, as less familiar people importantly, as less familiar people work in that codebase, too. A good work in that codebase, too. A good work in that codebase, too. A good codebase is not one where every single codebase is not one where every single codebase is not one where every single person at the company knows where person at the company knows where person at the company knows where everything is. A good codebase is one everything is. A good codebase is one everything is. A good codebase is one where it doesn't really matter that where it doesn't really matter that where it doesn't really matter that much. What matters is that people can much. What matters is that people can much. What matters is that people can find the right place for something find the right place for something find the right place for something relatively quickly. I'm talking about relatively quickly. I'm talking about relatively quickly. I'm talking about this today because of another Shan this today because of another Shan this today because of another Shan article. I've loved everything he has
-
article. I've loved everything he has article. I've loved everything he has written so far and I have a feeling I'm written so far and I have a feeling I'm written so far and I have a feeling I'm gonna love this one too. I'm guessing as gonna love this one too. I'm guessing as gonna love this one too. I'm guessing as to why he wrote this. My assumption to why he wrote this. My assumption to why he wrote this. My assumption would be that this came out because of would be that this came out because of would be that this came out because of people vibe coding so hard they don't people vibe coding so hard they don't people vibe coding so hard they don't know where anything is anymore. And I'm know where anything is anymore. And I'm know where anything is anymore. And I'm not here to defend that. All of that not here to defend that. All of that not here to defend that. All of that said, I do have a very different said, I do have a very different said, I do have a very different relationship with my code bases than I relationship with my code bases than I relationship with my code bases than I did in the past. And my awareness of did in the past. And my awareness of did in the past. And my awareness of where things are in them and the actual where things are in them and the actual where things are in them and the actual code going in is a spectrum now that is code going in is a spectrum now that is code going in is a spectrum now that is wider than it's ever been. There are wider than it's ever been. There are wider than it's ever been. There are some places where I feel like I some places where I feel like I some places where I feel like I understand better than ever what's going understand better than ever what's going understand better than ever what's going on. But I'll be realistic here. There on. But I'll be realistic here. There on. But I'll be realistic here. There are even more where I don't understand are even more where I don't understand are even more where I don't understand jack And I'm going to do jack And I'm going to do jack And I'm going to do my best to defend that, to defend the my best to defend that, to defend the my best to defend that, to defend the code bases where I have no idea what's code bases where I have no idea what's code bases where I have no idea what's going on or where anything is. And I'm going on or where anything is. And I'm going on or where anything is. And I'm going to read along with this article as going to read along with this article as going to read along with this article as we do it. I am so excited for this we do it. I am so excited for this we do it. I am so excited for this discussion because I feel like it's a a discussion because I feel like it's a a discussion because I feel like it's a a taboo topic where it comes up a lot, but taboo topic where it comes up a lot, but taboo topic where it comes up a lot, but the conversation we have isn't actually the conversation we have isn't actually the conversation we have isn't actually about the thing. And I want to go into about the thing. And I want to go into about the thing. And I want to go into the details on how we actually use our the details on how we actually use our the details on how we actually use our brains to understand code. But I have to brains to understand code. But I have to brains to understand code. But I have to borrow your brain for a sec for a quick borrow your brain for a sec for a quick borrow your brain for a sec for a quick message from today's sponsor. Recently, message from today's sponsor. Recently, message from today's sponsor. Recently, I feel like my whole life is just I feel like my whole life is just I feel like my whole life is just managing servers. If I'm trying to work managing servers. If I'm trying to work managing servers. If I'm trying to work in parallel, I have to go spin up a in parallel, I have to go spin up a in parallel, I have to go spin up a bunch of boxes that can run my code. And bunch of boxes that can run my code. And bunch of boxes that can run my code. And I'm spending half the time waiting for I'm spending half the time waiting for I'm spending half the time waiting for Docker to build. And once I have those Docker to build. And once I have those Docker to build. And once I have those changes ready to go, I push them up to changes ready to go, I push them up to changes ready to go, I push them up to GitHub. And now I'm sitting there GitHub. And now I'm sitting there GitHub. And now I'm sitting there waiting for the code to actually build.
-
waiting for the code to actually build. waiting for the code to actually build. And it's just pulling the same code and And it's just pulling the same code and And it's just pulling the same code and building the same thing with one or two building the same thing with one or two building the same thing with one or two lines change. Okay, maybe a couple lines change. Okay, maybe a couple lines change. Okay, maybe a couple hundred. We're using agents, let's be hundred. We're using agents, let's be hundred. We're using agents, let's be real. But the amount of time I'm wasting real. But the amount of time I'm wasting real. But the amount of time I'm wasting just sitting there is so obnoxious that just sitting there is so obnoxious that just sitting there is so obnoxious that I was really thankful when I moved over I was really thankful when I moved over I was really thankful when I moved over to today's sponsor. Debo's here to solve to today's sponsor. Debo's here to solve to today's sponsor. Debo's here to solve all of those problems. From where you all of those problems. From where you all of those problems. From where you run your agents to where your CI runs to run your agents to where your CI runs to run your agents to where your CI runs to how you're actually building from Docker how you're actually building from Docker how you're actually building from Docker in the first place. The depot CLI solves in the first place. The depot CLI solves in the first place. The depot CLI solves all of these problems and more. It makes all of these problems and more. It makes all of these problems and more. It makes it trivial to share your Docker builds it trivial to share your Docker builds it trivial to share your Docker builds and all the layers across depot's cache. and all the layers across depot's cache. and all the layers across depot's cache. Not just for you, but for your CI and Not just for you, but for your CI and Not just for you, but for your CI and for your team, too. So, everyone gets for your team, too. So, everyone gets for your team, too. So, everyone gets way faster builds across all platforms. way faster builds across all platforms. way faster builds across all platforms. And when I say way faster, I mean it. up And when I say way faster, I mean it. up And when I say way faster, I mean it. up to 40 times faster for realworld Docker to 40 times faster for realworld Docker to 40 times faster for realworld Docker builds. That's why companies like Post builds. That's why companies like Post builds. That's why companies like Post Hog, Planet, Scale, Inference, and more Hog, Planet, Scale, Inference, and more Hog, Planet, Scale, Inference, and more have all made the move over. It's just have all made the move over. It's just have all made the move over. It's just so much faster for those Docker builds. so much faster for those Docker builds. so much faster for those Docker builds. Their CI is way faster, too. But what I Their CI is way faster, too. But what I Their CI is way faster, too. But what I want to talk about right now is the want to talk about right now is the want to talk about right now is the remote agents stuff. Once you have their remote agents stuff. Once you have their remote agents stuff. Once you have their CLI set up and it has your Docker image, CLI set up and it has your Docker image, CLI set up and it has your Docker image, all of a sudden, you can just run Claude all of a sudden, you can just run Claude all of a sudden, you can just run Claude in it. You literally just run depot in it. You literally just run depot in it. You literally just run depot Claude instead of calling Claude Claude instead of calling Claude Claude instead of calling Claude directly. And now you have a real directly. And now you have a real directly. And now you have a real isolated sandbox you can get real work isolated sandbox you can get real work isolated sandbox you can get real work done in. Considering all the time I've done in. Considering all the time I've done in. Considering all the time I've put into managing all of my machines in put into managing all of my machines in put into managing all of my machines in order to get something similar, one order to get something similar, one order to get something similar, one command is very, very tempting. If command is very, very tempting. If command is very, very tempting. If you've been annoyed with your Docker you've been annoyed with your Docker you've been annoyed with your Docker build times or struggling to find a build times or struggling to find a build times or struggling to find a place to run your agents, look no place to run your agents, look no place to run your agents, look no further than soy.
-
further than soy. further than soy. I really love how Shawn opened this here I really love how Shawn opened this here I really love how Shawn opened this here in defense of not understanding your in defense of not understanding your in defense of not understanding your codebase with a good question to start, codebase with a good question to start, codebase with a good question to start, too. As a software engineer, how well do too. As a software engineer, how well do too. As a software engineer, how well do you have to understand your own you have to understand your own you have to understand your own codebase? This seems like a simple codebase? This seems like a simple codebase? This seems like a simple question, like every dev should question, like every dev should question, like every dev should understand their codebase. No, not that understand their codebase. No, not that understand their codebase. No, not that simple at all. Let's read to see what simple at all. Let's read to see what simple at all. Let's read to see what Sean has to say. My guess is that people Sean has to say. My guess is that people Sean has to say. My guess is that people who work on small code bases with low who work on small code bases with low who work on small code bases with low turnover teams, things like a library turnover teams, things like a library turnover teams, things like a library like Reddus or a game like The Witness like Reddus or a game like The Witness like Reddus or a game like The Witness would probably say obviously you have to would probably say obviously you have to would probably say obviously you have to understand it completely otherwise you understand it completely otherwise you understand it completely otherwise you can't do good work. I'd also guess the can't do good work. I'd also guess the can't do good work. I'd also guess the people who work on large code bases with people who work on large code bases with people who work on large code bases with high turnover teams like the Google web high turnover teams like the Google web high turnover teams like the Google web search backend or GitHub itself would search backend or GitHub itself would search backend or GitHub itself would say obviously you can't understand it say obviously you can't understand it say obviously you can't understand it completely. You just have to do the best completely. You just have to do the best completely. You just have to do the best you can in your local area. These are you can in your local area. These are you can in your local area. These are two largely different ways of two largely different ways of two largely different ways of programming with different methods, programming with different methods, programming with different methods, practices, and cultures. However, the practices, and cultures. However, the practices, and cultures. However, the first group is over represented in first group is over represented in first group is over represented in online discussions about software online discussions about software online discussions about software engineering. Woof, coming in swinging, engineering. Woof, coming in swinging, engineering. Woof, coming in swinging, Sean. Thank you. I want to defend the Sean. Thank you. I want to defend the Sean. Thank you. I want to defend the second group against the first. In many second group against the first. In many second group against the first. In many software engineering environments, software engineering environments, software engineering environments, there's nothing wrong with being in a there's nothing wrong with being in a there's nothing wrong with being in a state of partial understanding. In fact, state of partial understanding. In fact, state of partial understanding. In fact, in large systems, a partial in large systems, a partial in large systems, a partial understanding is the best that you can understanding is the best that you can understanding is the best that you can do. I almost entirely agree here. I do. I almost entirely agree here. I do. I almost entirely agree here. I wouldn't necessarily word it this way as wouldn't necessarily word it this way as wouldn't necessarily word it this way as a partial understanding rather like the a partial understanding rather like the a partial understanding rather like the depth of your understanding should depth of your understanding should depth of your understanding should change depending on where you are. I change depending on where you are. I change depending on where you are. I think you should generally understand think you should generally understand think you should generally understand how the pieces come together in a big how the pieces come together in a big how the pieces come together in a big code base before you make changes in code base before you make changes in code base before you make changes in your isolated section. Like you should your isolated section. Like you should your isolated section. Like you should know what is where to some extent, but
-
know what is where to some extent, but know what is where to some extent, but you obviously cannot understand the you obviously cannot understand the you obviously cannot understand the inner workings of the pieces. We'll see inner workings of the pieces. We'll see inner workings of the pieces. We'll see where Shawn goes with this. Against where Shawn goes with this. Against where Shawn goes with this. Against programming as theorybuilding. Oh boy. programming as theorybuilding. Oh boy. programming as theorybuilding. Oh boy. The best articulation of the quote, you The best articulation of the quote, you The best articulation of the quote, you have to understand your codebase side is have to understand your codebase side is have to understand your codebase side is Peter No's famous paper, Programming is Peter No's famous paper, Programming is Peter No's famous paper, Programming is theory building. I like this paper, but theory building. I like this paper, but theory building. I like this paper, but I think it goes too far in that I think it goes too far in that I think it goes too far in that direction. Nar's core point is that when direction. Nar's core point is that when direction. Nar's core point is that when programmers work on a program, the code programmers work on a program, the code programmers work on a program, the code is really just a byproduct, and the main is really just a byproduct, and the main is really just a byproduct, and the main product they're working on is their product they're working on is their product they're working on is their theory of the program. Interesting. I theory of the program. Interesting. I theory of the program. Interesting. I was assuming they were going to say the was assuming they were going to say the was assuming they were going to say the code is a byproduct and the product is code is a byproduct and the product is code is a byproduct and the product is the thing that they're actually like the thing that they're actually like the thing that they're actually like producing, but what apparently it's a producing, but what apparently it's a producing, but what apparently it's a level the other direction. There's the level the other direction. There's the level the other direction. There's the theory of the code, then there's the theory of the code, then there's the theory of the code, then there's the code, then there's the product on top. code, then there's the product on top. code, then there's the product on top. Seems like the theory building paper is Seems like the theory building paper is Seems like the theory building paper is pushing you the wrong direction in my pushing you the wrong direction in my pushing you the wrong direction in my opinion. So, it'll be interesting to see opinion. So, it'll be interesting to see opinion. So, it'll be interesting to see where this goes. Theory of programming where this goes. Theory of programming where this goes. Theory of programming is made up of their intuitive sense of is made up of their intuitive sense of is made up of their intuitive sense of what's happening and why, which can only what's happening and why, which can only what's happening and why, which can only be partially captured by code or be partially captured by code or be partially captured by code or documentation. Woof, more bangers. It is documentation. Woof, more bangers. It is documentation. Woof, more bangers. It is basically impossible to just write down basically impossible to just write down basically impossible to just write down how all of these things work. If you've how all of these things work. If you've how all of these things work. If you've tried to set up your codebases for tried to set up your codebases for tried to set up your codebases for agents, you already know this. There is agents, you already know this. There is agents, you already know this. There is no magic solution where everything you no magic solution where everything you no magic solution where everything you need to know about the codebase can be need to know about the codebase can be need to know about the codebase can be written as pros in code. There's a written as pros in code. There's a written as pros in code. There's a certain level of intuition you build as certain level of intuition you build as certain level of intuition you build as you work in the project about where you work in the project about where you work in the project about where things fail, why they might fail, what's things fail, why they might fail, what's things fail, why they might fail, what's going on, all these types of things that going on, all these types of things that going on, all these types of things that is historical outside of that codebase, is historical outside of that codebase, is historical outside of that codebase, just your general experience, but is just your general experience, but is just your general experience, but is also tuned to the specific codebase also tuned to the specific codebase also tuned to the specific codebase after you spend a lot of time in it. If after you spend a lot of time in it. If after you spend a lot of time in it. If a developer loses the code, they could a developer loses the code, they could a developer loses the code, they could rewrite the program easily. If they lose
-
rewrite the program easily. If they lose rewrite the program easily. If they lose their understanding, like if the team their understanding, like if the team their understanding, like if the team experienced a complete turnover, they experienced a complete turnover, they experienced a complete turnover, they would struggle to make sense of the would struggle to make sense of the would struggle to make sense of the code. code. code. Very true here. The important thing here Very true here. The important thing here Very true here. The important thing here to remember is that agents are 100% to remember is that agents are 100% to remember is that agents are 100% turnover constantly because every time turnover constantly because every time turnover constantly because every time you start a new thread, all the things you start a new thread, all the things you start a new thread, all the things the previous thread do are gone. It's the previous thread do are gone. It's the previous thread do are gone. It's like you're starting with a fresh like you're starting with a fresh like you're starting with a fresh developer every time you open a new developer every time you open a new developer every time you open a new thread. And that is awesome if you set thread. And that is awesome if you set thread. And that is awesome if you set things up for those agents to perform things up for those agents to perform things up for those agents to perform well without having this historical well without having this historical well without having this historical knowledge. But it's a it's a fun knowledge. But it's a it's a fun knowledge. But it's a it's a fun challenge in a way. And this is part of challenge in a way. And this is part of challenge in a way. And this is part of why I've been liking coding this new way why I've been liking coding this new way why I've been liking coding this new way so much is it's fun to try and figure so much is it's fun to try and figure so much is it's fun to try and figure out what it takes to make a new out what it takes to make a new out what it takes to make a new developer who's incredibly capable but developer who's incredibly capable but developer who's incredibly capable but doesn't know your codebase yet be able doesn't know your codebase yet be able doesn't know your codebase yet be able to act in meaningful ways as effectively to act in meaningful ways as effectively to act in meaningful ways as effectively as possible. It's like a fun rewarding as possible. It's like a fun rewarding as possible. It's like a fun rewarding thing. Apparently Shawn agrees with what thing. Apparently Shawn agrees with what thing. Apparently Shawn agrees with what Nor has said so far, but he goes further Nor has said so far, but he goes further Nor has said so far, but he goes further than what has been said. He says the than what has been said. He says the than what has been said. He says the theory should not be reconstructed from theory should not be reconstructed from theory should not be reconstructed from the code. According to Nor, you're the code. According to Nor, you're the code. According to Nor, you're better off scrapping the program better off scrapping the program better off scrapping the program entirely and having a new team rebuild entirely and having a new team rebuild entirely and having a new team rebuild from scratch, building up a new theory from scratch, building up a new theory from scratch, building up a new theory in the process. Interesting.
-
in the process. Interesting. in the process. Interesting. Reestablishing the theory of a program Reestablishing the theory of a program Reestablishing the theory of a program merely from the docs is strictly merely from the docs is strictly merely from the docs is strictly impossible. Therefore, the existing impossible. Therefore, the existing impossible. Therefore, the existing program tech should be discarded and the program tech should be discarded and the program tech should be discarded and the new formed programmer team should be new formed programmer team should be new formed programmer team should be given the opportunity to solve the given given the opportunity to solve the given given the opportunity to solve the given problem. of huh I could be convinced problem. of huh I could be convinced problem. of huh I could be convinced there are lots of places where you there are lots of places where you there are lots of places where you cannot do this and this is what I think cannot do this and this is what I think cannot do this and this is what I think Sean's going to say is that large enough Sean's going to say is that large enough Sean's going to say is that large enough this is not realist this is not realist this is not realist I'll put my AI spin on this in a little I'll put my AI spin on this in a little I'll put my AI spin on this in a little bit for now Sean says that anyone who's bit for now Sean says that anyone who's bit for now Sean says that anyone who's been an effective software engineer at a been an effective software engineer at a been an effective software engineer at a large company knows that no is dead large company knows that no is dead large company knows that no is dead wrong about this at least two reasons wrong about this at least two reasons wrong about this at least two reasons why you simply can't rebuild large why you simply can't rebuild large why you simply can't rebuild large software systems from scratch software systems from scratch software systems from scratch sufficiently large systems if they have sufficiently large systems if they have sufficiently large systems if they have users contain thousands of weird weird users contain thousands of weird weird users contain thousands of weird weird cases and quirks that cannot be cases and quirks that cannot be cases and quirks that cannot be reimplemented. Even a team that's reimplemented. Even a team that's reimplemented. Even a team that's intimately familiar with the system intimately familiar with the system intimately familiar with the system couldn't do it. There's just too much couldn't do it. There's just too much couldn't do it. There's just too much stuff to juggle. I'm going to guess that stuff to juggle. I'm going to guess that stuff to juggle. I'm going to guess that the weird cases is an XKCD link to the the weird cases is an XKCD link to the the weird cases is an XKCD link to the space bar thing. Am I right? No, I am space bar thing. Am I right? No, I am space bar thing. Am I right? No, I am not. not. not. This wicked features article actually This wicked features article actually This wicked features article actually looks great as well. things that seem looks great as well. things that seem looks great as well. things that seem good as ideas but end up making life good as ideas but end up making life good as ideas but end up making life hell over time like new user types hell over time like new user types hell over time like new user types making sure that your SAS can be done on making sure that your SAS can be done on making sure that your SAS can be done on prem if you want to provide that prem if you want to provide that prem if you want to provide that sharding across many databases sharding across many databases sharding across many databases supporting strong data locality oh god supporting strong data locality oh god supporting strong data locality oh god data locality hurts me so deeply data locality hurts me so deeply data locality hurts me so deeply internationalization thankfully has internationalization thankfully has internationalization thankfully has gotten easier thanks to a sponsor that gotten easier thanks to a sponsor that gotten easier thanks to a sponsor that may or not be on this video changes in may or not be on this video changes in may or not be on this video changes in version 10.17 version 10.17 version 10.17 the CPU no longer overheats when you the CPU no longer overheats when you the CPU no longer overheats when you hold down the space bar comment
-
hold down the space bar comment hold down the space bar comment Longtime user 4 writes, "This update Longtime user 4 writes, "This update Longtime user 4 writes, "This update broke my workflow. My control key is broke my workflow. My control key is broke my workflow. My control key is hard to reach, so I hold spacebar hard to reach, so I hold spacebar hard to reach, so I hold spacebar instead, and I configured Emacs to instead, and I configured Emacs to instead, and I configured Emacs to interpret a rapid temperature rise as interpret a rapid temperature rise as interpret a rapid temperature rise as control. That's horrifying. Look, my control. That's horrifying. Look, my control. That's horrifying. Look, my setup works for me. Just add an option setup works for me. Just add an option setup works for me. Just add an option to reenable the spacebar heating." to reenable the spacebar heating." to reenable the spacebar heating." Absolute classic. I bring it up here Absolute classic. I bring it up here Absolute classic. I bring it up here because the things in the system that because the things in the system that because the things in the system that might not be intended, the quirks of how might not be intended, the quirks of how might not be intended, the quirks of how it works and the patches that have been it works and the patches that have been it works and the patches that have been added to make something work for some added to make something work for some added to make something work for some random specific user, those things are random specific user, those things are random specific user, those things are wired deeply in the codebase. And if the wired deeply in the codebase. And if the wired deeply in the codebase. And if the person who understood those things is no person who understood those things is no person who understood those things is no longer there, it is very unlikely that longer there, it is very unlikely that longer there, it is very unlikely that you successfully replicate them in a you successfully replicate them in a you successfully replicate them in a fresh rewrite. I love the call out Sean fresh rewrite. I love the call out Sean fresh rewrite. I love the call out Sean has here that a successful rewrite has here that a successful rewrite has here that a successful rewrite always starts by carving out the always starts by carving out the always starts by carving out the existing codebase into small isolated existing codebase into small isolated existing codebase into small isolated chunks then rewriting one chunk at a chunks then rewriting one chunk at a chunks then rewriting one chunk at a time. In other words, rewriting a time. In other words, rewriting a time. In other words, rewriting a software system involves making a bunch software system involves making a bunch software system involves making a bunch of changes to the old system. You can't of changes to the old system. You can't of changes to the old system. You can't change the old system. You certainly change the old system. You certainly change the old system. You certainly can't replace it with a new one. can't replace it with a new one. can't replace it with a new one. Absolutely true. I am the person who Absolutely true. I am the person who Absolutely true. I am the person who often comes in as like no this often comes in as like no this often comes in as like no this rewrite. But even then, if like you rewrite. But even then, if like you rewrite. But even then, if like you can't change the existing codebase, I'm can't change the existing codebase, I'm can't change the existing codebase, I'm hesitant. When I'm coming in to do this hesitant. When I'm coming in to do this hesitant. When I'm coming in to do this type of rewrite, I almost always start type of rewrite, I almost always start type of rewrite, I almost always start by working on the existing codebase for by working on the existing codebase for by working on the existing codebase for a bit to get a feel for what is and a bit to get a feel for what is and a bit to get a feel for what is and isn't working, what doesn't matter, how isn't working, what doesn't matter, how isn't working, what doesn't matter, how the team works, what they like and don't the team works, what they like and don't the team works, what they like and don't like. You absolutely should have a good like. You absolutely should have a good like. You absolutely should have a good enough understanding of a codebase that enough understanding of a codebase that enough understanding of a codebase that you can contribute to it meaningfully you can contribute to it meaningfully you can contribute to it meaningfully before you even consider a rewrite. Even before you even consider a rewrite. Even before you even consider a rewrite. Even with agents, I don't think AI has with agents, I don't think AI has with agents, I don't think AI has changed this. I fundamentally believe a
-
changed this. I fundamentally believe a changed this. I fundamentally believe a core understanding is essential if you core understanding is essential if you core understanding is essential if you want to have any chance at rewriting the want to have any chance at rewriting the want to have any chance at rewriting the thing. Which is why when people come up thing. Which is why when people come up thing. Which is why when people come up to me and they're like, "Yo, I rewrote to me and they're like, "Yo, I rewrote to me and they're like, "Yo, I rewrote this thing in Rust." And I'm like, this thing in Rust." And I'm like, this thing in Rust." And I'm like, "Okay, what did you do to try and fix "Okay, what did you do to try and fix "Okay, what did you do to try and fix the original first?" And they're like, the original first?" And they're like, the original first?" And they're like, "Oh, I just thought it was slow, so I "Oh, I just thought it was slow, so I "Oh, I just thought it was slow, so I rewrote it." So, I got I I've been rewrote it." So, I got I I've been rewrote it." So, I got I I've been trying to not crash out about a specific trying to not crash out about a specific trying to not crash out about a specific DM I got a few days ago that I read and DM I got a few days ago that I read and DM I got a few days ago that I read and I shouldn't have. I was curious because I shouldn't have. I was curious because I shouldn't have. I was curious because this individual sent me a Gemini chat this individual sent me a Gemini chat this individual sent me a Gemini chat share link to justify their thoughts share link to justify their thoughts share link to justify their thoughts about why T3 Code, VS Code, and Cursor about why T3 Code, VS Code, and Cursor about why T3 Code, VS Code, and Cursor were all doomed projects that had were all doomed projects that had were all doomed projects that had fundamental performance issues that fundamental performance issues that fundamental performance issues that would never be addressed. And it was a would never be addressed. And it was a would never be addressed. And it was a hallucinated slop Gemini 31 Pro rant hallucinated slop Gemini 31 Pro rant hallucinated slop Gemini 31 Pro rant about Electron being theoretically bad about Electron being theoretically bad about Electron being theoretically bad if you open hundreds of Electron if you open hundreds of Electron if you open hundreds of Electron instances at the same time. He seemed to instances at the same time. He seemed to instances at the same time. He seemed to think that every thread you use in think that every thread you use in think that every thread you use in something like Codeex or Claude Code in something like Codeex or Claude Code in something like Codeex or Claude Code in the Electron app would result in a new the Electron app would result in a new the Electron app would result in a new Electron app spawning, which is just so Electron app spawning, which is just so Electron app spawning, which is just so hilarious and fundamentally wrong. And hilarious and fundamentally wrong. And hilarious and fundamentally wrong. And you can guess what he did at the end. He you can guess what he did at the end. He you can guess what he did at the end. He plugged his own absolute slop plugged his own absolute slop plugged his own absolute slop alternative that was written in Rust alternative that was written in Rust alternative that was written in Rust with no understanding whatsoever about with no understanding whatsoever about with no understanding whatsoever about what he was replacing and what the what he was replacing and what the what he was replacing and what the problems were. This is the average problems were. This is the average problems were. This is the average rewriter. Most people who come in, rewriter. Most people who come in, rewriter. Most people who come in, they're like, "We're gonna rewrite this they're like, "We're gonna rewrite this they're like, "We're gonna rewrite this and make it way better." Feel more like and make it way better." Feel more like and make it way better." Feel more like the Gemini guy than somebody who the Gemini guy than somebody who the Gemini guy than somebody who actually understood the codebase. And it actually understood the codebase. And it actually understood the codebase. And it sucks because they make people who know sucks because they make people who know sucks because they make people who know what they're doing that want to come in what they're doing that want to come in what they're doing that want to come in and rewrite because it makes sense to and rewrite because it makes sense to and rewrite because it makes sense to look worse because we get grouped in look worse because we get grouped in look worse because we get grouped in with these dumb asses that have no idea with these dumb asses that have no idea with these dumb asses that have no idea what they're doing. Anyways, let's go to
-
what they're doing. Anyways, let's go to what they're doing. Anyways, let's go to the second reason why he doesn't agree the second reason why he doesn't agree the second reason why he doesn't agree with this statement that the new with this statement that the new with this statement that the new programmer should just rewrite programmer should just rewrite programmer should just rewrite everything. Abandoned systems are everything. Abandoned systems are everything. Abandoned systems are revived all the time. In a tech company revived all the time. In a tech company revived all the time. In a tech company with hundreds of millions of lines of with hundreds of millions of lines of with hundreds of millions of lines of code and thousands of engineers, it's code and thousands of engineers, it's code and thousands of engineers, it's not uncommon for a codebase to have not uncommon for a codebase to have not uncommon for a codebase to have nobody left who's familiar with it. All nobody left who's familiar with it. All nobody left who's familiar with it. All it takes is a few people to quit at the it takes is a few people to quit at the it takes is a few people to quit at the wrong time, or for a codebase to be wrong time, or for a codebase to be wrong time, or for a codebase to be unmaintained for a year. Not only have I unmaintained for a year. Not only have I unmaintained for a year. Not only have I seen other teams do it, I've personally seen other teams do it, I've personally seen other teams do it, I've personally taken ownership of abandoned code bases, taken ownership of abandoned code bases, taken ownership of abandoned code bases, figured them out, and gotten to a point figured them out, and gotten to a point figured them out, and gotten to a point where I could effectively work with where I could effectively work with where I could effectively work with them. It takes time, but building a new them. It takes time, but building a new them. It takes time, but building a new theory of the codebase is possible. You theory of the codebase is possible. You theory of the codebase is possible. You start by understanding one flow end to start by understanding one flow end to start by understanding one flow end to end and then you slowly branch out from end and then you slowly branch out from end and then you slowly branch out from there making careful changes as you go. there making careful changes as you go. there making careful changes as you go. Yes. All true. And I'll hold my AI takes Yes. All true. And I'll hold my AI takes Yes. All true. And I'll hold my AI takes for a bit, but I'll drop the hint here for a bit, but I'll drop the hint here for a bit, but I'll drop the hint here that I think AI has made this a lot that I think AI has made this a lot that I think AI has made this a lot easier. Not the maintaining the legacy easier. Not the maintaining the legacy easier. Not the maintaining the legacy codebase part, but the ramping your own codebase part, but the ramping your own codebase part, but the ramping your own knowledge up about it by just asking knowledge up about it by just asking knowledge up about it by just asking questions and having a thing that can go questions and having a thing that can go questions and having a thing that can go verify the like way it responds to it. verify the like way it responds to it. verify the like way it responds to it. It might not have all the historical It might not have all the historical It might not have all the historical knowledge that the previous developers knowledge that the previous developers knowledge that the previous developers did, but it has their outputs, which is did, but it has their outputs, which is did, but it has their outputs, which is often enough to carry you to a good often enough to carry you to a good often enough to carry you to a good point. Oh boy, now we're getting to more point. Oh boy, now we're getting to more point. Oh boy, now we're getting to more banger statements. In sufficiently large banger statements. In sufficiently large banger statements. In sufficiently large code bases, everybody operates with an code bases, everybody operates with an code bases, everybody operates with an incorrect theory of the program. Woo!
-
incorrect theory of the program. Woo! incorrect theory of the program. Woo! Banger. Entirely true. Some of the best Banger. Entirely true. Some of the best Banger. Entirely true. Some of the best engineers I have known working in really engineers I have known working in really engineers I have known working in really big code bases had almost laughable big code bases had almost laughable big code bases had almost laughable misunderstandings of it that were really misunderstandings of it that were really misunderstandings of it that were really funny to me. One of my favorites that I funny to me. One of my favorites that I funny to me. One of my favorites that I think about a lot is one of like the think about a lot is one of like the think about a lot is one of like the best full stack devs I ever worked with. best full stack devs I ever worked with. best full stack devs I ever worked with. The guy who like got me into Alexa and The guy who like got me into Alexa and The guy who like got me into Alexa and ramped me up quickly at the start of my ramped me up quickly at the start of my ramped me up quickly at the start of my career hit me up three-ish years later career hit me up three-ish years later career hit me up three-ish years later when we were still both working at when we were still both working at when we were still both working at Twitch. Actually, I think I hit him up Twitch. Actually, I think I hit him up Twitch. Actually, I think I hit him up because he messaged one of the shared because he messaged one of the shared because he messaged one of the shared group chats for the Twitch web app group chats for the Twitch web app group chats for the Twitch web app because he was getting type errors when because he was getting type errors when because he was getting type errors when he was trying to query data on the he was trying to query data on the he was trying to query data on the client. At this point in time, he had client. At this point in time, he had client. At this point in time, he had worked a lot with the back end and the worked a lot with the back end and the worked a lot with the back end and the front end and built full stack stuff. front end and built full stack stuff. front end and built full stack stuff. But for whatever reason, he had never But for whatever reason, he had never But for whatever reason, he had never had to define a new query on the back had to define a new query on the back had to define a new query on the back end and then call it on the front end. end and then call it on the front end. end and then call it on the front end. And this would require you to run a And this would require you to run a And this would require you to run a generation command that would pull the generation command that would pull the generation command that would pull the latest schema down from the GraphQL latest schema down from the GraphQL latest schema down from the GraphQL server and then create the TypeScript server and then create the TypeScript server and then create the TypeScript definitions that were needed inside of definitions that were needed inside of definitions that were needed inside of the React code in order to call it type the React code in order to call it type the React code in order to call it type safe. Somehow despite touching safe. Somehow despite touching safe. Somehow despite touching everything across these systems, he had everything across these systems, he had everything across these systems, he had never had to do that step because he never had to do that step because he never had to do that step because he just never did both at the same time.
-
just never did both at the same time. just never did both at the same time. And he was really really confused why he And he was really really confused why he And he was really really confused why he was getting type errors in code that he was getting type errors in code that he was getting type errors in code that he knew was valid on both sides and shared knew was valid on both sides and shared knew was valid on both sides and shared a screenshot of it breaking in some a screenshot of it breaking in some a screenshot of it breaking in some complaints like trying to get help complaints like trying to get help complaints like trying to get help fixing it. And everybody was debugging fixing it. And everybody was debugging fixing it. And everybody was debugging assuming something was deeper and broken assuming something was deeper and broken assuming something was deeper and broken because this is one of the smartest because this is one of the smartest because this is one of the smartest people at the company. I'm scared to people at the company. I'm scared to people at the company. I'm scared to embarrass him. So I DM him, "Yo, did you embarrass him. So I DM him, "Yo, did you embarrass him. So I DM him, "Yo, did you run the GraphQL gen command?" He was run the GraphQL gen command?" He was run the GraphQL gen command?" He was like, "Wait, what?" Oh yeah. I don't like, "Wait, what?" Oh yeah. I don't like, "Wait, what?" Oh yeah. I don't know how I thought the types would get know how I thought the types would get know how I thought the types would get to the client code, but I guess that to the client code, but I guess that to the client code, but I guess that that does need something, huh? Just ran that does need something, huh? Just ran that does need something, huh? Just ran the command all is good. And then he the command all is good. And then he the command all is good. And then he went I think he deleted the original went I think he deleted the original went I think he deleted the original thread. But like everybody in order to thread. But like everybody in order to thread. But like everybody in order to be highly effective, you can't know be highly effective, you can't know be highly effective, you can't know everything because the effort it takes everything because the effort it takes everything because the effort it takes to learn everything and the amount of to learn everything and the amount of to learn everything and the amount of your brain it takes to know everything your brain it takes to know everything your brain it takes to know everything is going to stop you from actually is going to stop you from actually is going to stop you from actually getting done. This is actually one getting done. This is actually one getting done. This is actually one of the reasons I used to pitch of the reasons I used to pitch of the reasons I used to pitch Typescript so hard. A lot of the initial Typescript so hard. A lot of the initial Typescript so hard. A lot of the initial friction people were concerned about friction people were concerned about friction people were concerned about with Typescript is that it's more to with Typescript is that it's more to with Typescript is that it's more to learn and know and that it will take up learn and know and that it will take up learn and know and that it will take up more space in your brain. For me, it was more space in your brain. For me, it was more space in your brain. For me, it was the opposite. Since Typescript will the opposite. Since Typescript will the opposite. Since Typescript will correct you when you make small typo correct you when you make small typo correct you when you make small typo mistakes, when you don't use the right mistakes, when you don't use the right mistakes, when you don't use the right type for a thing, when you pass a string type for a thing, when you pass a string type for a thing, when you pass a string to a function that expects a number, it to a function that expects a number, it to a function that expects a number, it means you don't have to think about means you don't have to think about means you don't have to think about those things yourself. And when I got those things yourself. And when I got those things yourself. And when I got more into TypeScript, I realized how more into TypeScript, I realized how more into TypeScript, I realized how much of my brain was previously stuck much of my brain was previously stuck much of my brain was previously stuck checking all of those things for me, checking all of those things for me, checking all of those things for me, making sure every time I call a function making sure every time I call a function making sure every time I call a function that I passed the right type. And once that I passed the right type. And once that I passed the right type. And once the type system could take that debt the type system could take that debt the type system could take that debt from me, my brain was freed of it. In from me, my brain was freed of it. In from me, my brain was freed of it. In some ways, that means I understand the some ways, that means I understand the some ways, that means I understand the codebase less, that I'm not deeply codebase less, that I'm not deeply codebase less, that I'm not deeply introspecting every time I call a introspecting every time I call a introspecting every time I call a function to make sure it expects exactly function to make sure it expects exactly function to make sure it expects exactly what I'm passing it. But on the other
-
what I'm passing it. But on the other what I'm passing it. But on the other hand, I'm now so unbburdened and so much hand, I'm now so unbburdened and so much hand, I'm now so unbburdened and so much of my brain has been freed that I can of my brain has been freed that I can of my brain has been freed that I can now make better changes more reliably now make better changes more reliably now make better changes more reliably and ship faster with less bugs. Those and ship faster with less bugs. Those and ship faster with less bugs. Those types of wins are awesome and you should types of wins are awesome and you should types of wins are awesome and you should take them whenever you can. If you can take them whenever you can. If you can take them whenever you can. If you can free up your brain space in things that free up your brain space in things that free up your brain space in things that can be automated in some way, whether can be automated in some way, whether can be automated in some way, whether that is a compiler, a type checker, a that is a compiler, a type checker, a that is a compiler, a type checker, a llinter, an artificial intelligence llinter, an artificial intelligence llinter, an artificial intelligence coming in and checking, anything you can coming in and checking, anything you can coming in and checking, anything you can do to free your brain of the tedious do to free your brain of the tedious do to free your brain of the tedious and the details is probably not and the details is probably not and the details is probably not positive as long as your overall positive as long as your overall positive as long as your overall understanding doesn't go down in the understanding doesn't go down in the understanding doesn't go down in the process. And this isn't just for people process. And this isn't just for people process. And this isn't just for people working on side projects and This working on side projects and This working on side projects and This is my experience working on hundreds of is my experience working on hundreds of is my experience working on hundreds of millions of lines of code code bases at millions of lines of code code bases at millions of lines of code code bases at a place like Twitch or Amazon. And it a place like Twitch or Amazon. And it a place like Twitch or Amazon. And it seems to line up with Sean's experience, seems to line up with Sean's experience, seems to line up with Sean's experience, too, because this is the real world. You too, because this is the real world. You too, because this is the real world. You cannot know everything about a codebase cannot know everything about a codebase cannot know everything about a codebase this big. You have to learn to live this big. You have to learn to live this big. You have to learn to live without the details. And this makes a without the details. And this makes a without the details. And this makes a lot of people uncomfortable. It's lot of people uncomfortable. It's lot of people uncomfortable. It's actually one of the things that I see actually one of the things that I see actually one of the things that I see new devs struggle with the most when new devs struggle with the most when new devs struggle with the most when they get their first job. They go from they get their first job. They go from they get their first job. They go from working in code bases where they wrote working in code bases where they wrote working in code bases where they wrote every line of code and they know where every line of code and they know where every line of code and they know where everything is because it's all within everything is because it's all within everything is because it's all within their control to a codebase that existed their control to a codebase that existed their control to a codebase that existed before they even started writing code.
-
before they even started writing code. before they even started writing code. It's way harder to jump into something It's way harder to jump into something It's way harder to jump into something like that if you expect to know like that if you expect to know like that if you expect to know everything. So go in knowing you can't. everything. So go in knowing you can't. everything. So go in knowing you can't. Back to what Sean was saying here. He Back to what Sean was saying here. He Back to what Sean was saying here. He just opened this paragraph saying that just opened this paragraph saying that just opened this paragraph saying that everybody operates with an incorrect everybody operates with an incorrect everybody operates with an incorrect theory of the program and big enough theory of the program and big enough theory of the program and big enough code bases. The defining feature of code bases. The defining feature of code bases. The defining feature of modern software systems is that they're modern software systems is that they're modern software systems is that they're just way too big for anyone or even a just way too big for anyone or even a just way too big for anyone or even a whole team to keep in their head. Nobody whole team to keep in their head. Nobody whole team to keep in their head. Nobody understands at all. It's funny. He has understands at all. It's funny. He has understands at all. It's funny. He has another separate article from last year another separate article from last year another separate article from last year titled, "Nobody knows how large software titled, "Nobody knows how large software titled, "Nobody knows how large software projects work." Accurate. very accurate. projects work." Accurate. very accurate. projects work." Accurate. very accurate. To be effective, you have to figure out To be effective, you have to figure out To be effective, you have to figure out a way to work with a merely partially a way to work with a merely partially a way to work with a merely partially correct theory. This is why Shawn keeps correct theory. This is why Shawn keeps correct theory. This is why Shawn keeps going on about taking a position in going on about taking a position in going on about taking a position in confidence. If you're not sure about confidence. If you're not sure about confidence. If you're not sure about something, you can't just sit back and something, you can't just sit back and something, you can't just sit back and wait for someone with a perfect wait for someone with a perfect wait for someone with a perfect understanding to come and give you the understanding to come and give you the understanding to come and give you the answer. You're a competent engineer. answer. You're a competent engineer. answer. You're a competent engineer. That person is you. You have to grit That person is you. You have to grit That person is you. You have to grit your teeth, make your most educated your teeth, make your most educated your teeth, make your most educated guess, and then deal with the guess, and then deal with the guess, and then deal with the consequences. consequences. consequences. All bars. To be generous to the author All bars. To be generous to the author All bars. To be generous to the author of what was it called again? the theory of what was it called again? the theory of what was it called again? the theory of program or programming is theory of program or programming is theory of program or programming is theory building paper. It's possible that in building paper. It's possible that in building paper. It's possible that in 1985 the average size of a program was 1985 the average size of a program was 1985 the average size of a program was several orders of magnitude smaller than several orders of magnitude smaller than several orders of magnitude smaller than today and that when Norah writes about a today and that when Norah writes about a today and that when Norah writes about a large program, he's not talking about large program, he's not talking about large program, he's not talking about tens of millions of lines of code. Nor's tens of millions of lines of code. Nor's tens of millions of lines of code. Nor's first example of a large program is a first example of a large program is a first example of a large program is a 200,000line industrial monitoring 200,000line industrial monitoring 200,000line industrial monitoring program. And his second example is a program. And his second example is a program. And his second example is a compiler. In 1987, the first version of compiler. In 1987, the first version of compiler. In 1987, the first version of the compiler GCC was about a 100,000 the compiler GCC was about a 100,000 the compiler GCC was about a 100,000 lines of code. Now in 2015, GCTC is over lines of code. Now in 2015, GCTC is over lines of code. Now in 2015, GCTC is over 14 million lines. I can believe that 14 million lines. I can believe that 14 million lines. I can believe that rewriting one or 200,000 lines of code
-
rewriting one or 200,000 lines of code rewriting one or 200,000 lines of code is relatively straightforward, is relatively straightforward, is relatively straightforward, particularly if you get to reuse particularly if you get to reuse particularly if you get to reuse existing tests. Not so for one or 2 existing tests. Not so for one or 2 existing tests. Not so for one or 2 million. Again, yes, compilers are million. Again, yes, compilers are million. Again, yes, compilers are easier here because you have verifiable easier here because you have verifiable easier here because you have verifiable inputs and outputs. So you can make some inputs and outputs. So you can make some inputs and outputs. So you can make some pretty brutal endto-end tests that will pretty brutal endto-end tests that will pretty brutal endto-end tests that will guarantee in most cases things are guarantee in most cases things are guarantee in most cases things are handled. This is a big part of why the handled. This is a big part of why the handled. This is a big part of why the bun rewrite in Rust could make sense as bun rewrite in Rust could make sense as bun rewrite in Rust could make sense as well. But for things that face users, well. But for things that face users, well. But for things that face users, where users interact and expect certain where users interact and expect certain where users interact and expect certain behaviors and for their data to be behaviors and for their data to be behaviors and for their data to be formatted a certain way and to be formatted a certain way and to be formatted a certain way and to be accessible a certain way, those types of accessible a certain way, those types of accessible a certain way, those types of things, you're not going to be able to things, you're not going to be able to things, you're not going to be able to test the end to end to make sure it is test the end to end to make sure it is test the end to end to make sure it is still the same for people. Just not still the same for people. Just not still the same for people. Just not realistic. Next major point, theory realistic. Next major point, theory realistic. Next major point, theory building is one trade-off among many. building is one trade-off among many. building is one trade-off among many. LMS are often cited as a tool that's bad LMS are often cited as a tool that's bad LMS are often cited as a tool that's bad because it impedes the ordinary process because it impedes the ordinary process because it impedes the ordinary process of theory building. Sean thinks that's of theory building. Sean thinks that's of theory building. Sean thinks that's overly simplistic. Like many software overly simplistic. Like many software overly simplistic. Like many software tools, LMS are a double-edged sword. tools, LMS are a double-edged sword. tools, LMS are a double-edged sword. They make it harder to construct a They make it harder to construct a They make it harder to construct a detailed mental theory of the software, detailed mental theory of the software, detailed mental theory of the software, but they allow you to build a partial but they allow you to build a partial but they allow you to build a partial theory quickly, and they can help you theory quickly, and they can help you theory quickly, and they can help you leverage that partial theory more leverage that partial theory more leverage that partial theory more effectively. This is a complex trade-off effectively. This is a complex trade-off effectively. This is a complex trade-off that Shawn is still thinking about. I that Shawn is still thinking about. I that Shawn is still thinking about. I will say that I am as well. Setting LMS will say that I am as well. Setting LMS will say that I am as well. Setting LMS aside, Sean's confident that it's silly aside, Sean's confident that it's silly aside, Sean's confident that it's silly to say that anything that interferes to say that anything that interferes to say that anything that interferes with your theory of software must be with your theory of software must be with your theory of software must be bad. Here's a partial list of other bad. Here's a partial list of other bad. Here's a partial list of other things that make it hard to maintain a things that make it hard to maintain a things that make it hard to maintain a complete theory of your codebase. One, complete theory of your codebase. One, complete theory of your codebase. One, other people being allowed to write code other people being allowed to write code other people being allowed to write code in your codebase. Two, having to in your codebase. Two, having to in your codebase. Two, having to implement legally required features like implement legally required features like implement legally required features like accessibility and data protection.
-
accessibility and data protection. accessibility and data protection. Three, allowing your colleagues to quit Three, allowing your colleagues to quit Three, allowing your colleagues to quit jobs or move between teams. Don't forget jobs or move between teams. Don't forget jobs or move between teams. Don't forget about vacations, by the way. Four, about vacations, by the way. Four, about vacations, by the way. Four, having to upgrade software versions for having to upgrade software versions for having to upgrade software versions for security patches. And five, bringing in security patches. And five, bringing in security patches. And five, bringing in any libraries or other dependencies. any libraries or other dependencies. any libraries or other dependencies. This is a great analysis. All of these This is a great analysis. All of these This is a great analysis. All of these things make your understanding of your things make your understanding of your things make your understanding of your program worse. But I hope we would all program worse. But I hope we would all program worse. But I hope we would all agree that these things, despite agree that these things, despite agree that these things, despite affecting your understanding of your affecting your understanding of your affecting your understanding of your codebase, are obviously not bad. Like codebase, are obviously not bad. Like codebase, are obviously not bad. Like most things in software, maintaining a most things in software, maintaining a most things in software, maintaining a theory of the codebase is one value theory of the codebase is one value theory of the codebase is one value among many. Sometimes it's the most among many. Sometimes it's the most among many. Sometimes it's the most important value, and you'll sacrifice important value, and you'll sacrifice important value, and you'll sacrifice other values for it. Other times you other values for it. Other times you other values for it. Other times you trade it off for speed or legal trade it off for speed or legal trade it off for speed or legal compliance or for political reasons or compliance or for political reasons or compliance or for political reasons or because the features you want to add because the features you want to add because the features you want to add sometimes require you to make things sometimes require you to make things sometimes require you to make things more complex or like you have to support more complex or like you have to support more complex or like you have to support a platform like iOS or Android which a platform like iOS or Android which a platform like iOS or Android which immediately massively blows the immediately massively blows the immediately massively blows the complexity of a project. All these types complexity of a project. All these types complexity of a project. All these types of things are worth doing even if they of things are worth doing even if they of things are worth doing even if they make your own understanding of the make your own understanding of the make your own understanding of the codebase worse. Next part cites pure and codebase worse. Next part cites pure and codebase worse. Next part cites pure and impure software engineering. This is an impure software engineering. This is an impure software engineering. This is an article from over a year ago that article from over a year ago that article from over a year ago that actually looks really good. He questions actually looks really good. He questions actually looks really good. He questions why solo game devs get in fights with why solo game devs get in fights with why solo game devs get in fights with big tech engineers so often. Why big tech engineers so often. Why big tech engineers so often. Why high-profile external hires to large high-profile external hires to large high-profile external hires to large companies often fizzle out? Why is AI companies often fizzle out? Why is AI companies often fizzle out? Why is AI assisted development amazing for some assisted development amazing for some assisted development amazing for some engineers and useless for others? It's engineers and useless for others? It's engineers and useless for others? It's because different engineers do different because different engineers do different because different engineers do different types of work. He breaks this down as types of work. He breaks this down as types of work. He breaks this down as pure and impure where pure engineers are pure and impure where pure engineers are pure and impure where pure engineers are interested in solving technical problems interested in solving technical problems interested in solving technical problems as perfectly as possible. Open- source as perfectly as possible. Open- source as perfectly as possible. Open- source work for libraries trying to make the
-
work for libraries trying to make the work for libraries trying to make the best HTTP request library or the perfect best HTTP request library or the perfect best HTTP request library or the perfect game engine. Those types of things are game engine. Those types of things are game engine. Those types of things are pure. And then mure engineering is pure. And then mure engineering is pure. And then mure engineering is interested in solving a real world interested in solving a real world interested in solving a real world problem as efficiently as possible. Paid problem as efficiently as possible. Paid problem as efficiently as possible. Paid tech company work is like this. tech company work is like this. tech company work is like this. Engineers are asked to deliver some Engineers are asked to deliver some Engineers are asked to deliver some project or a feature as well as they can project or a feature as well as they can project or a feature as well as they can do it by the deadline. Absolutely. He do it by the deadline. Absolutely. He do it by the deadline. Absolutely. He brings it up because he says that almost brings it up because he says that almost brings it up because he says that almost all engineers, particularly pure all engineers, particularly pure all engineers, particularly pure engineers, prefer to maintain an engineers, prefer to maintain an engineers, prefer to maintain an accurate mental model of their software. accurate mental model of their software. accurate mental model of their software. It's more fun, less stressful, and it It's more fun, less stressful, and it It's more fun, less stressful, and it feels more like quote real engineering. feels more like quote real engineering. feels more like quote real engineering. This is a contradiction I had never seen This is a contradiction I had never seen This is a contradiction I had never seen anyone else point out this well that I anyone else point out this well that I anyone else point out this well that I have felt deeply and never known how to have felt deeply and never known how to have felt deeply and never known how to word. And I'm very thankful for you, word. And I'm very thankful for you, word. And I'm very thankful for you, Sean, for putting this to words. There's Sean, for putting this to words. There's Sean, for putting this to words. There's this really strange contradiction in this really strange contradiction in this really strange contradiction in most of our brains, and I'm as guilty as most of our brains, and I'm as guilty as most of our brains, and I'm as guilty as anyone of this where the things that anyone of this where the things that anyone of this where the things that feel like real engineering that make you feel like real engineering that make you feel like real engineering that make you feel like your job's important and it feel like your job's important and it feel like your job's important and it matters and you have this deep matters and you have this deep matters and you have this deep understanding and the things that bring understanding and the things that bring understanding and the things that bring real value as engineers, the things that real value as engineers, the things that real value as engineers, the things that make you actually worth employing and make you actually worth employing and make you actually worth employing and doing this for a living are almost doing this for a living are almost doing this for a living are almost opposite sides. And it's really strange opposite sides. And it's really strange opposite sides. And it's really strange that the stuff that we think makes us a that the stuff that we think makes us a that the stuff that we think makes us a good engineer and the stuff that good engineer and the stuff that good engineer and the stuff that actually puts money on the table to get actually puts money on the table to get actually puts money on the table to get us paid have almost no overlap us paid have almost no overlap us paid have almost no overlap whatsoever. And a lot of this results in whatsoever. And a lot of this results in whatsoever. And a lot of this results in horrible conversations and a lot of horrible conversations and a lot of horrible conversations and a lot of shitty dialogue in places like Twitter shitty dialogue in places like Twitter shitty dialogue in places like Twitter because the people who want to feel good because the people who want to feel good because the people who want to feel good about their engineering will lean about their engineering will lean about their engineering will lean towards these types of pure engineering towards these types of pure engineering towards these types of pure engineering things and they will all over the things and they will all over the things and they will all over the devs on the other side. I I like this devs on the other side. I I like this devs on the other side. I I like this framing here. We all want to be pure framing here. We all want to be pure framing here. We all want to be pure engineers, but since some are and some engineers, but since some are and some engineers, but since some are and some aren't, the conversation often erodess
-
aren't, the conversation often erodess aren't, the conversation often erodess to He says that this desire is to He says that this desire is to He says that this desire is why many engineers take up open source why many engineers take up open source why many engineers take up open source projects in their spare time in order to projects in their spare time in order to projects in their spare time in order to work on small code bases by themselves. work on small code bases by themselves. work on small code bases by themselves. In order to do engineering work where In order to do engineering work where In order to do engineering work where they can maintain an accurate nor theory they can maintain an accurate nor theory they can maintain an accurate nor theory of their codebase, they have to work on of their codebase, they have to work on of their codebase, they have to work on these small side things. Sean doesn't these small side things. Sean doesn't these small side things. Sean doesn't think there's anything wrong with that, think there's anything wrong with that, think there's anything wrong with that, and I agree. However, at work, you're and I agree. However, at work, you're and I agree. However, at work, you're paid to do a job. In other words, they paid to do a job. In other words, they paid to do a job. In other words, they pay you money to adopt their set of pay you money to adopt their set of pay you money to adopt their set of engineering values. It's hopefully well engineering values. It's hopefully well engineering values. It's hopefully well understood that however much you might understood that however much you might understood that however much you might personally care about performance, personally care about performance, personally care about performance, sometimes you have to write slow code at sometimes you have to write slow code at sometimes you have to write slow code at your job. For example, if you have to your job. For example, if you have to your job. For example, if you have to get a project done on time or to get a project done on time or to get a project done on time or to accommodate some awkward requirements. accommodate some awkward requirements. accommodate some awkward requirements. Maintaining a theory of the code base is Maintaining a theory of the code base is Maintaining a theory of the code base is the same kind of thing. He has some the same kind of thing. He has some the same kind of thing. He has some stuff here about the comments he got in stuff here about the comments he got in stuff here about the comments he got in other places that I think is actually other places that I think is actually other places that I think is actually very good. First, he is annoyed at very good. First, he is annoyed at very good. First, he is annoyed at lobsters because this site and this lobsters because this site and this lobsters because this site and this board is admittedly quite cringe at board is admittedly quite cringe at board is admittedly quite cringe at times. One interesting comment points times. One interesting comment points times. One interesting comment points out that the ability to reason locality out that the ability to reason locality out that the ability to reason locality about code with partial understanding about code with partial understanding about code with partial understanding has been a core goal of CS from the has been a core goal of CS from the has been a core goal of CS from the beginning. This is also a good beginning. This is also a good beginning. This is also a good description of what he was trying to get description of what he was trying to get description of what he was trying to get into in his previous article, how good into in his previous article, how good into in his previous article, how good engineers write bad code at big engineers write bad code at big engineers write bad code at big companies. It's amusing that the post companies. It's amusing that the post companies. It's amusing that the post got tagged as vibe coding because of one got tagged as vibe coding because of one got tagged as vibe coding because of one short simple paragraph mentioning LLM a short simple paragraph mentioning LLM a short simple paragraph mentioning LLM a bit. He didn't tag it as AI and I agree bit. He didn't tag it as AI and I agree bit. He didn't tag it as AI and I agree with him. This is not a post about AI.
-
with him. This is not a post about AI. with him. This is not a post about AI. This is reality. The hacker news comment This is reality. The hacker news comment This is reality. The hacker news comment pissed me off even more though. He said pissed me off even more though. He said pissed me off even more though. He said that the top comments are a genre that that the top comments are a genre that that the top comments are a genre that he expected, which is, "Wait, this he expected, which is, "Wait, this he expected, which is, "Wait, this situation sucks. Why isn't the blog post situation sucks. Why isn't the blog post situation sucks. Why isn't the blog post about how much this sucks?" Well, about how much this sucks?" Well, about how much this sucks?" Well, there's plenty of posts like that there's plenty of posts like that there's plenty of posts like that already. Shawn wanted to fill another already. Shawn wanted to fill another already. Shawn wanted to fill another niche. Another comment offers a second niche. Another comment offers a second niche. Another comment offers a second comparison of him with Seth Guden that comparison of him with Seth Guden that comparison of him with Seth Guden that he's seen. God doesn't quite write the he's seen. God doesn't quite write the he's seen. God doesn't quite write the Adenine sound bites that Seth Goden Adenine sound bites that Seth Goden Adenine sound bites that Seth Goden does, but neither does he write anything does, but neither does he write anything does, but neither does he write anything of engineering use, just vocabulary of engineering use, just vocabulary of engineering use, just vocabulary explainers for people who want to know explainers for people who want to know explainers for people who want to know kind of what their tech leads and line kind of what their tech leads and line kind of what their tech leads and line managers are talking about. I I am managers are talking about. I I am managers are talking about. I I am incredibly confident that whoever wrote incredibly confident that whoever wrote incredibly confident that whoever wrote this comment doesn't have a job. I I this comment doesn't have a job. I I this comment doesn't have a job. I I would bet a lot of money on it. I like would bet a lot of money on it. I like would bet a lot of money on it. I like Sean's response here, too. This comment Sean's response here, too. This comment Sean's response here, too. This comment is skewed by what people see of his is skewed by what people see of his is skewed by what people see of his work. for example, not the posts that work. for example, not the posts that work. for example, not the posts that discuss engineering topics cuz these discuss engineering topics cuz these discuss engineering topics cuz these ones aren't the ones that perform ones aren't the ones that perform ones aren't the ones that perform particularly well on HN. And second, and particularly well on HN. And second, and particularly well on HN. And second, and this is an important call out, he thinks this is an important call out, he thinks this is an important call out, he thinks that wanting to know what your tech that wanting to know what your tech that wanting to know what your tech leads and line managers are talking leads and line managers are talking leads and line managers are talking about is important. Yeah, the person who about is important. Yeah, the person who about is important. Yeah, the person who gives you the work that you're doing gives you the work that you're doing gives you the work that you're doing should be understandable by you. You should be understandable by you. You should be understandable by you. You should know what your team is asking should know what your team is asking should know what your team is asking for. This isn't some crazy controversial for. This isn't some crazy controversial for. This isn't some crazy controversial thing that real engineers don't have to thing that real engineers don't have to thing that real engineers don't have to deal with. Real engineers know how to deal with. Real engineers know how to deal with. Real engineers know how to work with other people. If not, then work with other people. If not, then work with other people. If not, then your LLM is better at engineering than your LLM is better at engineering than your LLM is better at engineering than you are. If you cannot work with your you are. If you cannot work with your you are. If you cannot work with your team and your users to solve real team and your users to solve real team and your users to solve real problems for people, you're worse than problems for people, you're worse than problems for people, you're worse than an LM now. Period. Do want to call out an LM now. Period. Do want to call out an LM now. Period. Do want to call out one of the tweets he mentioned where one of the tweets he mentioned where one of the tweets he mentioned where people talked more about the article.
-
people talked more about the article. people talked more about the article. This one from Nick is very good and I This one from Nick is very good and I This one from Nick is very good and I think points roughly where we're going. think points roughly where we're going. think points roughly where we're going. You can't keep an entire program in your You can't keep an entire program in your You can't keep an entire program in your head. So, what happens when AI 10,000xes head. So, what happens when AI 10,000xes head. So, what happens when AI 10,000xes the amount of code? code bases are going the amount of code? code bases are going the amount of code? code bases are going to be so large it will be even more to be so large it will be even more to be so large it will be even more impossible. Therefore, vibe coding fully impossible. Therefore, vibe coding fully impossible. Therefore, vibe coding fully hands-off will be the default. Everyone hands-off will be the default. Everyone hands-off will be the default. Everyone says otherwise is wrong and human brains says otherwise is wrong and human brains says otherwise is wrong and human brains won't keep up. The engineer must learn won't keep up. The engineer must learn won't keep up. The engineer must learn to work with a mental labyrinth with to work with a mental labyrinth with to work with a mental labyrinth with only imperfect information. I'm getting only imperfect information. I'm getting only imperfect information. I'm getting a taste of this right now because I've a taste of this right now because I've a taste of this right now because I've been rewriting the T3 code mobile app in been rewriting the T3 code mobile app in been rewriting the T3 code mobile app in React Native over to Swift UI and I have React Native over to Swift UI and I have React Native over to Swift UI and I have not read a single line of the code. My not read a single line of the code. My not read a single line of the code. My intuition on what it gets wrong comes intuition on what it gets wrong comes intuition on what it gets wrong comes from the failure cases I see when I'm from the failure cases I see when I'm from the failure cases I see when I'm using it and my understanding of how it using it and my understanding of how it using it and my understanding of how it works in the other system that it's works in the other system that it's works in the other system that it's largely copied from. And from that I'm largely copied from. And from that I'm largely copied from. And from that I'm usually able to steer it in the right usually able to steer it in the right usually able to steer it in the right direction. I've only had one or two bugs direction. I've only had one or two bugs direction. I've only had one or two bugs where I couldn't just say here's how it where I couldn't just say here's how it where I couldn't just say here's how it works in the other place. Mirror that works in the other place. Mirror that works in the other place. Mirror that here and it wasn't enough to solve it. here and it wasn't enough to solve it. here and it wasn't enough to solve it. It's actually kind of weird which cases It's actually kind of weird which cases It's actually kind of weird which cases this fails at. It's weird stuff like this fails at. It's weird stuff like this fails at. It's weird stuff like project selection for new threads. For project selection for new threads. For project selection for new threads. For the most part, I have not had to the most part, I have not had to the most part, I have not had to understand the implementation details of understand the implementation details of understand the implementation details of the mobile app at all in order to do the mobile app at all in order to do the mobile app at all in order to do something like this. But my something like this. But my something like this. But my understanding of where things are understanding of where things are understanding of where things are overall and how data gets to and from overall and how data gets to and from overall and how data gets to and from the different places, where it comes the different places, where it comes the different places, where it comes from, how it's sourced, what failure from, how it's sourced, what failure from, how it's sourced, what failure cases exist, all of that knowledge I've cases exist, all of that knowledge I've cases exist, all of that knowledge I've built through working on the rest of T3 built through working on the rest of T3 built through working on the rest of T3 code has applied and been super helpful code has applied and been super helpful code has applied and been super helpful in this isolated thing that is 60,000 in this isolated thing that is 60,000 in this isolated thing that is 60,000 plus lines of Swift slop that I haven't plus lines of Swift slop that I haven't plus lines of Swift slop that I haven't read a single line of. So, absolutely
-
read a single line of. So, absolutely read a single line of. So, absolutely agree here. This is where we're probably agree here. This is where we're probably agree here. This is where we're probably going. As always, thank you to Sean for going. As always, thank you to Sean for going. As always, thank you to Sean for writing yet another awesome article. writing yet another awesome article. writing yet another awesome article. This has quickly become one of my This has quickly become one of my This has quickly become one of my favorite blogs in all of software dev. I favorite blogs in all of software dev. I favorite blogs in all of software dev. I appreciate you a ton. Link in the appreciate you a ton. Link in the appreciate you a ton. Link in the description if you want to check out his description if you want to check out his description if you want to check out his other posts. They're all really good. other posts. They're all really good. other posts. They're all really good. This is a fun one for me cuz on one This is a fun one for me cuz on one This is a fun one for me cuz on one hand, I understand my code bases better hand, I understand my code bases better hand, I understand my code bases better than ever. And on the other, I feel like than ever. And on the other, I feel like than ever. And on the other, I feel like I'm understanding them less and less, I'm understanding them less and less, I'm understanding them less and less, too. And finding that balance has been too. And finding that balance has been too. And finding that balance has been really fun for me. It's almost like really fun for me. It's almost like really fun for me. It's almost like being a new developer again in a lot of being a new developer again in a lot of being a new developer again in a lot of ways that are actually really rewarding ways that are actually really rewarding ways that are actually really rewarding and resulting in fun workflows that are and resulting in fun workflows that are and resulting in fun workflows that are shipping real software. It's it's a fun shipping real software. It's it's a fun shipping real software. It's it's a fun time to be a dev. I know it's scary and time to be a dev. I know it's scary and time to be a dev. I know it's scary and stressful, but when you lean in a bit, stressful, but when you lean in a bit, stressful, but when you lean in a bit, the things you can do right now are so the things you can do right now are so the things you can do right now are so cool. And I hope that this way of cool. And I hope that this way of cool. And I hope that this way of thinking helps encourage you rather than thinking helps encourage you rather than thinking helps encourage you rather than discourage you about where we're all discourage you about where we're all discourage you about where we're all going as an industry. Let me know how going as an industry. Let me know how going as an industry. Let me know how y'all feel. And until next time, peace y'all feel. And until next time, peace y'all feel. And until next time, peace nerds.
Summary
The main theme is that true mastery of complex codebases, like operating systems or foundational technologies, doesn't mean knowing every line, but rather developing intuition and a higher-level understanding of architecture. The conclusion is that a well-architected codebase prioritizes clarity and ease of navigation for all developers, not absolute individual knowledge.