Миллион Строк Плохого Кода

«Нет боли – нет выгоды», как гласит древняя восточная мудрость.

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

Недавний пост Дэвида Робинсона, аспиранта, занимающегося программированием в Принстонском университете, посвященный проверке кода, не только поднял важную проблему в повседневной жизни каждого, кому волей-неволей (или невольно) приходится делиться своим опытом с другие.

Исходный текст был относительно беззубым, однако пост перестал быть томным после появления в комментариях Джона Кармака.

Это история о плохом коде, который когда-то написал ваш покорный слуга.

Во время одного из моих первых университетских курсов я написал на Java программу, которая должна была читать файл размером 6 МБ на строку (этот файл представлял собой геном бактерий в формате FASTA).

Мой код выглядел так:

   

BufferedReader reader = new BufferedReader(new FileReader (file)); String line = null; String text = ""; while( ( line = reader.readLine() ) != null ) { text = text + line; }

Построение строки с помощью серии конкатенаций таким способом крайне неэффективно — на чтение файла у меня ушло буквально минут 40( С тех пор я узнал несколько лучших способов ).

Самое главное, что после прочтения файла весь оставшийся алгоритм в программе выполнился примерно за 10 секунд. Два дня я работал так: вносил изменения в код, запускал программу и успел посмотреть целый эпизод LOST до того, как программа завершила выполнение.

«Блин, в двенадцатой строке ошибка! Опять все новое.

" После многих перезапусков я наконец подумал: «Конечно, должен есть лучший способ сделать это».

Я обнаружил, что на Perl можно написать цикл, который сможет прочитать геном менее чем за одну секунду (и я не мог программировать на Perl лучше, чем на Java — Мне просто повезло).

Поэтому я сел и написал Perl-скрипт, который считывал файл, компилировал его в одну строку и распечатывал.

Затем моя Java-программа вызывала Perl-скрипт через командную строку, захватывала выходные данные и и сохраните его в строку.

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

Рассказать об этом случае из своей жизни меня вдохновил недавний комикс от XKCD о «качестве кода»:

Миллион строк плохого кода

Комикс нельзя назвать иначе, как «злым» — опытный программист не дает ни одного полезного совета, он лишь приводит гиперболические аналогии.

Но больше всего меня привлек ответ пациента: «Хорошо, я прочитаю руководство по стилю кодирования».

Разве живой человек отреагировал бы так, если бы с ним кто-то был так груб? Не будет ли ответ чем-то вроде: «Хорошо, это был последний раз, когда я показывал вам свой код» или даже: «Хорошо, думаю, мне пора бросить программирование»? Проблема присутствует и в научных исследованиях.

Есть много причин, по которым учёные публикуют свои статьи, не внося в них код (и они понятны), но смущение: «мой код слишком уродлив, чтобы его кому-либо передать», обычно возглавляет список.

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

Пока этот миллион не вылился, пытаться написать что-то хорошее бесполезно.

Так что иди и пиши! Мне это напомнило, когда я читал дискуссию, развернувшуюся по поводу XKCD выше:

Единственный способ написать хороший код — сначала написать тонны дерьмового кода.

Чувство стыда за плохой код мешает вам перейти к хорошему коду — Хэдли Уикхэм (@hadleywickham) 17 апреля 2015 г.

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

Представьте, что кто-то осудил вас так же, как я осудил себя выше.

Будете ли вы продолжать просить о помощи? Сможете ли вы справиться с миллионом строк?

Комментарий Джона Кармака

Не путайте слова «кто написал этот код — идиот» и «этот код — херня» — между ними есть существенная разница.

Комикс посвящен последнему.

Я предполагаю, что это было сделано намеренно.

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

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

Небольшой стыд часто становится положительной мотивацией.

Мне стыдно за большую часть кода, который я написал за последний год. У меня в голове есть мысли о причинах, почему все обернулось именно так - некоторые из них являются оправданиями, но некоторые из них являются чистыми: «Какого черта я вообще думал, когда писал этоЭ» И если вы не чувствуете себя немного виноватым из-за своей недавней работы, то, возможно, вам будет полезно, чтобы кто-нибудь указал на проблемы — в том смысле, что этот человек сможет прорваться через ваши «защитные механизмы».

Я был бы рад, если бы кто-нибудь покопался во всем коде, который я написал для Oculus Mobile SDK. Я уверен, что по большей части я сам рано или поздно стану этим читателем, а большей частью буду только кивать головой и соглашаться с написанным; однако я уверен, что смогу почерпнуть из этого что-то полезное, и это благотворно скажется на моей дальнейшей работе.

> > Вы проверяете код каждого коммита в Oculus? Нет. Мы добились определенного прогресса в этом направлении; Мне будет интересно посмотреть, что из этого получится.

Мы все еще находимся под сильным давлением темпов развития нашего стартапа.

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

ну, это звучало не очень полезно, не так ли? Мне кажется, вы путаете резкую критику с серьезной критикой.

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

> > Проверяли ли вы ранее код, написанный другими разработчиками id? Неофициально, и тогда мне этого было достаточно.

Мне не нравится делать обзоры кода; возможно, именно поэтому я высоко ценю критику.

Хоть Джон и признается, что отчасти не чурается резких комментариев в жизни, ему далеко до Линуса Торвальдса, который щедро сыплет свои письма личными оскорблениями, а свои речи - фразы в духе "Вы мне не интересны, меня волнуют технологии и ядро - вот что для меня действительно важно" и заявления о том, что «Никто тебя не услышит, если ты будешь мягким».

Теги: #плохой код #ревью кода #Джон Кармак #Разработка веб-сайта

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.