This article discusses the practical aspects of learning software architecture, emphasizing that direct experience is paramount. It highlights the significant influence of social and organizational incentives on software design, often outweighing purely technical considerations, and provides concrete advice for adapting to and sometimes shaping these incentives.
Read original on Hacker NewsThe author asserts that software design and architecture are best learned through doing, rather than purely theoretical study. While formal courses provide a basic understanding, real-world projects and leadership roles where design becomes "your problem" are crucial for developing practical skills and learning from actual mistakes and successes.
A key meta-observation is the profound impact of Conway's Law: "Softwaregenesis repeats the social architecture of the organization producing software." This implies that the social issues, incentives, and organizational structure are often more critical determinants of a system's architecture than the code itself or even the initial technical design. Understanding the incentive structures that compel people to produce software is fundamental.
Adapting to Incentive Structures
System designers often face situations where incentive structures are not ideal. The article suggests two approaches: rarely, you might get a chance to design or nudge incentive structures (e.g., ensuring open-source project contributions are impactful). More commonly, you must adapt to existing constraints, making the best architectural decisions possible within those limitations.
The author uses `rust-analyzer` as an example to illustrate how social factors influenced architectural decisions. To attract brilliant, dedicated contributors for deep compiler work, the core system was designed to be independent (no `rustc` dependency, stable builds, no C dependencies, fast test suite). To attract "weekend warriors" for breadth features, internals were split into independent, `catch_unwind` guarded features, explicitly prioritizing ease of contribution over initial robustness, with crashes isolated to features and invisible to the user.