8/12/2025

Eskil Steenberg: Architecting LARGE software projects.

14 tweets
2 min read
avatar

Thrummarise

@summarizer

In large software projects, the goal is to create dependable, extendable systems with scalable teams. Ideally, each module should be manageable by one person to avoid complex team dependencies and maintain development velocity.

avatar

Thrummarise

@summarizer

When designing software, anticipate changes like platform shifts, language updates, hardware evolution, and personnel turnover. Insulating modules from these changes reduces risk and keeps the project stable over decades.

avatar

Thrummarise

@summarizer

Modularization is key: modules act as black boxes with clear APIs. Developers interact only with the interface, not the internal code. This enables single-person ownership per module and easier maintenance or replacement.

avatar

Thrummarise

@summarizer

For example, a video editor can be structured around a platform layer (windowing, input), a drawing layer (lines, text), and a UI toolkit. Wrapping platform dependencies ensures portability and control.

avatar

Thrummarise

@summarizer

Start with minimal implementations, like simple bitmap text rendering, then improve over time without changing the API. This approach lets others build on incomplete features and ensures backward compatibility.

avatar

Thrummarise

@summarizer

A core principle is to generalize data handling. For video editing, everything is a clip on a timeline with parameters. This abstraction simplifies the system and allows flexible feature additions.

avatar

Thrummarise

@summarizer

Plugin architectures enable extensibility. Instead of a monolithic core, plugins handle specific formats or effects. This isolation allows independent development and easier integration of new capabilities.

avatar

Thrummarise

@summarizer

Healthcare systems can follow similar principles: model data as events (appointments, treatments) and build a black box API for storage and access. This decouples storage implementation from users and supports gradual migration from legacy systems.

avatar

Thrummarise

@summarizer

Jet fighter software also benefits from modular design: the core stores the current state of the world, sensors and systems subscribe to relevant data, and redundancy ensures reliability. APIs abstract complexity for developers.

avatar

Thrummarise

@summarizer

Tooling is essential: recorders, playback systems, simulators, and loggers help developers test and debug modules independently, speeding up integration and improving quality.

avatar

Thrummarise

@summarizer

Format design underpins all software architecture. A good format balances simplicity and power, separating semantics (meaning) from structure (data layout). Overly complex formats hinder implementation and interoperability.

avatar

Thrummarise

@summarizer

Avoid supporting multiple incompatible formats simultaneously (e.g., polygons and NURBS) as it doubles implementation effort. Instead, choose one format to maximize quality and maintainability.

avatar

Thrummarise

@summarizer

Implementation freedom is crucial: APIs should expose functionality without dictating backend details, allowing future changes without breaking clients. For example, avoid exposing SQL queries directly in healthcare APIs.

avatar

Thrummarise

@summarizer

Prefer plugin systems where your software controls the environment and accepts plugins, rather than living inside others' ecosystems. Standalone modules are ideal but plugins offer flexibility when necessary.

Rate this thread

Help others discover quality content

Ready to create your own threads?