Что почитать разработчику?

August 25, 2022

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

Одна лучшая книга в области программирования за всю историю по версии меня

Естественно, лучшая книга по программированию - книга об Эргономичном подходе:) К сожалению, она ещё не написана.

Но у меня уже есть ряд постов (~80-100 страниц), которые можно почитать:

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

Три лучшие книги в области программирования за всю историю по версии меня

  1. Структура и интерпретация компьютерных програм. Очень крутая и глубокая книга по основам программирования - как думать о программах, как реализуются высоко-уровневые абстракции языков программирования, как программы исполняются - это всё есть в книге
  2. Patterns, Principles, and Practices of Domain-Driven Design. Очень хорошая, прикладная книга по DDD с эргономичными примерами кода
  3. "Принципы юнит тестирования". Уже упоминал её - на 2/3 раскрывает Эргономичный подход

Материалы для понимания Эргономичного подхода

В этом разделе я собрал книги (и доклады), которые либо повлияли на Эргономичный подход, либо содержат прямо позаимствованные идеи.

  1. Объектно-ориентированная декомпозиция системы
    1. Package by Component. Свои поиски альтернативного слоям способа декомпозиции систем я начал с подхода описанного в этой статье.
    2. Object-Oriented Software Engineering. На мой подход к декомпозиции существенно повлияла идея объектов дизайна из этой книги.
    3. Clojure Applied. В этой книге в "6. Creating Components" описан схожий подход к декомпозиции на функциональном языке (Clojure).
    4. К декомпозиции систем на основе эффектов я пришёл самостоятельно, но потом наткнулся на пару статей с очень похожей идеей:
      1. Improving Design Decomposition.
      2. Functional Decomposition for Software Architecture Evolution;
    5. Структурный дизайн
      1. Structured Design. Весь Эргономичный подход строится на снижении сцепленности, понятие которой изначально было введено в этой книге (главы "6. COUPLING", "7. COHESION")
      2. THE PRACTICAL GUIDE TO STRUCTURED SYSTEMS DESIGN. А в этой книге, на мой взгляд, понятия сцепленности и связанности раскрыты более доступно
    6. Сокрытие информации. Сокрытие информации (на ряду с низкой сцепленностью и высокой связанностью) является третьим основопологающим принципом Эргономичного подхода как в дизайне, так и в кодировании.
  2. Функциональная архитектура.
    1. Simple Made Easу (русские человеческие субтитры). Этот доклад внёс существенный вклад в мою любовь к функциональному программированию и как следствие к функциональной архитектуре в Эргономичном подходе. Так же я во многом опирался на этот доклад, отказываясь от сложных ORM-ов.
    2. Are We There Yet?. Ещё один доклад Рича Хикки, из которого я утащил способ представления изменяемых сущностей как последовательности неизменяемых состояний - эпохальную модель времени.
    3. Boundaries by Gary Bernhardt. Идея функциональной архитектуры (ака функциональное ядро/императивная оболочка) мне в первый раз попалась в этом докладе
    4. "Принципы юнит тестирования". Книга настолько хороша, что не грех её упомянуть ещё раз.
    5. А Domain Modeling Made Functional объединяет функциональную архитектуру с DDD
    6. Главы "8. the morphology of simple systems" и "9. design heuristics" из Structured Design существенно повлияли на мой подход к реализации подсистем.
  3. Предметно-ориентированное проектирование (Domain-Driven Design, DDD)
    1. Domain-Driven Design: Tackling Complexity in the Heart of Software. Обязательно надо прочитать оригинальную книгу. Из этой книги я утащил базовые блоки дизайна - сервисы приложения и домена, репозитории, сущности, объекты-значения и, самое главное - агрегаты. Агрегаты играют одну из ключевых ролей в объектно-ориентированной декомпозиции.
    2. Patterns, Principles, and Practices of Domain-Driven Design. Эта книга раскрывает DDD с более прикладной точки зрения.
    3. Implementing DDD. Эта книга считается классикой DDD, но мне предыдущая книга понравилась больше
    4. Domain Modeling Made Functional. Книга настолько хороша, что не грех ещё раз упомянуть
  4. Денверская школа тестирования.
    1. "Принципы юнит тестирования". В общих чертах к этому подходу я подошёл сам, а потом наткнулся на его очень качественную и подробную проработку в этой уже трижды упомянутой книге.

Что ещё почитать

Условно я разделил все книги на три раздела - "Программирование", "Проектирование", "Тестирование", но многие книги содержат информацию по всем трём разделам, так что разделение довольно условное и субъективне. Книги приведены примерно в рекомендуемом порядке прочтения, но это тоже весьма условно.

Программирование

  1. Clean Code. Базовая подборка правил написания поддерживаемого код
  2. Implementation Patterns. Я не сторонник императивного объектно-ориентированного программирования, но если писать в этом стиле, то в книге много полезного. Плюс с содержимым первых 4 глав о философии и общим принципам программирования я полностью согласен.
  3. Concurrent Programming in Java Design Principles and Patterns
  4. Java Concurrency in Practice
  5. Блог Владимира Хорикова (автора Принципов юнит тестирования). В целом описывает подход к разработке, который процентов на 70-80 совпадает с Эргономичным.
  6. Can programming be liberated from the von neumann style?. Одна из классических академических статей по ФП и, кажется, первое описание функциональной архитектуры
  7. Why Functional Programming Matters. Ещё одна классическая академическая статья по ФП
  8. Out of the Tar Pit. И ещё одна классическая академическая статья по ФП
  9. Practical API Design. Очень крутая книга по проектированию API, содержащая всю боль ошибок, допущенных главным архитектором NetBeans.
  10. Use The Index, Luke. Хороший блог с большим объёмом информации об эффективном использовании РСУБД
  11. Design Patterns Elements of Reusable Object-Oriented Software Сейчас шаблоны уже вышли из моды, а в ООП с классами я не верю, но из соображений общей эрудиции можно почитать.
  12. Philosophy of Software Design. Ещё одна хорошая книга для пополнения общей эрудиции. В этой книге мне теоретически прям нравится блок про комментарии, а в остальном книга является хорошей оппозицией многим широко распространённым "лучшим практикам".
  13. Object-Oriented Software Construction. Довольно любопытная книга по ООП и ООД. Она огромная и, на мой взгляд, в значительной степени морально устаревшая, но там как минимум есть очень важная идея Command Query Separation.

Тестирование

  1. Test Driven Development: By Example. Классика и точка.
  2. xUnit Test Patterns: Refactoring Test Code. Классика и точка №2.

Проектирование

  1. Designing Data-Intensive Applications. На мой взгляд самая крутая книга по хранению данных. Она и очень "широкая" - раскрывает всю тему целиком, и достаточно "глубокая" - довольно глубоко залазит в устройство и способ работы различных систем хранения данных
  2. Next Generation Databases: NoSQLand Big Data. Облегчённый аналог Designing Data-Intensive Applications - широкий но поверхностный обзор темы хранения данных.
  3. Applying UML and Patterns. Я сам не сторонник ни ООП, ни UML, ни тяжеловесных процессов, но в книге описаны хорошие общие принципы проектирования и программирования, а так же подход к декомпозиции систем. Части про UML можно смело пропускать.
  4. Clean Architecture: A Craftsman’s Guide to Software Structure and Design. Чистую архитектуру полезно иметь в своём арсенале, а знание SOLID на зубок - полезная штука для прохождения собеседований. Кроме того, я советую обратить особое внимание на часть 5 "Принципы организации компонентов"
  5. Just Enough Software Architecture: A Risk-Driven Approach. Довольно хорошая книга по проектированию систем и роли архитектора.
  6. Блог Тэда Камински. Блог/черновик книги (неоконченной) с кучей интересных мыслей по всем аспектам разработки.
  7. Programming Erlang. Книга по Эрлангу с подробным описанием эктороной модели. На мой взгляд Эрланг и экторная модель - лучшая из существующих реализации Истинного ООП ™
  8. Building microservices. Очень крутая книга по разработке микросервисов. Редкая книга с содержанием которой я согласен на 100%. Рекомендую обратить особое внимание на рекомендацию начинать с монолита и резать его на микросервисы, только когда по другому никак.
  9. Data and Reality. Вообще это больше книга по философии, но она всё равно оперирует понятиями записей, соединений и т.п. и очень глубоко рассматривает вопрос моделирования данных.
  10. A relational model of data for large shared data banks. Оригинальная академическая статья по реляционной модели данных.
  11. The entity-relationship model—toward a unified view of data. Оригинальная академическая статья по Entity-Relationship модели
  12. A coRelational Model of Data for Large Shared Data Banks. Хорошая академическая статья Эрика Мейера о дуальности SQL и NoSQL (реляционной и нереляционной моделей, на самом деле)
  13. Lean Architecture for Agile Software Development. В этой книге описан любопытный подход к архитектуре - Data, Context, Interaction
  14. Parnas Partitioning. Методика выполнения декомпозиции систем по Парнасу.
  15. Righting Software. Подход проектированию и планированию проектов на на безе разделения Парнаса.
  16. Object Thinking. Тоже больше философская, чем техническая книжка, но на этот раз для формирования ООП-мышления. Правда применить его в современных языках с классами не особо получается. А вот в Эрланге, имхо, вполне может получиться.