Список литературы для самообучения разработчика программного обеспечения

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

Предисловие

Классическая ошибка новичков - жажда к знаниям, нетерпеливость. Обычно это приводит к тому, что, в погоне за количеством, они надрываются (объем знаний, который предстоит освоить, действительно, огромный), осознают невыполнимость желаемого, впадают в депрессию, а затем и в состояние психологической защиты (мол, “академичность” неуместна на практике), и прекращают развиваться. Решается эта проблема очень просто - жажда должна быть не к знаниям, а к дисциплине. А уж дисциплина обязательно приведет к обретению знаний. Дисциплина - это, своего рода, производная знаний. Она поддерживает постоянную скорость на пути освоения знаний. Сперва нужно выработать привычку, а затем привычка будет работать на вас. Как говорится, сохраняйте порядок, и порядок сохранит вас.

Достаточно читать по 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

А вот, если вы фронтенд-разработчик, работающий с 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

Учимся архитектуре

Теперь можно приступить и к архитектуре:

  • “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” by Sam Newman
  • All Things Distributed” by Werner Vogels

Изучаем распределенные системы. Углубляем навыки.

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

К этой книге существует эталонное приложение, которое наглядно демонстрирует практическое применение изложенной в книге информации:

И можно сюда включить еще и книгу:

  • CQRS Journey” by Dominic Betts, Julián Domínguez, Grigori Melnik, Fernando Simonazzi, Mani Subramanian

К ней также существует демонстрационное приложение:

Учимся делать команду эффективной. Углубляем навыки.

Теперь можно прочесть и второе издание XP:

  • “Extreme Programming Explained” 2nd edition by Kent Beck
  • “Planning Extreme Programming” by Kent Beck, Martin Fowler
  • “Scrum and XP from the Trenches: How We Do Scrum” 2nd edition by Henrik Kniberg

Изучаем DDD

  • “Domain-Driven Design” by Eric Evans
  • “Implementing Domain-Driven Design” by Vaughn Vernon

Собственно, этих знаний достаточно для того, чтобы стать зрелым специалистом. Своего рода - кандидатский минимум. Далее - порядок чтения может быть произвольным. Читать весь список необязательно.

Базы данных

  • “Mastering PostgreSQL In Application Development” by Dimitri Fontaine
  • “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. Prescriptive architecture guidance for cloud applications” by Alex Homer, John Sharp, Larry Brader, Masashi Narumoto, Trent Swanson
  • 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
  • “Reactive Messaging Patterns with the Actor Model: Applications and Integration in Scala and Akka” by Vaughn Vernon
  • “The Site Reliability Workbook” by Betsy Beyer, Niall Richard Murphy, David K. Rensin, Kent Kawahara & Stephen Thorne
  • “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é

Изучаем проектирование

  • “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
  • 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

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
  • “The Art Of Computer Programming” Volume 1 3d edition by Donald Knuth
  • “The Art Of Computer Programming” Volume 2 3d edition by Donald Knuth
  • “The Art Of Computer Programming” Volume 3 2d edition by Donald Knuth

Хорошая подборка книг по алгоритмам: http://e-maxx.ru/bookz/

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

  • “xUnit Test Patterns. Refactoring Test Code.” by Gerard Meszaros

Компиляторы

  • “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

Изучаем оценивание задач

  • “Software Estimation: Demystifying the Black Art (Developer Best Practices)” by Steve McConnell (я встречал в интернете краткий конспект)
  • “Agile Estimating and Planning” by Mike Cohn

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

Эталонные демонстрационные приложения

“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

Updated on Nov 12, 2019

Comments

comments powered by Disqus