IT product company (England, UK).
Inventory and order management system for distributors and e-commerce, including ERP, CRM, and warehouse management system.
A complex scalable product with a large number of functionality and modules, not covered by automated tests. Constant release delays and bugs arising at the production stage negatively affected the customer’s reputation, as a result of which it was impossible to expand the client base and move to cooperation with larger companies (due to the higher error cost). Product development and delivery were intense and stressful for everyone involved.
Project technical characteristics
The system has a large codebase with a non-trivial, confusing architecture and mixed layers of code (business layer, database, controller, UI), which makes it difficult to maintain. Unit tests are almost absent, the Definition of Done didn’t have them, too. Requirements for the code level coverage are absent as well. Product quality control is carried out ad-hoc and with the help of manual testing. The system components are not isolated, due to the high level of cohesion the bugs appear at the slightest code changes. The product is very difficult to scale and integrate new functions to.
The principles of continuous integration and delivery (CI / CD) are not implemented, the product build and server updates are done manually, which negatively affects the speed of product delivery.
Constant release disruptions cause dissatisfaction among business owners and end clients; nervousness and stress arose in response to the pressure in the team. The situation is complexified by the lack of proactivity and technical leadership among engineers, and the accumulated technical debt over the years. Initiatives to introduce new engineering practices that benefit the project, in the long run, are ignored, leaving developers with learned helplessness.
Approaches and solutions
- We consulted stakeholders of the customer’s company on improving the current project situation. JazzTeam CTO acted as a mediator – an independent party, promoting an understanding among product owners with different points of view. Each of them recognized the need to improve processes, but the options they provided did not help eliminate the problem root. First and foremost, it was necessary to shift the focus from achieving short-term business goals to establishing a culture of value-based development.
- We reorganized the processes:
- We implemented CI/CD for automatic build, regular quality control, and automation of product delivery. That process was complex, painful, and required a number of studies to achieve full build automation, including those on ensuring automatic build of product executable files and implementing LiquiBase for version control at the database level. It was necessary to overcome distrust on the part of the team, as well as insist on the mandatory use of CI/CD for everyone.
- A large volume and lack of a culture of technical debt management made it critically difficult to work with it consistently throughout each sprint. At first, it was necessary to earn the trust of the team and, with small iterative changes, demonstrate the possibility, prove the importance of working through the debt, even in the conditions of constant developers’ lack of time with commercial tasks. We focused on the integration of automatic build of product executable files and were able to implement it at low cost, while the final effect allowed us to start applying CI/CD. It was appreciated by customers. Also, despite some resistance, engineers started to examine several researches for 1 hour a day. That approach allowed us not to lose focus on the commercial task delivery, and at the same time, we consistently moved forward to resolve the accumulated technical debts. Below are some illustrative examples of how critical tech debt was dealt with:
- We implemented the best development practices and generated a culture of value. In agreement with the business owners, we decided to strengthen the role of engineers on the project and increase the degree of team self-organization. To do so, we applied the best approaches of the Scrum methodology. Daily stand-ups increased the synchronization level of the geographically distributed team. A demo of the new functionality in front of the entire team helped achieve a common understanding of the current project status. Misunderstandings and problems in the team were promptly resolved during regular retrospectives. Opinions of all project participants were heard and the product owners began to take into account and think over the suggestions and comments of the engineers. We established a systematic transfer of knowledge within the team – it comprised lectures and meetups on technological or domain expertise. All that helped improve the psychological climate and overcome the learned helplessness of engineers.
Results and achievements
- Thanks to the carried out work, the customer was able to deliver new functionality regularly and on time, thereby developing and scaling the complex product. Quality degradation at the production level was eliminated. It opened up opportunities for ensuring the market share of the customer’s company and improving cooperation with larger players.
- The value-based approach to development was established in the team. Shifting from short-term goals to strategic product development the product owners began to listen to the initiatives proposed by the team that delivered long-term value. Also, the product owners began to invest in the implementation of the necessary engineering practices (CI/CD, Unit testing, test automation). Eliminating technical debt was conducted during each sprint, and long-term technology researches were generated.
- Thanks to the introduction of CI/CD, the process of the product build and delivery was automated. It became fast, transparent, and secure. That allowed ensuring the regularity of releases.
- The complex app codebase was covered with Unit tests, thanks to which we stabilized the quality of the system when making changes.
- Full-fledged test automation significantly improved the quality of the product and reduced the time for app development and support. Systemic test coverage made it possible to detect bugs quickly when implementing new functionality. That provided the opportunity for well-timed development to keep the product competitive.
- We improved the synchronization level between distributed team members and product owners. Engineers became motivated to overcome learned helplessness, use a proactive working approach. The psychological climate in the team has been improved, the development process takes place in a more relaxed atmosphere without unnecessary stress and nervousness.