There, I said it. A four letter swear word. Something worse than the F’ word if the horror on the boss’ face is anything to go by.
We don’t do “documentation” anymore and besides, the agile manifesto says it’s immoral to write a word of documentation. The code is the documentation. That you have to get inside the twisted maze of my mind, and work out what drug infused insanity I was trying to convey at the time and which may or may not result in what was intended regardless… that’s your problem.
Such nonsense pervades software development today. Although…
It’s not the lack of documentation per se but the lack of demonstrable thought that bugs me. A critical explanation of why things are the way they are.
Why has solution design been so poorly treated?
The answer to that lies in what design is trying to achieve.
Solution design aims to address the needs of the system, communicates how these needs are met and enables testing of the solution when the cost of change is lowest.
This testing is achieved by static walkthroughs and peer review.
However, in an agile world where we breakdown features and stories into small chunks that can be delivered rapidly and iteratively, the hefty tombs of yesterdays solution design documents are equally shrunk to focus on the few features and stories in scope.
Taken far enough it ends in a combined whiteboard design and review session with a handful of developers. And beyond taking a photo and circulating to the team, what's the point in doing anything more?
Firstly there's the supporting teams who are going to care for your solution through its early teething days, rebellious teenage years, into maturity and all the way to the grave – death being one of the few certainties in life. Making these guys bump their way around a darkened room trying to figure out how things hang together is unfair if not sadistic.
These guys don't work in scrum teams or story by story. They work from incident to incident, from shit-storm to fan-splattering shit-storm. They need a concise and holistic view of the solution for which a few poorly framed holiday photos doesn't cut it. Honestly, these guys are too nice to you.
Then there's the not insignificant matter of consistency.
You can argue the marginal benefits of any technology but you need to justify any change which runs counter to the inherent design patterns of a system as contributing significant value to overcome the increased complexity and costs it brings.
Do things consistently and you get paybacks in terms of proven reliability, easier maintainability, reduced cognitive load, faster delivery and so on.
Do things inconsistently and whilst you may get to play with the latest tech you're being pretty selfish - if that's your motivation. And if it's not then see above re justifying the increased complexity and costs.
Which brings me to my point on solution design.
Solution design is about more than addressing the needs of a few stories on a sprint by sprint basis. It's about addressing the broad needs of the system and providing a vision for the longer term. Defining the patterns which will be used time and again and which (should) enable that payback through consistency.
This isn't an argument that technological progress isn't a good thing or that we should never have crawled out of the sea. Or that your resident architect has all the answers. It's an argument to think about the broad needs, key decisions, responsibilities, patterns, principles, policies and costs - immediate and long term - that provide the foundation on which any system is based.
At times it may seem futile and time consuming but it's cheap to change this stuff early on rather than late on when it's most expensive.
And the way we do that best is through reasoned discourse. Discourse best expressed through quality documentation - words, diagrams and matrices.