Что почитать разработчику?
August 25, 2022
Этот пост содержит подборки книг, которые на мой взгляд стоит прочитать профессиональному разработчику. Большинство книг я рекомендую читать на английском, так как русские переводы зачастую фатально искажают смысл.
Одна лучшая книга в области программирования за всю историю по версии меня
Естественно, лучшая книга по программированию - книга об Эргономичном подходе:) К сожалению, она ещё не написана.
Но у меня уже есть ряд постов (~80-100 страниц), которые можно почитать:
- общий обзор процесса разработки по Эргономичному подходу
- диаграмма эффектов
- пример построения диаграммы эффектов
- общий обзор методики выполнения объектно-ориентированной декомпозиции
- агрегаты
- эргономичный подход к абстракции и немного функциональной архитектуры
- отличия Эргономичного подхода от мейнстримного (ранний пост, мог несколько потерять актуальность)
Кроме того, "Принципы юнит тестирования" отлично раскрывает темы функциональной архитектуры и эффективного тестирования. Поэтому прочитав мои посты и эту книгу вполне возможно получить хорошее представление о содержании моей будущей книги.
Три лучшие книги в области программирования за всю историю по версии меня
- Структура и интерпретация компьютерных програм. Очень крутая и глубокая книга по основам программирования - как думать о программах, как реализуются высоко-уровневые абстракции языков программирования, как программы исполняются - это всё есть в книге
- Patterns, Principles, and Practices of Domain-Driven Design. Очень хорошая, прикладная книга по DDD с эргономичными примерами кода
- "Принципы юнит тестирования". Уже упоминал её - на 2/3 раскрывает Эргономичный подход
Материалы для понимания Эргономичного подхода
В этом разделе я собрал книги (и доклады), которые либо повлияли на Эргономичный подход, либо содержат прямо позаимствованные идеи.
- Объектно-ориентированная декомпозиция системы
- Package by Component. Свои поиски альтернативного слоям способа декомпозиции систем я начал с подхода описанного в этой статье.
- Object-Oriented Software Engineering. На мой подход к декомпозиции существенно повлияла идея объектов дизайна из этой книги.
- Clojure Applied. В этой книге в "6. Creating Components" описан схожий подход к декомпозиции на функциональном языке (Clojure).
- К декомпозиции систем на основе эффектов я пришёл самостоятельно, но потом наткнулся на пару статей с очень похожей идеей:
- Структурный дизайн
- Structured Design. Весь Эргономичный подход строится на снижении сцепленности, понятие которой изначально было введено в этой книге (главы "6. COUPLING", "7. COHESION")
- THE PRACTICAL GUIDE TO STRUCTURED SYSTEMS DESIGN. А в этой книге, на мой взгляд, понятия сцепленности и связанности раскрыты более доступно
- Сокрытие информации. Сокрытие информации (на ряду с низкой сцепленностью и высокой связанностью) является третьим основопологающим принципом Эргономичного подхода как в дизайне, так и в кодировании.
- Функциональная архитектура.
- Simple Made Easу (русские человеческие субтитры). Этот доклад внёс существенный вклад в мою любовь к функциональному программированию и как следствие к функциональной архитектуре в Эргономичном подходе. Так же я во многом опирался на этот доклад, отказываясь от сложных ORM-ов.
- Are We There Yet?. Ещё один доклад Рича Хикки, из которого я утащил способ представления изменяемых сущностей как последовательности неизменяемых состояний - эпохальную модель времени.
- Boundaries by Gary Bernhardt. Идея функциональной архитектуры (ака функциональное ядро/императивная оболочка) мне в первый раз попалась в этом докладе
- "Принципы юнит тестирования". Книга настолько хороша, что не грех её упомянуть ещё раз.
- А Domain Modeling Made Functional объединяет функциональную архитектуру с DDD
- Главы "8. the morphology of simple systems" и "9. design heuristics" из Structured Design существенно повлияли на мой подход к реализации подсистем.
- Предметно-ориентированное проектирование (Domain-Driven Design, DDD)
- Domain-Driven Design: Tackling Complexity in the Heart of Software. Обязательно надо прочитать оригинальную книгу. Из этой книги я утащил базовые блоки дизайна - сервисы приложения и домена, репозитории, сущности, объекты-значения и, самое главное - агрегаты. Агрегаты играют одну из ключевых ролей в объектно-ориентированной декомпозиции.
- Patterns, Principles, and Practices of Domain-Driven Design. Эта книга раскрывает DDD с более прикладной точки зрения.
- Implementing DDD. Эта книга считается классикой DDD, но мне предыдущая книга понравилась больше
- Domain Modeling Made Functional. Книга настолько хороша, что не грех ещё раз упомянуть
- Денверская школа тестирования.
- "Принципы юнит тестирования". В общих чертах к этому подходу я подошёл сам, а потом наткнулся на его очень качественную и подробную проработку в этой уже трижды упомянутой книге.
Что ещё почитать
Условно я разделил все книги на три раздела - "Программирование", "Проектирование", "Тестирование", но многие книги содержат информацию по всем трём разделам, так что разделение довольно условное и субъективне. Книги приведены примерно в рекомендуемом порядке прочтения, но это тоже весьма условно.
Программирование
- Clean Code. Базовая подборка правил написания поддерживаемого код
- Implementation Patterns. Я не сторонник императивного объектно-ориентированного программирования, но если писать в этом стиле, то в книге много полезного. Плюс с содержимым первых 4 глав о философии и общим принципам программирования я полностью согласен.
- Concurrent Programming in Java Design Principles and Patterns
- Java Concurrency in Practice
- Блог Владимира Хорикова (автора Принципов юнит тестирования). В целом описывает подход к разработке, который процентов на 70-80 совпадает с Эргономичным.
- Can programming be liberated from the von neumann style?. Одна из классических академических статей по ФП и, кажется, первое описание функциональной архитектуры
- Why Functional Programming Matters. Ещё одна классическая академическая статья по ФП
- Out of the Tar Pit. И ещё одна классическая академическая статья по ФП
- Practical API Design. Очень крутая книга по проектированию API, содержащая всю боль ошибок, допущенных главным архитектором NetBeans.
- Use The Index, Luke. Хороший блог с большим объёмом информации об эффективном использовании РСУБД
- Design Patterns Elements of Reusable Object-Oriented Software Сейчас шаблоны уже вышли из моды, а в ООП с классами я не верю, но из соображений общей эрудиции можно почитать.
- Philosophy of Software Design. Ещё одна хорошая книга для пополнения общей эрудиции. В этой книге мне теоретически прям нравится блок про комментарии, а в остальном книга является хорошей оппозицией многим широко распространённым "лучшим практикам".
- Object-Oriented Software Construction. Довольно любопытная книга по ООП и ООД. Она огромная и, на мой взгляд, в значительной степени морально устаревшая, но там как минимум есть очень важная идея Command Query Separation.
Тестирование
- Test Driven Development: By Example. Классика и точка.
- xUnit Test Patterns: Refactoring Test Code. Классика и точка №2.
Проектирование
- Designing Data-Intensive Applications. На мой взгляд самая крутая книга по хранению данных. Она и очень "широкая" - раскрывает всю тему целиком, и достаточно "глубокая" - довольно глубоко залазит в устройство и способ работы различных систем хранения данных
- Next Generation Databases: NoSQLand Big Data. Облегчённый аналог Designing Data-Intensive Applications - широкий но поверхностный обзор темы хранения данных.
- Applying UML and Patterns. Я сам не сторонник ни ООП, ни UML, ни тяжеловесных процессов, но в книге описаны хорошие общие принципы проектирования и программирования, а так же подход к декомпозиции систем. Части про UML можно смело пропускать.
- Clean Architecture: A Craftsman’s Guide to Software Structure and Design. Чистую архитектуру полезно иметь в своём арсенале, а знание SOLID на зубок - полезная штука для прохождения собеседований. Кроме того, я советую обратить особое внимание на часть 5 "Принципы организации компонентов"
- Just Enough Software Architecture: A Risk-Driven Approach. Довольно хорошая книга по проектированию систем и роли архитектора.
- Блог Тэда Камински. Блог/черновик книги (неоконченной) с кучей интересных мыслей по всем аспектам разработки.
- Programming Erlang. Книга по Эрлангу с подробным описанием эктороной модели. На мой взгляд Эрланг и экторная модель - лучшая из существующих реализации Истинного ООП ™
- Building microservices. Очень крутая книга по разработке микросервисов. Редкая книга с содержанием которой я согласен на 100%. Рекомендую обратить особое внимание на рекомендацию начинать с монолита и резать его на микросервисы, только когда по другому никак.
- Data and Reality. Вообще это больше книга по философии, но она всё равно оперирует понятиями записей, соединений и т.п. и очень глубоко рассматривает вопрос моделирования данных.
- A relational model of data for large shared data banks. Оригинальная академическая статья по реляционной модели данных.
- The entity-relationship model—toward a unified view of data. Оригинальная академическая статья по Entity-Relationship модели
- A coRelational Model of Data for Large Shared Data Banks. Хорошая академическая статья Эрика Мейера о дуальности SQL и NoSQL (реляционной и нереляционной моделей, на самом деле)
- Lean Architecture for Agile Software Development. В этой книге описан любопытный подход к архитектуре - Data, Context, Interaction
- Parnas Partitioning. Методика выполнения декомпозиции систем по Парнасу.
- Righting Software. Подход проектированию и планированию проектов на базе разделения Парнаса.
- Object Thinking. Тоже больше философская, чем техническая книжка, но на этот раз для формирования ООП-мышления. Правда применить его в современных языках с классами не особо получается. А вот в Эрланге, имхо, вполне может получиться.