A common theme in non-dinosaur software development is iterating much and often. Of course the nature of those iterations, their frequency, and the techniques that are applied differ. You don’t iterate on rocket guidance software quite the same way you iterate on an e-commerce website (something about a failed rocket test being more expensive than a bug in CSS), but either way you iterate.
This is nothing more than a fundamental admission on our part that the complexity of what we do as engineers often exceeds our ability to visualise it in its entirety. The devil is always in the details and when a complicated system connects to another complicated system the complexity tends to get multiplied, not added.
So we iterate. We write tests and we iterate on those. We create a basic end to end implementation and we iterate on that. Whatever is appropriate and most effective for the nature of the systems we are developing.
getting it right the first time around,… iteratively
On the face of it, what I have written so far might seem a little contradictory with the title. If we admit that we can’t get things right without iterating on them then how are we to get it right the first time?
Several months ago we talked about intelligently compromising and uncompromising development. The distinction we made then was between what can/should or can’t/shouldn’t be compromised on to get a good design.
The answer this time is much the same. You can compromise on adding sophisticated error handling logic if your application does not demand it on the first iteration, but you can’t compromise on structuring your code in a good way that ensures there is a way to add this logic later if needed. You can compromise on which features are most critical to implement, but you can’t compromise on monitoring for the features you have implemented so you know they are working correctly. You can never compromise on testing…
We iterate until we get things right, but unless the system is a proof of concept that will be thrown away tomorrow we can’t compromise on making it a good system. One that does only some of the things we want perhaps, but for those few things at least a good system nonetheless.
If you enjoyed the read, drop us a comment below or share the article, follow us on Twitter or subscribe to our #MetaBeers newsletter. Before you go, grab a PDF of the article, and let us know if it’s time we worked together.