In this post, I will share my experience witnessing the failure of a large company in the EU, employing over 500 people. This company faced massive layoffs due to technical debt and poor decision-making.
"Hey everyone. Today, some of you will lose their jobs." - CEO
We'll dive into what happened, analyze the causes, and understand the lessons learned from this unfortunate event.
Feature-Focused Development
The Project Manager (PM) consistently prioritized new features over addressing technical debt, believing that time spent on code clean-up and optimisation was a waste. Convincing the PM to allocate even one sprint to deal with technical debts was an uphill battle. From his perspective, time spent on cleaning up the codebase and eliminating technical debt was a strategy developers used to waste time.
This approach led to a vicious cycle where the development team was always under pressure to deliver new features quickly, often at the cost of quality. It's challenging for non-technical stakeholders to grasp the intricacies of software development. When developers release features under pressure, they often skip essential testing, optimization, and sometimes even resort to temporary solutions. This approach inevitably leads to new bugs and system inconsistencies.
Moreover, the lack of focus on technical debt meant that the codebase became increasingly difficult to manage and maintain. Over time, this resulted in slower development cycles, higher defect rates, and a significant drop in overall productivity. The PM's inability to understand the long-term benefits of addressing technical debt was a critical factor in the company's downfall.
Temporary Fixes
The situation worsened whenever something broke down. We were instructed to implement quick fixes due to time constraints. As a result, the codebase became riddled with temporary fixes, leading to a cascade of bugs that grew larger and more frequent over time. These band-aid solutions, while addressing immediate issues, created a fragile and unstable codebase that was prone to frequent failures.
Each temporary fix introduced new inconsistencies and potential points of failure, making the system increasingly difficult to manage. This approach also demoralized the development team, as they were constantly firefighting instead of building robust, scalable solutions. The culture of quick fixes and shortcuts undermined the quality of the product and eroded trust in the development team's capabilities.
The accumulation of technical debt through temporary fixes reached a tipping point where the system became unsustainable. The constant need for quick fixes not only slowed down new feature development but also damaged current system with critical failures.
Tight Deadlines
Unrealistic deadlines were another significant contributor to the company's technical debt. At times, the deadlines set were beyond achievable, making it impossible to deliver a quality product. When we raised concerns about this issue, the response from the staff engineer was like:
"Just release something working, then we can do something about it."
This mindset led to a culture where the primary goal was to push something into production, regardless of its quality. As a result, crap products were shipped, compounding the existing technical debt and creating a backlog of issues that needed to be addressed.
The pressure to meet tight deadlines also meant that corners were cut, best practices were ignored, and thorough testing was often skipped. This approach not only increased the likelihood of defects but also made it difficult to identify and fix root causes of problems. The relentless pace of development left little room for reflection or improvement, trapping the team in a cycle of reactive problem-solving.
Messed Roadmap
Despite having set OKRs (Objectives and Key Results), we frequently received unexpected projects in the middle of the quarter. This lack of a proper roadmap led to chaos and further contributed to technical debt. The constant influx of new priorities disrupted the development process and made it difficult to maintain any semblance of strategic direction.
"Hey, we just need it now because there is a huge potential in that area"
The absence of a clear, coherent roadmap meant that the team was always in a state of flux, constantly shifting focus from one project to another. This instability not only slowed down progress but also increased the likelihood of mistakes and oversights. The lack of a well-defined roadmap also made it challenging to plan for long-term improvements, further exacerbating the issue of technical debt.
The frequent changes in priorities undermined the team's morale and productivity, as they were never given enough time to complete tasks properly. This chaotic environment made it difficult to establish a sense of accomplishment or progress, leading to frustration and burnout among the team members.
Skill Issues
Compounding the problem was the lack of technical expertise among the leadership. Our tech lead, who should have bridged the gap between business requirements and the development team, lacked the necessary technical skills. Essentially, the tech lead functioned as a second PM with limited technical knowledge.
A tech lead's responsibilities include managing business expectations based on capacity and technical limitations, and assisting the development team with delivery. Unfortunately, our tech lead lacked these crucial skills and had no authority to influence decisions. This deficiency can be traced back to HR, which failed to identify the missing competencies during the hiring process.
The tech lead's inability to provide technical guidance and support left the development team without a clear direction. This lack of leadership further compounded the issues of technical debt and poor decision-making, as there was no one to advocate for best practices or push for necessary improvements.
The HR department's failure to identify and hire qualified technical leaders was a significant oversight. The lack of skilled leadership created a vacuum that contributed to the company's decline, as there was no one to steer the team towards sustainable development practices.
Micromanagement
This topic deserves a post of its own, but I'll provide a quick overview here since it had a huge impact on the situation. The lack of a flat organizational structure, combined with a culture where everyone constantly watched each other, exacerbated the problems. Higher-level management made all the decisions, and no one could question them. Despite being told to "feel free to speak up," it was clear that doing so wouldn't change anything.
Bureaucracy and groups of people with very poor decision-making abilities created an environment where micromanagement thrived. This stifled innovation, hindered productivity, and contributed significantly to the company's downfall.
Conclusion
This experience taught me invaluable lessons about the importance of balancing feature development with technical debt management. It's crucial for non-technical stakeholders to understand the long-term impact of technical debt and to allocate sufficient time and resources to address it. Additionally, having skilled technical leads and realistic deadlines is essential for delivering high-quality products and maintaining a healthy codebase.
By sharing this story, I hope to shed light on the critical factors that led to the downfall of this company, providing insights for others to avoid similar pitfalls.
Key Takeaways:
- Prioritize addressing technical debt alongside new feature development to maintain a healthy codebase.
- Ensure that deadlines are realistic and allow for thorough testing and optimization.
- Develop a clear and coherent roadmap to provide direction and stability for the development team.
- Hire skilled technical leaders who can bridge the gap between business requirements and development capabilities.
- Foster a culture of quality and continuous improvement to avoid the pitfalls of quick fixes and shortcuts.
- By learning from these lessons, other companies can avoid the devastating consequences of technical debt and poor decision-making, ensuring long-term success and stability.
Also, I would highly recommend to use tools like TechDebtMonster, which is a tool I built to help teams manage and eliminate technical debt. This platform turns the daunting task of dealing with technical debt into a gamified experience, making it engaging and less intimidating for developers.
With seamless integration into Slack and JIRA, it allows teams to set schedules, monitor progress, and tackle tech debt monsters at various stages. This tool is a must-have for any team looking to manage technical debts.
Top comments (0)