My Experience Running Development at a Startup
antjanus.com
antjanus.com
Danger, Will Robinson!
I followed a similar path to the one you now tread. I cofounded, and managed/grew the dev team from me to forty folks.
Three years ago (after seven years of just "tech director"), I took the mantle of CTO.
Error.
CTO is not a technical role. To do it well, you must be technical, but it is in reality a sales and marketing role, both internal and external. I found myself isolated from our tech team in short order, as as CTO one is the public and board level technical face of the company - and that becomes all consuming, and you become the perceived source of all the problems. You become the messenger, who is much shot at, by both clients and your former allies in your technical team. The clients shout at you for bugs. The developers shout at you for pleading that bugs get fixed. You become that which lives between hammer and anvil. You are no longer part of the team. You are the boss.
So - unless you want to get out of technology and want to work as a marketeer/apology bot, don't aim for CTO. I did, it broke me.
I left my company today, as I started it for the love of tech, and making cool stuff - and at the point of organisational development they have reached, that is not something there's any scope for a CTO to do.
Lesson learned.
I'm basically a lead dev. I don't mind getting out of tech but right now, I'm here, and I enjoy the tech and I enjoy trying to get a project back on its rails and get to an MVP.
Thankfully my CEO was supportive of the split I defined, and it has allowed me to not lose my identity. But for a good 2 years there, I was struggling to find the right fit.
And as for getting yelled at about bugs, that's just part of the job. It's hard not to take personally, but when you realize that CSMs get yelled at so much more about bugs than we do in engineering roles, it helps put the pain into perspective.
I likewise promoted and hired to try to make the situation tenable, but wasn't allowed to change my role to be less client/organisation focussed - by that point I was truly shut out of the dev team.
It's also very hard not to take personally when nobody else is willing to take any responsibility - everything ends up escalated, usually with clients making death threats and other such fun.
Perhaps I'm just thin skinned, but I reached the point where halving my net worth just to escape was the best option.
Today I need to go and actually announce my resignation to the team. Only the directors know. Either everyone will cheer, or worse yet, there will be no reaction at all.
I made a rod for my own back - it just took me a decade to realise it. I guess I'm just not cut out for this.
We actually did pull development into support on a rota - and after a month of me spending two hours a day dealing with angry toxic engineers who are threatening to walk out because they've been made to look in the support inbox, or placating clients who've been brusquely told their issue isn't seen as a problem, we backed down. It turned into out and out warfare, people were naming their damn factions.
Does say something that the only technical person in the company other than support to do support was me.
To make it soft for them I'm tied into two years of covenants, and sold my equity back to the business for about a third of its value. For me, that means I have time and money, and no idea what to do with myself just yet. Could be worse - but it feels damn strange to no longer be part of what became my entire identity.
A fellow developer mentioned to me on slack that he calls it a "probe" which is just so much more fun to say and use in conversation.
Could also be because I've basically always had technical management, and the projects I work on tend to be fairly technical in nature (i.e. "can we do this?", not "the customer wants this by Monday").
I'm specifically curious how it differs from a prototype... is it just a prototype of 1 feature in isolation with bare-bones design? Or some feature that is only triggered from an arcane terminal command?
Thanks
"Updating things as you go also means that parts of the application that get less love tend to be written with an older style [...] and using older technology (like indexOf rather than contains or a for loop rather than reduce)."
That's not "older technology"! You're talking about whether to use some helper methods on Array.prototype. Who cares? It's certainly not any kind of technology choice.
It's really no different from whether you prefer to put your opening curly brace on the same line as an if sentence or the next one. Sure, it's slightly annoying when someone does it differently, but you shouldn't spend any time bikeshedding your codebase over stuff like this.
It's always ideal to have perfect code the first time it's written, my experience is that this is never going to happen unless you have perfected what you are building to the point that you have code generators/boiler plate code to cover most of what you are building.
With that said, very interesting article. Thank you for sharing your experience, it is very eye opening for me.
As for "everything is legacy a week later" - why not stick with boring but proven technology and frameworks for software that is crucial and you plan to have around for awhile? That may mean not using most of the JavaScript frameworks that are being pushed today. Sure, play with them for smaller or non business crucial stuff but why risk building a business on that instability?
There are so many other important things that a business or startup has to focus on, spend money on, etc. I guess I prefer to put a lot of resources into those things vs worrying about having to update or re-write my tech stack every few months on the latest shiny framework.
3 years later I'm still using code I wrote against it (though now with browserify) with no changes.
The switching cost when you can dump the old framework on every new project is much lower than the "This will be around for 3-7 years".
Now I follow what is happening in the JavaScript community but I don't consider using anything until its been out a year and is still active/growing.
Much of the churn seems to be throwing out everything for an incremental theoretical improvement, that rarely pays off in my domain.
Some of these things seem so self-evident but they were hard lessons. I've come to understand that there are a lot of business practices that just don't make sense to me until I get bit in the ass by not following them.
I agree with this part 100%. We're still rocking BackboneJS that we chose in 2011 or so. Sure it's behind the times as they say, but it's rock solid for our uses. We're in too deep to convert now and the cost doesn't outweigh the benefits. Clients are happy and we're happy.
In other newer areas, we're experimenting, mostly with RabbitMQ for small things on the backend and React Native on Mobile. With UI on new projects not in the core web app, we experiment. Works rather well and keeps us sane with the pace of JS frameworks.
But the summary is: you can make it as easy or complicated as you want it to be.
And I mean, every technology has the same issue. Take PHP for instance. Want to learn it? Cool, it's super easy. Want to build an app? Okay, so there these different frameworks. Oh btw, you should know about composer. And autoloading. Did you also hear about DI that Symfony uses? etc. etc.
I'd reserve Node/SPAs for 1) realtime or 2) UI/UX intensive. Landdox seems neither.
All I can say, is that almost everything that was said here was the exact experience we had. Even down to the choice of Angular 1.X and rewriting all of the IIFEs in our codebase to use ES6 imports with babel.
I also need to acknowledge that PM is something that you do fine with 2 people, but your processes will fall apart, probably as soon as you even hit 4 or 5 people.
I don't get it. Why? For ISV it's the product that matters. ESP:s might as well invent filler to charge the client but what does it help in creating a product with JS to run after the bleeding edge?
Usually we pick up a language and toolset, write the product with it, and if there are bugs that absolutely need to rearchitect some foundational things then then, only then is it worthwhile to ponder if some basic technical constructs need a major overhaul.
This "update to latest hot as you go" sounds like velocity is lost in trying to adapt to some new gimmick for no benefit.
Obviously there is some cost/benefit tradeoff here I'm not getting. What is it?
:) thanks. I'm fixing it!