Больше рецензий

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 рублей заплатил я на Озоне за этого Наполеона-Хилла-для-программистов.

Комментарии


Написал наконец упомянутый в рецензии текст для Хабра. Он тут.


Мдааа, это наверное самая эпичная рецензия которую я когда-либо в своей жизни читал.

Во-первых, автор совершенно очевидно страдает тяжелой формой расстройства Даннинга — Крюгера. Полтора года в разработке ПО - это пшик.

собственно разработкой ПО - вынужденно на разных языках - занимаюсь около полутора лет

Во-вторых, он очевидно считает себя высокоинтеллектуальной и одаренной, духовной личностью, да такой что может запросто сметать Аристотеля как несущественного. Попытки напхать больше имен и "крутых" понятий прямо-таки бросаются в глаза. Примерно как новые русские покупали картины не потому что понимали в искусстве, а потому что они дорого стоят и люди вокруг будут восхищаться. Куча цитат людей из других областей наук, а где цитаты от Мартина, Шилдта, Физерса, Олсона, Эккеля, Страуструпа, да кого угодно из мира разработки!

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

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

Если почитать Виттгенштейна

Вспомнилась статья Пьера Менара из рассказа Борхеса

этого Наполеона-Хилла-для-программистов


Теперь по критике Макконела

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


Слово "настороженно" видимо тут просто от балды запихали, да?, и казалось бы почему число 7 считается точкой за которой человек уже не может удерживать внимание? Качество абстракции определяет качество класса и я много перевидал в своей жизни классов, делающих все. Рекомендация очень важная и нужная.

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

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

Дата-классы используются как вспомогательный механизм, для обмена или представления ORM или других задач, для которых классы как таковые вообще не нужны. Вся суть ООП - объекты хранят внутреннее состояние, обмениваются сообщениями. Если мы уберем вторую часть, получим структурное программирование, прикидывающееся ООП.

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

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

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

Об исключениях автор говорит, что на высоком уровне абстракции лучше показать Data not available, чем Disk is not ready.

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

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

И правильно говорит. Абсолютно ненужная дополнительная проверка, которая ухудшает читабельность. В этом примере == true вообще не вперлось.

Интересна глава про форматирование кода. Одни люди переносят фигурную скобку:
Другие не переносят:
Как лучше? Макконнелл считает, что никакой разницы нет. Но 40 страниц придется прочитать.

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

Если честно, я просто офигел от этой рецензии, разозлился и решил написать этот комментарий. Такого профанства, выпяченного с надменным и напыщенным видом еще поискать надо. Я не знаю, может автор тролль или действительно такие люди существуют, но я хочу вот что сказать:
У меня 8 лет в разработке ПО и эта книга до сих пор стоит у меня на самом видном месте, хотя ее содержание я знаю наизусть. Это - настоящая Библия для программистов и не слушайте людей, подобных тому, что написал рецензию.


а где цитаты от Мартина, Шилдта, Физерса, Олсона, Эккеля


это кто такие вообще? Герберт Шилдт, это который выдает себя за участника комитета ANSI/ISO по языку? у которого вагон ошибок в книгах?


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