Product Lifecycle Requirements

As projects begin, develop, and mature, they eventually blossom into full-fledged products. Along the way, there are several important steps to take that help ensure the product turns out solid. Too frequently ignored, however, is the follow-through once the product has matured. Continuing to manage the lifecycle of a product, even once it’s “done”, is just as important to its quality, and often the quality-of-life of your team as well.

Table of Contents

Looking for the TL;DR? Here are some shortcuts to common reference sections:

Full Table of Contents:

Lifecycle != SDLC

While this document deals with the lifecycle of products at ATLAS, it is not a replacement for an understanding of Systems/Software Development Lifecycle (SDLC) approaches. It also does not prescribe an approach. Instead, it addresses how the company in particular develops and maintains its products. These requirements should be applicable to any SDLC process.

This distinction is made because SDLC is a loaded term. Sometimes it can refer generically to any lifecycle approach, but often it refers to a very particular process that heavily promotes waterfall development. ATLAS is not a waterfall shop, and many aspects of the colloquial SDLC methodology don’t fit well. As a result, the term “SDLC” will be avoided from here.

What is a Product?

It’s easy to look at the front-end applications, which receive all the marketing and sales focus, and call those the products. From a business and sales perspective, that’s probably true. Those are the products of the company. Engineering, however, has many more products than just those SKUs.

This document uses the term product frequently and loosely, but what is a product? Within the context of these requirements, basically everything is a product. They apply to all efforts. While the “productness” of some sub-modules or parts of larger applications might be debatable, assume that these requirements apply when in doubt.

The Structure of this Document

These requirements are broken into three major categories that encapsulate most of a product’s lifecycle. The first section is about the operation of the product, specifically around managing the initial effort, ongoing development, and its relationship with its users throughout. The second section details matters of responsibility, accountability, and ownership of the product as it relates to the support and maintenance from both a business and technical level. Finally, the last section covers the growth, innovation, and upkeep of products–how they’re kept from stagnation and how technical debt is paid off.

Reading the Requirements

When interpreting the verbiage of the requirements, know that it was inspired by RFC 2119. As a quick reference, requirements using must, shall, must not, and shall not are absolute. Should, should not, recommended, and not recommended are strongly encouraged but there may exist valid reasons to avoid them. May, may not, and optional are optional, but acknowledged as part of the problem space.

In all cases, the letter of the item is less important than the spirit. Reach out to team leadership if there are questions around interpretation. Similarly, no matter how absolute the requirement in this document, nothing overrides the fact that business must continue to operate. These requirements are a tool to assist in cooperation and ongoing value-creation for our customers; they are not a book with which to beat others.

Versioning and Operation Lifecycle

The versioning and operational requirements laid down in this document are bisected into the categories of versioned products and rolling products. Neither of them necessarily reflect anything about the development or release methodology of the product itself, though obviously some practices tend in one direction or the other. Instead, the focus is on the two different sets of expectations that consumers of the products harbor. The requirements are guided by these expectations, and differ as a result.

ATLAS uses a versioned approach most often for technical modules like code libraries, containers, and (rarely) some APIs. These are strongly versioned to provide a contract to their consumers. The contract serves as an interface guarantee; a statement that the product at version a.b.c does exactly what it does the same way every time, while version x.y.z may behave differently.

On the other hand, ATLAS usually relies on a rolling approach for its front-end, customer-facing software. Here, the contract between developer and consumer is much softer. It’s implied that in exchange for a live, hassle-free stream of updates, users receive new versions automatically and regularly–usually without their explicit consent or action. These products still have versions, of course, but the version is not part of that developer/consumer contract. Instead, there is an understanding that the developers will do their due diligence to ensure smooth transitions between releases, since users cannot opt out.

There are certainly crossovers between these domains. However, the important part is keeping in mind the consumer’s expectations. One must design these into the product, as they will heavily affect its lifecycle.

Public Version vs. Internal Version

It’s important to note that there is a clear distinction between the consumer-facing (“public”) version number of a product and its internal version as the development team knows it. No matter the approach, the internal version of a product must always uniquely represent a specific build of it–or, more accurately, a reproducible point-in-time instance of it. The public version of the product may be the same as the internal version, but rarely will. The requirements in this document almost exclusively cover public versions.

The public version number of the product is representative of its feature set rather than any given point-in-time instance. Rolling products must not have a prominent public version number. As discussed in later sections, the public version number is tied to a particular release rather than a build instance, and always requires a developer’s hand to maintain the contract implied by the version number. For example, if a product follows Semantic Versioning, there is meaning behind each part of the version number that must be upheld.

There’s another version indicator that can exist as well: a marketing version number. Using Windows as an example, Windows 10 is not (internally or externally) version 10.x.y.z of the OS software. The 10 is just part of the marketing. These indicators are of little concern to the development team, though there are a few considerations.

Choosing Versioned or Rolling

When starting a new project, choosing the operational lifecycle strategy is key to developing and maintaining it successfully. Making this decision can be challenging, but there are a few guidelines to help.

Versioned:

Some products are inherently versioned. Code libraries are a prime example. Organizations occasionally hybridize the two approaches–for example, automatically releasing nightly “unstable” versions or only making the latest version available–but the product is still consumed at a specific version. The consumer usually still has to seek out and upgrade versions themselves, and in those scenarios most consumers are encouraged to wait for full releases. Even versioned products with auto-updaters are still versioned.

Rolling:

Most SaaS products (including web applications) use a rolling model. Even their APIs are rolling, though often they’re hybridized. In the common hybrid model, the consumer declares a version in their request to specify the desired functionality and compatibility. However, they’re still forced to use the current interface; the version request is a function of the software rather than a fundamental part of the contract. It’s an inversion of control; the user must ask to be allowed to tap into compatibility with old versions, rather than the user driving which version is used and the developer trying to shepherd them forward.

Versioned Products

During Design

During Initial Development

Upon Initial Release

Subsequent Versions

Discontinuing a Product

There is currently no set of requirements or guidelines for discontinuing a product. A process will need to be established before requirements can be created.

Rolling Products

These are often called “live” or “service” products, and they represent a vast majority of the software consumers use today.

During Design

During Initial Development

Upon Initial Release

Subsequent Versions

Discontinuing a Product

There is currently no set of requirements or guidelines for discontinuing a product. A process will need to be established before requirements can be created.

Responsibility, Accountability, and Ownership

A product’s lifecycle is about more than versioning new features and managing consumer expectations. The product must also be continually supported and maintained. It is not acceptable to have products that are unattended. Having a clear and complete understanding of who owns a product’s lifecycle and what that ownership entails is critical to its continued success.

Responsibility vs. Accountability
It is important to differentiate between responsibility and accountability. The responsible party is the one tasked with the duty. The accountable party is the one held liable for the results. The two can be the same but aren’t necessarily so.

Maintenance and Support Checklist

This section provides an easy checklist of maintenance and support questions that must be answered for every product. The answers to these questions must always be available in product documentation during all stages of its lifecycle. They help ensure everyone is aware of which team is responsible for the ongoing support and who is accountable for the product’s continued success. The responsible and accountable party can shift over time, but it must always be clearly defined.

Note that the separate pieces/services which make up a product may have separate answers to these questions. For example, a website product with a backing database might have one team monitoring the health of the site and another monitoring the health of the database. This is disadvantageous, but until a DevOps methodology is fully embraced, is sometimes required. Be sure that the separation is clearly denoted in documentation.

The Importance of Documentation

The original development team of a product will not always be its shepherds. Even if the product doesn’t change hands directly, the team itself will change over time. The only way to preserve the decisions made about the product–whether during initial design, original development, or as part of on-going growth–is to document them.

Product Growth

All products that are to be supported for any significant amount of time must continue to grow. We cannot allow products to stagnate or rot, even those products which are “finished”. This section discusses how products should continue to innovate and evolve over time, even if they are already providing stable business value.

The Importance of Innovation

Warning
This section covers philosophy and approach rather than direct requirements. It is still very important; it provides context to the requirements that come in the next section.

Here’s a very curt statement:

A stagnant product leaves money on the table.

It may be blunt, but it’s a core philosophy of successful software companies. If you have a product you’re still supporting/selling/distributing, letting it languish is robbing the company of potential value. It may not be literal dollars, but there are many factors contributing to “value” which can be represented either directly or indirectly by money.

Like all things, software is subject to entropy. A new product is fresh and exciting, even something as simple as a development library. There is inherent momentum behind a new release. As that momentum dies down, however, users become bored and disinterested. This is one reason why you often see products like Facebook make large changes to user experience even though the existing one worked “just fine”–change keeps the momentum going. It keeps users engaged and gives you the opportunity to introduce new features and functionality which might lead to greater value.

It’s reasonable to react to this philosophy with some negativity. “Why make changes to a product which is bringing value and risk bringing less value?” There is some validity to this reaction, certainly. Not all markets react the same way to stagnant products. However, a stagnant product’s value often has a peculiar curve, as demonstrated by this rough graph.

Product Value centered

Post-release, the product’s value skyrockets to its peak after a warm-up period. From there, without any further releases, the value holds briefly before beginning to taper off. Eventually, the value will near zero. Obviously, this is not hard data based on any particular case study; it’s an abstraction of the philosophy. Most products will deviate from this on the micro level, but at the macro level, experience holds this to be accurate more often than not.

On the other hand, here’s the product’s value with additional releases that bring new functionality, a refreshed user experience, or even (less sustainably) important bug fixes.

Product Value with Releases centered

Again, these graphs are not hard data, but this approach has been proven time and again by various companies. Innovation is its own value, and often holds the key to unlocking the long-term potential of the product.

The Importance of Evolution

A central part of product ownership is being committed to its technical advancement and upkeep. Innovation is very important, but tacking new features onto a product without keeping the underlying infrastructure and technology up-to-date is like adding rooms onto your house when the foundation is cracking. You might be successful at first, but without addressing the underlying issue, the house is doomed. The importance of evolution is to not just patch up the foundation as it starts to fall apart, but to proactively improve and enhance it so that you can more easily innovate.

Perhaps a more familiar metaphor is technical debt. Through sheer entropy, code left unimproved for long periods of time will accrue debt. Quick fixes and hasty bolt-ons will act as loans, creating more debt. Eventually, if you don’t pay it down, it will begin to compound on itself until the burden of it is too much to repay. Often, you’re left with what seems like only a single option: technical bankruptcy.

Cycle of Technical Bankruptcy centered

To help ensure our products don’t fall into this cycle, there are a few basic requirements. These apply to both product owners and to product teams. Some are common sense, while others may seem a little extreme. Just remember that one of the primary ways Engineering can help the business grow is through innovation, and that innovation is much cheaper and easier when the foundation stays strong.

Evolution Requirements

Advancing and upkeeping a product comes in various forms. Redesign, re-architecture, and refactoring are the most common varieties of evolution. These are technical challenges to be overcome. However, product owners and stakeholders have responsibilities here as well: reevaluation (of business value and direction) and revision (of product roadmap). You may have heard it said that refactoring isn’t worthwhile, and therefore assume none of these efforts are beneficial. This is 100% false. These efforts can be incredibly lucrative, so long as they are focused on bringing additional value to the business. In other words, refactoring for the sake of it has no value; refactoring to pay off technical debt or increase speed to ROI is incredibly worthy.

These are the requirements of all products:

Summary

Hopefully, the requirements here are self-explanatory and self-evident. Most of the time, they come naturally from approaching a project in good faith. Either way, following them will help us ensure that we not only produce the best possible software, but also continue to keep it well-maintained and innovative well into the future.

If you have any questions about items in this document, please reach out to a lead or to the Architecture team.