Что такое хороший код? Считаем звёзды

Никогда такого не было, и вот опять! Опять на прошлой неделе на Хабре появился (и был очень активно комментирован) пост, ныне удалённый, о том, что такое хороший код и чем он отличается от плохого. Яндекс подсказывает, что публикаций о хорошем (вариант: отличном, идеальном, правильном, чистом, грязном, плохом и т.д.) коде здесь уже десятки и сотни, появляются они стабильно на протяжении многих лет, всегда активно обсуждаются, но к единому мнению на этот счёт так и не пришли.

Этот код тянет как минимум на одну звезду :)
Этот код тянет как минимум на одну звезду :)

Моё мнение - нет никакого "хорошего кода", потому что само понятие "хороший" крайне субъективно и неизмеримо. Так, может, нужна линейка для измерения хорошести качества кода? В общем, предлагаю вашему вниманию шкалу из 5 значений (ну или 6, начиная с нулевого - мыжпрограммисты), а для наглядности они обозначены звёздами. Впрочем, вы можете заменить звёзды на даны, школьные баллы, попугаи или любые другие единицы измерения - суть не изменится. Погнали!

0 звёзд - неработоспособный код

Это код, либо в принципе неработоспособный (например, из-за ошибок и опечаток), либо не исполняющий требуемых задач. Дальнейшие оценки его качества, как правило, лишены смысла. Чаще всего он появляется у начинающих программистов и проходит с опытом. К счастью, современные средства разработки помогают даже новичку быстро находить и исправлять ошибки в коде, поэтому если прогер не работает в блокноте (или, хуже того, на бумажке - признавайтесь, кто так проводит собеседования!), то и вероятность такого результата сравнительно низка.

⭐ Одна звезда - минимально работоспособный код

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

Такой код в настоящее время распространён повсеместно. Причин этому несколько, вот наиболее заметные:

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

⭐⭐ Две звезды - быстрый код

Код, который не просто работает, но ещё и работает достаточно быстро. Можно сказать, что этот код оптимизирован по процессорной вычислительной мощности. Одно из формальных определений:

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

На практике эффективность по времени иногда определяется не по этому учебно-тренировочному критерию, а по объективным целям и задачам проекта, и может быть задана как относительно ("на каждый N не больше k"), так и абсолютно ("открывать окно не дольше 0,5 секунды") или даже субъективно ("не менее 80% опрошенных согласились, что программа открывается мгновенно").

Этот критерий поставлен выше, чем оптимизация по памяти, потому что от него зависит взаимодействие программы с людьми. Компьютер - фиг бы с ним, на то он и робот ("раическое бездушное устройство" по Чапеку), чтобы работать, а вот человек должен быть счастлив.

Умение писать быстрый код - очень полезный навык и признак того, что программист уже не новичок. Однако ему есть к чему стремиться!

⭐⭐⭐ Три звезды - оптимизированный код

Код, который задействует условно небольшое количество памяти при работе. Можно сказать, что он оптимизирован не только по процессорной мощности, но и по оперативной памяти.

На практике такой код важен, поскольку память - ресурс всё же исчерпаемый, и чем обильнее создаётся однозвёздочный код, тем быстрее он исчерпывается. Выжрав много памяти, программа может аварийно выгрузиться либо банально начать тормозить. Оптимизированный код уже можно называть хорошим, а программу - не бить по наглой рыжей морде.

Создание такого кода - признак определённого мастерства.

⭐⭐⭐⭐ Четыре звезды - компактный код

Код, который сам имеет минимальный объём. Можно сказать, что он оптимизирован и по процессору, и по оперативке, и по накопителю.

В наши дни фактор компактности отошёл на второй план. Накопители данных стремительно дешевеют, многое уходит в облака, а шутки про очередную игру весом под сто гигов не влияют на её популярность - ну сто и сто, на диске всё равно полно места. Однако в стародавние времена, когда компьютеры были большими, это было реально важно (см. История одного байта).

Обычный программист может при желании слегка усечь объём кода: заменив повторяющиеся куски на функции, используя однобуквенные переменные или даже через #define заблаговременно переименовать все команды языка в более краткие, если это оказывается выгодно. Однако всё это, конечно, баловство, которое приносит минимальный результат и в целом скорее вредит. Для того, чтобы принципиально сократить код путём его полной переработки, требуется очень высокая квалификация.

⭐⭐⭐⭐⭐ Пять звёзд - идеальный код

Код, который не только отлично оптимизирован, но и прекрасен: легко читаем, красиво оформлен, в нужных местах прокомментирован, понятен будущим поколениям программистов. Высший пилотаж от мира IT. Дальнейшие комментарии, как говорится, излишни.

Выводы

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

@StjarnornasFred
22.02.2021 22:04 UTC
Первоисточник

Комментарии

@Lailore
22.02.2021 17:07 UTC
0
Эм, пропущена стадия — «понятный код».
@JustDont
22.02.2021 18:16 UTC
+4

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

@Dr_Sigmund
22.02.2021 18:23 UTC
+7
На мой взгляд, так себе классификация. Во-первых, перечисленные уровни звёзд не являются вложенными множествами. Куда отнести код, который является компактным, но при этом весьма неэффективным по скорости работы и использованию памяти?
Во-вторых, отнесение неработоспособного кода к 0-й категории мне кажется довольно странным. Хорошо написанный (с точки зрения других критериев — скорости, оптимальности, читабельности и т.д.) код, содержащий ошибки, может быть гораздо легче и дешевле довести до работоспособного состояния, чем код, в принципе правильно работающий, но использующий неэффективный алгоритм.
Наконец, не упомянут такой важный критерий, как наличие ошибок, не проявляющихся при обычной работе кода, но потенциально способных вызвать проблемы при определённых условиях. Код, не содержащий защиты от переполнения буфера, может прекрасно работать годами, если буфер достаточно велик, пока однажды сервер не грохнется по непонятной причине, или же эта дыра не будет использована для взлома.
@
22.02.2021 18:26 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
23.02.2021 10:24 UTC
+1
Это вы еще про деньги забыли упомянуть (т.е. про стоимость разработки). И про скорость той же разработки.

>И ответ на вопрос
Совсем не очевиден. Примитивный одномерный критерий. При том что реальная разработка как минимум бывает «быстро, качественно, дешево — выберите любые два пункта».
@cranium256
22.02.2021 18:54 UTC
+3
Как-то всё примитивно получилось. Как оценка приложения в условном GooglePlay: как-то работает — одна звёздочка, хорошо работает, да ещё и удобный интерфейс — пять звёздочек. А что там под капотом у приложения — никого не интересует.

Понятие совершенного кода, imho, в первую очередь подразумевает код, который лёгок в сопровождении, расширении и модификации. Всё остальное: читаемость, комментарии, алгоритмы, оптимизации — вытекает из этого. Не говоря уж о том, что код должен работать и выполнять свою задачу.
@Fen1kz
22.02.2021 19:27 UTC
+4

Очень ироничный скриншот — по автору это получается идеальный код. Быстрый, оптимизированный, компактный, легко читать.


Ни слова про расширяемость. Поступила задача рисовать не 5 конечную звезду, а 7? Ну всё, приехали.

@Dr_Sigmund
23.02.2021 00:19 UTC
0
Поступила задача рисовать не 5 конечную звезду, а 7?

А нет ли здесь антисемитизма? (Это шутка, если что.)
@kovserg
22.02.2021 20:13 UTC
+2

Разные классификации могут быть. Например:


  • ненужный код
  • не критичный код
  • код который участвует в получении прибыли
  • и код, где если что-то пойдёт не так всем трындец
@AlexTheLost
23.02.2021 10:18 UTC
+1

Главное уточнить хороший код для кого/чего. Для машины это явно — тот который требует меньше ресурсов на выполнение. А для человека — тот который ему будет легче понять.
По моему мнению трудность в понимании кода другими сегодня это основная проблема в промышленной разработке.
Пришел к выводу что легкий для восприятия код это простой код т.е. с минимальным кол-во элементов и связей между ними. Другими словами проблема комбинаторная.
Поэтому при рефакторинге, считаю, нужно уделять внимание не добавлению абстракций а уменьшению кол-ва элементов и связей между ними — явных и неявных.

@JustDont
23.02.2021 11:02 UTC
0
Поэтому при рефакторинге, считаю, нужно уделять внимание не добавлению абстракций а уменьшению кол-ва элементов и связей между ними — явных и неявных.

Т.е. идеал кода — public static void main() и далее весь проект внутри?

23.02.2021 22:01 UTC
0

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

@Deosis
24.02.2021 06:27 UTC
0

У автора две звезды получит код только с линейной сложностью. То есть даже сортировка отпадает.