Ода красивому коду Евгений Золотов

Ода красивому коду

Евгений Золотов

Опубликовано 04 апреля 2014

0 Какой красивый код!

10 Пусть тот, кто устал от этой фразы, первым бросит в меня камень. Это редкая и наверное самая ценная похвала, какой только может удостоиться программист. Деньги? Деньги платят за функционал. Но красоту программы способен оценить лишь человек, понимающий, как она работает, чего стоило её написать. Неуловимое, вечно ускользающее, всегда желанное для автора качество. Так нельзя ли его формализовать? Чтобы отныне и впредь наверняка писать только красивый код?

20 Красота — понятие размытое. Мы применяем его направо и налево, к живому и неживому, ухитряемся даже сравнивать на конкурсах, но не желаем, а может, и боимся признаться себе, что до конца не понимаем значение этого понятия — быть красивым. «Википедия» определяет красоту как способность объекта вызывать у наблюдателя эстетическое (в смысле — не привязанное к практической пользе) наслаждение. Проблема в том, что в любых двух точках пространственно-временно массива каноны красоты разнятся. 

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

40 Короче говоря, определиться даже с пониманием женской красоты мы оказались не в силах. Когда же дошло до машинного кода — субстанции, с которой человек никогда ранее дел не имел (программы для ткацких станков не в счёт), — можно было гарантированно начинать с чистого листа. Опыт цивилизации в этом отношении нулевой. Даже всезнающая «Википедия» молчит и самое близкое, что предлагает, — статью на тему что-токрасоты в математике (откуда мы кое-что почерпнём). Вот так и получается, что наиболее надёжный способ сформулировать критерии красивого кода — спросить людей, которые его пишут. За последние десять лет этот вопрос периодически звучал на просторах Сети то там, то здесь, так что я попытался обобщить — и вот что получилось (дополните или исправьте, если  упустил).

50 В первом приближении красота кода — это внешняя эстетика текста программы: хорошо организованная структура, выровненные строки, сгруппированные по смыслу элементы, пригнанные к формату комментарии. Но это вульгарное понимание, родственное попытке приравнять красоту к функциональности. Копните чуть глубже — и выяснится, что ключевую роль здесь играет простота. Похоже, красивый код должен быть максимально простым — таким, чтобы в нём не осталось ничего лишнего, но при этом он решал бы задачу, ради которой написан. Простоты, как правило, никто не требует, зато движение с ориентиром на неё даёт целый букет полезных свойств.

60 Простота способствуют скорейшему пониманию программы читающим её. Она гарантирует, что в коде будет минимум ошибок и слабых мест. С высокой вероятностью делает код минимальным по размеру, наименее требовательным к системным ресурсам и максимально быстрым. Наконец, простота почти наверняка означает, что проект не «рос по ходу дела», а был тщательно продуман, спроектирован ещё до того, как автор коснулся клавиатуры. Такая программа сравнительно легко может быть расширена, когда понадобится добавить в неё новый функционал. 

70 Не скажу за всех, но лично для меня эталоном простоты, моей «киберпалеолитической Венерой», навсегда останется короткий отрывок на ассемблере Intel 8080. Всего одна команда. Вот она:

XOR A

Надеюсь, те, кто программировал в восьмибитную эпоху, пережили сейчас несколько приятных секунд. Смысл этой операции — в обнулении регистра A. Того же можно достичь прямо, присвоением (MVI A,0), но «исключающее ИЛИ» позволяет сделать это короче, сэкономив один байт. Совсем не лишнее, когда вся оперативная память умещается в 64-килобайтную страницу! Впрочем, только ли из экономии так писали? XOR A была как удачно угаданная нота в музыкальной гамме: она дарила то самое эстетическое наслаждение!

80 Из этого примера очевидна и ещё одна важная вещь: простота и читабельность кода — не синонимы. Хорошо читаемый код получается не только благодаря изящной реализации алгоритма, но и наглядной визуальной структуре текста программы и, главное, хорошим комментариям. Словно лёгкий макияж, который не скрывает, а подчёркивает, помогает оценить красоту естественных черт, комментарии и структура делают замысел творца понятным с первого взгляда.

90 Читабельность — это резко возросшие шансы, что красоту программы оценит кто-то ещё, кроме вас. И даже что вообще код может быть сочтён красивым. Ведь не все согласны, что реальный код может быть красив: одно дело — чистая «математика», реализация алгоритма в чистом виде, другое — реальный мир, повседневные задачи, где приходится иметь дело с безобразными, плохо предсказуемыми вещами вроде орфографических ошибок, ненадёжных электрических контактов, невнимательных пользователей.

100 Кстати, самое время вспомнить и о ранее упомянутой красоте математических построений. Так вот: математики сходятся во мнении, что красота матобъекта обратно пропорциональна затраченным на его понимание усилиям. В точку! После такого можно даже согласиться с навязшим на зубах стереотипом, что программированию нужно учить параллельно с математикой!

110 Но давайте подведём итог. Что мы выяснили? Прежде всего — красота кода не зависит от языка. Программа может быть красивой на ассемблере и Malbolge — нашёлся бы человек, желающий и способный её оценить!

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

130 Наконец, третий и, возможно, самый приятный для программистской братии вывод: «наведение» красоты, её достижение — отнюдь не чисто механический процесс. Красивый код нельзя получить решейпингом, ренумерацией, оптимизацией. Для этого обязательно понадобится голова! И это в некотором смысле дарит нам надежду. Ведь роботы, которые уже подминают под себя фастфуд и журналистику, однажды доберутся и до программирования (доберутся-доберутся, вспомните комментарии к «Ошибке в автомобильном софте»!) — но и тогда, похоже, местечко для нас, человеков, всё-таки останется.

К оглавлению