The customer’s company has been developing an application for obtaining scientifically based forecasts of heat regimes of perpetually frozen soils. The system is designed to simulate the behavior of the physical environment through the numerical solution of differential equations. The application is actively used in the construction and oil industry.
The owner of the company had a request to conquer new market niches, which required the addition of a significant part of new functionality. By that moment the system had become very complex due to the accumulation of a large amount of source code of different versions written by different generations of employees. From a technical point of view, the product became difficult to upgrade, releases were extremely unstable, and deliveries became irregular. Writing Unit tests was a rare practice and applied ad hoc. There was also no automated UI testing, since its implementation was an even more complex and labor-intensive task that required the use of a separate framework. Manual testing was carried out on an ad-hoc basis, no regression testing was carried out.
To be able to further develop the product, it was necessary to introduce effective management practices, build processes on the project and eliminate the accumulated technical debt.
Technical description of the project:
Within this project, JazzTeam was responsible for process management and systematic work on the technical debt. Namely, our team was engaged in the implementation of CI/CD, setting up manual and automated testing processes, managing legacy code refactoring and improving the product architecture. It was also required to build processes for planning and systematic work on tasks. We have already told about this project in our previous article, but now we want to tell you about the results we could achieve.
JazzTeam was required to improve or create from scratch the following key project processes:
Also, it was required to carry out the following works as part of the project:
To manage the project, the Scrum methodology was introduced, which accelerated the development process and made it understandable, transparent, and manageable for the customer.
JazzTeam management team transformed the process of business analysis on the project. We optimized the requirements collection processes, adjusted the process of requirements handling and converting them into tasks. A new scheme for the formation and setting of tasks was also developed. The business analyst collected requirements from customers, after which he assessed the risks: whether the introduction of new features would harm the health of the entire application. Further, all relevant requirements were combined into tasks with specific performance criteria. A task plan was developed before each sprint. Each of the tasks in it was further decomposed and evaluated by the engineer performing it.
The next step was to improve the delivery process. First of all, we introduced the practice of regular sprint planning, backlog grooming. The team began to conduct a preliminary analysis determining the next release date. Effective planning approaches had a positive impact on the product delivery process: the team was able to deliver releases on time.
Since the system had a complex architecture and nontypical technology stack, the task of CI/CD implementation and test automation required research. The situation was complicated by the fact that the engineers had no previous experience in UI automated testing. Therefore, it was decided to start daily research (1 hour per day) on test automation and CI/CD implementation and constantly monitor the progress. As practice showed, without dwelling on one task, it was possible to find a solution faster.
One of the important decisions for the systematic improvement of the product was the introduction of architectural hours. Meetings were held weekly in the development team, at which the product development strategy was discussed taking into account its current technical state.
A discussion on strategic refactoring was also initiated as part of architectural hours. Engineers began to work on isolating code modules by covering input and output data with tests. So, during the first year, a third of several dozen main modules of the system were isolated in the background. This practice allowed achieving significant progress in the fight against high code consistency and allowed us to minimize the impact of modules on each other.
Processes were built and test plans for manual and automated testing were created under the guidance of the JazzTeam manager, which made it possible to more professionally manage the quality of the product.
The practice of mandatory Unit test writing by developers was introduced. The Data-Driven Testing approach was used in Unit testing. It simplifies input data entry, which is especially important for a simulation system with a large number of calculation modules.
Daily UI testing of critical product functions in the build that is as close to production as possible (with applied software and hardware protection) made it possible to change the current product code with minimal risk of missing regression bugs.
So, the following workflow for quality assurance was implemented:
Our team implemented the CI/CD culture on the project, thanks to which the product delivery process became significantly faster and more stable. You can learn more about how CI/CD was implemented on the project here.
Two months after CI/CD implementation, this practice began to bring the first results. The process of creating distributions of the product became fast and safe, which made it possible to significantly free up time and increase the productivity of the team. Automatic build greatly stabilized, simplified, and accelerated the process of creating different product versions for delivery to customers. The time spent by a specialist for the build of a license reduced by more than 15 times (10 minutes versus ~ 3 hours).
Platform: .NET, C#, C++, Managed C++.
Technologies: White, Jenkins, TestLink, Jira.
Processes: test management, project management, release management.
The company received new opportunities for product development and the creation of new functionality. The customer’s development team began to reduce the technical debt, use and accumulate best engineering practices, maintain the necessary documentation, while increasing the speed of creating new functionality. Thanks to the established processes and comprehensive work, the customer was able to release new versions of the product 2 times faster, while the amount of functionality implemented for the release also doubled.