One of the terms mentioned around Emergent Design in the ThoughtWorks Technology Radar is the Lean Software Principle of Last Responsible Moment. The theory behind last responsible moment is that you should defer decision making to the last responsible moment in order to gain flexibility in the choices you have later. Sometimes people forget there is an option other than making a decision and that is making no decision until they have the information they need to make an informed choice.
It turns out lots of agile practices help us delay decision making until we have enough information to make an informed decision and help us to adapt when circumstances change and decisions are no longer valid. For example when you take a TDD approach you delay making design decisions upfront and instead make them as you code. Having a set of tests help support refactoring when business needs change or functionality needs to be extended.
The things I intend to take out of Last Responsible Moment are:
- I need to learn to be able to cope with uncertainty and ambiguity. Not everything can be set in stone early in a project. Decisions shouldn’t be made because of a fear of the unknown. It is important to identify the different approaches/options available to you and be aware of the pros, cons and costs.
- Sometimes is is worth investing in more than one option to determine which is the right one. All options have value. Yes it will cost time and money but in return it brings benefits. A better informed decision when you make your final selection. Perhaps more experience in a technology or approach which could be beneficial elsewhere in the project or in a future project. (Obviously projects have limited budget and time and you must respect that. Taking this approach for every decision would not be sensible or beneficial)
- I need to take responsibility for my use of time and actions
- I need to code/design using techniques that allow me to absorb change e.g. use of interfaces, separation of concerns etc. (Nothing new here!)
- Develop just what you need.
- I need to recognise what decisions need to be made up front e.g. layers within application, usability design and what can wait until things become clearer
- I need to develop the ability to respond quickly. This will give me the option of waiting until customers get a better idea of what they want. Clever coding and designing as described earlier comes into this as do things like continuous builds and delivery
- Being aware of the information required to make a decision I should try to obtain this as early as possible so I can make an informed decision quickly and avoid carrying unnecessary options.
Definitely some practical behaviour I can put into action in work and in my personal projects.