The last article in our series concluded with a question: What if we’re not building software, but instead, we’re simply documenting it? Documentation in software development is far from a new concept. A static mentality has burdened our industry, persisting since the early 1980s methodologies like the Structured Systems Analysis and Design Method (SSADM) that treated documents as first-class, one-off deliverables. Documentation had its crescendo in the late 1990s with The Rational Unified Process and then its pivotal day of reckoning with the publishing of The Agile Manifesto in the early 2000s. The Agile Manifesto made some so happy to dump documentation that many claimed Agile was “that methodology where you don’t have to do documentation.” Unfortunately, this misinterpretation of the situation introduced a critical inefficiency we’ll call the “Documentation Gap”—where documents like user stories and design specifications quickly fall out of sync with a rapidly evolving system.
This disconnect leads to costly rework and an unreliable knowledge base that slows teams down instead of accelerating them. AI has made clear, the documentation problem never really went away, because the information problem never really went away. Software development is, in essence, an act of documentation. We aren’t just writing code; we are creating a constantly evolving body of knowledge that defines, supports, and operates the system. The real work isn’t churning out documents; it’s a team’s continuous effort to ensure that the underlying information is clear and connected to efficiently and continuously manifest the right solution. A new perspective is a strategic shift: from creating static artifacts to building living instructions. This is how we address the “Documentation Gap” and, in the process, unlock the full potential of AI-augmented development.
The Documentation Gap: Why Our Systems Are Inefficient
The critical mismatch lies between the dynamic, ever-changing nature of software and our outdated documentation practices. A user story can change in a single sprint, but the corresponding design documents, test plans, and API references often do not. The inevitable result is an ecosystem of disconnected documentation that creates friction at every turn and this friction comes at a high cost.
The primary expense is rework. When a developer builds to an outdated design document, or a tester writes a test for a feature that has already evolved, the organization is paying twice for the same work. Over time, these small inconsistencies compound into a knowledge base so fractured and unreliable that it contributes to the “maintenance sinkhole“ we spoke of in Part 1. Instead of accelerating delivery, the documentation becomes a liability, actively slowing the team down and eroding trust in the process itself.
This leads us to a crucial paradox. We know that clarity and shared knowledge are essential for a high-performing team. Yet, the more effort we put into a traditional, manual approach to documentation, the less valuable it becomes. A document that takes a week to update is a week-old document—and in a dynamic cycle, a week-old document is already out of date again. The very act of creating and maintaining these static artifacts, which are meant to bring clarity, ensures they will eventually be ignored.
Modern Approaches to Software Documentation
In response to the pain and cost of the documentation gap, the software industry has developed a number of incremental solutions. While valuable, these approaches tend to solve a specific symptom rather than addressing the core problem of a static documentation mentality.
- Proximity Solutions: These approaches move documentation from a separate documentation repository into the same repository as the source code. The core idea is that if the documentation is close to the code, it will be easier for engineers to maintain it.
- Benefit: Developers can use familiar tools and version control systems.
- Limitation: This still treats documentation as a separate, static artifact. It is a process solution, not a fundamental change to how information is structured, and is also largely inaccessible by anyone other than a developer.
- Executable Solutions: These approaches use a shared, semi-formal language (e.g. BDD’s “Given/When/Then”) to define system behavior. The documentation is an executable part of the system, and tests can be generated directly from it, or are defined explicitly by it.
- Benefit: The documentation becomes a living part of the system, and tests can be generated directly from it.
- Limitation: These approaches are primarily focused on system behavior and are not comprehensive solutions for all forms of project information.
- Automated Solutions: These approaches use tools that can automatically generate documentation from source code comments or definitions. Similarly, tools like linters can automatically enforce code style guides and maintain code consistency.
- Benefit: These tools solve the synchronization problem for a specific type of documentation, ensuring it is always consistent and up to date.
- Limitation: This only works for a very specific type of documentation. It is not an end-to-end solution for all project artifacts, doing nothing to solve the friction between user stories, test plans, and design documents.
While these are all valuable steps forward, and solve real problems, they don’t address the fundamental issue of the static mentality of documentation. To truly unlock the information system’s potential, we must look beyond these incremental fixes.
From Documentation to Instruction: A New Perspective
We must adopt a new paradigm and re-examine all of our work outputs—from the first conversation to the final line of code—not as static artifacts, but as living instructions for the system.
Every output is an instruction set with a clear purpose:
- Requirements as Instructions: A user story isn’t just a placeholder on a backlog; it’s the first instruction. It tells the team what to build and, most importantly, why it has value to the user.
- Tests as Instructions: A test case is more than a verification step; it is a set of instructions that defines the problem to be solved and asserts the negation of that problem by the system under test.
- Design as Instructions: A design document or a wireframe isn’t merely a drawing; it’s a set of instructions for the system’s architecture and user experience, telling the team how to lay out its foundational “bones” of the system’s skeleton.
- Code as Instructions: The code itself is a definitive form of documentation. Every line is an instruction set that the computer follows to operate the system.
- Deployments as Instructions: The process for deploying an application—from a simple script to a complex CI/CD pipeline—is a powerful set of instructions for how the system is delivered to run in a production environment.
From Artifacts to Information
We’ve established that all of our work outputs—from the first conversation to the final line of code—are forms of living instructions. But the central challenge remains: how do we manage this ever-growing, interconnected body of information? The ultimate inefficiency is not a lack of documentation, but the lack of a single, coherent source of truth.
The next step in our evolution isn’t just about creating more documents. It’s about moving From Artifacts to Information, where we treat all of our instructions as a single, interconnected body of living knowledge. This new paradigm—a canonical model that transforms our disconnected outputs into a cohesive, centralized source of truth—is the key to unlocking the true potential of AI-augmented development.
What if we could create a system where all of our instructions—from requirements to deployments—are dynamically linked, providing a real-time, unified view of the system? The next article in our series will explore how to make this a reality.

