I was on vacation for most of the last two weeks: rather than having some front-end tips or tricks at my fingertips, I’ve been touring around east coast cities! They’re cities with a tremendous amount of activity happening all the time, especially construction work. This got my newly-relaxed mind thinking about how city engineering relates to maintaining large-scale software projects.
There are several parallels:
1. Cities are able to constantly refactor themselves in the face of imperfection. If a building is no longer habitable, or its architecture is so out-of-date that it’s considered abhorrent, someone will step up to demolish and rebuild. This usually creates something far more in line with modern trends and requirements, and gives everything around the new building a new excitement and perspective on the prospects of that area.
2. Once they reach a certain level of utility/scale, cities require constant maintenance. When a water pipe leaks, someone must take on the painful task of digging through concrete to fix it. As with bug fixing, this relatively small amount of pain (debugging/digging) will typically result in an essential fix that benefits everyone. If the teams that perform these kind of essential maintenance tasks become unavailable, (due to strikes, budget cuts, etc), the city/software will quickly become untenable.
3. Cities have an organizational structure in place that allows them to recover from catastrophic failure, such as accidents on a public transit system, natural disasters, or a terrorist attack. These are painful, traumatic incidents that have an effect on the whole system. Initial recovery is usually surprisingly swift and later followed by a long, intense period of healing and regeneration.
4. And finally, city neighborhoods are resilient to an extraordinary amount of bit rot before radical corrective action becomes urgent. A lot of rot requires bold decisions and resources in order to restore a bad neighborhood from a dangerous place to the wonderful sustainable environment that it once was. This task of restoring something from a liability to an asset can take months or years. Once complete, the ongoing failure that was is easily forgotten.
Can this concept be extended further? Are there other aspects of software development that map directly to the maintenance and development of a healthy, booming city?