Big Ball of Mud - Revisited!
Big Ball of Mud (more likely Great Balls of Fire that will burn you down!)
I am being mentored by Arun Batchu this semester looking into the exciting world of software architecture and as a self study we should look into this Big ball of Mud. I have read the page before and was also mentioned to me recently by my peer as we were discussing software architecture, Conway's Law, microservices architecture.The Big ball of mud page (1999) existed before the Agile Manifesto (2001) was conceived. This means that the observation that the authors wrote were noted before most of the agile processes ever existed but I somehow still observe the same kind of things (now more prevalent) in an agile world.
Well I guess the forces that they have observed still applies to the software projects of the agile world. How would we consciously prevent ourselves from creating Big balls of mud ? I think that there is no clear answer to that because any software project will be constrained by time and budget. But we can take steps to ensure that at the point that we need to ship our software system it will have a structure that will be good enough to handle changes. Nobody will be able to build the perfect elegant system because nobody can predict the future all we can do today is to make a best guess and often times make a trade off when we make that guess.
What are some of the steps we can take?
1. A complex system with a lot of functionality will definitely need a structure to support its function.So if the system is complex enough (however you want to define complexity) you must advocate to the product owners that you are going to need to invest some time and money on the software architecture because it will dictate the pace of the work that is coming. But don't invest too much because you are going to need to create functionality to satisfy business or product owners. As i said in my previous post you can interleave architectural tasks with user stories, think of alternative architectures but not commit to it yet until you have enough information which will be a best fit for the system. You still need define the architecture, know your quality attributes but define the architecture loosely but make it clear as more information comes along to help you decide during the software project.
2. Re-evaluate and refactor the systems architecture for each iteration
This will give you a chance to use the learning that you have gained during the iteration and enhance the systems architecture. At this point, you can also prevent deviation from the architecture and its erosion.
Functionality and feature will always trump good software architecture, there must be discipline to make sure that an evaluation of a software projects architecture during a retrospective (feedback loop at the end of an iteration)
Comments