(written by lawrence krubner, however indented passages are often quotes). You can contact lawrence at: firstname.lastname@example.org
I had a job interview recently that went well. But then, the CTO read something that I had written a year and a half ago.
Then the CTO said to me “We can’t hire you. We are a tiny startup. We are facing some serious deadlines. We need to push a product out the door.”
I said, “I want to help you push a product out the door. I can work hard and help you guys move fast.”
He said, “Yeah, but you want to do everything the right way. And you want to Functional programming. And you want to do microservices. And you want to do pattern matching instead of conditionals. And we don’t have time for all of that stuff. We need to get something done right now.”
And I said, “You should not do all of that stuff right now. And I can help you not do all of that stuff right now. You are doing the right things for where you are at right now.”
And he said, “I appreciate that you have a real love of the craft of software, but we can’t afford that kind of perfectionism right now. And I feel like we would be disrespecting you if we hired you. You are way up here, but the code we need to write right now is way down here. We need money from investors. We need to show them something.”
And I said, “I know what it’s like to have to push code out the door. I have written plenty of dirty code so as to meet a deadline. We all cut corners to hit a deadline. You have to survive in the short-term to ensure that there will be a long-term. And when the long-term approaches, I’d be happy to help you clean up the technical debt that we accrue in the short-term.”
It took me awhile to convince him. But I really do think he is on the right track. He has a small team. They started off with one of the big monolithic frameworks. And of course, those frameworks are great when you start. Martin Fowler has an essay called “Monolith First“. The big monoliths give you a little bit of everything: some routing, some security, some CSRF protection, some templates, some database migrations, some API delievery — a little bit of everything. You can go a long way. Most companies never outgrow Ruby On Rails or PHP’s Symfony. It’s only at large scale that a site outgrows the routing provided by these monoliths, and only then does microservices make sense.
We’ve all known brilliant programmers are a little too brilliant to work at startups. Top graduates from Stanford. And that genius won’t do well at a startup. Because that genius can be uncompromising in their ways. And now the CTO was worried that I was going to be uncompromising in the same way.
So I told the CTO a story. I once had my own startup, from 2002 to 2008. We burned through most of $2 million. I know what it is like to think, “We are almost out of money.” I know what is like to think “We will meet with investors on Wednesday, and we must convince them to give us $250,000, or we are dead.”
We could in fact simplify all programmers to two types: those who know theory and those who know money. There are those who love the math and always got good grades at school and who come out of Stanford and demand that software live up to their academic ideals of perfection. And there are those programmers who know what it is like to run out of money. The first type needs to be at Google or Apple, or some place that is rich enough that it never needs to cut corners for the sake of money. The second type is what you need to start a startup.
Of course, in between, there is the transition. So we must hope there is a third type of programmer. Because some startups grow up big and become Google. And to get from small to large, you need a programmer who knows money, but also knows when it is time to introduce real craftsmanship. Too much technical debt can sink an otherwise successful startup. Someone has to say “Now is the moment when we stop cutting corners.”Source