Fundamentals 9 min read

Why Managing Complexity Is Futile—and What Actually Improves Software Design

The article argues that complexity in software cannot be eliminated, only shifted to well‑defined places, explains why abstractions leak, explores the limits of local consequence, and shows how eliminating duplication and thoughtful layering can still reduce overall complexity.

Architect's Guide
Architect's Guide
Architect's Guide
Why Managing Complexity Is Futile—and What Actually Improves Software Design

Inspired by Ferd’s essay, the author explains that complexity is inevitable in software; it can only be transferred between components, and library authors inevitably make their own code more complex to hide that complexity from users.

As the original quote says, “Complexity has to live somewhere. If you are lucky, it lives in well‑defined places,” so we must acknowledge its existence and manage it in locations everyone understands.

Two common reasons abstractions leak are that runtime costs cannot be hidden—different implementations may have the same logic but different performance—and that failures force engineers to “open the hood,” exposing low‑level details.

The author also describes a subjective sense of complexity, citing Kent Beck’s “Local Consequence” idea: we would like every change to be confined to a small, understandable area, but this is impossible in practice.

Organizing code by page

Organizing by data ownership

Organizing by a single business flow

Organizing by regional language version

Organizing by market‑specific customization

Grouping code that reads the same variable

Grouping code that writes the same variable

Grouping code simply because the same team owns it

These principles often conflict, so we rely on experience to prioritize high‑frequency changes and make them easy to modify, even though we cannot predict every future change.

Eliminating duplication is a powerful way to reduce complexity. Successful examples include:

PyTorch’s automatic generation of backward‑pass code from the forward pass.

Vue’s reactivity system that re‑executes getters after dependencies change.

React’s single render function with virtual‑DOM diffing.

Airtable’s form CRUD logic, where most code is identical across forms.

gRPC’s code generation for symmetric RPC structs.

When duplication is identified, a new framework or pattern can be built to remove it, thereby eliminating a portion of the overall complexity despite the effort required.

The author concludes that trying multiple approaches and embracing layered designs remains essential, as software architecture is a social science with practical limits, but there is still ample room for improvement.

Source: https://zhuanlan.zhihu.com/p/138145081
Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

Software Architecturecode organizationsoftware complexityabstractionlocal consequence
Architect's Guide
Written by

Architect's Guide

Dedicated to sharing programmer-architect skills—Java backend, system, microservice, and distributed architectures—to help you become a senior architect.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.