When Software Becomes a Big Ball of Mud
Jason Garber, co founder of Promptworks discusses a common software development anti-pattern, the “big ball of mud -- no architecture, no testing, and a big steaming pile of technical debt.”
by Jason Garber
Ryan Findley, our friend at Neomind Labs from whom we leased office space when we started Promptworks in 2013, once made an astute observation after the office cleaners left:
They do a great job at first (and charge you a higher fee for that initial cleaning), but then over time get worse and worse until you fire them and hire a new cleaning company, who also does a great job at first— I’ve observed this too—why is it? “I want that initial clean every time, and I’d be happy to pay for it,” Ryan said, “but it seems the only way to get that level of service is to be a new customer.”
In my 15 years of experience, I’ve observed that software tends to go the same way. Potential clients come in with an app they hired some developers to build on the cheap. Frankly, what the app manages to do for how little they paid is often astounding! Utility has triumphed over aesthetics and workmanship was sacrificed for functionality. But now, the client says, changes take a very long time and often break more than they fix. Lack of progress is frustrating, but the straw that breaks the camel’s back is the developers returning to school, taking another job, or just going AWOL—how convenient for them!
The “Ball of Mud” Pattern
They need to find a new software engineering partner, so they come to Promptworks. We open up the code and see it follows the “big ball of mud” pattern: Architecture is non-existent, there are no tests to reveal what the app is supposed to do, and even a cursory glance at the code shows red flags and loads of technical debt. We run it through CodeClimate just to prove that this code gets an F.
One approach would be to dive right in—fueled by the enthusiasm that runs high when starting a new project and perhaps the adrenaline of an upcoming deadline—to fix their list of bugs and add the new features they need quickly and cheaply. Essentially, we’d be continuing the labor-intensive pattern of applying more muscle and long hours to coerce the codebase to work properly and keep the system creeping forward. We’ve done our fair share of adding mud to the ball at previous jobs and experience has taught us that it’s irresponsible and unsustainable. The enthusiasm runs out, deadlines zoom by, and we’re back in the state of squalor that ended the last development relationship. We can’t and won’t do this to our clients.
How to Fix It
Instead, we’ll tell clients if Promptworks is to make any forward progress, we have to rebuild it right: using a good language and framework, pair programming, test-driven development, continuous integration, continuous deployment— Agile and XP practices all around. It might take months just to get back to where it would seem they are now. The price tag isn’t easy to swallow after months or years of bargain basement coding, but once educated about technical debt, they realize that there’s no way forward but to pay it off. Cheap development came at a price—and in some cases that approach is appropriate, but it’s much sadder when the client didn’t know there was an alternative. Kent Beck said, “Make it work. Make it right. Make it fast.” Their problem was instead of going through this cycle several times an hour during development, they’re taking years to make it right!
Metrics Help You Sustain Quality, Velocity
Perhaps it’s just because I’m an engineer, but if there was a cleaning company that kept track of how many grams of dirt their vacuum cleaner collected, and emailed me photos of the white glove test, I’d hire them in a heartbeat. When we track our performance longitudinally, it helps us avoid slowing down, cutting corners (more often a consequence of trying to meet ambitious client requests than laziness), and getting ourselves in the situation where the client feels they need to find new help. Switching costs are non-trivial, so you must factor them into the rate of maintaining a clean house in perpetuity.
At Promptworks, we strive to keep our code and development process clean and running smoothly so the client never wants to switch. If they do, we hand off all the Agile planning, development methodology, automated tests, and deployment infrastructure to make it easy for new software engineers to be productive quickly. We’re proud to have hired and trained developers on behalf of a number of clients, because a sustainable plan for ongoing development and maintenance is a crucial part of our clients’ satisfaction.
It’s All About the Long Term
Promptworks values looking out for our clients’ long-term interests and being the craftspeople behind their well-oiled machine. If you have a critical system that has become a big ball of mud, we’d be happy to take a look and help you make a plan. If you’re just getting started on a new software project, let us apply our experience and finely tuned software development process to start your project off right and put it on track for long-term success.