Субьективная выжимка из «Совершенный код:2 издание» Стива Макконнелла
Ожидает приглашения

Первая мысль, которая осталась после прочтения звучит: «Программируйте не на языке, а с помощью языка». Иными словами: не нужно зацикливаться на том языке, который Вы изучаете или знаете лучше всего. Используйте язык в зависимости от поставленной задачи. А для решения разных задач, как известно, разные языки могут быть более предпочтительными.
«Код пишут не для компьютера, а для человека» — тоже интересная мысль. Многие думают, что программировать, это значит давать команды компьютеру что-либо делать. По сути, это, конечно, так и есть. НО! Не стоит забывать, что текст программы должен быть понятен тому, кто его будет смотреть, править, изменять. Если рассуждать о том, что программировать — это командовать компьютером, тогда зачем нам высокоуровневые языки? Зачем нам различные фреймворки и тд? Давайте писать на ассемблере или вообще в двоичном виде, все равно же мы для компьютера пишем, а ему двоичное роднее. Тут не стоит вопрос об удобности или ускорения программирования, здесь стоит вопрос о формировании такой культуры программирования, в которой человеку в первую очередь должно быть понятно что и как делается в программе. Компьютер он и так поймет, но вот поймет ли человек, зависит от того, насколько мы будем придерживаться раскрываемого принципа.
Из этой мысли вытекают несколько других принципов: «Если это возможно, не используйте GOTO». Для понимания чего-либо человеку удобно видеть информацию в логичном, систематизированном виде. Каким бы Вы не были высокоразвитой или творческой личностью, информация легче усваивается, если она выкладывается, подчиняясь определенной логике. Программу легче понять, когда функция идет за функцией. Заканчивается одно, начинается другое. Оператор «GOTO» нарушает подобную конструкцию. Он позволяет произвольно перепрыгивать из одного места в другое. Программа выполняется, но плохо понимается. Точнее, долго понимается. Есть сторонники и противники «GOTO», ведутся дискуссии, но, думаю, для нас можно просто решить это не использовать.
Также в эту группу можно включить «Не используйте циклы, вложенность которых больше 3-х». Я сам не раз сталкивался с проблемой понимания многосложных циклов. Было ощущения, что это как-то неправильно, неудобно, хотя и работает. Для осознания этой мысли и формализации в словесную форму надо было почитать эту книгу.
«Комментируйте свой код». Думаю, это очень даже логично. Несмотря на всякие там «Хороший код не нуждается в комментировании, он самопонятен», или «Не нужно заполонять экран лишними символами», или «Хочешь объяснить код – пиши документацию отдельно» и все такое. Это все понятно. Но мне кажется, что хороший комментарий имеет право на жизнь. В книге, кстати, приводятся различные смысловые и визуальные реализации комментариев. Об этом как-то не задумываешься, но, прочитав, начинаешь это замечать и использовать.
«Начиная писать программу, составь для себя конвенцию стиля-форматирования». Думаю, эта мысль более актуальна для новичков-программистов. Несмотря на дискуссии о «правильности» того или иного форматирования (4 пробела или 2, открывающая скобка в конце строки или с начала следующей и тд.), важно избрать для себя какой-то один стиль и максимально, но без фанатизма придерживаться его. Даже если тот программист, который пишет в другом стиле, будет просматривать Ваш код, ему будет легко его читать, даже несмотря на различность стиля. Сначала Вы составите для себя правило форматирования, потом оно станет просто привычкой.
«Сначала подумай, потом пиши или семь раз отмерь, потом режь». Неплохо, прежде чем начинать писать интерфейс контроллера, подумать о программе глобально. Что она будет делать, что куда будет передаваться, что где будет храниться и кому что будет видно. Буквально недавно я начал писать для себя технические задания сам, для, так сказать, организации труда. До этого было как-то лень или я думал, что все и так понятно. Но, как оказалось, озвучивание того, что я собираюсь делать очень даже полезная вещь (Кто бы мог подумать?). Как в кувшин, сначала закидываем большие камни, потом поменьше, потом еще меньше, потом песочек и вуаля, кувшин – полон и все влезло как надо.
«Этапы формирования программы: планирование->разработка->тестирование->отладка». Думаю, логично, во время тестирования своего творения заниматься именно тестированием, а не продумывать как бы еще и чего бы добавить. Часто бывает, что во время разработки становится понятно, что что-то идет не так. Ну, неудобно как-то все. И вместо того, чтобы реализовывать приходиться опять планировать. Чтобы как можно реже это воспроизводить, предлагается доводить каждый этап до конца и в своем порядке.
«KISS, DRY, YAGNI, DIE». Всем известные принципы, которые, почему-то известны не всем. Все это американские аббревиатуры. По-русски звучат как: делай проще, не повторяйся, тебе это не понадобится и дублирование — зло.
«80% времени тратится на реализацию 20% функционала». Иными словами, большую часть времени реализации мы тратим на какие-то мелочи. Все бы ничего, но, возможно, в этих мелочах вовсе нет надобности. Нужно суметь правильно расставить приоритеты и уделять время на то, что действительно важно.
«Сначала неприятное». Думаю, что у всех разработчиков есть какие-то вещи, которые ну не очень хочется делать. Кто-то не любит базы данных, кто-то не любит возиться с AJAX или еще что-нибудь. Переносить на неопределенное время то, что неприятно неправильно. Когда, например, так делаю я, то процесс разработки несколько увеличивается. Я чувствую, что вот-вот, еще немного, и надо будет заниматься этим самым, «неприятным». И вдруг обнаруживается, что вот в этом месте можно покрасивее функцию сделать. Здесь отступов меньше, чем надо и в таком духе. Это лично у меня так.
«Образование и чтение, совершенствование и оттачивание». Ни для кого не секрет, что нужно в нашем современном мире образовываться практически без остановки. Читать, общаться с гуру, все такое. Особенно если Вы разработчик мобильных приложений (шутка). Так вот читать в неделю 35 страниц тематической литературы – это обязательно. Остановимся на этом.
«Разделения труда, разделение программ, разделяй и властвуй». Сегодня, слава богам, существуют различные методики разделения команд и труда для аккуратной, быстрой и адекватной работы(методики управления проектами). Различные SCRUM, AGILE, внутренние программы. Сегодня, слава богам, существуют различные методики разделения кода(системы контроля версий). Различные GIT, SVN, Mercurial. Так давайте все это использовать (когда удобно, конечно)!
«Говорящие фамилии». Чуть не забыл про названия. Это вытекает логичным образом из формирования своего, всем понятного стиля. Сюда относится: называние классов с большой буквы все слова, называние функций с маленькой буквы и остальные слова с большой, называние констант ВСЕ_БОЛЬШИЕ_БУКВЫ и так далее. Такие мелочи очень помогают и ускоряют понимание.
Думаю, можно закончить мою двухколесную выдержку. Общее ощущение от книги положительное. Хотя иногда возникало ощущение, что эта книга написана ни для кого. Т.е. вроде для профессионального (опытного) программиста это все и так должно быть понятно, а для начинающего много того, что, по сути, не совсем понятно. Даже самое первое «с языком, а не на языке» для начинающего, знающего только один язык, может быть не совсем ясно. Ну а для гуру многостраничные рассказы про комментарии и названия вообще могут вызвать недоумение. Если преодолеть некоторый дискомфорт, связанный с этими моментами (если он, конечно, возникнет), то читать можно. Как Чехова, не хуже.
ОЗОН прислал мне еще книги: «Мифический человеко-месяц», «Приемы объектно-ориентированного программирования: паттерны проектирования» и «Анализ алгоритмов». Если кому интересно что-то, могу прочитать и тезисно изложить. Или выделить какие-то особенно интересные для вас моменты. Также принимаю конструктивную критику и пожелания прекратить марать бумагу. Всем удачи!