Что такое чистый код? Это то, что все ищут, но никто не может найти. Люди редко могут сойтись на том, что это такое и как это реализовать на практике. Можно найти бесчисленное число статей на эту тему, и эта станет ещё одной. Я попытаюсь разобраться в том, что такое чистый код сам по себе, в отрыве от языков, парадигм и сфер применения. 

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

Разрабатывая часть проекта, мы опираемся на общую идею, на техническое задание. Я думаю, что в любой сфере деятельности выполнение задачи выглядит примерно так: мастер-исполнитель ознакамливается с заданием, планирует его реализацию и уже потом приступает к процессу непосредственного труда. Во всяком случае с программированием дела обстоят именно так. Программист читает ТЗ, прикидывает решение и пишет реализацию. Почему же код иногда получается понятным, простым, а иногда - нет?

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

Всякий текст лёгок в понимании, только когда его автор глубоко проанализировал тему, всё обдумал, структурировал свои мысли и только после этого представил их «на бумаге». Все идеи долго обдуманы, а поэтому и просты. Ведь только такой и может быть хорошо понятая идея. Человеческий мозг не может содержать в себе слишком сложные объекты. Даже когда мы думаем о таких сложных вещах как свёртывание белков, в нашей голове не находится ничего сверхъестественного. Каждая идея ссылается на несколько других, а те в свою очередь ещё на другие… эти цепочки(графы) могут быть весьма обширными, но их звенья крайне примитивны. Если мы не можем представить идею как что-то древовидное, когда есть какие-то сложные и непонятные вещи, которые невозможно объяснить другим, это в сущности означает не более того, что мы сами не имеем полного понимания происходящего. Есть известный миф отсылающий к этому: если ты не можешь что-то объяснить 7 летнему ребенку, то ты и сам этого не понимаешь. Это правда за тем исключением, что объяснение дерева(графа) некоторой идеи может занимать столь много времени, что этому ребёнку будет уже далеко не семь лет, когда вы закончите.

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

Конечно, на любом языке можно высказать одну и ту же идею множеством способов, один сложней другого. Но сам навык представления мысли в простом виде общий. В романы Достоевского не надо вносить сюжетные правки при переводе с русского на немецкий: история рассказана уже понятно, красиво и глубоко. Здесь то же самое.

Без сомнения, необходимо учиться писать предложения грамотно, так, чтобы они не были сухими или перегруженными и т.п. Есть общие приёмы достижения этого, а есть локальные для данного языка. Впрочем, это лишь мишура. Есть такое понятие «язык автора»(например, «у Достоевского тяжёлый язык») и оно сюда идеально подходит. У каждого человека есть свой способ выбирать конструкции языка для формирования текста, но это лишь малая часть того, как передаётся авторская идея. Истории Достоевского велики благодаря своим идеям, а не благодаря тому, что обёрнуты в красивые слова.

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


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

Комментарии (34)


  1. kekoz
    04.11.2023 18:41
    +8

    Чистый код — это примерно такой же розовый пони, как ISO OSI. Прекрасно подходит для теоретического описания чего бы то ни было, но будучи воспринятым литерально порождает чудовищ.


  1. Algrinn
    04.11.2023 18:41
    +1

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


    1. 19Zb84
      04.11.2023 18:41
      +8

      читабельный код

      Это уже очень абстрактно. Одному читабельный, другому не читабельный.


      1. Pijng
        04.11.2023 18:41

        Часто слышу такое мнение в англоязычном комьюнити. В целом мысль понятна, но это какое-то обобщенное утверждение. Что-то сродни «все субъективно».

        Имхо, читабельный код – это скорее составной феномен. Поэтому и критерии ему дать сложно. Кто-то даже пытается с условным cognitive complexity анализом, но многим он не нравится. И не без причин.

        Но я тут в особого умника играть не буду, так как сам для себя еще в этом вопросе не определился :)


    1. Myclass
      04.11.2023 18:41

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


  1. 18741878
    04.11.2023 18:41
    +4

    Покажите свой код коллеге и попросите ответить честно - его не сильно стошнит, если ему придется этот код поддерживать? Если не сильно, то код нормальный и вполне чистый


    1. Skykharkov
      04.11.2023 18:41
      +7

      Очень помогает возвращаться к своему коду двух-трехлетней давности. Я фрилансер, так сказать, "в одно лицо" программирую. И то бывает мурашки по коже, когда читаешь своей старый код. Первая мысль - "ну какой дебил это писал вообще!". Прямо хорошо помогает сравнивать итерации в типовых задачах и совершенствовать их, добиваясь близости к идеалу. А "белоснежный код" есть. Это тот код который написали, но ни разу не запускали. Вещь в себе. Идеальная. Само совершенство.


      1. sshikov
        04.11.2023 18:41
        +1

        Это тот код который написали, но ни разу не запускали. 

        Ну да, никому не нужный )


        1. gev
          04.11.2023 18:41

          Я так и делаю =)


      1. SadOcean
        04.11.2023 18:41
        +2

        Кстати некоторый левелап был когда я понял, что от старого кода перестало воротить.

        Ну то есть всратенький, но ок, понять можно

        Возможно конечно просто перестал расти, как минимум в этом направлении


        1. KongEnGe
          04.11.2023 18:41

          Вот последние лет 15 уже на плато восприятия. Временами даже с цитатами из Уэллса: "Шесть, маленькое два сверху, крестик и закорючка. Господи, вот голова была!"


      1. yatanai
        04.11.2023 18:41
        -3

        Тоже фрилансер. Я пришёл к выводу что нужно выработать специфический стиль, при знании которого, всё написанное становится понятным.

        После этих изысканий у меня нет чувства что мой старый код воняет, но соблюдение стиля в итоге превращается в рутину. Я просто хочу написать класс обёртку, а в итоге надо прописать все мета-свойства явно, указать где какие конструкторы-операторы, а лишь потом написать int x; int y;//members

        ЗЫ а чистый код, о котором любят говорить, не существует. Если ты пишешь чисто, то значит что в 70% этот код нельзя расширить, в итоге надо либо переписывать либо фигню поверх писать. Есть практики пилить на всё подряд функции, но это превращается в итоге в IsThisStringHaveOneNumber(str), рано или поздно.


        1. gev
          04.11.2023 18:41
          +2

          Существует =)


      1. LaRN
        04.11.2023 18:41
        +1

        Скорее это код, который Не написали. Он чистый и прозрачный :)


    1. gev
      04.11.2023 18:41
      +1

      Показываю код Codemium, и прошу объяснить, что там происходит. Если описывает в терминах доменной области, а не в терминах функций, переменных и их манипуляций, то ок =)


  1. sshikov
    04.11.2023 18:41
    +4

    Я попытаюсь разобраться в том, что такое чистый код сам по себе, в отрыве от языков, парадигм и сфер применения. 

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

    Это то, что все ищут, но никто не может найти.

    Кто эти мифические все? Я вот не ищу. Код должен решать поставленную задачу, удовлетворять требованиям. Среди моих требований никогда не было такого, чтобы код был чистым. То есть, если оно даже и существует - оно никогда нигде не записано.

    иногда получается понятным, простым, а иногда - нет?

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


    1. 19Zb84
      04.11.2023 18:41
      -1

      Так не бывает. 

      Общая теория систем.

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

      Но правды ради сказать, для этого нужен формальный язык.
      например у Уемова это язык тернарного описания.

      > Кто эти мифические все? 
      не мифические, а абстрактные.

      Все кому это надо. Это дастаточно определенно. Что бы быть достаточным.


      1. sshikov
        04.11.2023 18:41
        +3

        Все кому это надо.

        И нахрена это кому-то надо? Понимаете, недостаток данной статьи именно в том, что не указано, что за проблему автор пытается решить. И вы ее тоже не сформулировали. Зачем вам чистый код? Чтобы что?

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

        А раз вы не знаете, куда вы хотите попасть, то вам все равно, в какую сторону пойти (почти цитата).


        1. ryanl
          04.11.2023 18:41

          Зачем вам чистый код? Чтобы что?

          Чтобы реализовывал ровно то, что описано в ТЗ и делал это рационально. Чистый код - это код, в который нечего добавить, и нечего исправлять.


          1. 19Zb84
            04.11.2023 18:41

            Это хороший код, но не идеальный.
            Идеальный код, это код который идеально взаимодействует с кодом ещё других программ.


            1. ryanl
              04.11.2023 18:41

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


              1. 19Zb84
                04.11.2023 18:41

                Ну почему ?
                Например, есть функция, которая обрабатывает строки.

                Во втором приложение нужна эта же функция, что бы обрабатывала числа.

                пишется функция, которая обрабатывает и числа и строки.

                Второй вариант более идеален, чем первый.


        1. 19Zb84
          04.11.2023 18:41

          И нахрена это кому-то надо?


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

          Как пример я знаю программистов, которые пишут лучше всех, но написать то то конкретное не могут.

          Например на одной работе была такая последовательность действий.

          * Дают задачу
          * Описываешь как ты её будешь делать
          * Апрувят описание
          * Пишешь реализацию

          Это достаточно хороший метод. Процентов 70 -80 ошибок исчезают на стадии описания.

          Такие размышления дают четкое понимание, что такое хороший код.
          Это уменьшает время разработки.
          Если комманда из 5 чеовек точно знает одинакого, что такое хорошо, а что плохо, тогда код ревью будет занимать 1 минуту.

          Да много где это требуется.
          Можно конечно без этого. Будет все то же самое, но код будет развиваться в зависимости от чьего то мнения, которое может быть правильным, а может и не быть.

          > у меня никогда не было такой потребности

          А у меня небыло потребностей использовать матрицы или разыминование указателя...Но это не значит, что это бесполезные вещи.

          > А раз вы не знаете, куда вы хотите попасть

          Неправильно. Понимание куда хочется попасть есть. нет четкого пути для достижения этого.

          Например у нас страна строила коммунизм 70 лет. Они знали что хотят, но не знали как к этому придти.

          Это понятие идеала из эстетики.


          1. amatoravg
            04.11.2023 18:41

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


      1. Pshir
        04.11.2023 18:41

        Слово «код» по определению подразумевает использование конкретного языка программирования. Собственно, вы и сами пишете, что для рассмотрения системы в отрыве от языка нужно использовать... другой язык. То, что этот язык не используется непосредственно программистами для написания программ, ничего не меняет.


  1. alexdora
    04.11.2023 18:41
    +3

    Это то, что все ищут, но никто не может найти.

    Я не ищу чистый код. Ищу внятную доку или хорошие комментарии. А если все работает, стараюсь не лезть по капот.

    что такое чистый код сам по себе, в отрыве от языков

    В отрыве от языков? Например в Golang жестко фиксировали язык при разработке и за это большое спасибо Гуглу. Любой чужой проект читается на одном дыхании.

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

    Мне статья не понравилась, вода водой, про высокие материи и без понимания предмета


  1. 19Zb84
    04.11.2023 18:41
    -2

    А хорошо в статье минимум, и все по теме.

    Эта тема очень близка к общей теории систем.
    Если искать ответ на вопрос, что такое объект и что такой чистый код, Можно это попробовать сделать на основе трудов Уемова


  1. thegriglat
    04.11.2023 18:41
    +3

    Идеальный код -- не существует, но работает.


  1. Master255
    04.11.2023 18:41
    -2

    Белоснежно чистый код - это настоящий код. Код выгодный компьютерам и пользователям. Пример кода https://github.com/arvidn/libtorrent

    И ещё есть говнокод. Думаю, вы знаете.

    И корпоративный код - код выгодный предприятиям.

    Возможно есть что-то ещё. Но эти три вида кода - база.


  1. arTk_ev
    04.11.2023 18:41

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

    Для поиска оптимального решения, нужно сделать сразу несколько решений:

    1) С минимальным изменением кода и с костылями. Такие решения допустимы во время хотфиксов, но вещает тех.долг. На практике такое решение потребует значительно больше времени даже чем другие.

    2) Идеальное решение. Решение по правилам чистого кода, без костылей с неограниченым рефакторингом и времени, либо решение согласно пейперу.

    3) Гениальное решение. Решение с минимальными изменениями, после которого кода становится меньше чем было. Быстрое и простое, которое одновременное решает множество проблем.Такое решение теоритически существует всегда.

    4) Ленивое решение. Решение ничего не делать, задача решиться сама собой. На удивление , это самое частое решение, если гениальные решений были до этого.

    Комбинация из 4-х решений и даст оптимальное решение. Грязный код не позволит сделать 2, 3 4, в нем возможно только решение 1.


  1. vvbob
    04.11.2023 18:41

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


    1. GoogleTan Автор
      04.11.2023 18:41

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


  1. tremp
    04.11.2023 18:41
    +1

    Ощущение, что текст сгенерирован нейросетью.


  1. duke_alba
    04.11.2023 18:41

    Мне больше нравится писать красивый код. Далеко не всегда получается, правда :-)