outsight

Эксперт

Эксперт Лайвлиба

18 апреля 2016 г. 01:18

7K

1

Правильно будет начать не с книжки, а с себя. Я не гуру. За плечами имею долгий айтишный опыт, но собственно разработкой ПО - вынужденно на разных языках - занимаюсь около полутора лет. Говорю это для того, чтобы было понятно: я - из таргет-группы, книга написана для меня.

Жаль, что Стивен Макконнелл не относится к писательству как к конструированию ПО. Он с ужасом пишет, что программистам кое-где (не уточняется, но точно в Индии) платят за код построчно. Есть подозрение, что в американских издательствах компьютерной литературы платят именно так: Совершенный код сомнений в обратном не вызывает. Это даже не тот случай, когда читать книжку для пользы дела нужно по диагонали. Правильный способ такой: до середины читать то, что выделено жирным или большим шрифтом (заголовки), а начиная с пятой части - только большим: там происходит переход на более высокий уровень абстракции и снова все повторяется. Начиная, кстати, с этой 5 части каждая новая глава напоминает введение в какую-то другую книгу - тоже, впрочем, неинтересную. То есть все становится еще хуже, чем было. Хотя казалось, что хуже быть уже не могло.

Семьдесят страниц вводного текста ни о чем напоминают напоминают введение Жака Деррида к Диссеминации , где этот странный - в плохом смысле - мыслитель сомневается в необходимости введения как такового. Две последние главы у Макконнелла - сотня страниц примерно - резюмируют то, что было написано раньше. Это при том, что свое отдельное резюме есть в каждой главе. Вообще, будучи в здравом уме, книгу невозможно прочитать от корки до корки. И пусть ваша читательская совесть будет спокойна, страдать должен Макконнелл. Плюс в том, что он откровенен - и это его главное - как автора - достоинство. Он признает, например, что худший виденный им код написала женщина. Не буду делиться своим опытом и своими мыслями на этот счет, но написать такое в современной Америке требует большой смелости.

Макконнелл многое взял из литературы по мотивации (так вроде называется весь этот говнотрэш про думай-и-богатей?). Очень кстати под конец мелькнула цитата из Карнеги. Книга содержит Тест на готовность руководителя, разделы про психологические аспекты отладки, личность программиста и другие ценные вещи. Утверждается, например, что программист должен быть умным. Это обязательно. Для глупых Макконнелл подготовил специальную подборку книжек по развитию ума.

Мало кто меня раздражает, как Аристотель. А Макконнелл его очень любит и навязчиво цитирует: дурной знак - от таких интеллектуалов надо бежать. Этот грек - глупый и злобный - придумал движущую силу для физиков, флогистон для химиков и даже программистам нагадил через толщу веков. Размышляя не так давно об ООП я понял, что именно из-за Аристотеля оно работает со скрипом. Мир есть совокупность фактов, а не вещей. Если почитать Виттгенштейна, все встает на места, и серебряная пуля - вот она. Не вещь надо ставить на вершину иерархии, а операцию-действие. Это тема для другого текста: надо его все-таки написать, может, для Хабра.

Вот как раз цитата из Макконнелла на философскую тему:

Прекрасный пример абстрактного объекта, который не существует в реальном мире, - Shape(фигура). Объекты Circle(окружность) и Square(прямоугольник) существуют на самом деле, тогда как класс Shape - это абстракция конкретных фигур.

Уж не знаю, встречал ли Аристотель в реальном мире окружность и прямоугольник (square?), но у автора есть определенные проблемы на уровне базы (не данных).

Рекомендации по конструированию делятся на самоочевидные и спорные:

Настороженно относитесь к классам, содержащим более семи элементов данных-членов.

(очевидно, автор никогда не моделировал производственные процессы, где объекты обладают множеством характеристик, одни из которых участвуют в логике, другие нужны просто для учета - я, например, не вижу смысла резать такой объект и таблицу поперек, код от этого проще не станет)

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

(избавляемся от дата-классов?)

Избегайте слов, при написании которых люди часто допускают ошибки.

(программист должен быть еще и лингвистом-психологом? или речь о том, что лучше придумать синоним, если есть сомнения? мол, пиши флюкончик и ложись спать?)

Об исключениях автор говорит, что на высоком уровне абстракции лучше показать Data not available, чем Disk is not ready. Вопрос: для кого лучше? Кому такое исключение упростит жизнь? Снизить степень вложенности автор советует путем замены else if на case. А в качестве эффективного метода отладки предлагает спроектировать и переписать программу с нуля

Раздел про операторы, напротив, равно бесспорный и ненужный. Макконннелл советует: если вы пишете if-then, то, возможно, вам стоит написать еще и else, потому что британские ученые установили, что в 68.5% процентах случаев, он тоже вам пригодится.

Раздел про оператор goto на 15 страницах - просто шедевр. Вспомнилась статья Пьера Менара из рассказа Борхеса о возможности обогатить игру в шахматы, устранив одну из ладейных пешек. Менар предлагает, рекомендует, обсуждает и в конце концов отвергает это новшество.

Очень хороший пример Макконнелл приводит с этим же оператором в разделе о циклах:

goto Start:
while (exptession) {
// Делаем что-то
Start:
// Делаем что-то еще
}

Говорит, так нельзя делать. Входить в циклы надо правильно. Вообще Макконнелл не утруждает себя поиском и разбором каких-то типичных ошибок. Из его примеров плохого можно составить пособие по экстравагантному говнокодированию: лучше писать if ( a > b ) - говорит автор, - чем if ( (a > b) == true ).

Интересна глава про форматирование кода. Одни люди переносят фигурную скобку:

If ( ... )
{
......
}

Другие не переносят:

If ( ... ) {
......
}

Как лучше? Макконнелл считает, что никакой разницы нет. Но 40 страниц придется прочитать.

Из всего объема (за вычетом предисловий и послесловий к послесловиям) процентов пять, наверное, имеют ценность. Меня, например, заставила задуматься главка о семантическом сопряжении, которое я учитывал только подсознательно. Ну и глава про инструментарий оказалась полезной. О некоторых штуках я действительно не слышал. Вообще, жаль немного, что Макконнелл обошелся со своим опытом и желанием этим опытом поделиться столь безобразно. Он мог написать большую статью, например, и эта статья вошла бы во все хрестоматии, потому что упорядочить правила хорошего кодирования многого стоит. Пожалел я немного и о потраченном времени (хотя его всего считанные часы, потому что книжка пустая) и о деньгах (не немного, нормально). 840 рублей заплатил я на Озоне за этого Наполеона-Хилла-для-программистов.

Ветка комментариев

Все комментарии

Не злитесь!
Сколько времени вы на мой текст потратили? Минут 5? А денег? То-то же! У меня на Макконнелла гораздо более весомый повод для злости. Я не буду разбирать ваши замечания подробно, хотя кое-где вы просто не разглядели сарказма, а где-то спорите о вкусах.
"Совершенный код" лежит на вашей полке 8 лет? И вы достаете его время от времени, чтобы пройти "Тест на готовность руководителя" или прочитать 15 страниц про оператор goto? Серьезно? Я не верю. Как ни крути, но книга Макконнелла - из категории философии программирования, которая, как и любая философия "не дает никаких знаний, ничего не сообщает, поэтому запомнить ничего нельзя, хотя и есть толстые книги". Мне очень нравится эта характеристика Мераба Мамардашвили. Он говорит следом, что "философия может лишь сообщить определенный способ мысли, который постоянно должен воссоздаваться человеком на свой собственный страх и риск". Сообщает ли этот способ мысли "Совершенный код"? Безусловно да. И заметьте, я в рецензии говорю о достоинствах книги тоже. И звездочек у меня поставлено 2 из 10, а не 1.
Повлиял ли "Совершенный код" на меня? Безусловно, да. Когда я под вечер готов махнуть на что-то рукой и написать быстро и некрасиво, внутренний голос с занудными интонациями Макконнелла приводит с десяток аргументов, почему я должен задержаться на работе на часок-другой. И я задерживаюсь, и делаю настолько хорошо, насколько могу. Хотя, возможно, это черта характера . Не будь Макконнелла, интонации были бы другие, но голос никуда б не исчез.
1.5 года программирования это пшик, и я пытался подчеркнуть именно это: даже мне, неопытному разработчику, книга дала очень немного, ведь все максимы автора делятся на самоочевидные и спорные. К этим 1.5 годам сейчас добавилось еще 3. И я продолжаю утверждать, что "Совершенный код" не стоит своего ажиотажа. Библия для программистов - удачное сравнение. Книга и популярная вроде, но тоже так себе. Сравните с ближайшими аналогами. Тот же Гомер гораздо лучше, разве вы не находите?

-2 10.07.19