вторник, 20 октября 2009 г.

[comp.prog.thoughts] У чтения хорошего кода есть большая проблема

Возвращусь к цитате из интервью Брайана Кернигана о чтении чужого кода:

Чтение чужого кода так же бесценно. Конечно, это подразумевает, что код хорош; я не вижу много пользы от чтения больших объемов плохого кода, разве что научиться не писать так.

Первоначально я перевел ее неправильно, указав, что чтение чужого кода не имеет ценности. По двум причинам:

  • ошибочно решив, что invaluable переводится как “не имеющий практической ценности”, вместо “бесценный”;
  • с чтением хорошего кода связана очень большая проблема.

Я подумал, что Керниган как раз намекает на эту проблему, поэтому-то и не предает значения чтению кода, потому не заглянул в словарь для точного перевода invaluable. :(

Так что же это за проблема такая? Может быть, это отсутствие хорошего кода? Нет. Хороший код встречается, и не так уж редко.

Главная проблема с хорошим кодом в том, что на него не обращаешь внимания. Ведь зачем программисту приходится читать чужой код? Не для того же, чтобы узнать, сколько пробелов используется в отступах (ну такое бывает, но крайне редко). Я читаю чужой код, чтобы понять, как в нем делаются конкретные вещи. Например, как организуется учет тайм-аутов при получении ответа SMTP сервера. Или как формируют HTTP-заголовки в SOAP запросе. Я ищу в коде решение конкретной задачи. И чем проще это решение найти, чем меньше я продираюсь сквозь код, тем код лучше. А вот с плохим кодом ситуация обратная: при попытке найти в коде суть решения основные усилия тратятся на борьбу с кодом. Плохой код, в отличии от хорошего, виден сразу.

Такие вот дела. Пожалуй, я не соглашусь с Керниганом. Чтение хорошего кода не очень полезно, т.к. можно даже не обратить внимание на то, насколько код хорош.

Чтение плохого кода так же не имеет большого смысла – ведь важно не столько понять, что код плох (это не сложно), и даже не почему он плох (это сложнее, в особенности, если приходится свои выводы оформлять для результатов code review). Самое сложное с плохим кодом – это понять, как же не писать такой код. А понять это – это научиться писать хороший код… Опаньки, а круг-то замкнулся… :)

11 комментариев:

Miroslav комментирует...

нуу батенька насчет чтения хорошего кода вы не правы. Хороший программист - ленивый программист. Если он видит короткое и простое решение того над чем мудохался долго и налепил кучу кода/багов он усваивает моментально и бессознательно.

eao197 комментирует...

Т.е., грубо говоря, увидел, как кто-то оформляет циклы, но сознание этого не отметило, а в подсознании отпечаталось... И потом подсознание само "руку направило"...

Да, такое возможно, согласен.

Skynin комментирует...

Заблуждение 10
Людей можно научить программированию, показывая им, как писать программы.
...
Дело вот в чем: изучая любой язык, мы в первую очередь учимся читать. Вы берете "Войну и мир", или "Дика и Джейн", или какое-то другое произведение и читаете. И вы не думаете, что можно написать "Дика и Джейн" или "Войну и мир", не изучив как можно больше примеров творчества умелых писателей. (Поверьте мне, написание "Дика и Джейн" тоже требует мастерства! Надо писать словами, входящими в словарь, соответствующий возрасту и знаниям читателей.)
Что же привело нас, занятых в индустрии ПО, на этот порочный путь, путь, на котором писать учат раньше, чем читать? Я даже не уверен, что знаю.

Роберт Гласс Факты и заблуждения профессионального программирования

eao197 комментирует...

> Что же привело нас, занятых в индустрии ПО, на этот порочный путь, путь, на котором писать учат раньше, чем читать? Я даже не уверен, что знаю.

Не могу согласиться. Хоть аналогии являются всего лишь приближениями, но все-таки придется ими воспользоваться.

Литература -- это отдельный вид творчества, в котором главную роль играют только мозги автора. Тогда как в ряде других областей (скажем, живопись, скульптура или даже слесарное дело) обучение начинается именно с "письма". Т.е. ученик делает рисунок или пилит какую-нибудь деталь. А потом ему показывают, в чем именно он ошибся и что именно он сделал не так. Таким образом приводятся в соответствие умение думать и умение делать руками. Без умения делать руками просмотры тысяч картин, скульптур или изделий из металла ни к чему не приведут.

Программирование, с одной стороны, похоже на литературную деятельность. Но не совсем. Все-таки это инженерная деятельность. И здесь так же нужно привести в согласованное состояние умение думать и "умение делать руками". А умение делать без опыта написания программ не получается. Нужно дать человеку возможность сначала сделать что-то самому. Чтобы потом показать, что именно он сделал не так. Только заработав собственные мозоли можно научиться ценить красоту чужого труда (мля, поэтично как получилось).

Наверное поэтому, программирование начинается с "письма", а не с "чтения".

Skynin комментирует...

Еще момент о важности "чтения" что у него указан, и согласен - программист бОльшую часть времени читает код, а не пишет. Причем - чаще чужой код, чем свой (это вытекает из факта сопровождения). Хотя свой, через годик - как чужой :)

Понятно что любая аналогия - это не доказательство, а упрощенное видение, по сходству процессов.

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

... обычный программист -- не столько математик, сколько лингвист
и философ в одном лице, активно применяющий положения формальной логики.
Ричи О'Бауэр
Программирование как высшая форма творчества

eao197 комментирует...

Процесс, используемый при проектировании и написании компьютерных программ, почти полностью идентичен тому, который используется, чтобы сочинять и писать книги.

Интересно, а в написании книг метод brute force так же используется? (copy-and-paste используется точно) :)

Ричи О'Бауэр
Программирование как высшая форма творчества


Недавно прочитал на каком-то HR-форуме: "ИТ-шники, пожалуй, самые большие снобы". Название статьи убеждает меня в этом :)

Skynin комментирует...

"ИТ-шники, пожалуй, самые большие снобы".
Как истинные графоманы :D

А если серьезно, то не только айтишники. Просто у айтишнирков больше голосов в инете, чтобы демонстировать свой снобизм :)

eao197 комментирует...

Программирование как высшая форма творчества

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

Skynin комментирует...

Но с заголовком и главной идеей о том ... Есть еще кучи профессий ...
А-а-а, это конечно. Просто стандарт мира потребителей, употреблять превосходные степени в описании качеств "продукта".
А про то что в программировании такое же количество рутины (напр спр у Гугла "Программирование — отстой!"), как и в любой другой профессии - помалкивать :)

eao197 комментирует...

А-а-а, это конечно. Просто стандарт мира потребителей, употреблять превосходные степени в описании качеств "продукта".

Да, это все объясняет :)

А про то что в программировании такое же количество рутины (напр спр у Гугла "Программирование — отстой!"), как и в любой другой профессии - помалкивать :)

Забавно: чем старше я становлюсь, тем спокойнее отношусь к рутине и все более насторожено к необходимости творчества (рождению новых идей). Наверное, действительно "война дело молодых"...

Skynin комментирует...

Наверное, действительно "война дело молодых"...
В обществах, где молодые люди 15 - 29-ти лет составляют больше 30% населения, конфликты гарантированно заканчиваются насилием.
Популяционная бомба