System Design Space
Граф знанийНастройки

Обновлено: 24 марта 2026 г. в 12:33

A Philosophy of Software Design (short summary)

hard

Плохой дизайн редко выглядит как одна большая катастрофа. Обычно он ощущается как постоянная усталость от системы: непонятно, где менять код, интерфейсы кажутся тяжелыми, а любая простая задача тянет слишком много контекста. Эта глава как раз про борьбу с такой сложностью.

Особенно ценно здесь то, как книга переопределяет хороший дизайн через управление сложностью: deep modules, information hiding, red flags и снижение когнитивной нагрузки. Такой взгляд помогает проектировать интерфейсы и границы так, чтобы системе было проще жить и меняться.

Внутреннюю архитектуру сервиса по этой главе обсуждать заметно легче: она дает сильный язык для разговора о качестве модулей, удачных границах и тех интерфейсах, которые либо скрывают сложность, либо размазывают ее по всей системе.

Практическая польза главы

Управление сложностью

Фокусирует на главной цели дизайна: снижать случайную сложность и повышать понятность системы.

Глубокие модули

Помогает проектировать интерфейсы, скрывающие внутреннюю сложность и уменьшающие cognitive load.

Design debt

Учит замечать ранние сигналы деградации дизайна и вовремя делать структурные улучшения.

Interview articulation

На интервью дает сильный язык для обоснования модульных границ и качества API-контрактов.

Источник

Code of Architecture — Recap

Обзор книги в четырёх выпусках книжного клуба CoA с участием архитекторов Т-Банка.

Читать статью

A Philosophy of Software Design

Авторы: John K. Ousterhout
Издательство: Yaknyam Press
Объём: 190 страниц

Философия борьбы со сложностью от Джона Остерхаута: глубокие модули, information hiding, strategic programming и red flags.

Оригинал

О книге

"A Philosophy of Software Design" — одна из самых цитируемых современных книг о проектировании ПО. Джон Остерхаут, профессор Стэнфорда и автор Tcl/Tk, представляет философию борьбы со сложностью через правильную модуляризацию, скрытие информации и стратегическое мышление.

Книга возникла из курса CS 190 в Стэнфорде, где студенты проектировали и review'или реальные программные системы. Это сборник практических принципов, выведенных из анализа тысяч студенческих проектов.

Детальный обзор

Review Part I

Подробный разбор первых глав: сложность, тактическое vs стратегическое программирование.

Читать обзор

Часть 1: Природа сложности (главы 1-6)

Природа сложности

Симптомы сложности:

🔄Change Amplification
🧠Cognitive Load
Unknown Unknowns

Причины сложности:

Dependencies

Связи между модулями

Obscurity

Неясность намерений кода

Формула:
Complexity = Σ (cₚ × tₚ)
где c — сложность компонента, t — время работы с ним

Тактическое vs Стратегическое программирование

Тактическое ❌

  • "Главное — чтобы работало"
  • Быстрые патчи и хаки
  • Накопление технического долга
  • Локальная оптимизация

Стратегическое ✅

  • "Хороший дизайн = рабочий код"
  • Инвестиции 10-20% времени в дизайн
  • Проактивное устранение сложности
  • Глобальная оптимизация

Детальный обзор

Review Part II

Глубокий разбор глав 7-11: уровни абстракции, перемещение сложности, исключения.

Читать обзор

Часть 2: Модули и абстракции (главы 7-11)

Глубокие vs Мелкие модули

Deep Module ✅

interface
Много функциональности

Маленький интерфейс, много возможностей

Shallow Module ❌

big interface
Мало функц.

Большой интерфейс, мало возможностей

Примеры глубоких модулей: Unix file I/O (5 системных вызовов), сборщик мусора (нулевой интерфейс). Shallow: Java I/O классы, множество exceptions.

Information Hiding

Каждый модуль должен инкапсулировать знания о дизайне, представляя наружу минимальный интерфейс.

❌ Information Leakage — детали реализации видны снаружи

❌ Temporal Decomposition — разбиение по времени выполнения

Different Layer, Different Abstraction

На каждом уровне системы должны быть свои абстракции. Pass-through методы — признак проблем.

✅ Pull Complexity Downward

Перемещайте сложность вниз — в реализацию, а не в интерфейс

Define Errors Out of Existence

Вместо бросания исключений — проектируйте API так, чтобы ошибочные состояния были невозможны. Пример: unset() в Tcl не бросает исключение для несуществующей переменной — это делает код проще.

Часть 3: Комментарии и документация (главы 12-16)

Почему комментарии важны

Комментарии не дублируют код — они описывают абстракции, которые код не может выразить.

Interface comments — контракт модуля

Implementation comments — "что" и "почему"

Cross-module comments — связи между модулями

Comments First

Пишите комментарии перед кодом. Это помогает:

  • Продумать дизайн до реализации
  • Определить правильные абстракции
  • Обнаружить проблемы в дизайне рано
  • Сохранить мотивацию писать документацию

🎯 Правила хорошего нейминга

Точность

Имя должно точно описывать сущность

Консистентность

Одинаковые паттерны для похожих вещей

Избегайте лишних слов

fileCount, а не numberOfFiles

Часть 4: Консистентность и очевидность (главы 17-21)

Консистентность

  • Naming conventions — единообразные имена
  • Coding style — форматирование, структура
  • Design patterns — типичные решения
  • Invariants — гарантированные свойства

Очевидность кода

Код очевиден, если читатель может быстро понять его без глубокого анализа.

✅ Хорошие имена и комментарии

✅ Консистентность

❌ Event-driven programming (сложно отследить)

❌ Generic containers (теряется семантика)

🚩 Red Flags — признаки плохого дизайна

Shallow Module — Интерфейс сложнее реализации
Information Leakage — Детали реализации видны снаружи
Temporal Decomposition — Разбиение по времени, а не по функции
Overexposure — Избыточные публичные методы
Pass-Through Method — Метод просто передаёт вызов дальше
Repetition — Повторяющийся код в разных местах
Special-General Mixture — Смешение общего и частного кода
Conjoined Methods — Методы понятны только вместе
Comment Repeats Code — Комментарий дублирует код
Implementation in Interface — Детали реализации в документации
Vague Name — Неточное или слишком общее имя
Hard to Pick Name — Сложно придумать хорошее имя
Hard to Describe — Сложно описать назначение
Nonobvious Code — Код требует глубокого анализа

Видео-серия Code of Architecture

Ключевые идеи

1.

Complexity is incremental

Сложность накапливается постепенно, по капле

2.

Working code isn't enough

Нужен хороший дизайн, не только работающий код

3.

Deep modules

Много функциональности за простым интерфейсом

4.

Information hiding

Инкапсуляция знаний о реализации

5.

Pull complexity down

Сложность в реализации, простота в интерфейсе

6.

Define errors out

Проектируйте API без ошибочных состояний

7.

Comments as design tool

Пишите комментарии до кода

8.

Consistency matters

Консистентность снижает cognitive load

Связанные главы

Где найти книгу

Чтобы отмечать прохождение, включи трекинг в Настройки