October 1, 2018
TABLE OF CONTENTS
The featured company in this case study is a global retailer that provides printing services, branded merchandise, custom packaging, custom uniforms and apparel, and digital media services. In early 2003, the company launched a project to develop the first version of their software solution, a technology platform designed to help the company’s franchise owners create, manage, and distribute orders. The project took four and a half years to complete and, in the end, the resulting product exhibited significant functionality gaps and performance issues. The substantial costs the global retailer had already incurred to build the first version prohibited any major revisions for the foreseeable future, so the company continued to use it, making minor enhancements whenever possible.
In late 2014, the technology council for the global retailer met with the company’s board to call for change. Users had grown increasingly vocal about the need for software that could better keep pace with their needs, which had continued to evolve over the past seven years. They felt they lacked the support necessary to keep their own clients happy. Presented with this feedback, the global retailer decided to rebuild their platform from the ground up. They also decided to rethink how they would build it, and they were willing to revisit their software development approach in order to avoid making the same mistakes again.
The company drafted a completely new team to manage the development of a new version of their software and began work in early 2015. Soon after, they engaged Levvel to help them overcome the many challenges presented by the scale, complexity, and urgency of the work effort. Not only did Levvel deliver mission-critical modules as part of this engagement, they also introduced modern development best practices, including designing an effective DevOps pipeline. This enabled the global retailer team to implement a technology platform that could grow organically as their needs—and their customers’ needs—changed over time.
The global retailer faced two major challenges common to most software implementations: time and scale. They had big plans but were fighting the clock to quickly get users onto a platform that they could trust.
The primary users of the software platform are the company’s owners, whose function is similar to that of a franchise owner. These owners perform their day-to-day operational activities—selling, order creation, marketing, etc.—using the tools provided by the parent organization. The owners’ confidence in the company’s ability to provide them with a suitable technical solution had eroded over time, mostly due to the considerable time it took to build the first version, and the tool’s failure to adequately address their needs. The company desired to change this perception around their ability to deliver as quickly as possible.
Despite looming concerns around attrition, they still wanted to deliver a great user experience. They also wanted to create a process for incorporating user feedback more quickly into the platform. They had decided during planning to not only improve upon the existing functionality in the first version of the software, but to create brand new functionality not available anywhere else on the market. For example, the original version did not include integration with shipping partners, advanced marketing tools, or the functionality required for owners to interact directly with their vendors. The company eventually identified 11 modules for their target platform, including core modules, like order entry and quotes, and innovative modules, like marketing campaign management and vendor management.
The global retailer’s goal of launching the new version in beta in July of 2016 presented a significant logistical challenge, as it gave the team just 15 months of development time. The compressed timeline also introduced product and technology risks, as developers sometimes felt compelled to take coding shortcuts or to cut features in order to stay on schedule. Such tradeoffs, while understandable, would end up limiting the product’s capabilities and weakening the platform’s long-term maintainability and flexibility.
Like many modern consumers, the retailer’s users have regularly engaged with top-tier applications like Facebook and Amazon in their personal lives. As is often the case, these interactions influenced the users’ expectations for business applications, and they anticipated an entirely new and more intuitive user experience with the new release. These expectations had to be taken into account during development, from the requirements-gathering phase all the way through deployment and beyond. First and foremost, the company’s owners wanted an application that was easy to use, helped their businesses grow, and presented relevant data quickly. They also wanted access to the application from multiple devices.
The global retailer’s schedule for meeting these demands would stretch any organization. They hired multiple development partners to accelerate the timeline, with each partner taking on a different set of modules. This method of staffing mandated a waterfall approach to requirements gathering so that they could fully spec the features required for each module. In turn, this required that considerable time be set aside to validate that each module was fully integrated.
For the most part, the global retailer selected offshore development partners to stay within budget. However, managing multiple partners led to its own set of challenges, and the skill level exhibited by some of these partners did not foster much confidence in their ability to deliver a viable product on time. As a result, the global retailer decided to go in a different direction for their mission-critical modules.
The company realized that they needed to rethink their software development methodology from the ground up. They believed that certain modules—order entry, marketing campaigns, and quote management—required a higher level of support than is typically provided by offshore partners. The company wanted a partner with whom they could sit in person and walk through scenarios step by step, addressing finer details as they went along. They also wanted a partner who understood what can never be fully expressed in a requirements document, especially for a complex system with numerous options for essential activities: order entry, payment, marketing, billing, and integration.
The global retailer opted to work with an onshore development partner for these mission-critical modules, engaging Levvel in September 2015. Levvel immediately laid the groundwork for success by dedicating three days at the start of their engagement to a thorough review of the requirements. The retailer also reaped the benefits of Levvel’s understanding of modern development best practices, both in the server- and client-side application paradigms. These best practices included feature sprints, continuous integration configuration, unit testing, and modern tooling. Levvel created a .NET WebAPI application to function as a backend REST API, and an AngularJS single page application for the frontend. Both of these components required very different sets of skills and methodologies to create a cohesive, functioning platform that would allow the retailer to iterate on their ideas quickly over time.
In order to create the modules in the specified timeframe, the Levvel team quickly needed to remove any bottlenecks and iterate through the long list of features. To get the flexibility needed to accomplish this, they created an agile process within the overarching waterfall process established by the global retailer. In addition, Levvel needed to help the retailer modernize their frontend development practices in order to create a viable build process for the client-side application.
Levvel created a small team for each of the three modules, generally comprised of two frontend developers and two backend developers. One developer acted as the team lead but still wrote code to keep a pulse on the development team’s needs.
Almost immediately, Levvel designed and implemented a continuous integration (CI) process. CI allows each development team to quickly find points of failures in their unit tests, database migration scripts, or the deployment process itself. Allowing a team to quickly identify points of failure early on prevents them from wasting a lot of time later identifying specific code blocks that caused the failure. On average, the Levvel team tested their code six to eight times per day. Without an automated CI process, developers might not find bugs for days or even weeks. When a failure occurred, they could very quickly identify the point of failure and notify the responsible team.
The second large undertaking for the Levvel team was modernizing the AngularJS application in order to create a flexible code build process. Many developers understand how to create a build process for legacy and backend-only applications, but creating a build process for a single page application framework like AngularJS requires a different set of modern tools and best practices.
Such a large-scale initiative introduced not only technical challenges but overall project management hurdles as well. While these challenges are common, Levvel’s response was less so and made use of modern tools and processes.
For example, during the retailer’s project, Levvel used Trello, a real-time collaboration tool that organizes projects into kanban style boards, helping development teams to stay organized and track specific features during the development process. For each feature, Levvel partnered a frontend developer with a backend developer. However, because integration issues were arising, Levvel also introduced a process that required the partners to develop a code contract before beginning work on a new feature. Once both parties implemented the contract, they conducted a pair programming session to validate that both sets of code worked to complete the final feature.
Not only was Levvel proficient at working out internal problems, they were also effective in communicating to their clients, despite the developers’ working style. For the majority of their time on the global retailer’s project, the Levvel teams worked remotely. This required them to be extra diligent in maintaining synchronized, productive interaction with their retailer contacts. Fortunately, the distance did not hurt performance or relationships, and each side was able to progress through project stages in a collaborative and timely manner.
Although Levvel successfully resolved most of the issues that arose during development, there were challenges and risks that could not be fully mitigated due to timeline and budget constraints. The retailer’s system had to be configured according to a long set of very precise specifications—the requirements document alone contained over 100,000 detailed requirements for all three modules. In order to ensure full compliance, Levvel partnered with the retailer’s QA team to create new processes and knowledge-sharing routines that improved the validation process over time. As the QA and development teams became more familiar with each other’s strengths and weaknesses, the process improved rapidly and helped to mitigate the risk to the final product.
Throughout the process, Levvel discovered issues and discrepancies in the company’s requirements and in the implementation of features. These issues were found through iterative discussion directly with the global retailer, mainly through video chat or in-person meetings. This open communication between the retailer and their development partner was key to this project’s success.
Another important element to this project’s success was the mutual respect between the retailer and Levvel. In many cases, mutual respect leads to mutual understanding— and ultimately results in a better product for end users. The cost of having a partner one does not trust or respect is not easily quantified, but Levvel and the retailer both believe that the platform would not have been created as quickly or effectively with an offshore partner.
Another important element of this interaction was Levvel’s understanding of the retailer’s business model. Levvel was committed to obtaining a comprehensive knowledge of the retailer’s business needs, and treated those needs as their own. Together, the retailer and Levvel believe this understanding and their open and direct lines of communication resulted in an estimated three-month project acceleration and a savings of approximately $480,000.
From a technical perspective, the two components that accelerated development were the CI server and the front-end build system. Both of these components allowed the teams to iterate and develop features more quickly. The value of these components is also hard to quantify, but without them, Levvel believes the development would have taken one or two months longer, costing the retailer up to $320,000 more.
A major lesson learned by both parties is that integration with the platform’s other modules (outside the scope of Levvel’s involvement) should have been tested sooner with defined testing scripts or criteria. The QA process uncovered a number of issues that could have been avoided if there had been more communication amongst the various teams creating the disparate modules. A global coding standard would have also proven useful, given the abbreviated project timeline and the number of development teams working simultaneously on the platform. Such a standard would have kept the code consistent and allowed teams to work on various parts of the platform without having to learn a new style each time. The codebase is being refactored by Levvel and the global retailer over time to allow for the consistent standard of quality.
Creating a large-scale platform is always a challenge, but fighting against legacy technology and processes can exacerbate that challenge. Accomplishing this task required discipline and constant communication between Levvel and the global retailer. In addition, this project required flexibility in the waterfall process in order for the final product to adhere to the needs of the users, as well as exceed users’ expectations for product delivery.
The main lessons Levvel and the global retailer learned that can be shared are:
Levvel and the global retailer successfully completed a beta release of the new platform and will continue to iterate on their process, the features, and the success of the platform.