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

Чтение — это больно

Я сидел за своим столом с сокрушительной головной болью, копаясь в коде, который мне лгал, обсуждая, как пишется файл, но не почему, и скрывая смысл. Попытка наскрести какое-то подобие идеи о том, что происходит; чтобы чувствовать себя комфортно, внося изменения. Больше раз, чем я хотел бы признать, я был в ситуациях, когда я не был на 100% уверен, что моя смена в безопасности. Я всегда чувствую, что где-то я что-то упустил или неправильно понял. Это обычное чувство¹. Плохой код замедляет вас, утомляет, расстраивает, принижает и выставляет напоказ.

Мы ожидаем эту боль. Мы предполагаем, что эта боль исчезнет, ​​если у нас будет больше знаний или если мы потратим время на то, чтобы втереть систему в свой мозг. Это не позволяет увидеть, что даже с многолетним опытом код, который мы видим, не прост для понимания, и больше знаний не сделало его более читабельным. Он никогда не был написан с мыслью о других людях.

Тот факт, что мы не можем понять код, больше связан с тем, кто является целевой аудиторией, чем с нашей способностью его читать. Читать код — это как быть археологом. Мы раскрываем нашу находку и просеиваем код. Попытка понять, чего группа людей на протяжении многих лет пыталась достичь. У нас есть артефакты их понимания, их компетентности, заботы и давления. От них ожидается, что у нас будет достаточно понимания кода, чтобы увидеть, что важно, а что нет, на какие вопросы он пытался ответить и ограничения, в которых на них были даны ответы.

То, как мы учимся, определяет, как мы пишем код

Бзз стук. Статика быстро пропадает, показывается синий экран. Готовый. Мигающий курсор терпеливо ждет, пока я скажу ему, что делать. Это мои первые воспоминания об обучении программированию. Я был взволнован перспективой управлять этой машиной, научившись общаться с ней, я мог заставить ее делать что-то для меня, создавать миры!

10 PRINT "HELLO, WORLD!" 
20 GOTO 10

Если бы только научиться программировать было легко. Когда мы впервые начинаем программировать, все представляет собой борьбу. Мы спотыкаемся о язык, засасываемся бесконечными фреймворками, спотыкаемся в темноте и в конце концов: «Привет, мир!» Эта борьба заставляет нас смотреть одну строку кода за другой. Сделай это, затем сделай то. Мы учимся мыслить шагами; проверить наличие воды в чайнике, включить чайник, пока не закипит — ждать. Шаг за шагом. Это небольшие единицы работы, которые мы описываем на языке, понятном компьютеру. Мы говорим компьютеру, что делать и как это делать.

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

Язык компьютера

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

Современные языки позволили нам создавать более сложные системы. Снимая ограничения на имена, обеспечивая более контролируемую модульность и более высокие уровни абстракции. Мы медленно уходим от языка машины и движемся к более человеческому языку.

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

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

Боль написания кода

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

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

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

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

Давайте попробуем что-нибудь еще

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

Мы все авторы кода. Наша работа заключается в том, чтобы наш код объяснялся нашей аудитории. Не так, как принято считать, задача читателя — узнать больше.

Возможно, у вас в голове слишком много идей, а пальцы слегка танцуют на клавишах. Строка за строкой появляется на экране, как будто ваш разум слился с ней. Или вы держите голову в руках, не зная, как двигаться дальше. Вы пробуете что-то. Запустить его. Прочитайте некоторые документы. Запустить его. Переполнение стека. Запустить его. Медленно, но верно вы находите решение.

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

Теперь, когда вы поняли, что хотите сказать, теперь вам нужно придумать, как лучше это сказать. Черновики пересматриваются, отличная работа не выпадает из головы в Visual Studio Code. Рассмотрим используемый язык, объясняет ли он себя людям, отражает ли BlockContentGet(5, bool) тот факт, что мы получаем последние новости?

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

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

Вывод

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

Ключом к читабельности является общение. Не говоря о машинах, о последовательности, выборе и итерации. Но друг другу, сообщая идеи и намерения. Сдвиг в перспективе, который ожидает большего и дает больше. Ориентация на реалии команд и сложных систем, где сбои в коммуникации обходятся дорого. От более настраиваемого к меньшему, от соглашения к дизайну. Более четко сообщать о наших изменениях и вносить изменения с позиции понимания.

Вы автор, и вы несете ответственность.

[1] Исследование показало, что мы тратим в среднем 58% нашего времени на понимание кода. https://www.researchgate.net/publication/318811113_Measuring_Program_Comprehension_A_Large-Scale_Field_Study_with_Professionals

Первоначально опубликовано на https://barryjones.me.uk.