Совершенный код

Александр Шитик
Александр Шитик

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

Совершенный код
Стив Макконнелл
Жанры: Программирование
Год издания: 2010
Год прочтения: 2020
Моя оценка: Наивысшая
Количество прочтений: 1
Количество страниц: 893
Конспект (страниц): 0
Первоначальный язык издания: Английский
Переводы на другие языки: Русский, Китайский

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

Сначала кратко опишу все основные разделы книги с моими небольшими комментариями. После чего напишу общий вывод с преимуществами и недостатками книги. Спойлер: книга очень хорошая, и преимуществ у неё значительно больше, чем недостатков.

Основы разработки ПО

Эта часть книги целиком и полностью посвящена базовым понятиям о программировании и о том, из каких частей состоит программирование и что именно включает в себя разработка ПО. Здесь рассмотрены такие этапы, как определение требований, разработка, тестирование, сопровождение. Конечно, они описаны более подробно и интересно, так что читать будет не скучно. Хотя конкретно этот раздел полезным будет в первую очередь тем, кто только начинает свой путь в карьере программиста. Для ещё лучшего понимания этой части книги в главах используются метафоры и аналогии (например, строительная аналогия). Как и в многих подобных книгах, здесь также упоминается о цене ошибок на тех или иных этапах создания ПО (пока поверхностно, ибо более детально это будет раскрыто ниже). А ещё из плюсов раздела — то, что уже здесь упоминается о том, что подходы к разработке могут быть разными: итеративными (спиральными) и водопадными. Кратко описаны преимущества и недостатки каждого подхода. О более модных и современных терминах и подходах типа 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 страниц, но пусть это вас не отпугивает, ибо материал, который в ней изложен, по моему мнению, даже значительно лучше, чем у Роберта Мартина. Перечислим основные плюсы и минусы книги.

Минусы:

  1. Книга огромная, и прочитать такую не каждому под силу.
  2. Год издания не самый свежий, поэтому некоторые примеры и темы могли устареть. Например, нет упоминаний о некоторых современных языках программирования, а современные подходы к деплою приложений и технологии разработки ПО уже значительно изменились.

Плюсы:

  1. Отличная и понятная структура.
  2. Легко читается.
  3. В конце каждой главы есть краткий вывод с перечнем важного.
  4. Часто приводятся примеры плохого кода с последующим улучшением до хорошего.
  5. Код представлен на разных языках, плюс есть сравнение алгоритмов на разных языках.

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

Вверх