What is building software like? The common belief is that software is like engineering. Most people seem to think that building a software system is like building a bridge. This is likely the premise that Waterfall was built upon.
As an enlightened agilist, I know better than this. Building software isn’t like building a bridge. But what is it like then? There is a craftsmanship movement that says software is a craft similar to woodworking or blacksmithing. I believe this is true.
However, I can’t say that building a software system is like building a wooden table or a chainmail shirt. Having built both a wooden table and chainmail shirt I can attest the the fact that these analogies don’t capture the depth or complexity in software. So what does?
Cities! Building software is like building a city. No city starts with an analysis committee to decide how may people are going to live there. The population of a city changes over time.
The infrastructure of cities is not designed before the city is built. A city’s infrastructure starts simple and evolves over time as the city grows and changes. Cities are not built in one fell swoop. Cities start as small towns and are built up over time as new needs arise.
For those who have had the privilege, think about the first time you played SimCity. Do you remember the first time playing, just trying to figure out the rules.
You probably started by building a small residential, commercial, and industrial zone along with a couple roads to connect them and a power plant. It wasn’t long before these zones were fully populated at which point the citizens began to complain about crime.
So you had to build a police station and add more building zones.
Soon these were fully populated and the citizens complained about other problems. As the needs would arise you had to add a fire station, schools, libraries, and eventually, an airport, sports stadium, and the coveted Archology. That’s how I started.
Although functional, my first city was eternally haunted by pollution, traffic, crime, poverty, and other normal city problems. This wasn’t good enough. I wanted to build the perfect city; A city without all those normal city problems.
So I pulled out a piece of paper and designed a city where the industrial zones where far from the residential zone. This avoided pollution. I drew an elegant highway system that was sure to avoid any form of traffic.
The city layout was an even grid to evenly distribute police and fire station coverage. It was perfect! I started a new game to build my perfect city. In an hour I was bankrupt. I tried again, and again I went bankrupt.
I must have tried a dozens times to build the perfect city and went bankrupt every time. Finally I gave up and reverted by to my very first approach… start small and build as needed. This more agile approach seemed to work every time. Here’s my conclusion:
Building software is like building a city. Start small and go from there.