How hard can it be to build a spaceship?

The historical marker in Vrhnika, showcasing the timeline of the railroad that existed between Vrhnika and Ljubljana between 1899 and 1966

I live in the town of Vrhnika, some 20km from the center of Ljubljana, the capital of Slovenia. My family and I moved out of the city before it was cool, in 2016. We did it for the usual reasons: to have some land, more space, be closer to the nature and the sea and to spoil our kids even more.

The plan was working out perfectly for a while. However, a few years ago, our growing kids started attending a school in Ljubljana. And, at the same time, trucks began clogging the highway like never before.

Commuter rail has been the solution to this problem in and around most European capitals for 150+ years. Plans to upgrade and expand the railway in Slovenia have been around at least since I got here, 18 years ago, though I hear they’ve existed since before I was born.

Which is why it always breaks my heart a bit to see this historical marker.

The dog and I often walk past it. It stands near where the train station in Vrhnika used to be. What’s printed on it is the curriculum vitae of the railroad that existed between Vrhnika and Ljubljana for almost seven decades before it was dismantled in 1966.

The preparations for its construction started in 1895, the concession agreement was signed in 1897 and the first shovel hit the ground in 1898. The first train arrived in Vrhnika a year later. At the turn of the 20th century, my neighbours’ ancestors were choo chooing to the capital and back several times a day.

Four years. Three for planning and one for construction. That’s how long it took Slovenes to go from need to solution in the late 19th century.

When you drive through the flatland between Vrhnika and Ljubljana (whose population has increased 10-fold since 1899), you almost cannot believe that this advanced Central European society can’t rebuild the railroad it so badly needs again. When it comes to both GDP per capita and educational attainment, Slovenia inches behind Spain, another EU member, but one where trains are swooshing left and right. And yet – and I promise you I write this without an ounce of cynicism – it is not only impossible to build that railroad again in four years in Slovenia: it is impossible – period.


Early in my career, programming was like putting Legos together.

I worked on short projects. Somebody needed a simple web site twenty people would ever visit. Or perhaps a CMS only their secretary would use. Or a searchable database of eighty travel deals.

A programming language was like a box of Lego Creator bricks one uses to construct a spaceship in a fairly straightforward way. And if the spaceship had a flaw (or the requirements for it changed) and I had to take ten or twenty or thirty bricks out and then put them back in correctly, oh well.

Later, when I worked in startups, my job felt different. Everything was growing: the product, the customer base and our organisation. We were there for the long haul. I guess you could argue we were still putting virtual Lego bricks together, but the spaceship had to be built by more and more people because it was meant to carry more and more passengers, the vast majority of whom we didn’t even know yet.

When our spaceship had a flaw, taking some bricks out and putting them back in correctly wasn’t as trivial as it used to be. How we build and, more importantly, how we build together became crucial. And it definitely wasn’t straightforward. There were no step-by-step instructions anymore.

The way it usually plays out is you build a small spaceship first. Then your business grows and you need to add more features to it and make it bigger. Then your business grows even more and you need to do it again.

At some point, there are five people on your team building the spaceship with you, then ten, then twenty. You agree on some rules. You’ll build some components first and then use those components to build the spaceship. This way you don’t have to dismantle half of it when you need to change one part. Instead, you can just take one component out. Which is why you made it in a way that makes it easier to remove. Perhaps you agreed on using different colours for different components, making it easier to see where they are joined, etc.

When your spaceship (along with your team) becomes even bigger, your rules become more complicated. You are now building components to make components to make the spaceship. Different people work on different types of components and are beginning to specialise. A few years later there is no single person in your entire organisation who understands the whole spaceship. Many have left.

When somebody new joins the team that is now building on top of your legacy, what they will experience depends on a number of factors. Maybe the rules you have set weren’t good enough and your spaceship is now a mess everyone including yourself is surprised is still flying.

Or maybe the rules were good but too sophisticated for the people you were able to hire. Or the incentives you were able to offer them. They couldn’t (or wouldn’t) follow them consistently, so you ended up getting a mess despite your super smart rules.

Or maybe the requirements were changing violently and your spaceship had to be something else every quarter. Did you lack vision or was space travel simply a nascent market? With the benefit of hindsight, many will claim it was the former.

But the truth is nobody can be sure. At some point in time, the spaceship you were building became too complex to fit into any computational space at your disposal, like your head or all the heads on your team. It is then that it took on a life of its own.

You were still in full control of the code you were writing, but once you shipped it to the growing number of users, each of them a complex system in its own right, new properties started to emerge.

“School bus? They are using our spaceship to take kids to school? Oh well, let’s paint it yellow then…”

Rather than walking down the set path, you find yourself discovering new ones. You’re no longer executing the vision as confidently as you used to. Instead, you are responding to new needs. You started off as the spaceship’s creator. Now you’re just part of its environment. Perhaps a big part, but still just a part with its share of influence.

Years down the road, if anyone would like to judge your performance, they can do so, but they must understand that environment first. Instead of assuming you have been the almighty creator all along.

Be angry at the previous programmer, but don’t be too angry.


Playing politics is attributing the state of a complex system to someone as if they had full control over it.

It is when you curse the president for an economic downturn or credit them for an economic recovery. When you praise the CEO when their company stock is going up and blame them when it’s going down. When you hold the parent fully responsible when their child either drops out of school or wins an award.

In each of these cases you would only be right to the extent the person had control over the environment, not the system itself. And an economy, a company or a child are all complex systems that don’t fully fit into any number of heads.

Humans are emotionally wired to demand an explanation. We don’t like randomness. The idea our wellbeing doesn’t depend on a finite set of if-then rules that can fit into our computational space is scary. So much so, we will invent frameworks that help us cope. These frameworks, from religion and democracy to OKR and React, aren’t perfect but they are the best we can do for now.

And that best is sometimes not good enough anymore. Like when I’m stuck in a car with my kids on the highway between Vrhnika and Ljubljana, looking at the flat, empty land right next to it and thinking about that historical marker with photos of trains gliding back and forth across that same land, 100 years ago.

“How hard can it be?”, I’m tempted to think.

I would obviously prefer the speed of railroad building of a late 19th-century society. As much as I’d prefer the speed of code shipping of an early stage startup. But, at the same time, I wouldn’t prefer the 19th-century environmental standards any more than I would an early stage startup revenue. Not to mention democratic standards or human rights and who knows how many other, more obscure needs that different people around me have and would’t be willing to give up, which I am failing to consider.

My selfish desire for more reliable means of transportation may be pale in comparison, but then again, most modern needs started off as something the previous generation had considered a luxury.

Plus, it’s a bit sad to think of commuter rail in the 21st century as luxury.

Just like a code base grows to respond to the growing needs of its user base, our society has been adding rules and components to respond to the growing needs of its population. And just like software can become too complex to continue to adapt to new needs, I’m afraid our society, too, can get stuck. But what happens then, I wonder? Except politics, of course.