Как прокачаться в проектировании программного обеспечения — список книг

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

  • как делаем
  • как эксплуатируем

Что делаем

Для того, чтобы сделать хорошую архитектуру системы хорошо бы глубоко разобраться в предметной области и дальше учитывать это знание при проектировании. Для этого подойдет концепция Domain Driven Design и я рекомендую прочитать пару книг по этой теме.

Domain-Driven Design: Tackling Complexity in the Heart of Software

What Is Domain-Driven Design?

Как делаем

Fundamentals of Software Architecture

  1. Architecture Styles
  2. Techniques and Soft Skills

Building Evolutionary Architectures

  1. Fitness Functions — про подход с fitness function из генетических алгоритмов, которые позволяют отслеживать соответствие изменений системы архитектурным правилам и подходам
  2. Engineering Incremental Change — про то, как обеспечивать инкрементальность изменений
  3. Architectural Coupling — про модульность, гранулярность и типы архитектур. Эта часть гораздо подробнее изложена в первых двух частях книги Fundamentals of Software Architecture
  4. Evolutionary Data — глава про эволюцию данных, эволюционирование схем и как быть если ваши системы интегрированы через антипаттерн Shared Database Integration
  5. Building Evolvable Architectures — конкретные подходы для построения эволюционных архитектур, как с гринфилда, так и для существующих систем
  6. Evolutionary Architecture Pitfalls and Antipatterns — про грабли, на которые можно наступить на этом пути
  7. Putting Evolutionary Architecture into Practice — глава про применение методов и подходов из предыдущих глав в реальном мире

Designing Data-Intensive Applications

  1. Распределенные данные
  2. Производные данные
  • 2. Модели данных и языки запросов — SQL, NoSQL, Map Reduce, Cypher и SparQL
  • 3. Подсистемы хранения и извлечения данных — SSTables, LSM, B-Tree, Звезды и снежинки, столбцовое хранение данных
  • 4. Кодирование и эволюция — json, xml, thrift, protobuf, avro. Миграции данных:)
  • 6. Секционирование — типа ключ/значение, по диапазонам ключе, секционирование и репликация, секционирование и вторичные индексы, перебалансировка секций
  • 7. Транзакции — ACID/BASE, 2PL(two-phase locking), SSI (serializable snapshot isolation)
  • 8. Проблемы распределенных систем — сбои и отказы, ненадежные сети, ненадежные часы, знание/истина/ложь
  • 9. Согласованность и консенсус
  • 11. Потоковая обработка
  • 12. Будущее информационных систем

Designing Distributed Systems

  • паттерны проектирования обслуживающих систем
  • паттерны проектирования систем пакетных вычислений
  • ambassador: для использования шардированного сервиса и для сплита трафика для тестирования разных версий
  • adapters: мониторинг, журналирование
  • шардирование: консистентный хеш, шардирование реплицированных сервисов, …
  • scatter-gather: распределенный поиск по документам
  • FaaS и events: преимущества и недостатки FaaS, реализация декораторов на функциях
  • выбор владельца: локи для распределенных систем
  • событийно-ориентированная пакетная обработка
  • координированная пакетная обработка

Architecting for Scale, 2nd Edition

  • Способы улучшения доступности (учитывать отказы при проектировании и разработке, думать о масштабировании, управляйте рисками, контролируйте доступность, имейте план реагирования на проблемы)
  • Введение в управление рисками в контексте ИТ-систем (что это такое, критичность и вероятность риска, матрица рисков, смягчение рисков, …)
  • Сервисы и микросервисы — куда же без них в 2017 году:) Преимущества и недостатки сервисов. Обсуждение зависимостей между сервисами и к чему она приводит в плане доступности
  • Масштабирование приложений (запас на две ошибки, владение сервисами, классы сервисов и их использование, SLA, непрерывное улучшение)
  • Облака — еще одна “горячая” тема. Автор рассказывает про AWS, в проектировании и создании которого он участвовал до того, как перешел в NewRelic
  • Ну и напоследок заключение, в котором автор подбил summary под содержанием книги

Cloud Native

Patterns of Enterprise Application Architecture

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions

  • общая база данных (shared database)
  • удаленный вызов процедуры (remote procedure invocation)
  • обмен сообщениями (messaging)
  • построение сообщений
  • маршрутизация сообщений
  • преобразование сообщений
  • конечные точки обмена сообщениями

Monolith to Microservices

  • какой логикой пользоваться для декомпозиции вашего монолита на микросервисы — внезапно тут активно упоминается очередной трехбуквенный акроним DDD (Domain Driven Design)
  • всегда ли вам нужны микросервисы — логично, что нет:)
  • как не облажаться с миграцией с монолита на микросервисы
  • как распиливать монолитный код
  • как быть с источниками данных — аля пилим базу данных
  • какие боли у вас возникнут когда вместо одного рантаймящегося монолита у вас появится коллекция микросервисов, в которой сложность эксплуатации возрастает на порядки, если использовать те же подходы, что для эксплуатации монолита

Building Microservices, 2nd Edition

Как эксплуатируем

Release It!, 2nd Edition

  • антипаттернах стабильности
  • паттернах стабильности

Site Reliability Engineering

  • Принципы
  • Практики
  • Управление
  • Выводы
  • определения качества обслуживание сервиса aka SLO, SLA, SLI (глава 4)
  • избавления от рутины (глава 5)
  • мониторинга распределенных систем (глава 6)
  • технологий выпуска ПО (глава 8) — эту главу рекомендую разработчикам
  • простоты (глава 9) — эту главу рекомендую разработчикам
  • балансировки нагрузки на уровне фронтенда (глава 19)
  • балансировки нагрузки в датацентрах (глава 20)
  • способах борьбы с перегрузками (глава 21)
  • способах борьбы с каскадными сбоями (глава 22)
  • разрешениях конфликтов в распределенных системах и достижения консенсуса (глава 23)
  • распределенный cron (глава 24)
  • конвейеры обработки данных (глава 25)
  • сохранность данных (глава 26)

The Site Reliability Workbook

Kubernetes Patterns

  • Behavioral patterns — поведенческие паттерны, описывающие взаимодействия разных типов контейнеров и платформы
  • Structural patterns — структурные паттерны, помогающие организовать контейнеры внутри пода
  • Configuration patterns — паттерны конфигурации для настройки cloud native приложений в k8s
  • Advanced patterns — продвинутые паттерны, которые покрывают темы, которые позволяют расширять саму платформы при помощи операторов (operator).

Итоги

Список крутых и полезных для проектирования книг не исчерпывается теми, что указанны выше. Но изучения книг из этого списка определенно достаточно, чтобы сильно прокачать свой уровень в архитектуре:) Все перечисленные книги доступны в плейлисте на обучающей платформе O’Reilly.

Director of digital ecosystem development department at Tinkoff. Bachelor at applied math, Master at system analysis, Postgraduate studies at economics.

Director of digital ecosystem development department at Tinkoff. Bachelor at applied math, Master at system analysis, Postgraduate studies at economics.