Architecting Large Software Projects: A Modular and Resilient Approach

Eskil Steenberg

Summary:

This video discusses Eskil Steenberg's philosophy for architecting large software projects by breaking them into manageable, dependable modules.

  • Key Principles: Focus on dependability, extendability, team scalability, and development velocity, while prioritizing risk reduction by using robust, long-lasting languages like C89.
  • Modular Design: Modules should act as black boxes, communicating only through clearly defined APIs, allowing individual developers to work in isolation and enabling easy replacement of internal implementations without affecting other parts of the system.
  • Layered Architecture: Complex applications are built in layers (platform, drawing, text, UI toolkits), with a core that handles the application's primary data (e.g., timeline for a video editor, events for healthcare).
  • Plugin Architecture: Core functionality is kept minimal, while various features and data types are added via a plugin architecture, promoting extensibility and allowing for diverse teams.
  • Tooling Importance: Building robust tooling (recorders, simulators, loggers) is crucial for testing and development, especially for large, complex systems with many independent components.
  • Format Design: The core of software development is designing robust data formats and APIs that are simple, implementable, and offer flexibility for future changes and diverse implementations.

Introduction & Core Philosophy [00:00:02]

This video details Eskil Steenberg's approach to structuring large software projects, aiming to break them into manageable, individual modules. It serves as a follow-up to a previous talk about enabling single-person software development. The goal is to apply this philosophy to complex projects like a video editor, a digital healthcare system, and a jet fighter, focusing on process over specific domain expertise.

Video Editor Example: Base Layers [00:11:05]

The talk begins by designing a basic video editor, demonstrating a layered software stack suitable for native applications with a UI.

A layered software stack for a video editor, showing UI Toolkits on top, followed by Text, Drawing Layer, and Platform Layer at the bottom.

Video Editor Example: Core & Plugins [00:24:50]

Houdini Node Graph
Houdini Node Graph [ 00:26:29 ]

A screenshot of Houdini, demonstrating its node-graph-based interface where "everything is a node" with parameters.
A diagram illustrating the core of the application interacting with plugins, which then feed into the UI Toolkits and underlying layers.
- **Launcher UI:** A separate application component that initializes the platform, core, and loads all available plugins. [00:35:48] - **Decoupling Core and UI:** The core can exist independently of the UI. This allows for diverse applications (e.g., a command-line tool for server-side video processing that uses the same core logic without the UI). [00:39:39] - **Plugin Implementation:** Plugins are often implemented as separate dynamic link libraries (DLLs), allowing developers to work in isolation and iterate quickly. [00:40:19] - Plugins expose their parameters and functionality through a descriptor system, enabling the UI to dynamically generate controls. [00:40:40] - This means most of the application's functionality resides in these independent plugins.

Healthcare System Example [00:44:58]

A diagram showing a new Black Box system with an Access API connected via "Glue" to an "Old System," illustrating gradual migration.
A diagram depicting a multi-access API layer built on top of the core black box, allowing various applications (UI, Internet, Feature, Website) to interact with the system.

Jet Fighter Example [00:50:50]

A conceptual diagram of an API with a "Subscriber" component communicating with an "Authoritative Core," indicating support for multiple wire types.
A diagram showing multiple redundant cores for fault tolerance, with a single subscriber interface for external systems.
- This allows initial simple core implementation for rapid development, followed by complex, robust re-implementation of the internal core without affecting users. [01:01:09]

Key Architectural Principles (Wrap Up) [01:03:43]