Jane Jacobs was an activist and urbanist in New York City who wrote The Death and Life of Great American Cities. She wrote about cities, but I argue that many of her thoughts on complexity and scale also apply to software engineering.
- Eyes on the street : Cities :: Linus's Law : Programming
One of her most famous ideas in the book is eyes on the street – the idea that a well-trafficked sidewalk brought security to a neighborhood with community-driven policing. It's not too far from Linus's Law,
Given enough eyeballs, all bugs are shallow – Linus Torvalds
2. Old buildings : Cities :: Open source : Codebases
Cities need old buildings so badly it is probably impossible for vigorous streets and districts to grow without them.
In software, I'd say a similar idea is to always lean towards code reuse and open source building blocks. Jacobs argues that old buildings revitalize cities because they provide cheap and flexible spaces. While many engineers have a tendency to always rewrite programs from scratch, refactoring bit-by-bit often is more effective. There's also a creative aspect – both old building and open-source software come with constraints, but allow for creativity in how they are used, split apart, and put together.
3. Cities : Suburbs :: FAANG : Startups
[Cities] are not like suburbs, only denser.
Ex-FAANG engineers usually make bad startup employees. They try to take some of the best practices used at scale and apply them to startup-scale problems. This leads to over-engineered architecture and complexity that doesn't have the staff to support it. I'm guilty of it, but the trope has some truth to it: You don't need Kubernetes.
3. Neighborhoods : Cities :: Applications :: Codebases
What defines a neighborhood? Jane Jacobs fought back against the traditional view that a neighborhood was a unit roughly the size to support an elementary school and community center, about 7,000 people. Instead she defined a neighborhood on the city-level, district-level, and street-level.
What is an application? Is it a single program? Is it a single program plus it's runtime environment? Is it a collection of programs that fulfills a business requirement? Boundaries are fuzzy. Ultimately I think we need similar types of distinction when talking about applications.