Principled Software Development
Every software development effort should be unafraid to implement big ideas.
SOFTWARE ENGINEERING
2/11/20242 min read
Every software development project makes decisions on how to balance the iron triangle of scope-time-cost. Good teams will always want to their product to be the best it can, to do more, even in the face of a looming shipping deadline. Making such a decision is hard. It's harder still to make the right compromise today that won't compromise the future. To help make the right decision, I've collated here the By Design principles that I encourage my teams to follow, that help guide these tricky decisions.
Lean By Design: Maximise value with minimum effort.
Eliminate waste: Wasted, unproductive effort is the surest way to unnecessarily increase time and cost. However, tracking down and eliminating every last form of waste is harder. Here's a short list of things to consider: Partially done work, Extra features, Relearning, Task switching, Waiting and handoffs, Defect load, Reused reusable code, Too much tech debt, Too little tech debt.
Build quality: Poor quality is an invitation for future work, so teams should really understand the difference between production-ready and feature-complete. Never compromise on the former and never ship the latter. XP techniques can be useful such as pair programming, TDD, code reviews.
Build knowledge: Agile development prefers collaboration over complete documentation, but complete is not the same as none. It's important to just enough documentation, maybe use GenAI tools to create them. Equally important is sharing the knowledge, because knowledge, like code, should be reusable and reused.
Defer commitment: Embrace "learning by doing" by always starting with MVP. Defer building out features until have received market feedback. Build first and they will come is vain and wasteful.
Deliver quickly: Fail fast in order to fail often to shorten feedback loops. Software value is measured in fitness for use and not in conformance to requirements. But failure really is failure if learnings are not made and implemented.
Empower the team: Invest the team with all the skills and autonomy to deliver. Provide delivery management that removes obstacles and coaches rather than directs.
Systems thinking: The technology solution is not the whole solution and only delivers value in context; developers should collaborate to understand the context.
Ethical By Design: Be of real benefit to the people we wish to serve.
Trustworthy, responsible and accountable: The solution is private and secure and not just for PII and SI.
Fairness and justice: The solution is inclusive and non-discriminatory to individuals and there are methods for redress.
Of benefit to users not just investors.
Does no harm to society: The solution does not perpetuate structural injustice, nor does it have an unfair cost/benefit distribution.
Scalable By Design: Grow without rewriting.
Always MVP first to prove out one hypothesis at a time.
Then scale to desired user base without compromising other principles, using scalable architecture patterns, e.g.: Loose Coupling, Modularity, Stateless (or Event-Driven) Architecture, Sharding.
Sustainable By Design: Be responsible in how our products use diminishing resources.
Carbon: Build applications that are carbon (fuel) efficient.
Electricity: Build applications that are energy efficient.
Carbon Intensity: Consume electricity with the lowest carbon intensity [of its source].
Embodied Carbon: Build applications that are hardware efficient.
Energy Proportionality: Maximise the energy efficiency of hardware.
Networking: Reduce the amount of data and distance it must travel across the network.
Demand Shaping: Build carbon-aware applications, that demands energy from the grid when the energy is cleanest.
Measurement & Optimisation: Focus on step-by-step optimisations that increase the overall carbon efficiency.
Thinking about the above will safeguard Intergenerational Justice; we won’t limit the resources that future generations will have at their disposal by overusing the same resources today.