Provided services
Product Development, Test Automation Services, Manual Testing Services, IT Consulting, Project Management, CI/CD Implementation & Modernization. DevOps Services, Early-Stage Innovation, R&D Services, Software Reengineering, Refactoring and Modernization. Cloud Migration
Client
Our client is a SaaS vendor specialized in engineering scientific solutions for energy and construction companies dedicated to simulating the behavior of the physical environment. The client’s solutions help customers maintain profitability, adhere to strict industry regulations, and secure long-term viability no matter how tough the conditions are.
Whether it’s putting up buildings, laying pipelines, or drilling wells, the only way to make sure everything mentioned above will stand the test of time is to understand what is happening and what can happen beneath the ground. And that’s exactly what the application developed by our client assists its users with.
Product
Powered by a data-driven core and complex algorithms, our client’s product leverages numerical solutions of differential equations to simulate the behavior of permafrost (perpetually frozen soils) under various conditions, focusing specifically on heat regimes. It equips scientists and engineers with data necessary to make decisions about building in or extracting resources from even the most challenging environments.
Challenge
Our client was headed to new markets and this expansion demanded fundamental changes to the product. However, by that time, the system built up a large amount of source code written by different generations of employees. Paired with the lack of structured testing and systematic task management, it resulted in a highly complex and unstable codebase that made the product difficult to maintain, not to mention adding new features to it.
All signs pointed to the client’s bold ambitions of breaking into new markets would stay just that — ambitions. Also, the company could have benefited from a greater emphasis on establishing best practices in software development and testing to prevent negative consequences on its growth journey.
This is when JazzTeam joined the project. The client needed more than just technical fixes. On top of that, they required a complete overhaul of their development practices. Our role was to help transition the team to a more mature, process-driven mindset, addressing technical debt, and establishing best practices in testing, continuous integration, and delivery management. The goal was both to stabilize the current product and prepare it — and the team — for future growth.
Project context
Throughout its existence, the product faced a lot of issues that we had to sort out:
Technical debt
To speed up the product’s time to market the client had to make some trade-offs, including limited planning, incomplete documentation, and lack of code reviews and refactoring, which, over time, led to increased technical debt. It slowed down the development cycle to the point where the shipping of new features became almost impossible.
Dual-language code
The fact that the app’s calculation engine was written in C++ and the UI layer along with business logic were developed in C# posed scalability-related challenges when the client sought to evolve their product. Keeping the two languages coherent became increasingly complex, making the introduction of automated testing a challenging task.
Unstable releases
Problematic code, overflowing backlog, and hard-to-plan sprints — all the direct consequences of skill gaps in the client’s development team — resulted in unreliable releases that used to be carried out once a year.
Limited testing
The lack of structure and consistency in existing quality assurance processes negatively impacted the quality of deliverables and the overall development. The client’s team performed UI and unit testing ad-hoc, covering only 10% of code. As for automated testing, this practice was considered a complex and labor-intensive task as it required the use of a separate framework. The lack of regression testing led to a constant stream of bugs, meaning that every new code change was stressful and challenging for the client’s team.
Challenging task management
The lack of organized project management and a well-honed strategy for iteration planning added to the pile of issues that undermined the development process. Due to irregular task setting, constantly shifting priorities, and mistimed launches, the client had to act in the context of continuous firefighting instead of redirecting their effort to the product’s further development.
Solution
After analyzing the state of the client’s project processes and current level of QA maturity, JazzTeam decided to roll out fundamental improvements across all key project areas. From product governance to testing and release management, the client’s project demanded not just point solutions, but an all-in transformation effort with many processes set up from scratch.
Phase 1: Analysis and research
Keeping in mind the product’s unique architecture and complex tech core, our team started the QA transformation process by performing in-depth technical research to determine the optimal approach to CI/CD implementation and test automation.
As our client’s engineering team was new to automated UI testing, we took a collaborative route, initiating regular product sessions focused on continuous product improvement. Our specialists also introduced technical strategy meetings — including retrospectives on strategic refactoring — into the client’s development team, helping them adjust the product development strategy based on the as-is tech state.
During technical strategy meetings, we also dedicated a lot of effort to setting up the process of strategic refactoring. Under our guidance, the client’s team gradually isolated code modules through comprehensive testing to improve code consistency and minimize module dependency. After a year of successful implementation, the team isolated a third of the system’s main modules.
Phase 2: Process transformation
Incremental improvements won’t come to fruition unless they are built on a solid foundation of consistent project management. That’s why JazzTeam stepped up to introduce best project governance practices that would ensure the high quality of final deliverables and lay the ground for reliable releases.
Restructuring the business analysis process
Since the client’s project lacked traceability of the requirements and adequate risk management strategy, the team had a hard time prioritizing test areas and validating the final product. We introduced a new requirements management system that facilitated the process of requirement gathering and their further transformation into tasks.
Our team also brought in a new task prioritization scheme for business analysis, taking the complexity out of risk assessment and task preparation. A more structured approach towards task prioritization also made it easier for software engineers to decompose and evaluate tasks.
Streamlining the development process
As part of our broader transformation efforts, JazzTeam experts introduced the Scrum methodology into the client’s project to improve scheduling, resource allocation, and risk management in the client’s team.
Rewiring the delivery process
The instability of the client’s releases sprung from the failing software release management system. So we fixed the latter, introducing our client’s team to the best release management practices, including sprint planning, backlog grooming, delivery plans, document curation, code freezes, and more.
Phase 3: Quality assurance
Next, we moved on to the main part of our collaboration: rescuing the client’s product by bringing a testing culture to the client’s team. As the product’s codebase ended up in a tangle, JazzTeam implemented a tailored QA strategy designed to reduce code dependencies.
- JazzTeam specialists aided the client’s team in creating test plans for manual and automated testing.
- We helped the client’s engineers implement a test management system based on the combination of Jira and TestLink.
- Our team set up a daily UI testing system that enabled the client’s team to validate product performance on near-production builds, minimizing the risk of regression bugs. To mimic the real-world conditions, we used a testing environment with applied software and hardware protection.
- Our specialists introduced the client’s team to the practice of pre-release testing that prevents production issues down the road.
- We also established unit tests as a mandatory practice in the client’s development team to promote code quality even in the early development stages.
We based our unit testing strategy on a data-driven testing system, relying on the latter to simplify input data entry. For a scientific simulation system with a variety of calculation models, this approach improved the accuracy of calculation verification and control over the range of computations.
- We advised the client’s team to use reference values derived from real projects with validated ground measurements to effectively integrate the parameterized testing approach. In this case, the system can make calculations and automatically compare them against real-world data.
- The DDT (Data-Driven Testing) approach enabled the team to adjust the desired level of accuracy based on the test target. More stable system cores benefited from a high level of accuracy, while new product versions were tested more thoroughly to catch issues in their tracks.
- Our DDT-based method paved the way for comprehensive edge case testing, allowing our client’s team to size up core performance metrics such as speed, calculation cycles, and more to test-drive the system.
JazzTeam’s specialists helped the client implement an efficient quality assurance workflow that now allows the client’s team to safeguard the quality of new functionalities.
- New functionality is covered with unit and integration tests right after it is developed.
- While a dedicated developer performs unit and integration tests, other engineers verify test coverage and make sure the functionality passes all tests.
- Next, the functionality branch merges into the development branch. The combined branch then undergoes comprehensive testing that takes 3+ hours.
- A manual testing engineer decides on additional UI or data-driven testing. If necessary, they create an autotest script or collaborate with the business analyst to prepare a set of test data.
Phase 4: CI/CD implementation
As part of the QA improvement roadmap, our team designed and implemented CI/CD pipelines to automate testing throughout the entire development lifecycle. Using Jenkins as a central automation hub, JazzTeam’s quality assurance engineers helped the client’s team automate deployments, reducing the chances of manual errors and accelerating the time-to-market for new releases.
While dealing with a complex testing environment, we followed an integrated CI/CD implementation approach that incorporated continuous integration, continuous testing, continuous delivery, and continuous reporting on the application’s performance and health in production.
Result
Prior to collaborating with JazzTeam, our client’s development team wasn’t accustomed to learning and working through a testing culture. The lack of test discipline and related experience undermined the quality and speed of releases while technical debt piled up. Backed by our 12+ year QA expertise, the client managed to solve all these challenges and introduce a quality-driven, value-based development environment.
Here are the results our client achieved, collaborating with JazzTeam’s QA consulting experts:
- Well-honed testing process, established from the ground up, guided by best engineering practices;
- Doubled speed of product development and delivery, ensured through the effective combination of test automation and manual testing;
- x2 more functionality implemented in each release;
- x5 faster releases;
- Significant reduction of the technical debt, improving software performance and maintainability;
- > 300 working hours saved during the first year of collaboration due to proper organizational and technical measures taken;
- The time spent on creating a new product version decreased by 15 times, dropping from 3 hours to 10 minutes thanks to automatic builds;
- With the client’s team approach to testing changed and DDT integrated, the number of unit tests increased by 25%, contributing to better code quality and regression prevention;
- A third of the system modules were isolated during the first year of the project to reduce the risk of unintended side effects when making changes to the code.
Working iteratively and hand-in-hand with our project managers and QA specialists, the client’s team underwent both cultural and technological transformation, which opened new opportunities for product development and unlocked continuous innovation for the client’s scientific tech product.
JazzTeam specialists played a key role in changing the mindset of the customer’s team and fostering a productive development environment. Our experts helped the client improve team cohesion while also helping successfully integrate new members to it.
Today, we continue to support the company, mentoring the client’s team on QA-related projects and assisting in maturing QA processes.
Screenshots
Technologies
Platform: .NET, C#, C++, Managed C++.
Technologies: White, Jenkins, TestLink, Jira.
Processes: test management, project management, release management.