Today's Best Practice is Tomorrow's Legacy
Every industry has best practices. Some of these best practices have been around for literal centuries. For example, double entry in accounting has been around since about the 13th century. It’s battle tested, it’s effective, and it will likely be around for at least another seven centuries to come.
Accounting, however, has been around for several millenia. It’s earliest known appearance is in ancient mesopotamia - about 7,000 years ago. In other words, it took nearly 6,000 years for the industry to completely settle in on the absolute best practice.
Software, by contrast, is a significantly younger industry. Instead of being around for 7,000 years, it’s been around for about 70 years, with the first recognized computer program built in 1948. And my oh my, what a contentious 70 years it has been. We’ve swung around the pendulum back and forth arguing over paradigms, languages, styles, best practices, definitions, and more.
We have thought leaders who present today’s best practices. Take them with a grain of salt.
The industry is too young for us to truly have found the absolute best practices. In fact, what was considered best practice even just 20 years ago is now regarded as horrible, no good, down right awful legacy code.
So… what do you do in an uncertain environment like this?
Learn from nature and evolution. Become antifragile. Aim for the following attributes:
- Start with small, not large units.
- Prefer internally cohesive, externally independant (“decoupled”) units.
- Blend centralization and decentralization. Battle tested and refined units can become rigid, centralized, and focus on efficiency. Novel units should focus on being adaptible, decentralized, and innovative.
- Seek out system stressors that will force higher levels of fitness from the outer, decentralized rim all the way to the rigid, inner core.
- Have predefined mortem metrics for every unit. Unfit units should be terminated to enable focusing on improving the fit units.
In the end, really, what we are looking for is a balance between efficiency and innovation, between centralization and decentralization, and between stability and adaptability.
Today’s best practices in software are merely today’s best understood practices to “jump the gun” on the above attributes. But they by themselves are not enough to ensure a system will stay current over time.