Such a phenomenon as “outsourcing” has become ingrained in our everyday lives today. Outsourcing refers to the process of transferring a part of the company’s functions to another company (outsourcer). Usually an outsourcer is an expert in this field. As a result, companies can free up their resources and time. This allows drawing more focus on strategic processes.
Outsourcing is very actively used in software development. Software development is a complex and time-consuming process that requires the engineering approach. This process presupposes thinking through the entire system that should be developed at the very beginning and a clear understanding of how the team moves throughout the entire software development life cycle. Constant synchronization between customers and contractors is important. If the customer lets everything go with the flow and does not take part in the development, then with a high degree of probability everything will end sad – starting from the failure to meet deadlines to receiving an inoperative product.
One large European company (hereinafter referred to as the customer) faced such a situation. It decided to outsource the development of an important software product to an Indian company (hereinafter referred to as the contractor). However, after some time, the customer noticed that the contractor fails to deliver the result on a regular basis, the software is of poor quality and the number of bugs increases each time.
The customer had already invested a sufficient amount of funds in the development of the software product, and the option of changing the contractor was highly undesirable. Taking this fact into account, it was decided to engage a team of consultants who were supposed to correct the situation and set up development processes for this software product on the side of the contractor. Dzmitry Harachka, founder of JazzTeam, participated in this international team as an Agile consultant.
The consultants faced a difficult task – it was necessary to find the bugs that created a bottleneck and which fixing would allow stabilizing the software.
The situation was also complicated by the peculiarities that are inherent in the world of Indian outsourcing. There were certain advantages for the customer in the form of workability and relative savings, but the consultants faced a serious challenge – a lack of confidence that the specialists understood their tasks correctly, lack of will (a specialist must not say “no” to the manager), caste hierarchy, unclear statuses, and problems with task formulating.
The process stabilization plan included the introduction of the following practices step by step:
First, the consultants created a road map for the project consisting of milestones and the scope of works to be completed by a certain date. Each milestone was a check point. As a result, it became clear to everyone what tasks should be solved in a given period of time.
Figure 1 – Road map
Implementation of pair programming
Pair programming is the process of writing the software code by two developers simultaneously. One developer directly solves the problem – writes the code in detail, and the other developer follows the process watching code creation from the side. At regular intervals (usually every 30 minutes – 1 hour) the programmers change roles.
The number of bugs began to decrease upon pair programming introduction. Due to the fact that two programmers began to work on a single problem simultaneously, they could discuss solutions on the fly, choose and apply the best ones, so the quality of the code began to improve. The consultants also joined the development by sharing their experience with Indian colleagues. Team coordination became easier.
Scrum / Kanban implementation
The consultants started to set up the task control process in accordance with Scrum and Kanban Agile methodologies. Scrum is a project management framework (primarily related to software development) that allows in rigidly fixed and short-term iterations called sprints to provide the customer with a working product (product increment) with new business opportunities of the highest importance. This allowed planning the development process in such a way that the highest priority tasks included in the product backlog should have been implemented during a specific sprint. It made it possible to have significant progress both in terms of software development and in terms of business development.
An important aspect of the entire consulting process was the introduction of mandatory stand-up meetings for the development team. A stand-up meeting is a daily meeting of the whole team. During the stand-up meeting each team member tells about his/her progress over the past working day, what difficulties he/she faced, what works are planned for the day (or next day). Stand-up meetings made it possible to quickly identify problems on the project, and the team was able to quickly solve these problems. Stand-up meetings are closely related to one of the most important artifacts of Scrum – a Scrum board. This is a convenient tool intended to visualize the software development process reflecting the stage of the development life cycle on which this or another task is.
Also, the consultants’ team introduced obligatory retrospectives – the process of discussing how the team coped during the sprint, what was done well, and what could be improved, i.e. how to improve the quality of work in the future.
The development team was trained and understood how to use Scrum and Kanban. The team members also highly appreciated Scrum and Kanban implementation in the software development process.
Figure 2 – Scrum and Kanban Implementation
So, the managers and the customer itself began to control project evolution and understand at what stage the development of the software product is.
Data Driven Testing implementation
At the next stage the team of consultants started to stabilize the work of the software product, build a full-fledged testing process and improve the code quality. The fact is that after adding new functionality the product started to work incorrectly. Finding bugs took a lot of time and did not always lead to success. Therefore, the following standard was introduced on the project – each developer should write Unit tests after writing their own part of the code. And later this allowed introducing the following approach to software automated testing – Data Driven Testing (DDT). With this approach the test can accept a set of input parameters and a reference result, or reference state, with which it shall compare the result obtained during the run of the input parameters. After making changes in the code, tests were run in automatic mode and the results were compared with the reference ones. This allowed narrowing the range of searching for bugs, thereby reducing time for manual testing. It became clear what changes (in what part of the software) caused specific bugs.
Figure 3 – Data Driven Testing Implementation
Thanks to this, it was possible to find and fix critical bugs, stabilize software product operation, then quickly detect emerging bugs in the application and eliminate them. You can find more information about Data Driven Testing in the article written by founder of JazzTeam containing examples of using the approach.
CI/CD implementation
Business dictated its terms and set the pace. It was necessary to build products, test and release them as quickly and often as possible. But the approach to do it all manually took a lot of time. The developers spent their time on tasks that were unusual for them.
It was decided to automate this process by introducing CI/CD (Continuous Integration, Continuous Delivery). Thanks to this, it was possible to set up automatic building, testing and release of the product, which made it possible to quickly identify bugs in the product due to more frequent minor updates. This allowed reducing development costs and minimizing risks of releasing a product with critical bugs.
You can get more information about CI/CD implementation and the use of Jenkins in the projects in our article.
Technologies that were introduced: JUnit, Maven, Jenkins, Spring, Scrum, Kanban, CI/CD.