Our Focus: Plan - Deliver - Validate
Software development is difficult in ways that other types of engineering are not. Civil engineers build roadways designed to serve users driving cars within very narrowly defined parameters. Architects design buildings with a well-defined set of use and building codes. Software is often a domain unfettered by parameters constraining a user’s decision, and it is always a field in which human assumptions (which are often wrong) dictate strategic and tactical plans. Historically, a huge percentage of software projects fail completely, often because incorrect assumptions made in planning become immutably baked into the final project, or, put more plainly, project owners asked developers to build the wrong thing.
As a reaction to this, software project management has, since early this century, seen an explosion of management paradigms. While pre-2000 development often focused on monolithic statement-of-requirement-oriented waterfall project management, modern projects utilize techniques from eXtreme Programming (XP), Agile, Scrum, and Lean, to name a few.
Radial has applied our own experience developing software within some of these paradigms to develop our own process. We use techniques and processes found in Lean Entrepreneurship and Agile Project Management, allowing us to build within a culture that focuses on regular and predictable product delivery and improvement. Our clients, and indeed anyone asking for software development services, require effective software that is delivered, functional and valuable. Our process ensures this, even in circumstances of great uncertainty.
Radial’s process combines a short, just-in-time, last minute planning phase, leading to a short, highly-focused development effort producing and delivering valuable software to the client, followed by a thorough after-action review of challenges, discoveries, observations, and refinements. We repeat this process through the life of our engagement with clients, providing value with impactful, regular software delivery.
A fundamental tenet of Lean Software Development is to make development decisions as late in the development process as is possible. This enables the collection of as much data and input regarding the decision as possible, encouraging decisions based on data rather than assumption. Joined with this, Lean expects delivery of software as rapidly as possible following decisions.
At Radial, we use a process by which we analyze software features on a matrix of difficulty compared to relative value to the end user. We encourage our clients to prioritize work by maximizing value and minimizing required work, maintaining a running list of project goals. From this list, our clients work with developers to break work into two-week development efforts, or “sprints,” during which the developers commit to delivering crucial features. We call this process of planning, ranking difficulty, and maintaining the priority of the overall list, “grooming.”
During our two-week sprints, our developers build software utilizing a process called Test-Driven Development (TDD), a technique designed to ensure that our software can be qualitatively measured as meeting requirements, and which results, when utilized properly, in robust protection from a large class of bugs - unintended effects of the interaction of disparate elements of software.
At Radial, we utilize collaborative techniques throughout the development cycle. We use architecture planning and design discussions to improve the foundation of what we’re doing. Developers work in pairs to make decisions on a tactical level that improve the efficiency an maintainability of the product. To the outside observer, this may appear to duplicate work. The result, however, is actually an overall higher rate of delivery because thoughtful design and review reduce errors and wasted time. Our goal is to go slow - or carefully - in order to go fast. This also leads to a dramatic reduction of “code debt,” or circumstances wherein engineering decisions made in the past create roadblocks to future development.
Following development of each client line items, our developers deliver their code, which goes through a comprehensive process of peer review, prior to being made available to our clients. During code review, we ask another engineer to closely examine the code for conformance to project standards (parallel to something like AP Style), and engineering best practices. This ensures that a single developer is unable to inject mistakes into a project and that multiple members of the team have an understanding of each bit of code being delivered to clients.
After we deliver our work to our clients, we think it’s important to take a step back and to have a team conversation about the work we just did, while the work is fresh in our minds, so we always perform an open and frank meeting, called a “retrospective.”
In a retrospective, we talk about the successes our developers had and the challenges they faced. We talk about mistakes made - sometimes in terms of misunderstanding difficulty and sometimes in terms of technical decision-making. We engage our client to learn about their feelings about the work we have done, and the learning they have done about both the software we have just delivered and the work that we have delivered previously.
The retrospective process is derived from the Lean manufacturing techniques known as poka-yoke (error proofing), and total protective maintenance, which require that part of our process is necessarily working to remove errors and make our own development process more effective. By looking at our own immediate successes and failures forces that we improve our process continuously.
After planning our work, delivering our work, and reviewing our work, all within a two-week sprint, designed to deliver value to our clients, we rest. Typically for a weekend. And then, we do it again.
At Radial, our clients expect a constantly improving and evolving product, delivered at regular intervals (twice a month, e.g.), through a process that improves over time. Ultimately, this is what we deliver to our clients: both their product and a process for making that product better.