Никогда такого не было, и вот опять! Опять на прошлой неделе на Хабре появился (и был очень активно комментирован) пост, ныне удалённый, о том, что такое хороший код и чем он отличается от плохого. Яндекс подсказывает, что публикаций о хорошем (вариант: отличном, идеальном, правильном, чистом, грязном, плохом и т.д.) коде здесь уже десятки и сотни, появляются они стабильно на протяжении многих лет, всегда активно обсуждаются, но к единому мнению на этот счёт так и не пришли.
![Этот код тянет как минимум на одну звезду :) Этот код тянет как минимум на одну звезду :)](https://habrastorage.org/getpro/habr/upload_files/876/e61/980/876e61980162150068f23d1d1704df44.jpg)
Моё мнение - нет никакого "хорошего кода", потому что само понятие "хороший" крайне субъективно и неизмеримо. Так, может, нужна линейка для измерения хорошести качества кода? В общем, предлагаю вашему вниманию шкалу из 5 значений (ну или 6, начиная с нулевого - мыжпрограммисты), а для наглядности они обозначены звёздами. Впрочем, вы можете заменить звёзды на даны, школьные баллы, попугаи или любые другие единицы измерения - суть не изменится. Погнали!
0 звёзд - неработоспособный код
Это код, либо в принципе неработоспособный (например, из-за ошибок и опечаток), либо не исполняющий требуемых задач. Дальнейшие оценки его качества, как правило, лишены смысла. Чаще всего он появляется у начинающих программистов и проходит с опытом. К счастью, современные средства разработки помогают даже новичку быстро находить и исправлять ошибки в коде, поэтому если прогер не работает в блокноте (или, хуже того, на бумажке - признавайтесь, кто так проводит собеседования!), то и вероятность такого результата сравнительно низка.
⭐ Одна звезда - минимально работоспособный код
Код, который успешно исполняется и при этом исполняет требования рабочего задания. Вот и всё. Дальнейшие оценки его качества - оптимизация, читаемость и тому подобное - в рамки этого уровня качества не вписываются. От однозвёздочного кода требуется просто работать, вот и ладно.
Такой код в настоящее время распространён повсеместно. Причин этому несколько, вот наиболее заметные:
Аппаратный прогресс: рост вычислительных мощностей, удешевление памяти. Кажется, что программы незачем оптимизировать - ведь и так будет летать, эти восемь ядер всё сожрут!
Массовая цифровизация, из-за которой техзадания программистам ставят люди, далёкие от IT (например, руководители заводов) и они в принципе не могут оценить качество кода.
Высокие зарплаты в IT активно привлекают всех-всех-всех, которые трудоустраиваются, пройдя курсы "вайти-вайти за месяц" и имея соответствующие навыки.
Высокие зарплаты в IT стимулируют экономию со стороны руководителей - они нанимают тех, кто готов работать за минимальные деньги (прямиком из предыдущего пункта).
Справедливости ради: не всегда это плохо. Если разработка маломасштабная, то её и оптимизировать особо незачем (и так летать будет, ну ведь правда же!). Так или иначе, такой код обычно пишут начинающие программисты и по мере обретения опыта переходят на уровень выше.
⭐⭐ Две звезды - быстрый код
Код, который не просто работает, но ещё и работает достаточно быстро. Можно сказать, что этот код оптимизирован по процессорной вычислительной мощности. Одно из формальных определений:
Программа считается эффективной по времени, если время работы программы пропорционально количеству элементов последовательности поступивших данных N, т.е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз.
На практике эффективность по времени иногда определяется не по этому учебно-тренировочному критерию, а по объективным целям и задачам проекта, и может быть задана как относительно ("на каждый N не больше k"), так и абсолютно ("открывать окно не дольше 0,5 секунды") или даже субъективно ("не менее 80% опрошенных согласились, что программа открывается мгновенно").
Этот критерий поставлен выше, чем оптимизация по памяти, потому что от него зависит взаимодействие программы с людьми. Компьютер - фиг бы с ним, на то он и робот ("раическое бездушное устройство" по Чапеку), чтобы работать, а вот человек должен быть счастлив.
Умение писать быстрый код - очень полезный навык и признак того, что программист уже не новичок. Однако ему есть к чему стремиться!
⭐⭐⭐ Три звезды - оптимизированный код
Код, который задействует условно небольшое количество памяти при работе. Можно сказать, что он оптимизирован не только по процессорной мощности, но и по оперативной памяти.
На практике такой код важен, поскольку память - ресурс всё же исчерпаемый, и чем обильнее создаётся однозвёздочный код, тем быстрее он исчерпывается. Выжрав много памяти, программа может аварийно выгрузиться либо банально начать тормозить. Оптимизированный код уже можно называть хорошим, а программу - не бить по наглой рыжей морде.
Создание такого кода - признак определённого мастерства.
⭐⭐⭐⭐ Четыре звезды - компактный код
Код, который сам имеет минимальный объём. Можно сказать, что он оптимизирован и по процессору, и по оперативке, и по накопителю.
В наши дни фактор компактности отошёл на второй план. Накопители данных стремительно дешевеют, многое уходит в облака, а шутки про очередную игру весом под сто гигов не влияют на её популярность - ну сто и сто, на диске всё равно полно места. Однако в стародавние времена, когда компьютеры были большими, это было реально важно (см. История одного байта).
Обычный программист может при желании слегка усечь объём кода: заменив повторяющиеся куски на функции, используя однобуквенные переменные или даже через #define
заблаговременно переименовать все команды языка в более краткие, если это оказывается выгодно. Однако всё это, конечно, баловство, которое приносит минимальный результат и в целом скорее вредит. Для того, чтобы принципиально сократить код путём его полной переработки, требуется очень высокая квалификация.
⭐⭐⭐⭐⭐ Пять звёзд - идеальный код
Код, который не только отлично оптимизирован, но и прекрасен: легко читаем, красиво оформлен, в нужных местах прокомментирован, понятен будущим поколениям программистов. Высший пилотаж от мира IT. Дальнейшие комментарии, как говорится, излишни.
Выводы
Понятно, что моя классификация далека от идеала. Например, как классифицировать красиво оформленный, но при этом неоптимизированный код, если оптимизация не очень важна? Поэтому я не претендую на высшую истину в этом вопросе, но надеюсь, что эта заметка поможет приблизиться к таковой, дав пищу для размышлений.