«Нет боли – нет выгоды», как гласит древняя восточная мудрость.
И пусть мудрость не древняя и не восточная, лично для меня самый ценный жизненный опыт зачастую был самым болезненным.
Недавний пост Дэвида Робинсона, аспиранта, занимающегося программированием в Принстонском университете, посвященный проверке кода, не только поднял важную проблему в повседневной жизни каждого, кому волей-неволей (или невольно) приходится делиться своим опытом с другие.
Исходный текст был относительно беззубым, однако пост перестал быть томным после появления в комментариях Джона Кармака.
Это история о плохом коде, который когда-то написал ваш покорный слуга.
Во время одного из моих первых университетских курсов я написал на Java программу, которая должна была читать файл размером 6 МБ на строку (этот файл представлял собой геном бактерий в формате FASTA).
Мой код выглядел так:
Построение строки с помощью серии конкатенаций таким способом крайне неэффективно — на чтение файла у меня ушло буквально минут 40( С тех пор я узнал несколько лучших способов ).BufferedReader reader = new BufferedReader(new FileReader (file)); String line = null; String text = ""; while( ( line = reader.readLine() ) != null ) { text = text + line; }
Самое главное, что после прочтения файла весь оставшийся алгоритм в программе выполнился примерно за 10 секунд. Два дня я работал так: вносил изменения в код, запускал программу и успел посмотреть целый эпизод LOST до того, как программа завершила выполнение.
«Блин, в двенадцатой строке ошибка! Опять все новое.
" После многих перезапусков я наконец подумал: «Конечно, должен есть лучший способ сделать это».
Я обнаружил, что на Perl можно написать цикл, который сможет прочитать геном менее чем за одну секунду (и я не мог программировать на Perl лучше, чем на Java — Мне просто повезло).
Поэтому я сел и написал Perl-скрипт, который считывал файл, компилировал его в одну строку и распечатывал.
Затем моя Java-программа вызывала Perl-скрипт через командную строку, захватывала выходные данные и и сохраните его в строку.
Если бы у меня еще была эта программа, я бы распечатал ее исходный код и повесил в рамке на стену, чтобы почаще напоминать себе, что никогда и никого не буду ругать за написание «плохого» кода.
Рассказать об этом случае из своей жизни меня вдохновил недавний комикс от XKCD о «качестве кода»:
Комикс нельзя назвать иначе, как «злым» — опытный программист не дает ни одного полезного совета, он лишь приводит гиперболические аналогии.
Но больше всего меня привлек ответ пациента: «Хорошо, я прочитаю руководство по стилю кодирования».
Разве живой человек отреагировал бы так, если бы с ним кто-то был так груб? Не будет ли ответ чем-то вроде: «Хорошо, это был последний раз, когда я показывал вам свой код» или даже: «Хорошо, думаю, мне пора бросить программирование»? Проблема присутствует и в научных исследованиях.
Есть много причин, по которым учёные публикуют свои статьи, не внося в них код (и они понятны), но смущение: «мой код слишком уродлив, чтобы его кому-либо передать», обычно возглавляет список.
Те, кто стремится пристыдить других за код, в этом деле не очень помогают! Знаменитый совет начинающим писателям гласит: «Каждый из нас таит в себе миллион плохих строк.
Пока этот миллион не вылился, пытаться написать что-то хорошее бесполезно.
Так что иди и пиши! Мне это напомнило, когда я читал дискуссию, развернувшуюся по поводу XKCD выше:
Единственный способ написать хороший код — сначала написать тонны дерьмового кода.
Чувство стыда за плохой код мешает вам перейти к хорошему коду — Хэдли Уикхэм (@hadleywickham) 17 апреля 2015 г.
В следующий раз, когда вы, опытный программист, захотите пристыдить кого-то за его код, попробуйте вспомнить свой собственный миллион строк кода.
Представьте, что кто-то осудил вас так же, как я осудил себя выше.
Будете ли вы продолжать просить о помощи? Сможете ли вы справиться с миллионом строк?
Комментарий Джона Кармака
Не путайте слова «кто написал этот код — идиот» и «этот код — херня» — между ними есть существенная разница.Комикс посвящен последнему.
Я предполагаю, что это было сделано намеренно.
Нападки на автора вряд ли принесут какую-либо пользу, но должна быть возможность строго критиковать сам код. В реальной жизни многим авторам трудно отделить себя от своей работы, но научиться делать это — ценный навык.
Предоставленные самим себе, большинство людей демонстрируют нерушимую способность игнорировать свои недостатки, а это пагубно сказывается на их профессиональном росте.
Небольшой стыд часто становится положительной мотивацией.
Мне стыдно за большую часть кода, который я написал за последний год. У меня в голове есть мысли о причинах, почему все обернулось именно так - некоторые из них являются оправданиями, но некоторые из них являются чистыми: «Какого черта я вообще думал, когда писал этоЭ» И если вы не чувствуете себя немного виноватым из-за своей недавней работы, то, возможно, вам будет полезно, чтобы кто-нибудь указал на проблемы — в том смысле, что этот человек сможет прорваться через ваши «защитные механизмы».
Я был бы рад, если бы кто-нибудь покопался во всем коде, который я написал для Oculus Mobile SDK. Я уверен, что по большей части я сам рано или поздно стану этим читателем, а большей частью буду только кивать головой и соглашаться с написанным; однако я уверен, что смогу почерпнуть из этого что-то полезное, и это благотворно скажется на моей дальнейшей работе.
> > Вы проверяете код каждого коммита в Oculus? Нет. Мы добились определенного прогресса в этом направлении; Мне будет интересно посмотреть, что из этого получится.
Мы все еще находимся под сильным давлением темпов развития нашего стартапа.
> > Ваш комментарий к статье выглядит как обезьяна, прокатившаяся по клавиатуре, а потом вы просто для галочки проделали автокоррекцию.
ну, это звучало не очень полезно, не так ли? Мне кажется, вы путаете резкую критику с серьезной критикой.
Вы заметили, что моя последняя фраза не так обидна и в то же время принесла больше смысла, чем первая? Обычно лучше всего действуют тактичные и полезные комментарии, но бывают случаи, когда необходим определенный минимум «энергии активации», чтобы комментарий подействовал на человека.
> > Проверяли ли вы ранее код, написанный другими разработчиками id? Неофициально, и тогда мне этого было достаточно.
Мне не нравится делать обзоры кода; возможно, именно поэтому я высоко ценю критику.
Хоть Джон и признается, что отчасти не чурается резких комментариев в жизни, ему далеко до Линуса Торвальдса, который щедро сыплет свои письма личными оскорблениями, а свои речи - фразы в духе "Вы мне не интересны, меня волнуют технологии и ядро - вот что для меня действительно важно" и заявления о том, что «Никто тебя не услышит, если ты будешь мягким».
Теги: #плохой код #ревью кода #Джон Кармак #Разработка веб-сайта
-
Как Оптимизировать Mac — Мощное Руководство.
19 Oct, 24 -
Несовершенное Эго
19 Oct, 24 -
Sali — Ваш Язык Программирования.
19 Oct, 24