Белоснежно чистый код
Что такое чистый код? Это то, что все ищут, но никто не может найти. Люди редко могут сойтись на том, что это такое и как это реализовать на практике. Можно найти бесчисленное число статей на эту тему, и эта станет ещё одной. Я попытаюсь разобраться в том, что такое чистый код сам по себе, в отрыве от языков, парадигм и сфер применения.
Для начала, хочется подумать о месте приложения кода — о программе. Программа — это часть продукта, исполняемая на различных вычислительных устройствах. Это может быть сервер, мобильный телефон, браузер или даже кофемолка. Хоть продукт и состоит из множества составляющих (реклама, наполнение, в некотором смысле сообщество), сейчас мы ограничимся лишь программной составляющей. Это отступление необходимо, чтобы не возникло путаницы, будто программа и есть продукт. Программное обеспечение отражает или может отражать лишь часть задумки автора.
Разрабатывая часть проекта, мы опираемся на общую идею, на техническое задание. Я думаю, что в любой сфере деятельности выполнение задачи выглядит примерно так: мастер-исполнитель ознакамливается с заданием, планирует его реализацию и уже потом приступает к процессу непосредственного труда. Во всяком случае с программированием дела обстоят именно так. Программист читает ТЗ, прикидывает решение и пишет реализацию. Почему же кол иногда получается понятным, простым, а иногда — нет?
Программист в процессе написания кода занимается переводом образов из своей головы на некоторый язык, который сможет понять и компьютер, и другой человек. Программа есть ничто иное как необычный вид воплощения мыслей.
Всякий текст лёгок в понимании, только когда его автор глубоко проанализировал тему, всё обдумал, структурировал свои мысли и только после этого представил их «на бумаге». Все идеи долго обдуманы, а поэтому и просты. Ведь только такой и может быть хорошо понятая идея. Человеческий мозг не может содержать в себе слишком сложные объекты. Даже когда мы думаем о таких сложных вещах как свёртывание белков, в нашей голове не находится ничего сверхъестественного. Каждая идея ссылается на несколько других, а те в свою очередь ещё на другие… эти цепочки (графы) могут быть весьма обширными, но их звенья крайне примитивны. Если мы не можем представить идею как что-то древовидное, когда есть какие-то сложные и непонятные вещи, которые невозможно объяснить другим, это в сущности означает не более того, что мы сами не имеем полного понимания происходящего. Есть известный миф отсылающий к этому: если ты не можешь что-то объяснить 7 летнему ребенку, то ты и сам этого не понимаешь. Это правда за тем исключением, что объяснение дерева (графа) некоторой идеи может занимать столь много времени, что этому ребёнку будет уже далеко не семь лет, когда вы закончите.
Те же самые рассуждения применимы и к текстам, написанным не только на русском, английском или любом другом человеческом языке, но и для языков формальных.
Конечно, на любом языке можно высказать одну и ту же идею множеством способов, один сложней другого. Но сам навык представления мысли в простом виде общий. В романы Достоевского не надо вносить сюжетные правки при переводе с русского на немецкий: история рассказана уже понятно, красиво и глубоко. Здесь то же самое.
Без сомнения, необходимо учиться писать предложения грамотно, так, чтобы оно не было сухим или перегруженным, и тп. Есть общие приёмы этого, а есть локальные для данного языка. Но это лишь мишура. Есть такое понятие «язык автора»(например, «у Достоевского тяжёлый язык») и оно сюда идеально подходит. У каждого человека есть свой способ выбирать конструкции языка для формирования текста, но это лишь малая часть того, как передаётся авторская идея.
Все существующие парадигмы, паттерны проектирования, лучшие практики и тп представляют из себя ни что иное как популярные способы оформления идей. Это удобные протоптанные дорожки, которые всем знакомы. Проще говоря, шаблоны, такие как адаптер, трёхзвенная актовая структура, декораторы и тому подобные помогают читающему легче разобраться в произведении.
——————————
Чем больше человечество думает над объектом, тем лучше оно его понимает. Каждый программист должен стремиться к тому, чтобы в полной мере осознать задачу, чтобы мочь разбить её на простейшие части, чтобы собрать из этого конструктора красивую, простую и понятную программу.