The Asbestos home builder: Learning from the Mistakes – Strategies for Improvement

Through these posts, I have relayed a situation that I experienced firsthand—how cutting corners in a project can lead to major failures down the line.

Part 1 shared the story of Tom the Builder and the shortcuts that turned a simple home project into a costly, hazardous mess.

Part 2 – Technical and Part 2 – Non-Technical, provided the more specific details of what was seen in the software project, showing how software projects face similar risks. Business leaders struggle with misaligned expectations, legal complications, and security flaws. Developers face unstable codebases, accumulating technical debt, and systems too fragile to scale.

This final part gets to what you may have been looking for—the solutions for how to fix this situation and how you can set up your projects from the start to avoid these problems altogether.

Fixing the Current Situation

While the issues in the codebase were alarming, I couldn’t just document them and hope the developer would resolve them independently. I needed to provide clear guidance on how to address the risks and validate that the fixes were properly implemented.

To approach this, I sorted the issues into two categories:

  • Quick fixes and temporary workarounds—immediate actions that could mitigate risks without requiring extensive rewrites.
  • Structural issues needing long-term resolution—problems that demanded deeper changes to ensure the software’s stability and maintainability.

For the short-term fixes, I focused on the most urgent vulnerabilities first—removing hardcoded credentials, stopping the db seeding on startup, and patching security gaps. These were akin to temporary home repairs, like sealing leaks or reinforcing weak flooring until a full renovation could take place.

For the deeper issues, I ensured a plan was in place to address the root causes, guiding the team toward better architecture, improved documentation, and more rigorous testing practices. These were the long-term solutions necessary to prevent future failures, just as structural home repairs prevent further deterioration.

This hands-on approach wasn’t just about identifying flaws—it was about ensuring real improvements happened and setting a framework for avoiding similar issues in the future.

Short-Term Fixes: Stabilising the System

Just as the family needed urgent repairs to address immediate safety concerns in their Just as the family needed urgent repairs to address immediate safety concerns in their house, software projects require swift action to mitigate the most pressing risks.

  • Prioritize Security Issues: Start with vulnerabilities that could lead to immediate breaches, such as removing hardcoded credentials and fixing input validation.
  • Triage Critical Risks: In the earlier software example, sending a quick email chain to stakeholders with steps to address critical risks—such as deleting the seeded super admin account—proved effective.
  • Establish Temporary Safeguards: Implement logging for critical areas, even if rudimentary, to gain visibility into system usage while longer-term solutions are developed.

These quick fixes mirror patchwork solutions for sealing water closets or drafty windows—temporary but necessary steps to stabilize the system. While urgent fixes serve as the first line of defense, knowing when to transition from patching issues to implementing lasting solutions is key to sustainable software development. Just like temporary home repairs, they buy time—but without deeper structural improvements, the same problems will surface again.

Long-Term Solutions: Building for Stability

Like removing asbestos or reinforcing the structural integrity of a house, fixing the foundational issues in software demands significant investment. Key strategies include:

  • Refactor Code Incrementally: Tackle the problematic areas identified in the review, prioritising high-impact improvements such as adding logging frameworks and introducing design patterns that simplify the system.
  • Adopt Best Practices: Enforce standards for code hygiene, consistent naming conventions, and dependency injection to ensure maintainability and scalability.
  • Implement Testing: Introduce unit and integration tests for existing functionality, and require all new features to include test coverage.
  • Upgrade Tools and Libraries: Conduct regular reviews of dependencies, updating them to their latest stable versions to reduce risks.

These solutions align with long-term goals and create a system that is stable and secure, ready for future expansion.

Lessons for Stakeholders: Avoiding Tom’s Mistakes

The family learned the hard way that vetting contractors is essential—and the same holds true for software projects.

  • Select Developers Carefully: Evaluate contractors based on their ability to deliver secure, high-quality solutions, not just on cost or speed. Red flags include vague answers and a lack of curiosity about requirements.
  • Set Clear Expectations: Define requirements that go beyond minimum specifications to include security, documentation, and maintainability standards.
  • Monitor Progress: Regular code reviews and audits can catch issues early, preventing technical debt from spiraling out of control.

Tom’s shortcuts showed why vetting matters. Much like hiring an experienced contractor ensures a stable home, selecting developers who prioritize security, maintainability, and quality can prevent costly mistakes down the road.

Preventing Technical Debt: A Proactive Approach

Avoiding technical debt requires a long-term commitment to quality.

  • Adopt a Culture of Quality: Promote practices like code reviews, peer programming, and automated testing to ensure problems are caught early.
  • Document Decisions: Maintain thorough documentation to guide future developers, making the system easier to maintain and evolve.
  • Plan for Growth: Design the system with scalability and extensibility in mind, abstracting common components and leveraging modular architecture.

This mirrors the lessons from Part 2 – Technical and Part 2 – Non-Technical, where ignoring software flaws early led to an unstable and inefficient system. Recognizing small cracks before they become structural failures ensures long-term success. Avoiding technical debt (where appropriate) isn’t just about writing clean code today—it requires a proactive approach that balances refactoring legacy components with the demands of new feature development.

Bringing It All Together

This post ties together the narrative from the previous posts:

  • From Tom the Builder: Just as the family learned hard lessons about trusting an unqualified builder, stakeholders must recognise the importance of vetting developers and investing in quality.
  • From the Technical Pitfalls: The issues uncovered in Post 2 highlight what happens when shortcuts become systemic. Addressing these mistakes takes time but is essential for stability and scalability.

Every project comes with choices: cut corners or build for longevity. The lessons from this series underscore one truth—real success comes from thoughtful planning, rigorous execution, and accountability. How will you ensure your next project is built to last?

Part 1 – The Asbestos home builder: A tale of cutting corners
Part 2 – Non-technical – The project behind the analogy
Part 2 – Technical – The project behind the analogy