Skip to content

Book Introduction

Chapter Info

Calculating... Writing Progress: 90%

!!Software development was never about writing code. It's about making decisions under uncertainty — balancing short-term pressure with long-term evolution, navigating a landscape where technology, business constraints, and human factors collide. Most of these decisions have no right answer. They have trade-offs. This book is about those trade-offs — and the principles that help you navigate them.!!

Book Introduction

Foundational Concepts

Why Building Software Is Tough

!!Software development is inherently complex. It combines abstract problem-solving with technical systems that must work together across many layers.!! Software must handle countless situations, edge cases, and failures. Developers manage interactions between components, concurrency, distributed state, and asynchronous events while ensuring reliability and security. They turn unclear business needs into precise instructions, anticipate user behavior, and collaborate across teams. Meanwhile, technology evolves, legacy code must keep working, and technical debt grows. These challenges don’t just add up — they multiply. !!Complexity is not a phase software passes through; it is the medium it lives in.!!

Why Building Software Is Tough

Fred Brooks

No Silver Bullet: Essence and Accidents of Software Engineering (1986).

Software Exists to Create Value

!!Software is not an end in itself. It exists to solve real problems, meet human needs, and make things possible that were previously difficult or impossible.!! Its value does not come from the amount of code written, the sophistication of its architecture, or the technologies it uses, but from the difference it makes in the real world. What matters is not the software itself, but what people can achieve with it.

Software Exists to Create Value

The People Behind Software

!!Building software requires people with complementary responsibilities. Product defines what to build and why, developers turn requirements into working systems, platform teams provide shared foundations, DevOps enables fast and reliable delivery, architects guide structural decisions, and security teams protect systems and users.!! These responsibilities often overlap, but each brings an essential perspective. Building software is a collective effort that goes far beyond writing code.

The People Behind Software

In Practice, Boundaries Blur

Roles provide useful boundaries, but real teams rarely stay inside them. Developers make architectural and operational decisions, architects write code, and product managers make technical calls. This overlap is necessary: ambiguity and changing needs require people to cross boundaries. !!The best systems are built by teams that share context and responsibility, not by specialists working in silos.!!

In Practice, Boundaries Blur

Nothing New Under the Architectural Sun

!!There is nothing new under the architectural sun.!! The shift from monoliths to microservices, or from on-premises to the cloud, often replaces old problems with new versions of the same challenges. Internal coupling becomes network coupling; centralized failures become distributed ones. The pattern repeats with LLMs and protocols like MCP: connecting models to tools raises familiar questions about contracts, permissions, and observability, with the added uncertainty of probabilistic behavior. !!Technologies change, but the architectural challenge remains: build systems that adapt, scale, fail safely, and stay understandable.!!

Nothing New Under the Architectural Sun

Back to Basics: Why Core Principles Matter

!!Fundamental principles are the foundations of software design. Like the foundations of a building, they provide a stable base for everything built above them.!! They help engineers reason about unfamiliar situations, evaluate trade-offs, and make decisions without relying on a particular framework or technology. A strong foundation does not prescribe every detail of a system; it gives us something reliable to build on, even when the structure above it changes.

Back to Basics: Why Core Principles Matter

It All Comes Down to Money

!!The first principle of software development is: "everything is business, and everything is money".!! Software is not built for its own sake — it's created to serve goals, generate value, cut costs, or gain a competitive edge. This shapes every decision: what gets built, when, and how much quality is acceptable. Revenue-generating features often come before refactoring, testing, or long-term maintainability — not from negligence, but from trade-off management under financial constraints. Engineers who understand this stop arguing for clean code on principle and start arguing for it as a financial decision — and that is the argument the business actually hears.

It All Comes Down to Money

Software Development Is a Human Science

!!Many believe software development is an exact science — but in reality, it's deeply human.!! Software failures rarely come from code alone. Behind every bug, outage, or architectural compromise, there is a human decision: a misunderstood requirement, an unclear responsibility, a rushed trade-off, or a missing conversation. Technology evolves fast, but human nature changes slowly. !!Ambiguity, pressure, incentives, ego, trust, motivation, and communication shape architecture as much as frameworks or programming languages.!!

Software Development Is a Human Science

Related chapter

Design by Humans explores the psychology, biases, and organizational dynamics behind software decisions.

Tom DeMarco and Tim Lister

Peopleware: Productive Projects and Teams (1987).

Better Decisions, Not Perfect Ones

!!This book is about learning to make better software decisions: not perfect decisions, but conscious ones.!! Decisions that balance speed and quality, autonomy and control, simplicity and flexibility, innovation and stability. The goal is not to eliminate trade-offs. The goal is to understand them before they decide for you.

Better Decisions, Not Perfect Ones

Software Architecture and Design

Software Architecture Is About Decisions

!!Software architecture is not about drawing diagrams or choosing frameworks. It's about the decisions you make — and more importantly, the decisions you avoid making too early.!! Every choice about structure, boundaries, dependencies, and failure handling compounds over time. Good architecture preserves options: it keeps doors open for change while closing off paths that lead to chaos. Bad architecture locks you in: it forces every new feature into a shape that no longer fits. The defining characteristic of architecture is not what it looks like on day one — it's what it allows you to do on day 500.

Software Architecture Is About Decisions

Related chapter

Design by Principles explores the mindset and practices that guide these decisions, and Design by Structural Principles turns them into concrete structural rules.

Design for Success

!!Design for Success is the practice of building software that consistently delivers its intended outcome — not only when everything goes as expected, but also when components fail, conditions change, or unexpected situations occur!!. This means designing two paths at once: the happy path, where the system delivers value as expected, and the failure path, where assumptions break, dependencies disappear, traffic surges, data is wrong, or people make mistakes. The failure path is not separate from success; it is part of what makes success possible. A system is truly designed for success only when it is also designed for failure.

Design for Success

Related chapter

Design for Resiliency covers how systems absorb, contain, and recover from failure.

Architecture Is Shaped by Requirements

!!Requirements are not a list to be checked off — they are the forces that shape the system. Functional requirements define what it must do; non-functional requirements define what it must endure.!! Architecture is the response to those forces. Misread them, and the architecture answers the wrong question — no matter how elegant the design.

Architecture Is Shaped by Requirements

Architectural Characteristics: The Qualities That Define a System

!!Beyond what a system does, architecture defines how well it does it. These qualities — called architectural characteristics — are the non-functional dimensions that shape every technical decision!!: scalability, resilience, security, performance, availability, testability, and visibility. Improving one often degrades another. A system optimized for performance may sacrifice simplicity. A system designed for maximum security may slow delivery. The architect's job is not to maximize all of them — it's to know which ones matter most for the context and to accept the consequences of that choice.

Architectural Characteristics: The Qualities That Define a System

Chapters in this book

Explore the related chapters: Simplicity, Security, Visibility, Resiliency, Scalability, Testability, Availability, and Performance.

You Can't Have It All

It is impossible to satisfy all requirements perfectly. Many requirements are contradictory — high performance vs high security, fast delivery vs thorough testing, flexibility vs simplicity. Others demand enormous effort for marginal gain: going from 99.9% to 99.999% uptime can cost 10x more resources. !!Architecture is not the art of optimizing everything — it's the art of choosing what matters most for the context at hand, accepting that some things will be good enough, and knowing what you're willing to sacrifice.!! The question is never "can we have it all?" The question is: "what are we willing to give up?"

You Can't Have It All

When Every Stakeholder Wants Something Different

Every stakeholder optimizes for something different. Developers push for maintainability; business leaders push for time-to-market; architects think long-term; DevOps watches reliability; project managers watch timelines. Each is right from where they sit — and each is incomplete on its own. !!The architect's job is not to side with one view but to make the trade-offs visible so the choice is conscious instead of accidental.!!

When Every Stakeholder Wants Something Different

Architectural Styles: Proven Patterns That Guide Implementation

An architectural style is a proven pattern with a known set of trade-offs. Microservices buy scalability and independent deployment with operational complexity. Layered architecture buys simplicity with rigidity. Event-driven systems buy resilience and decoupling with debugging pain. There is no neutral style — every choice is a bargain. The right one isn't the most popular; it's the one whose strengths match your critical requirements and whose costs you can afford to pay.

Architectural Styles: Proven Patterns That Guide Implementation

External Material

Architecture Styles Worksheet by Mark Richards. More resources: Developer to Architect.

Modern Cloud Infrastructure

!!Modern cloud infrastructure represents a paradigm shift in how we architect and deploy systems.!! Infrastructure as Code treats configurations as version-controlled artifacts. Containerization and Kubernetes orchestrate workloads across auto-scaling clusters. Security follows zero-trust models with identity-based access and encryption by default. Observability platforms provide insights through distributed tracing and unified logging.!! Understanding cloud-native design is no longer optional — it is the foundation on which modern systems are built.!!

Modern Cloud Infrastructure

Related chapter

Design for the Cloud explores these concepts in depth.

The Cost of Late Changes

!!A change made during design costs one unit of effort. The same change made during development costs ten. Made after release, it costs a hundred.!! Made after the system has been running for years and shapes other systems around it, it can cost a thousand — sometimes the system is rewritten instead. This exponential curve is why architecture matters: the decisions you make on day one set the price of every change that follows. !!Good architecture is not the one that solves today's problem — it is the one that keeps tomorrow's changes affordable.!!

The Cost of Late Changes

Barry Boehm

Software Engineering Economics (1981). The 1× / 10× / 100× ratios are a heuristic, not a universal law; the central idea is that delayed changes usually cost more.

The Best Code Is the Code You Don't Write

!!Every line of code is a liability. It must be read, understood, tested, secured, deployed, monitored, debugged, refactored, and eventually replaced!!. The cheapest, most reliable, most secure code is the code that does not exist. Before writing a function, ask whether the feature is truly needed. Before adding a dependency, ask whether the standard library suffices. Before designing an abstraction, ask whether duplication is actually a problem. !!The best engineers are not those who produce the most code — they are those who solve the most with the least.!!

The Best Code Is the Code You Don't Write

Related chapter

Design for Simplicity explains how reducing unnecessary complexity keeps systems easier to build and evolve.

Jeff Atwood

“The best code is no code at all.” — The Best Code is No Code at All (Coding Horror, 2007).

The AI Era

!!The LLM revolution is fundamentally changing how we build software, who builds it, and what gets built.!! This section frames the shift that runs as an undercurrent through every chapter of this book.

Engineering in the Age of AI

!!The question is not whether AI will transform software development — it already has. The question is where human judgment remains essential.!! Every chapter in this book asks the same sub-question: what part of this discipline does AI absorb, and what part does it expose? The answer is rarely "all of it" and rarely "none of it" — and learning to tell the difference is now part of the job.

Engineering in the Age of AI

Related chapter

Design by AI confronts this directly — from the end of traditional interfaces to the redefinition of the developer role itself.

From Code to Intent

For seventy years, programming meant describing how a computer should solve a problem — every loop, every condition, every variable, written by hand. With LLMs, the abstraction shifts: engineers describe what they want, and the model produces the how. This is the deepest change of the AI era, deeper than any framework shift before it. !!The skill that matters is no longer fluency in a language — it is the ability to express intent precisely, to specify constraints clearly, to reason about edge cases the model would miss.!! Code becomes an artifact, like compiled assembly: still important, but no longer where the thinking happens.

From Code to Intent

The Golden Age of Engineers Starts Now

AI is rewriting the role: from writing every line of code to shaping intent, supervising agents, and orchestrating systems. The transition will be disruptive — large companies are restructuring, and some engineering roles will shrink or change as AI absorbs more of the work. That part deserves to be said plainly. But the same forces compressing headcount are unleashing something bigger on the other side. !!As the cost of building software collapses, it reaches industries, markets, and small companies it never reached before — and every one of them needs engineers.!! For those who lean in and adapt, this is not the twilight of the profession. It is the golden age, just beginning.

The Golden Age of Engineers Starts Now

Cheaper Code Doesn’t Mean Cheaper Software

AI is making code dramatically cheaper to produce. But when everyone can build faster, faster becomes the baseline: competitors ship more, expectations rise, and companies must produce, test, secure, and operate far more software. !!The cost of each unit of software falls, but the demand for software grows even faster.!! AI may not reduce software budgets — it may shift them from human coding time toward more software, compute, agents, and tokens.

Cheaper Code Doesn’t Mean Cheaper Software

Principles Outlast Technology

AI changes who writes the code, how fast it gets written, and what the developer's day looks like. It does not change the principles. Keep It Simple is still Keep It Simple — whether the code is typed by a human or generated by an agent. A poorly designed system does not become scalable because an LLM produced it. A fragile architecture does not become resilient because the prompt was elegant. Coupling, complexity, security boundaries, blast radius, observability, trade-offs — none of these are softened by AI. They are amplified, because AI lets us build faster and bigger, which means bad principles compound faster too. !!Frameworks, languages, platforms, and now models will keep cycling. The principles in this book are the part that does not move.!!

Principles Outlast Technology

Context Has Always Been Everything

Context has always been everything. A decision is only as good as the context that produced it. Humans decide from where they sit — budget, team, legacy, regulation, market — which is why the same architectural choice can be brilliant in a startup and reckless in a bank. AI did not invent this truth; it exposed it. An LLM's output is determined by the context fed into it: the prompt, the files, the examples, the tools, and the conversation history. Same mechanism, different labels. !!Building software well, before and after AI, is the discipline of constructing the right context before committing to a decision.!!

Context Has Always Been Everything

Skepticism Is the New Engineering Skill

!!In the age of AI, skepticism is becoming one of the most essential engineering skills. When agents can generate code, propose architectures, and solve problems in seconds, the challenge is no longer just producing solutions, but evaluating them.!! An answer may sound perfectly convincing while relying on assumptions that do not reflect reality. A solution that works well in one context may be completely inappropriate in another. Engineers must question assumptions, challenge results, and verify that proposed solutions actually fit the problem they are trying to solve.

Skepticism Is the New Engineering Skill

Source

Adapted from a presentation by Ian Varley, Principal Architect at Salesforce.

Two Visions of AI Engineering

Engineers and companies often imagine a different destination for AI. Engineers see AI as a powerful collaborator: they remain in the loop, shaping intent, reviewing decisions, testing results, and supervising agents. Companies see the possibility of going further — agents that build, test, secure, and deploy, coordinated by other agents, with humans stepping in only when judgment is required. !!One vision puts AI around the engineer; the other gradually removes the engineer from the loop.!! Where we end up will depend less on what either side wants than on what autonomous agents can reliably deliver.

Two Visions of AI Engineering

Scalable Organization

!!How an organization structures its teams and domains is one of the most consequential decisions it makes.!! The goal is always the same: running without friction, scaling as the company grows, staying efficient at every size, and evolving when the ground shifts. What makes it hard is that the answer never holds still. !!Team structure is shaped by the complexity of the technology available, and by how accessible that technology is — what the platform makes possible, what tooling automates, what AI now puts within reach of a single engineer.!!

Scalable Organization

The Org Chart Writes the Code

Team structure is not a side topic in software design — it is software design. !!Conway's Law states it plainly: organizations produce systems that mirror their own communication structure.!! Siloed teams produce fragmented architectures. Collaborating teams produce coherent ones. This means the org chart is an architectural artifact, and how teams are organized scales — or fails to scale — exactly like the systems they build.

The Org Chart Writes the Code

Related chapter

Design by Humans examines how organizational structures and incentives shape software systems.

Melvin Conway

How Do Committees Invent? (Datamation, 1968).

From Silos to Cross-Functional Teams

For decades, many software organizations were structured around functional silos — QA, developers, DevOps, security, and architects each in their own team. The model was orderly on paper but slow in practice: every change crossed handoffs, every specialist became a bottleneck, and ownership dissolved between teams. The cross-functional model answered this directly. One team, all skills, full lifecycle — from design to on-call. Concerns are addressed in real time, inside the team, without waiting for external groups. !!The result is fewer bottlenecks, faster delivery, and genuine ownership: you build it, you run it, you maintain it.!!

From Silos to Cross-Functional Teams

From Cross-Functional to Cross-Team

Cross-functional teams solved the silo problem inside a team — but not between them. Shipping a feature still often means changing a neighboring service: a foundation library, an infrastructure component, an API you don't own. The traditional answer is to file a team dependency request and wait for the owning team to do the work. AI is breaking this model. An engineer can now read and understand a neighboring service well enough to make the change directly, opening a pull request in a codebase that was previously off-limits. The owning team's role shifts from doing the work to reviewing it — confirming the change matches their service's vision without absorbing its cost. !!Ownership doesn't disappear; it moves from doing to validating.!!

From Cross-Functional to Cross-Team

Platforms Make Organizations Scalable

Cross-functional teams own the full lifecycle — but no team can rebuild its own infrastructure, security, observability, and delivery pipeline from scratch. That's where developer-centric platforms come in. By abstracting operational complexity and providing paved paths, platforms let product teams focus on the business problem while inheriting industrial-grade foundations. !!A scalable organization is not just about how teams are split — it's about what is built once, centrally, so that every team benefits without rebuilding it.!!

Platforms Make Organizations Scalable

Related chapter

Design for Developers explores how platforms empower teams and why developer experience is a strategic advantage.

Process Is What Makes It Run

Beyond teams and platforms, what holds a scalable organization together is its processes. How code is built, reviewed, integrated, deployed, monitored, and rolled back. When these are manual, every step becomes a bottleneck and the org stops scaling at exactly the moment it grows. !!Automated, well-designed processes do the opposite: they make the right thing easy and the wrong thing hard, invisibly, at every step of the lifecycle.!! This is what lets independent teams move fast without breaking each other.

Process Is What Makes It Run

Related chapters

Design by Process, Design to Be Built (CI), and Design to Be Released (CD) cover the practices that make delivery repeatable and safe.

Nicole Forsgren, Jez Humble, and Gene Kim

Accelerate: The Science of Lean Software and DevOps (2018).