Список литературы для самообучения разработчика программного обеспечения¶
Один из частых вопросов, который я наблюдаю регулярно, - это “посоветуйте список литературы в области разработки программного обеспечения”. В этом посте я изложу свое видение самообучения и приведу список тематической литературы, с учетом моего личного опыта.
Содержание
- Список литературы для самообучения разработчика программного обеспечения
- Предисловие
- Кандидатский минимум
- Учимся обучению
- Изучаем основную используемую технологию
- Азбука программирования
- Учимся быть эффективным
- Учимся делать команду эффективной
- Изучаем операционную систему
- Изучаем основы алгоритмов и структур данных
- Изучаем математику
- Учимся архитектуре
- Изучаем распределенные системы
- Изучаем распределенные системы. Углубляем навыки.
- Изучаем DDD
- Дополнительная литература (на выбор)
- Учимся делать команду эффективной. Углубляем навыки.
- Развитие личностных профессиональных качеств
- Базы данных
- Изучаем распределенные системы. Третий заход.
- Углубляем DDD
- Изучаем проектирование
- POSA
- Алгоритмы. Второй заход.
- Тестирование
- Компиляторы
- Изучаем архитектуру
- Изучаем оценивание задач
- Функциональное программирование
- Справочники
- Справочная информация
- Эталонные демонстрационные приложения
Предисловие¶
Классическая ошибка новичков - жажда к знаниям, нетерпеливость. Обычно это приводит к тому, что, в погоне за количеством, они надрываются (объем знаний, который предстоит освоить, действительно, огромный), осознают невыполнимость желаемого, впадают в депрессию, а затем и в состояние психологической защиты (мол, “академичность” неуместна на практике), и прекращают развиваться. Решается эта проблема очень просто - жажда должна быть не к знаниям, а к дисциплине. А уж дисциплина обязательно приведет к обретению знаний. Дисциплина - это, своего рода, производная знаний. Она поддерживает постоянную скорость на пути освоения знаний. Сперва нужно выработать привычку, а затем привычка будет работать на вас. Как говорится, сохраняйте порядок, и порядок сохранит вас.
Достаточно читать по 5 страниц в день. Тут главное - стабильность. Пусть будет по чуть-чуть, но постоянно. Дисциплина - мать победы, говорил А.В. Суворов. Гнаться за количеством не нужно.
“A little reading goes a long way toward professional advancement. If you read even one good programming book every two months, roughly 35 pages a week, you’ll soon have a firm grasp on the industry and distinguish yourself from nearly everyone around you.”
- “Code Complete” by Steve McConnell
“We become authorities and experts in the practical and scientific spheres by so many separate acts and hours of work. If a person keeps faithfully busy each hour of the working day, he can count on waking up some morning to find himself one of the competent ones of his generation.”
- William James, cited by Steve McConnell in “Code Complete”
И, желательно, чтобы читаемая книга совпадала с тематикой текущего проекта, чтобы через практику хорошо легла в память. Я по этой причине часто изменял свой график чтения. Обычно я читал в параллели 2-3 книги. Одну - планово, другие - по потребностям проекта.
Еще одной ошибкой является неудачный выбор литературы. Сегодня штампуется много литературы, но далеко не каждая книга достойна внимания. Закон Парето работает и здесь.
Хорошей вещью для систематизации собственных знаний является написание статей и участие в профессиональных дискуссиях. Ничто так не систематизирует собственные знания, как попытка объяснить что-то другому человеку. Вы, конечно, будете периодически ошибаться, но для кристализации знаний это лучше, чем ничего не делать. К тому же, это хорошо развивает сдержанность в аргументации, что немаловажно.
На первых порах критически важно участвовать в Open Source проектах. Можно завести свои собственные Open Source проекты. Можно принимать участие в каких-то существующих проектах с авторитетными комьюнити, которые будут помогать избавляться от ошибок. В любом случае, не надейтесь на то, что профессиональные проекты предоставят вам достаточную практику для закрепления знаний. А Open Source проекты - очень даже предоставят. Я даже считаю, что практика должна предшествовать теории, потому что трудно запомнить какое-то решение, если вам на практике не знакома решаемая проблема. Потребность в теории должна назреть. Когда я приступал к теории, то у меня был накоплен уже солидный багаж проблем, решение которых я искал. Когда я впервые прочитал о мотивации паттерна Bridge, у меня в голове промелькнуло: “так вот, оказывается, как решается та самая проблема”. Когда я читал каталог Code Smells, я частенько вспоминал свой код. В результате, решения навечно запечатлелись в памяти.
Очень правильно сказал Сергей Тепляков: “Полноценное обучение – это не теория vs. практика. Это комбинация этих вещей, при этом процент одного и другого зависит от человека и изучаемой темы.”
Ну и, главное, не впадать в фанатизм. Засасывает. Нужно себя уравновешивать другими интересами, семья, спорт, физкультура, шашлыки, друзья, путешествия... Непредвзятый и свободный взгляд намного важнее изобилия знаний. Путешествие должно быть на легке, как говорил Кент Бек. По сути, знания нужны только для того, чтобы избавиться от всего лишнего. Архитектура - это, на самом деле, наука об ограничениях (т.е. о том, как не надо делать).
Кандидатский минимум¶
Учимся обучению¶
Это может показаться немного удивительным, но первая книга будет посвящена не техническим знаниям, а вопросам самоорганизации, управления временем, психологии, методикам работы под стрессом, оцеванию задач по разработке программного обеспечения, вопросам коммуникации и поведению в конфликтных ситуациях, и, самое главное, - науке быть правдивым. Именно правдивость является важнейшим отличительным признаком настоящего профессионала. И это не так просто, как может показаться на первый взгляд. Есть разница между кодером и профессионалом. И эта книга о том, как стать профессионалом. Без знаний, изложенных в этой книге, вы просто не сможете изыскать время на самообучение, и список остальных книг вам может просто не понадобиться:
- “The Clean Coder” by Robert C. Martin
Изучаем основную используемую технологию¶
Следующая книга должна быть посвящена основной используемой технологии, т.е. синтаксическим возможностям языка программирования. Для Python-разработчиков хорошим выбором была бы книга:
- “Learning Python” 5th edition by Mark Lutz
Для Golang интересно выглядят книги:
- “Hands-On Software Architecture with Golang. Design and architect highly scalable and robust applications using Go” by Jyotiswarup Raiturkar
- “The Go Programming Language” by Alan A.A. Donovan Google Inc., Brian W. Kernighan Princeton University
Для Erlang:
- “Programming Erlang: Software for a Concurrent World (Pragmatic Programmers)” 2nd edition by Joe Armstrong
Для frontend-разработчиков, работающих с Angular, имеет смысл обратить внимание на книгу:
- “ng-book2. The Complete Book on Angular 6” by Nate Murray, Felipe Coury, Ari Lerner, and Carlos Taborda
Азбука программирования¶
Подразумевается что вы уже хорошо знаете синтаксис основного языка программирования. Но, знание букв еще не делает вас поэтом. Следующие книги являются азбукой программирования. Я привожу их в таком порядке, в каком я рекомендую их прочтение:
- “Design Patterns: Elements of Reusable Object-Oriented Software” by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
- “Patterns of Enterprise Application Architecture” by Martin Fowler, David Rice, Matthew Foemmel, Edward Hieatt, Robert Mee, Randy Stafford
- “Refactoring: Improving the Design of Existing Code” 1st edition by Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts
- “Clean Code: A Handbook of Agile Software Craftsmanship” by Robert C. Martin
- “Code Complete” 2nd edition by Steve McConnell
- “UML Distilled. A Brief Guide to the Standard Object Modeling Language” 3d edition by Martin Fowler
- “KISS Principles“
Учимся быть эффективным¶
Знаний предыдущих пяти книг достаточно для того, чтобы вы стали работать в разы эффективней. Но нужно не только знать, а еще и уметь быть эффективным на практике. Никто не раскрывает этот вопрос лучше, чем Kent Beck:
- “Test-Driven Development By Example” by Kent Beck
Учимся делать команду эффективной¶
Следующий барьер - умение сделать команду эффективной. Вы не сможете быть эффективным в изоляции, поскольку ваша эффективность определяется качеством кодовой базы, а она разрабатывается всей командой. Или вы сделаете команду эффективной, или ваша эффективность так и останется мечтательством. Опять же, лучший наставник в этих вопросах - Kent Beck:
- “Extreme Programming Explained” 1st edition by Kent Beck
На данном этапе, этой книги достаточно. Обратите внимание, я советую именно первое издание, так как оно лучше раскрывает смысл и назначение Agile разработки.
Изучаем операционную систему¶
Вот по операционным системам я мало что могу посоветовать, так как низкоуровневым программированием я практически не занимался. Но вам обязательно нужно получить представление о том, как работают регистры процессора, память, и как управлять операционной системой.
Я в свое время читал эти книги (к сожалению, сегодня они устарели):
- “The Linux® Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures” by Claudia Salzberg Rodriguez, Gordon Fischer, Steven Smolski
- “Digital computers and microprocessors” by Aliyev / “Цифровая вычислительная техника и микропроцессоры” М.М.Алиев
А вот этот справочник у меня всегда под рукой:
- “Unix and Linux System Administration Handbook” 5th edition by Evi Nemeth, Garth Snyder, Trent R. Hein, Ben Whaley, Dan Mackin
Изучаем основы алгоритмов и структур данных¶
Алгоритмы хоть и используются редко в прикладной разработке (если вы только не пишете поисковые системы, системные утилиты, языки программирования и операционные системы, системы маршрутизации, биржевые анализаторы и т.п.), но знать хотя бы базовые основы необходимо. Существует книга, которая за двести с небольшим страниц может дать эти базовые основы в легкой и популярной форме:
- “Algorithms Unlocked” 3d edition by Thomas H. Cormen
Данная книга не акцентируется на математике, что, с одной стороны, облегчает освоение материала, но, с другой стороны, оставляет невосполненным важный аспект профессиональных знаний. К счастью, существует книга, которая обеспечивает легкий вход в алгоритмы, включая их математический анализ:
- “Introduction to the Design and Analysis of Algorithms” 3d edition by A.Levitin
При чтении этой книги могут возникать вопросы справочного характера по математике, ответы на которые можно найти в приложении этой книги (Appendix A: Useful Formulas for the Analysis of Algorithms, Appendix B: Short Tutorial on Recurrence Relations), в математических справочниках (например, М.Я. Выгодского, А.А. Гусака) или в справочном разделе по математике “VIII Appendix: Mathematical Background” книги “Introduction to Algorithms” 3d edition by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein.
Изучаем математику¶
Существует монументальная книга, которую стоит упомянуть отдельно (обратите внимание на фамилии авторов, которые в представлении не нуждаются). Чтобы не тормозить общий процесс обучения, ее лучше читать в параллельно-фоновом режиме. К тому же математические знания следует всегда поддерживать в актуальном состоянии, и регулярно освежать их в голове в фоновом режиме.
- “Concrete Mathematics: A Foundation for Computer Science” 2nd edition by Ronald L. Graham, Donald E. Knuth, Oren Patashnik
Эта книга дает прекрасную математическую базу для функционального программирования. И хорошо заходит в сочетании с “The Art Of Computer Programming” Volume 1 3d edition by Donald Knuth, поскольку у них многие темы пересекаются и раскрываются с разных точек зрения, что дает полноту понимания. Справочник математических нотаций в конце книги нередко оказывается полезным.
Книги по математике и алгоритмам - сложные книги, и я хотел бы поделиться одним советом, который я услышал еще в студенчестве. Если что-то непонятно - прочитай три раза:
- Первый раз просто прочитай, оставив попытки что-то понять, - нужно просто получить обзорность материала.
- Второй раз прочитай уже пытаясь слегка вникать.
- И третий раз прочитай уже вникая полностью.
Учимся архитектуре¶
Теперь можно приступить и к архитектуре:
- “Clean Architecture: A Craftsman’s Guide to Software Structure and Design” by Robert C. Martin
Изучаем распределенные системы¶
- “NoSQL Distilled. A Brief Guide to the Emerging World of Polyglot Persistence.” by Pramod J. Sadalage, Martin Fowler
- “Building Microservices. Designing Fine-Grained Systems” 2nd edition by Sam Newman
- “A plain english introduction to CAP Theorem” (Russian) by Kaushik Sathupadi
- “Map Reduce: A really simple introduction” by Kaushik Sathupadi
- “Eventually Consistent - Revisited” by Werner Vogels
- “Distributed systems: for fun and profit” (2013). An introduction to distributed systems. (source code)
- “Lecture notes (PDF) (including exercises)” by Martin Kleppman (download, source code, video)
Изучаем распределенные системы. Углубляем навыки.¶
Книг по этой теме предстоит прочитать слишком много. Вряд-ли ваша работа будет ждать, пока вы прочитаете их все. К счастью, сообщество .NET разработчиков подготовило краткий справочник, который заменит вам прочтение десятка книг:
- “.NET Microservices: Architecture for Containerized .NET Applications” edition v2.2.1 (mirror) by Cesar de la Torre, Bill Wagner, Mike Rousos
К этой книге существует эталонное приложение, которое наглядно демонстрирует практическое применение изложенной в книге информации:
- https://github.com/dotnet-architecture/eShopOnContainers (CQRS, DDD, Microservices)
Еще одно хорошее краткое руководство от Microsoft:
И можно сюда включить еще и книгу:
- “CQRS Journey” by Dominic Betts, Julián Domínguez, Grigori Melnik, Fernando Simonazzi, Mani Subramanian
К ней также существует демонстрационное приложение:
- https://github.com/microsoftarchive/cqrs-journey (Event Sourcing, SAGA transactions)
Изучаем DDD¶
Начинать я рекомендовал бы с прекрасного краткого руководства:
- “What Is Domain-Driven Design?” by Vladik Khononov
Затем приступить к классике:
- “Domain-Driven Design” by Eric Evans
- “Implementing Domain-Driven Design” by Vaughn Vernon
Существуют краткие изложения этих двух книг по DDD.
Краткие изложения “Domain-Driven Design” by Eric Evans:
- “Domain-Driven Design Reference” by Eric Evans
- “Domain-Driven Design Quickly“
Краткое изложение “Implementing Domain-Driven Design” by Vaughn Vernon:
- “Domain-Driven Design Distilled” by V.Vernon
Статьи на частые вопросы по DDD¶
- Patterns related to Domain Driven Design by Martin Fowler
Aggregate & Domain Modeling¶
- “What is domain logic?” by Vladimir Khorikov
- “Domain services vs Application services” by Vladimir Khorikov
- “Domain model isolation” by Vladimir Khorikov
- “Email uniqueness as an aggregate invariant” by Vladimir Khorikov
- “How to know if your Domain model is properly isolated?” by Vladimir Khorikov
- “Domain model purity vs. domain model completeness” by Vladimir Khorikov
- “Domain model purity and lazy loading” by Vladimir Khorikov
- “Domain model purity and the current time” by Vladimir Khorikov
- “Immutable architecture” by Vladimir Khorikov
- “Link to an aggregate: reference or Id?” by Vladimir Khorikov
- “How to create fully encapsulated Domain Models” by Udi Dahan
- “Effective Aggregate Design” by Vaughn Vernon
- “Designing a Domain Model to enforce No Duplicate Names by Steve Smith
CQRS & Event Sourcing¶
- “Overselling Event Sourcing” by Alexey Zimarev
- “Event Sourcing and Microservices” by Alexey Zimarev
- “Projections in Event Sourcing” by Alexey Zimarev
- “Event Sourcing and CQRS” by Alexey Zimarev
- “Entities as event streams” by Alexey Zimarev
- “Event Sourcing basics” by Alexey Zimarev
- “What is Event Sourcing?” by Alexey Zimarev
- “Event Sourcing and CQRS” by Alexey Zimarev
- “CQRS, Task Based UIs, Event Sourcing agh!” by Greg Young
- “Clarified CQRS” by Udi Dahan
Bounded Context and Microservices¶
- “Bounded Contexts are NOT Microservices” by Vladik Khononov
- “Tackling Complexity in Microservices” by Vladik Khononov
- “DDDDD: Bounded Contexts, Microservices, and Everything In Between” by Vladik Khononov
- “Reactive Microservices” by Vaughn Vernon
- “Microservices and [Micro]services” by Vaughn Vernon
- “About Bounded Contexts and Microservices” by Alberto Brandolini
- “Using domain analysis to model microservices“
- “Identifying microservice boundaries“
- “Domain, Subdomain, Bounded Context, Problem/Solution Space in DDD: Clearly Defined” by Nick Tune
- “Monolith -> Services: Theory & Practice” by Kent Beck
- “How to break a Monolith into Microservices :: Go Macro First, then Micro” by Zhamak Dehghani
API-Design¶
- “Designing APIs for microservices“
- “Web API design“
- “Web API implementation“
- “Microsoft REST API Guidelines“
- “Google REST API Guidelines“
- “Microservice API Patterns“
- “Web API Design - Crafting Interfaces that Developers Love“
- “REST vs. GraphQL: A Critical Review“
- “5 reasons you shouldn’t be using GraphQL” (перевод на Русский)
Event Storming¶
By Alberto Brandolini (twitter):
- “Domain-Driven Design: The First 15 Years”, chapter “Discovering Bounded Contexts with EventStorming” by Alberto Brandolini
- “Introducing Event Storming” by Alberto Brandolini
- “Remote EventStorming” by Alberto Brandolini
- “EventStorming in COVID-19 times” by Alberto Brandolini
- “Leanpub: Introducing EventStorming” by Alberto Brandolini
- EventStorming.com
Others:
- “Domain-Driven Design Distilled” by Vaughn Vernon, chapter “Chapter 7 Acceleration and Management Tools :: Event Storming”
- “What is Domain-Driven Design?” by Vladik Khononov, chapter “Chapter 8: Event Storming”
- “EventStorming Glossary & Cheat sheet” by Nick Tune
- “Open Agile Architecture”, chapter “19. Event Storming“
- “Event Storming на практических кейсах”, Сергей Баранов (видео)
- “Reactive in practice, Unit 1: Event storming the stock trader domain” by Kevin Webber, Dana Harrington
- “Event storming at ibm.com“
- “Event driven solution implementation methodology“
- “Awesome EventStorming“
Tools:
Modelling¶
- “Domain-Driven Design Starter Modelling Process” by Nick Tune
- “Legacy Architecture Modernisation With Strategic Domain-Driven Design” by Nick Tune
Собственно, этих знаний достаточно для того, чтобы стать зрелым специалистом. Своего рода - кандидатский минимум. Далее - порядок чтения может быть произвольным. Читать весь список необязательно.
Дополнительная литература (на выбор)¶
Учимся делать команду эффективной. Углубляем навыки.¶
Теперь можно прочесть и второе издание XP.
- “Extreme Programming Explained” 2nd edition by Kent Beck
- “Planning Extreme Programming” by Kent Beck, Martin Fowler
- “More Effective Agile: A Roadmap for Software Leaders” by Steve McConnell
- “Clean Agile: Back to Basics” by Robert C. Martin
- “Agile! The Good, the Hype and the Ugly” by Bertrand Meyer
- “Scrum and XP from the Trenches: How We Do Scrum” 2nd edition by Henrik Kniberg
- “The Mythical Man-Month Essays on Software Engineering Anniversary Edition” by Frederick P. Brooks, Jr.
- “Succeeding with Agile: Software Development Using Scrum” by Mike Cohn
- “User Stories Applied: For Agile Software Development” by Mike Cohn
- “Systems Thinking” by Craig Larman (перевод на Русский)
Развитие личностных профессиональных качеств¶
- “The Pragmatic Programmer: From Journeyman to Master” 1st edition by David Thomas, Andrew Hunt
- “The Pragmatic Programmer: your journey to mastery, 20th Anniversary Edition” 2nd edition by David Thomas, Andrew Hunt
“A Mind for Numbers: How to Excel at Math and Science” by Barbara Ann Oakley
“Systems Thinking. Quality Software Management. New York: Dorset House.” by Gerald M. Weinberg, 1992, ISBN: 0932633226
“An Introduction to General Systems Thinking” by Gerald M. Weinberg
“Harvard Business Review on Decision Making” by Harvard Business School Press
Базы данных¶
- “Mastering PostgreSQL In Application Development” by Dimitri Fontaine
- “The Art of PostgreSQL” 2nd edition by Dimitri Fontaine - is the new title of “Mastering PostgreSQL in Application Development”
- “SQL Antipatterns. Avoiding the Pitfalls of Database Programming.” by Bill Karwin
- “Refactoring Databases. Evolutionary Database Design” by Scott J Ambler and Pramod J. Sadalage
- “An Introduction to Database Systems” by C.J. Date
- “PostgreSQL 10 High Performance” by Ibrar Ahmed, Gregory Smith, Enrico Pirozzi
Изучаем распределенные системы. Третий заход.¶
- “Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions” by Gregor Hohpe, Bobby Woolf
- “Service Design Patterns: Fundamental Design Solutions for SOAP/WSDL and RESTful Web Services” by Robert Daigneau
- “Microsoft .NET: Architecting Applications for the Enterprise” 2nd edition by Dino Esposito, Andrea Saltarello
- “Cloud Design Patterns“
- “Cloud Design Patterns. Prescriptive architecture guidance for cloud applications” by Alex Homer, John Sharp, Larry Brader, Masashi Narumoto, Trent Swanson. (Code Samples)
- “Build Microservices on Azure” by Microsoft Corporation and community
- “Cloud Best Practices” by Microsoft Corporation and community
- “Performance Antipatterns” by Microsoft Corporation and community
- “Azure Application Architecture Guide” by Microsoft Corporation and community
- “Azure Data Architecture Guide” by Microsoft Corporation and community
- “Release It! Design and Deploy Production-Ready Software” 2nd edition by Michael Nygard
- “Microservices Patterns: With examples in Java” 1st edition by Chris Richardson (more info)
- “Monolith to Microservices Evolutionary Patterns to Transform Your Monolith” by Sam Newman
- “Microservices AntiPatterns and Pitfalls” by Mark Richards
- “Microservices vs. Service-Oriented Architecture” by Mark Richards
- “Site Reliability Engineering: How Google runs production systems” edited by Betsy Beyer, Chris Jones, Jennifer Petoff & Niall Richard Murphy
- “The Site Reliability Workbook: Practical Ways to Implement SRE.” by Betsy Beyer, Niall Richard Murphy, David K. Rensin, Kent Kawahara & Stephen Thorne
- “Building Secure & Reliable Systems: Best Practices for Designing, Implementing and Maintaining Systems.” by Heather Adkins, Betsy Beyer, Paul Blankinship, Ana Oprea, Piotr Lewandowski, Adam Stubblefield
- “Database Reliability Engineering. Designing and Operating Resilient Database Systems.” by Laine Campbell and Charity Majors
- “Designing Data-Intensive Applications. The Big Ideas Behind Reliable, Scalable, and Maintainable Systems” by Martin Kleppmann
- “Database Internals: A Deep Dive into How Distributed Data Systems Work” by Alex Petrov
- “Distributed systems: principles and paradigms” 3d edition by Andrew S. Tanenbaum, Maarten Van Steen
- “Service-Oriented Architecture Analysis and Design for Services and Microservices” by Thomas Erl
- “REST in Practice: Hypermedia and Systems Architecture” by Savas Parastatidis, Jim Webber, Ian Robinson
- “RESTful Web APIs: Services for a Changing World” by Leonard Richardson, Sam Ruby, Mike Amundsen
- “Web API Design Crafting Interfaces that Developers Love” by Brian Mulloy
- “REST API Design Rulebook” by Mark Massé
Углубляем DDD¶
- “Reactive Messaging Patterns with the Actor Model: Applications and Integration in Scala and Akka” by Vaughn Vernon
- “Patterns, Principles, and Practices of Domain-Driven Design” by Scott Millett, Nick Tune
- “Hands-On Domain-Driven Design with .NET Core: Tackling complexity in the heart of software by putting DDD principles into practice” by Alexey Zimarev
- “Event Sourced Building Blocks for Domain-Driven Design with Python” by John Bywater
Изучаем проектирование¶
- “Agile Software Development. Principles, Patterns, and Practices.” by Robert C. Martin, James W. Newkirk, Robert S. Koss
- “Analysis Patterns. Reusable Object Models” by Martin Fowler
- “Implementation Patterns” by Kent Beck
- “Smalltalk Best Practice Patterns” by Kent Beck
- “Development of Further Patterns of Enterprise Application Architecture” by Martin Fowler
- “Domain Specific Languages” by Martin Fowler (with Rebecca Parsons)
- “Pattern Hatching: Design Patterns Applied” by John Vlissides
- “Microsoft Application Architecture Guide” 2nd edition (Patterns & Practices) by Microsoft Corporation (J.D. Meier, David Hill, Alex Homer, Jason Taylor, Prashant Bansode, Lonnie Wall, Rob Boucher Jr., Akshay Bogawat)
- “Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development” by Craig Larman
- “Object-Oriented Software Construction” 2nd edition by Bertrand Meyer
- “Working Effectively with Legacy Code” by Michael C. Feathers
- “Refactoring To Patterns” by Joshua Kerievsky
- “Structure and Interpretation of Computer Programs” (aka SICP) 2nd edition (MIT Electrical Engineering and Computer Science) by Harold Abelson, Gerald Jay Sussman, Julie Sussman
- “Object Oriented Software Engineering: A Use Case Driven Approach” by Ivar Jacobson
- “Object-Oriented Analysis and Design with Applications” 3rd edition by Grady Booch, Robert A. Maksimchuk, Michael W. Engle, Bobbi J. Young Ph.D., Jim Conallen, Kelli A. Houston
POSA¶
- “Pattern-Oriented Software Architecture: A System of Patterns, Volume 1” by Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal
- “Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects, Volume 2” by Douglas C. Schmidt, Michael Stal, Hans Rohnert, Frank Buschmann
- “Pattern-Oriented Software Architecture: Patterns for Resource Management, Volume 3” by Michael Kircher, Prashant Jain
- “Pattern-Oriented Software Architecture: A Pattern Language for Distributed Computing, Volume 4” by Frank Buschmann, Kevin Henney, Douglas C. Schmidt
- “Pattern-Oriented Software Architecture: On Patterns and Pattern Languages, Volume 5” by Frank Buschmann, Kevin Henney, Douglas C. Schmidt
Алгоритмы. Второй заход.¶
- “Introduction to Algorithms” 3d edition by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
- “Algorithms and Data Structures” (Oberon version: August 2004) by N.Wirth
Donald E. Knuth:
- “The Art of Computer Programming, Volume 1: Fundamental Algorithms” 3d edition by Donald Knuth
- “The Art of Computer Programming, Volume 1, Fascicle 1: MMIX; A RISC Computer for the New Millennium” 1st edition by Donald Knuth
- “The Art of Computer Programming, Volume 2, Seminumerical Algorithms” 3rd edition by Donald E. Knuth
- “The Art of Computer Programming, Volume 3, Sorting and Searching” 2nd edition by Donald E. Knuth
- “The Art of Computer Programming, Volume 4, Fascicle 0: Introduction to Combinatorial Algorithms and Boolean Functions” 1st edition by Donald E. Knuth
- “The Art of Computer Programming, Volume 4, Fascicle 1: Bitwise Tricks & Techniques; Binary Decision Diagrams” 1st edition by Donald E. Knuth
- “The Art of Computer Programming, Volume 4, Fascicle 2: Generating All Tuples and Permutations” 1st edition by Donald E. Knuth
- “The Art of Computer Programming, Volume 4, Fascicle 3: Generating All Combinations and Partitions Paperback” 1st edition by Donald E. Knuth
- “Art of Computer Programming, Volume 4, Fascicle 4: Generating All Trees; History of Combinatorial Generation 1st edition by Donald E. Knuth
- “The Art of Computer Programming” Volume 4, Fascicle 5: Mathematical Preliminaries Redux; Introduction to Backtracking; Dancing Links” 1st edition by Donald E. Knuth
- “The Art of Computer Programming, Volume 4, Fascicle 6: Satisfiability” 1st edition by Donald E. Knuth
- “The Art of Computer Programming, Volume 4A, Combinatorial Algorithms, Part 1” 1st edition by Donald E. Knuth
Хорошая подборка книг по алгоритмам: http://e-maxx.ru/bookz/
Тестирование¶
- “xUnit Test Patterns. Refactoring Test Code.” by Gerard Meszaros
- “Growing Object-Oriented Software, Guided by Tests” by Steve Freeman, Nat Pryce
- “Agile Testing: A Practical Guide for Testers and Agile Teams” by Lisa Crispin, Janet Gregory
- “More Agile Testing: Learning Journeys for the Whole Team” by Lisa Crispin, Janet Gregory
- “ATDD by Example: A Practical Guide to Acceptance Test-Driven Development” by Markus Gärtner
- “Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation” by Jez Humble, David Farley
- “Continuous Integration: Improving Software Quality and Reducing Risk” by Paul M. Duvall, Steve Matyas, Andrew Glover
Компиляторы¶
- “Compiler Construction” by N.Wirth
- “Compilers: Principles, Techniques, and Tools” 2nd edition by Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman
Изучаем архитектуру¶
- “Software Architecture in Practice” 3d edition by Len Bass, Paul Clements, Rick Kazman
- “Documenting Software Architectures: Views and Beyond” 2nd edition by Paul Clements, Felix Bachmann, Len Bass, David Garlan, James Ivers, Reed Little, Paulo Merson, Robert Nord, Judith Stafford
- “Software Systems Architecture: Working With Stakeholders Using Viewpoints and Perspectives” 2nd edition by Nick Rozanski, Eóin Woods
- “Designing Software Architectures: A Practical Approach (SEI Series in Software Engineering)” 1st edition by Humberto Cervantes, Rick Kazman
- “Fundamentals of Software Architecture: An Engineering Approach” 1st edition by Mark Richards, Neal Ford
- “Building Evolutionary Architectures: Support Constant Change” 1st Edition by Neal Ford, Rebecca Parsons, Patrick Kua
- “Introduction to Solution Architecture Paperback” by Alan McSweeney
- “Systems Analysis and Design” 7th edition by Alan Dennis, Barbara Haley Wixom, Roberta M. Roth
- “The Design of Design: Essays from a Computer Scientist” by Frederick P. Brooks
- “Living Documentation: Continuous Knowledge Sharing by Design” by Cyrille Martraire
- “Just Enough Software Architecture: A Risk-Driven Approach” by George H. Fairbanks
- “The Book: 37 Things One Architect Knows About IT Transformation” by Gregor Hohpe
- “The Software Architect Elevator: Redefining the Architect’s Role in the Digital Enterprise 1st Edition” by Gregor Hohpe
- “Cloud Strategy: A Decision-based Approach to Successful Cloud Migration” by Gregor Hohpe, Michele Danieli, Jean-Francois Landreau, Tahir Hashmi
- “Open Agile Architecture: A Standard of The Open Group“
- “ISO/IEC/IEEE 42010:2011(en) Systems and software engineering — Architecture description“
- ГОСТ Р 57100-2016 Системная и программная инженерия. Описание архитектуры
Изучаем оценивание задач¶
- “Software Estimation: Demystifying the Black Art (Developer Best Practices)” by Steve McConnell (я встречал в интернете краткий конспект)
- “Agile Estimating and Planning” by Mike Cohn
Функциональное программирование¶
- “Software architecture: object-oriented vs functional” by Bertrand Meyer
- “Category Theory for Programmers” by Bartosz Milewski (unofficial PDF and LaTeX source)
- “Domain Modeling Made Functional. Tackle Software Complexity with Domain-Driven Design and F#” by Scott Wlaschin
- “F# for Fun and Profit” by Scott Wlaschin
- “Functional Programming for the Object-Oriented Programmer” by Brian Marick
- “Functional Thinking” by Neal Ford
- “Haskell“
- “The Science of Functional Programming. A Tutorial, with Examples in Scala.” by Sergei Winitzki, Ph.D.
- “Microservices with Clojure. Develop event-driven, scalable, and reactive microservices with real-time monitoring” by Anuj Kumar
Для Golang-разработчиков:
- “Learning Functional Programming in Go: Change the way you approach your applications using functional programming in Go” by Lex Sheehan
Справочники¶
- “Computing Handbook. Computer Science and Software Engineering.” 3d edition by Allen Tucker, Teofilo Gonzalez, Jorge Diaz-Herrera
Справочная информация¶
Body of Knowledge¶
- “Guide to the Systems Engineering Body of Knowledge (SEBoK)“
- “The Information Technology Architecture Body of Knowledge (ITABoK)“
- “The Enterprise Architecture Body of Knowledge (EABoK)“
- “A Guide to the Business Architecture Body of Knowledge(R) (BIZBOK(R) Guide)“
- “A Guide to the Business Analysis Body of Knowledge (BABoK)“
- “DAMA-DMBOK: Data Management Body of Knowledge” 2nd edition by DAMA International
- “The Project Management Body of Knowledge“
- “Учебник 4CIO. Настольная книга ИТ-Директора“
- “Учебник 4CDTO. Настольная книга руководителя цифровой трансформации“
Online-каталоги¶
- Catalog of Refactorings
- Code Smell
- Anti Patterns Catalog
- Catalog of Patterns of Enterprise Application Architecture
- List of DSL Patterns
- Enterprise Integration Patterns
- Service Design Patterns
- SOAPatterns.org
- CloudPatterns.org
- BigDataPatterns.org
- Microservices Patterns
- Microservices Patterns (book)
- Microservices Patterns from Sam Newman
- About DDD on the site of Ward Cunningham
- Refactoring Databases
- XUnit Test Patterns
- Cloud Design Patterns | Microsoft Docs
- Refactoring Databases
- Catalog of Database Refactorings
- Extreme Programming Rules
- Consistency Models - a clickable map
- Subway Map to Agile Practices - a clickable map
- The Arcitura Education Patterns, Mechanisms and Metrics Master Catalog
- Microservice API Patterns
- Architecture Playbook (source)
- Software Systems Architecture - This web site contains a selection of supporting material for the book (“Software Systems Architecture: Working With Stakeholders Using Viewpoints and Perspectives” 2nd edition by Nick Rozanski, Eóin Woods), including sample chapters, references and white papers.
Code Smell catalogs¶
- Chapter 17: “Smells and Heuristics” of the book “Clean Code: A Handbook of Agile Software Craftsmanship” by Robert C. Martin
- Chapter 3. “Bad Smells in Code” of the book “Refactoring: Improving the Design of Existing Code” by Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts
- Code Smell catalog on the site of Ward Cunningham
- “Refactoring To Patterns” by Joshua Kerievsky
Другие подборки литературы¶
- Awesome lists
- Awesome Domain-Driven Design
- Awesome Microservices
- Solution Architecture links, articles, books, video lessons, etc.
- Awesome Algorithms
- Awesome Algorithms Education
- List of awesome university courses for learning Computer Science
- MAXimal :: bookz - электронные версии различных книг по алгоритмам
- Programming and design learning resources by Kamil Grzybek
- Список книг от Сергея Теплякова
- Список книг от Grady Booch
- Книги по направлению Архитектура и проектирование ПО от эксперта luxoft
- The Architect’s Path (Part 1 - Model) by Gregor Hohpe
- The Architect’s Path (Part 2 - Implementation) by Gregor Hohpe
- Software Architecture Book References by Mark Richards
Эталонные демонстрационные приложения¶
- eShopOnContainers (CQRS, DDD, Microservices)
- Microsoft patterns & pratices CQRS Journey sample application (CQRS, DDD, Event Sourcing, SAGA transactions)
“A perfect example of this [you can see] if you go look at the CQRS and Event Sourcing by Microsoft Patterns and Practices, which is heavily focused on doing this inside of Azure using their toolkits.”
- Greg Young, “A Decade of DDD, CQRS, Event Sourcing” at 18:15
- Full Modular Monolith application with Domain-Driven Design approach by Kamil Grzybek
- Sample .NET Core REST API CQRS implementation with raw SQL and DDD using Clean Architecture by Kamil Grzybek
- Refactoring from anemic to rich Domain Model example by Kamil Grzybek
- Sample Bounded Contexts for C#.NET from the book “Implementing Domain-Driven Design” by Vaughn Vernon
- Sample Bounded Contexts from the book “Implementing Domain-Driven Design” by Vaughn Vernon
- Implementation of samples from the book “Domain-Driven Design” by Eric Evans in Java, C#, Ruby, Golang (yet another Golang). See also the article.
- Simple CQRS example by Greg Young (приложение так же реализует Event Sourcing)
- Greg Young’s Simple CQRS in F# by Jérémie Chassaing
- Complete serverless application to show how to apply DDD, Clean Architecture, and CQRS by practical refactoring of a Go project (more info) by Robert Laszczak
- Clean Monolith Shop by Robert Laszczak - Source code for Why using Microservices or Monolith can be just a detail? article
- go-iddd - showcase project for implementing DDD in Go by Anton Stöckl (see more info here and here).
- Demo taxi system, using eventsourcing library by John Bywater
- FTGO example application. Example code for the book Microservice patterns by Chris Richardson
- Eventuate Tram Customers and Orders by Chris Richardson
- Eventuate Tram Customers and Orders - .NET version by Chris Richardson
- eventuate-examples by Chris Richardson
- Sample code for the book Principles, Practices and Patterns of Domain-Driven Design by Scott Millett, Nick Tune
- Hands-On Domain-Driven Design with .NET Core, published by Packt by Alexey Zimarev
- Extended code samples related to the book “Domain Modeling Made Functional” by Scott Wlaschin
- Railway-Oriented-Programming-Example by Scott Wlaschin
- DDD with Actors by Vaughn Vernon
- The examples for the book “Reactive Messaging Patterns with the Actor Model” by Vaughn Vernon
- A Stock Trader system to demonstrate reactive systems development (source by RedElastic)
- ContosoUniversityDotNetCore-Pages by Jimmy Bogard
- Refactoring from Anemic Domain Model Towards a Rich One by Vladimir Khorikov
- DDD in Practice by Vladimir Khorikov
- DDD and EF Core by Vladimir Khorikov
- CQRS in Practice by Vladimir Khorikov
- Applying Functional Principles in C# by Vladimir Khorikov
- Specification Pattern in C# by Vladimir Khorikov
- Specification pattern implementation in C# by Vladimir Khorikov
- Validation in DDD course by Vladimir Khorikov
Варианты реализации OO/Functional Aggregates на примере Reference Applications by Chris Richardson:
- Traditional OO mutable Domain Objects
- Functional Scala witn immutable Domain Objects
- Hybrid OO/Functional Scala with immutable Domain Objects
Others:
Updated on Aug 05, 2020