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

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

Сами книги я условно поделил на 3 категории, которые больше сфокусированы на отдельных вопросах

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

И начнем мы с вопроса

Что делаем

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

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

Каноническая книга, в которой Эрик Эванс изложил концепцию Domain Driven Design. Про нее часто говорят, но гораздо реже ее начинают читать, а дочитывают до конца только избранные. Возможно, причина этого станет ясна, если посмотреть на рис.1, где представлена заглавная страница книги:)

What Is Domain-Driven Design?

Отличная книга Владика Кононова, который простыми словами обобщил основные концепции и дал рекомендации как их применять в реальном мире. Более подробный разбор книги можно прочитать в моем обзоре.

Как делаем

Fundamentals of Software Architecture

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

  1. Foundations
  2. Architecture Styles
  3. Techniques and Soft Skills

и раскрываются они хорошо. Подробности о книге можно прочитать в моем обзоре.

Building Evolutionary Architectures

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

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

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

Designing Data-Intensive Applications

Читал эту книгу в переводе от издательства “Питер”, которое перевело название книги как “Высоконагруженные приложения”. Заметим, что ни слова про высокую нагрузку по данным:) В остальном перевод вышел довольно хорошим.

О качестве книги говорит то, что после первых 2 глав я заказал себе бумажную копию книги и поставил рядом с 2 томиками Таненбаума, книжкой GoF и другими классическими книгами. Кстати, отдельно надо сказать про иллюстрации к каждой главе — они превосходны. Очень наглядно отображены взаимосвязи между сущностями, про которые дальше упоминает автор книги. Прочтение книги у меня заняло почти месяц с перерывами, т.к. книга чрезвычайно емкая по содержанию.

Книга разбита на три части и 12 глав:

  1. Основы информационных систем
  2. Распределенные данные
  3. Производные данные

Первая часть является вводной и состоит из глав:

  • 1. Надежные, масштабируемые и удобные в сопровождении системы
  • 2. Модели данных и языки запросов — SQL, NoSQL, Map Reduce, Cypher и SparQL
  • 3. Подсистемы хранения и извлечения данных — SSTables, LSM, B-Tree, Звезды и снежинки, столбцовое хранение данных
  • 4. Кодирование и эволюция — json, xml, thrift, protobuf, avro. Миграции данных:)

Вторая часть включает в себя главы:

  • 5. Репликация — синхронная/асинхронная, master/slave, master/master, no-master
  • 6. Секционирование — типа ключ/значение, по диапазонам ключе, секционирование и репликация, секционирование и вторичные индексы, перебалансировка секций
  • 7. Транзакции — ACID/BASE, 2PL(two-phase locking), SSI (serializable snapshot isolation)
  • 8. Проблемы распределенных систем — сбои и отказы, ненадежные сети, ненадежные часы, знание/истина/ложь
  • 9. Согласованность и консенсус

Часть 3 состоит из глав:

  • 10. Пакетная обработка
  • 11. Потоковая обработка
  • 12. Будущее информационных систем

P.S.

Книга просто превосходна для тех, кому приходится проектировать/разрабатывать системы, которые хранят/обрабатывают данные:)

Designing Distributed Systems

Автор книги является сооснователем kubernetes, поэтому его опыт в проектировании распределенных систем является довольно актуальным:) Книга мне показалось хорошей, но одновременно слишком простой. Но за счет этого она отлично подойдет новичкам вступающим на запутанную дорожку distributed systems:)

Книга состоит из 3х частей:

  • одноузловые паттерны проектирования
  • паттерны проектирования обслуживающих систем
  • паттерны проектирования систем пакетных вычислений

Все паттерны даются в контексте контейнеров и их оркестрации, книга содержит практические примеры, для реализации которых используется инсталляция kubernetes и его примитивы, такие как pods, deployments, services, etc. Ближе к концу книги вы попробуете использовать helm для разворачивания etcd, kafka и иже с ним.

В первой части рассматриваются паттерны:

  • sidecar: для https, динамической конфигурации и метрик
  • ambassador: для использования шардированного сервиса и для сплита трафика для тестирования разных версий
  • adapters: мониторинг, журналирование

Во второй части рассматриваются:

  • репликация: для stateless сервсиов, sticky sessions, кеширование, …
  • шардирование: консистентный хеш, шардирование реплицированных сервисов, …
  • scatter-gather: распределенный поиск по документам
  • FaaS и events: преимущества и недостатки FaaS, реализация декораторов на функциях
  • выбор владельца: локи для распределенных систем

В третьей части рассматриваются паттерны проектирования систем пакетных вычислений:

  • системы на основе очередей задач
  • событийно-ориентированная пакетная обработка
  • координированная пакетная обработка

Architecting for Scale, 2nd Edition

Читать лучше на английском, т.к. на русском первое издание этой книги назвали как “Масштабирование приложений. Выращивание сложных систем”. Выращивать можно на даче картошку:) А тут все вертится относительно правильной архитектуры приложений, которая позволяет масштабироваться, сохраняя высокую доступность. Кстати, есть еще проблема, что переводные русские термины не сопровождаются их английскими аналогами — это приводит к тому, что не всегда очевидно о чем рассказывает переводчик. Приходиться восстанавливать это знание из контекста перевода:) Если абстрагироваться от перевода и заглянуть в содержание книги, то автор раскрывает следующие мысли:

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

Cloud Native

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

Patterns of Enterprise Application Architecture

Каноническая книга, которой в следующем году исполнится 20 лет. Я не мог здесь ее не упомянуть, но читать стоит с осторожностью, т.к. все эти паттерны из мира Java приложений, которые были на рубеже тысячелетий:)

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

Книге уже больше пятнадцати лет, а она до сих пор актуальна почти целиком. Забавно, что единственная устаревшая глава называется “Новые стандарты и перспективы интеграции корпоративных приложений”.

А если серьезно, то в самом начале книги (2 глава) дается отличный обзор разных стилей интеграции приложений:

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

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

Дальше (в главе 3) авторы рассказывают про составные части системы обмена сообщениями, а в следующих главах подробно рассматривают паттерны для каждой из частей, а именно

  • каналы обмена сообщениями
  • построение сообщений
  • маршрутизация сообщений
  • преобразование сообщений
  • конечные точки обмена сообщениями

В конце (глава 11) рассматриваются вопросы управления системой, которые очень полезно рассмотреть, чтобы не погрязнуть в непроработанных заранее вопросах тестирования и отладки системы. Приятно, что в системе есть 3 практикума, где рассматривается создание несложных систем, с использованием только что рассмотренных паттернов. Изюминкой является рассмотрение процесса проектирования реальной системы по торговле облигациями в главе 13 данной книги.

P.S.

Очень рекомендую почитать книгу тем, кто планирует или реализует архитектуру с использованием микросервисов:) Знание этих паттернов позволит вам не наступать на грабли и не изобретать велосипеды.

Monolith to Microservices

Книжка определенно хороша. Правда, она является не продолжением книги про создание микросервисов, а скорее приквелом для выпущенной изначально книги. Об этом говорит и сам автор во вступлении, посыпая голову пеплом относительно того, что он открыл ящик Пандоры с микросервисами, что привело к массовому adoption’у их всеми подряд без глубокого понимания границ применимости этого подхода:)

В новой книге Сэм Ньюман рассматривает такие темы как:

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

Во всех упоминавшихся выше темах автор приводит логичные аргументы

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

First, give yourself enough space and gather the right information to make rational decisions. Don’t just copy others; think instead about your problem and your context, assess the options, and move forward, while being open to change if you need to later. Second, remember that incremental adoption of microservices, and many of the associated technologies and practices, is key

Очень логичные и понятные мысли, которые заставляют трезво смотреть на любые подходы к решению задач. И да, на микросервисы тоже:)

Building Microservices, 2nd Edition

Если говорить кратко, то книга объективно хороша. Автор рассматривает проектирование программного обеспечения от и до.

В книге на примерах демонстрируется какие преимущества есть у монолита (да, они тоже есть) и какие у микросервисов (а их гораздо больше).

Не забывает автор и о “сопутствующих” вопросах, навроде интеграции всей пачки получившихся микросервисов, их тестирования, развертывания и мониторинга. Забавно, что если не рассматривать эти вопросы в самом начале, то система из микросервисов будет напоминать пазл с потерянными кусками, которые препятствуют его сбору в финальный продукт.

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

На закуску рассматриваются вопросы масштабирования микросервисов.

В общем, читайте книгу и не пожалеете.

Правда, для максимальной простоты прочтения хорошо бы, чтобы Вы имели опыт разработки и прошли все стадии от создания монолитов до перехода к микросервисной архитектуре. В этом случае книга будет читаться элементарно, а автор будет восприниматься как Капитан Очевидность:))

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

Release It!, 2nd Edition

Начинается все с введения, где автор рассказывает о том, что побудило написать эту книгу, дальше он переходит к первой части, в которой рассматривается такое понятие как стабильность:)

Часть посвященная стабильности состоит из глав, в которых рассказывается о

  • крахе системы покупки билетов на самолеты, причем информация подана в виде небольшой детективной истории:)
  • антипаттернах стабильности
  • паттернах стабильности

Дальше автор переходит ко второй части, в которой обсуждает дизайн системы для production, в третьей части идет речь про delivery вашей системы, а в четвертой — про решение системных проблем. В общем, отличная книжка для людей участвующих в разработке программного обеспечения.

Site Reliability Engineering

Книга определенно мне понравилась, но есть нюанс …

Нюанс заключается в том, что название SRE в головах людей получило коннотацию Devops, что в принципе неплохо, но … у кого из знакомых разработчиков я не спрашивал читали ли они эту книгу, то получал ответ в стиле “Нет, это вроде что-то для devops’ов”

На самом деле книга определенно хороша и ряд глав стоит прочесть разработчикам в первую очередь. Структура книги довольно проста и состоит из 5 частей:

  • Введение
  • Принципы
  • Практики
  • Управление
  • Выводы

В введении кратко описывается содержание книги, а вот уже в принципах начинается интересное и рассматриваются вопросы, касающиеся:

  • менеджмента рисков (глава 3)
  • определения качества обслуживание сервиса aka SLO, SLA, SLI (глава 4)
  • избавления от рутины (глава 5)
  • мониторинга распределенных систем (глава 6)
  • технологий выпуска ПО (глава 8) — эту главу рекомендую разработчикам
  • простоты (глава 9) — эту главу рекомендую разработчикам

В части, касающейся практик, приводится порядка 20 глав, среди которых особо важны для разработчиков главы касающиеся:

  • тестирования надежности систем (глава 17)
  • балансировки нагрузки на уровне фронтенда (глава 19)
  • балансировки нагрузки в датацентрах (глава 20)
  • способах борьбы с перегрузками (глава 21)
  • способах борьбы с каскадными сбоями (глава 22)
  • разрешениях конфликтов в распределенных системах и достижения консенсуса (глава 23)
  • распределенный cron (глава 24)
  • конвейеры обработки данных (глава 25)
  • сохранность данных (глава 26)

В части про управление рассказано о некоторых вопросах менеджмента команд SRE. А в последней части, называющейся “Выводы” проводятся параллели между разработкой ПО в Google и разработкой mission critical систем в авиастроении, кораблестроении, атомной энергетике и т.д.

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

The Site Reliability Workbook

Данная книга является продолжением предыдущей и рассказывает о том, как внедрить SRE подходы в вашей компании:)

Kubernetes Patterns

Очень крутая книга, структура которой напоминает книгу “Паттерны проектирования” от банды четырех. Книга размещена в этой части, т.к. она позволяет лучше понять как работает k8s под капотом, который является стандартом де-факто для современных приложений.

В этой книге рассматриваются следующие виды паттернов.

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

Мой краткий обзор этой книги доступен по ссылке.

Итоги

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

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

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store