Doing good engineering vs. getting shit done By I mean following good engineering practices and writing maintainable code. It includes, but is not limited to doing Test Driven Development, writing tests, using the CI and CD, implementing a design pattern, religiously doing code reviews. good engineering By I mean doing whatever is needed to implement the feature. Just mark the ticket to done without doing any of the things mentioned above. This will invariably lead to bugs. getting shit done little jira Some incidents at work prompted me to post on reddit: I felt like I’m forever stuck in this dilemma and I wanted to know what other people in the industry (especially senior people) felt. To my surprise, this post got a lot of attention and it was really nice going through all the comments. Most of the people agreed with the topmost comment: Writing high quality maintainable code v/s getting shit done? I have a “tech debt dial” which goes from 0% to 100%. If I dial it down to 0% that means the team should be in full on hack mode. Fuck tests, fuck good coding standards just get it done. If I dial it up to 100% that means the team only works on code quality (refactoring) and tooling (e.g. tests / CI infrastructure). Ultimately on a normal day we leave it at 30% Many others gave their own version of the above. But then I came across: There’s a false dichotomy between “beautiful code” and code that is “fast to write”. Writing beautiful code does not take longer than writing messy code. What takes long time is to learn how to write maintainable code. What a revelation! “What takes long time is to learn how to write maintainable code.” It took sometime, and some arguments both at work and on reddit, for me to agree with that. But once I did, I was totally on board with it. I decided I will stop hacking up stuff and actually do good engineering. This prompted me to write another post: . To my utter surprise this post got even more attention. Seems like a lot of developers agreed with me. Learn to write maintainable code instead of getting shit done I don’t want to get into the mindset of There is no tradeoff. Rather, the mindset I want to be in is . This is a much better place to be in. there’s a tradeoff between speed and good engineering. I take time do it right- that’s because I have a lot left to learn However, doing good engineering is easier said than done. It becomes an order of magnitude harder when people you work with do not see the importance of it. Not only do you have to spend extra time and effort to learn how to do it, you also have to explain to the manager why this feature will take you a week instead of 1 day that it’ll take the other developer to do. But I have decided. I will stick to my guns and not give in. Even if my job is on the line. In any case, I wouldn’t want to work at a place that doesn’t understand the importance of good engineering. Bad engineering only gives a of speed. Take 1 day to build a feature, take another week to debug and fix bugs. Groups of people and entire companies fall into this trap. I do not want to fuel such a culture. perception I don’t write software for money, I do it for the love of engineering. I get a dopamine rush when I solve problems. It doesn’t happen everyday. It happens when I learn something new. It happened when I first did TDD. It happened when I understood dependency injection. I do good engineering. I owe it to the software engineering community- the one that gives me answers on Stack Overflow and on the internet search, the one that made the linux kernel that powers my MacBook, android and iOS, the one that is fighting back tyranny of governments and federal banks by developing bitcoin and ethereum. A free and open community that I am deeply humbled and proud to be a part of. have to