
Однозначно советую к прочтению не только начинающим программистам, но и тем, кто уже давно в этой индустрии. Книга очень похожа на книгу, прочитанную чуть ранее от Роберта Мартина, но на мой взгляд в ней сильно лучшие примеры, да и тем побольше.
Сначала кратко опишу все основные разделы книги с моими небольшими комментариями. После чего напишу общий вывод с преимуществами и недостатками книги. Спойлер: книга очень хорошая, и преимуществ у неё значительно больше, чем недостатков.
Основы разработки ПО
Эта часть книги целиком и полностью посвящена базовым понятиям о программировании и о том, из каких частей состоит программирование и что именно включает в себя разработка ПО. Здесь рассмотрены такие этапы, как определение требований, разработка, тестирование, сопровождение. Конечно, они описаны более подробно и интересно, так что читать будет не скучно. Хотя конкретно этот раздел полезным будет в первую очередь тем, кто только начинает свой путь в карьере программиста. Для ещё лучшего понимания этой части книги в главах используются метафоры и аналогии (например, строительная аналогия). Как и в многих подобных книгах, здесь также упоминается о цене ошибок на тех или иных этапах создания ПО (пока поверхностно, ибо более детально это будет раскрыто ниже). А ещё из плюсов раздела — то, что уже здесь упоминается о том, что подходы к разработке могут быть разными: итеративными (спиральными) и водопадными. Кратко описаны преимущества и недостатки каждого подхода. О более модных и современных терминах и подходах типа Scrum или Agile тут не говорится, но и тех методологий, что указал автор, вполне достаточно новичку. Наконец, автор затрагивает и такие важные характеристики, которыми должно обладать ПО, такие как: масштабируемость, сопровождаемость, переносимость, отказоустойчивость, безопасность и другие.
Высококачественный код
Если вы думаете, что после немалого, но в то же время интересного материала вы сразу окунётесь в раздел по написанию крутого кода и разбору холиварных тем про именование функций, переменных, использование табов и пробелов, то ошибаетесь. Дальше идёт целый раздел про проектирование ПО. Я бы не сказал, что речь идёт непосредственно о полноценной архитектуре — луковой (если, например, рассматривать монолиты) или микросервисной. Скорее здесь идёт упор на описание системы в целом, выделение неких больших модулей в рамках этой системы, а дальше уже — проектирование отдельных классов, а затем классы описаны в виде отдельных методов. Это своего рода абстрактное программирование с использованием диаграмм и блок-схем. Я не берусь ручаться за то, что сейчас действительно повсеместно этот подход (с блок-схемами и диаграммами) используется. Единственное, где мне активно приходилось с этим сталкиваться, — были колледж, а затем университет. Ни на одной работе я не чертил блок-схемы, ровно как это не делали мои друзья и коллеги. Также в этом разделе идёт завязка на ООП, и для случаев функционального программирования всё может быть не так просто и очевидно. Так что с этим разделом интересно ознакомиться, но насколько стоит применять его на практике — большой вопрос.
Здесь речь скорее идёт о решении небольших и средних задач, чем полноценных проектов. Ни слова о технологиях, повсеместно использование абстракций и придерживание SOLID. Кстати, сам подход ООП раскрыт довольно неплохо. Конечно, можно было для этого отдельную книгу прочитать, но для новичков и этого хватит. Немало времени уделяется также хорошему и правильному именованию классов и методов. Разбираются причины, когда в принципе нужно создавать отдельные методы, а когда нет. Пару слов об исключениях и обработке ошибок. Ещё одним интересным плюсом книги для новичков является программирование с использованием псевдокода. Я также люблю это называть программированием на бумаге. Новичкам будет особенно полезно, если они не знают, как написать полноценно тот или иной алгоритм.
Переменные
А вот начиная с этого раздела я бы рекомендовал читать книгу повнимательнее уже всем программистам, даже тем, кто уже написал не один проект и не первый год в разработке.
Сто страниц материала. Казалось бы, что можно обсуждать по работе с переменными? Есть что, и даже много чего полезного. Раздел в целом начинается интересным тестом на знание типов данных (включая деревья, кучи и другие типы). Приведены примеры хорошей и плохой инициализации переменных на разных языках. Разбираются области видимости с использованием понятных изображений. Перечисляются общие советы по минимизации области видимости.
Затрагивается тема длительности существования данных, именования временных переменных, статусов (переключателей), конвенции именования для разных языков. Разбираются уместные и общепринятые аббревиатуры, стандартные префиксы, грамотные сокращения имён.
Под конец раздела идёт более детальное знакомство с типами данных и их ограничениями: числа с плавающей точкой, енамы, константы, собственные типы данных, массивы, структуры, указатели.
Операторы
В этой части книги речь идёт о последовательной организации кода, использовании условных операторов и циклов. Раздел также на 100 страниц, поэтому здесь есть на чём остановиться. Например, есть детальное сравнение построения и работы (продолжительности и времязатратности) одних и тех же циклов в разных языках: C, C++, C#, Java и Visual Basic. Также затронуты темы рекурсии и goto.
Усовершенствование кода
Раздел состоит из следующих глав:
- Качество ПО
- Совместное конструирование
- Тестирование, выполняемое разработчиками
- Отладка
- Рефакторинг
- Стратегии оптимизации кода
- Методики оптимизации кода
В начале снова требования к ПО и характеристики ПО — почти те же, что были в начале. Упоминается о стоимости нахождения и исправления дефектов. Раздел в целом теоретический, и кода здесь немного. Упоминается парное программирование. Как я писал выше в описании первого раздела, материал, в том числе этого раздела, слегка спорный, так как многое устарело. Упоминается тестирование. Про тестирование, кстати, у меня скоро будет обзор на отдельную книгу. Но в отличие от обычных книг, где учат, какие тесты бывают, что покрывать и как писать, здесь автор зашёл с другой стороны. Например, он описывает типичные ошибки в тестировании, например анализ пограничных значений. Рассказывает про мониторы покрытия тестов (уже тогда они были), несколько слов об инструментах тестирования, TDD и о некоторых общепринятых стандартах.
А вот более интересное в этом разделе начинается с главы про рефакторинг. Ещё один пример цикла for на тестах в разных языках показывает, насколько по-разному работает конструкция и потребляются ресурсы в зависимости от языка программирования. Тип компилятора тоже играет большую роль. Есть интересная таблица, показывающая относительное быстродействие кода, написанного на разных языках. К примерам сравнения кода на C, C++, C#, Java и Visual Basic также добавляются PHP и Python. Особенно часто можно встретить относительное быстродействие распространённых операций на языках C++ и Java. Сложно сказать, насколько сейчас эти тесты уместны, ведь вышли новые версии компиляторов, в языках появляются новые конструкции, и даже интерпретаторы, скажем того же PHP, переписываются и оптимизируются с каждой версией. Но посыл этой главы был не в том, чтобы сравнить время, затраченное на некий алгоритм или базовую функцию (скажем, нахождение квадратного корня), а в том, что один и тот же код (функция) в разных языках может работать совершенно не так, как в других (где-то дольше, а где-то быстрее).
В завершении раздела есть пример того, как изменение типов данных на более подходящие может влиять на скорость выполнения алгоритма (опять-таки пример на разных языках).
Системные вопросы
Раздел состоит из следующих глав:
- Как размер программы влияет на конструирование
- Управление конструированием
- Интеграция
- Инструменты программирования
Что тут интересного? Например, поднята тема, как размер команды может влиять на эффективность, а также перечислена примерная доля программистов в написании кода от общего кода в зависимости от команды. Рассказывается о том, как размер проекта в строках кода примерно соотносится с плотностью ошибок. Возможно, графики и таблицы слегка спорные, но почитать про это стоит. В первую очередь я бы даже советовал раздел почитать менеджерам.
В целом, раздел теоретический, и кода почти нет. Также упоминается тема изменений требований по ходу реализации проекта и того, насколько это сдвинет проект. Также перечислены основные факторы, относящиеся к программистам и команде, которые также способны повлиять на скорость. К таким факторам автор причислил:
- опыт и способности программиста;
- мотивацию команды;
- качество управления;
- объём кода, использованного повторно;
- текучесть кадров;
- изменчивость требований;
- и другие.
Затронута тема отношения и построения коммуникаций с программистами. Например, то, как программисты проводят своё время. То есть уже тогда была актуальна тема выгорания. Ещё здесь упоминается одна тема, касающаяся вопросов религии — таких как выбор IDE, именование и стиль кода, использование линтеров и прочее.
Обсуждается тема интеграции — поэтапной и инкрементной, T-образной и некоторых других. Описаны преимущества и недостатки каждой. Но материал весьма спорный, так как про современный CI/CD нет ни слова.
Мастерство программирования
Как итог, это общий раздел книги, включающий в себя многие другие, а также ссылающийся на уже прочитанные разделы. Уточнены общие советы, также много примеров кода — от размещения комментариев до работы с классами и методами. Я бы не сказал, что этот раздел можно воспринимать как вывод всей книги — скорее, как дополнение к предыдущим. Завершается раздел моральными наставлениями от автора, например, о том, как относиться к лени, аккуратности и другим качествам. В конце указан огромный список литературы, что как минимум указывает на профессиональный подход к книге и тщательную её проработку во время написания.
Выводы
Эта книга почти 900 страниц, но пусть это вас не отпугивает, ибо материал, который в ней изложен, по моему мнению, даже значительно лучше, чем у Роберта Мартина. Перечислим основные плюсы и минусы книги.
Минусы:
- Книга огромная, и прочитать такую не каждому под силу.
- Год издания не самый свежий, поэтому некоторые примеры и темы могли устареть. Например, нет упоминаний о некоторых современных языках программирования, а современные подходы к деплою приложений и технологии разработки ПО уже значительно изменились.
Плюсы:
- Отличная и понятная структура.
- Легко читается.
- В конце каждой главы есть краткий вывод с перечнем важного.
- Часто приводятся примеры плохого кода с последующим улучшением до хорошего.
- Код представлен на разных языках, плюс есть сравнение алгоритмов на разных языках.
Книга однозначно хорошая. Я бы сказал, это одна из лучших теоретических книг по программированию, которую стоит прочитать как начинающим, так и опытным разработчикам.