Кажется, мы делаем всё, чтобы писать хороший код: читаем книги, слушаем подкасты, ходим на конференции и изучаем лучшие практики. Почему же результат оставляет желать лучшего? Новые языки осваиваются медленно, код превращается в адского монстра, а джуны месяцами учатся понятно называть идентификаторы.
Позвали Григория Петрова, DevRel’а Evrone.com (ex. Voximplant, Radmin, Digital October Center) и вдохновителя сообщества Moscow Python, рассказать, как писать хороший код самому и научить команду. А еще обсудили, как понять, какие механизмы нас тормозят, и как посмотреть на нейрофизиологию через призму прикладной разработки и руководства технической командой. Разговор оказался настолько интересным, что сделали статью по его следам.
Наш гость сам себя называет генералистом. Пишет на большинстве мейнстримовых языков разработки, кроме Haskell, и интересуется нейрофизиологией. В какой-то момент он посмотрел на свой предыдущий опыт работы и понял, что ему нравится писать документацию, объяснять сложные вещи простым языком и общаться с разработчиками, но не руководить. Поэтому позиция DevRel (Developer Relations) оказалась для него оптимальной.
Хороший код, что это?
Объективные критерии назвать сложно, у каждого свое мнение. Главное - понять, для чего мы пишем код. Конечно, есть разработчики, которые относятся к коду как к искусству, но в основном он нужен бизнесу, чтобы решать бизнес-задачи и позволять людям взаимодействовать друг с другом и с информацией. Добавим, что IT как индустрии всего лет
Плохой код - когда бизнес просит поменять цвет кнопки, а разраб отвечает, что это займет неделю, и это не отговорка, а реальное положение дел.
В чем, собственно, проблема?
Скорее всего, почти у всех нас было такое: написал какой-то код, все сделал правильно, добавил контроль ошибок, автотесты, написал документацию. Возвращаешься к нему через полгода - кровь из глаз. Делаешь ревью кода команды - тоже адище. Год за годом одна и та же ситуация: пишешь код, стараешься, а результат как на картинке ниже.
Взято на Bonkersworld.
С обучением молодых разработчиков та же проблема. Обучаешь их азам (как именовать идентификаторы, как писать понятный код, проводить декомпозицию, почему не всегда надо наследовать, что значит юнит в юнит-тестах), а они меняют работу быстрее, чем учатся.
К примеру, у Григория обучение разработчика до уверенного мидла занимало три года. В среднем по рынку разработчик меняет место работы через полтора — поэтому он начал искать способы ускорить обучение. Ведь если мы умеем учить бухгалтеров, то почему с разработчиками так сложно?
Герой перебрал немало методов и остановился на нейрофизиологии, которая дала ответы на некоторые вопросы о мозге и как его правильно использовать.
Немного теории
Современная нейрофизиология понимает множество деталей, но полноценных гипотез о работе памяти или внимания пока не так много, да простят нас популяризаторы науки. Мы понимаем, что в процессе запоминания нейрон и глия вокруг него меняются, но что конкретно из этих изменений обеспечивает память, сказать не можем. Во многом система внутреннего подкрепления (Reward system) выбирает, что именно мы запоминаем. Она связана с эмоциями, но как именно она определяет, что важно, нам тоже до конца неясно. Эмоционально окрашенные вещи запоминаются лучше, на этом основано множество попыток «хакнуть» механизм, но пока безрезультатно.
Сейчас готовых ответов и инструкций, что конкретно делать, чтобы получить результат, нет, но есть вполне интересные теории. Например, теория Грациано (Attention Schema Theory) описывает, что такое личность и как работает сознание. В русской нейрофизиологии есть прекрасная теория когнитома Константина Анохина.
Когнитом. Из презентации К. В. Анохина от 2015 года
Для нас в этой теории самое ценное, что в мозге кроме нейронов и их коннектома (всех связей нейронов одного организма) есть дерево смыслов - когнитом.
Объясним, что это такое. Ребенок рождается с некоторой топологией общего назначения, которая готова к распознаванию лиц и обучению речи, но в ней нет программ, это почти чистый лист. В процессе роста мозг бомбардируется огромным количеством информации. Обрабатывая ее, он ищет закономерности и постепенно строит дерево смыслов: свет обычно светит сверху, от огня горячо, а вода мокрая.
К двадцати годам получается программист, в голове которого дерево миллионов смыслов. Он использует этот когнитом, чтобы думать, читать и писать код. Элементы дерева связаны с другими элементами практически как граф, у дерева есть некое поведение. Чтобы в когнитом добавить что-то новое, нужно много раз активировать окружающие это смыслы. Например, повторять иностранное слово и его перевод, строить предложения с ним.
У когнитома есть два режима: быстро «думать» уже известным способом, либо очень медленно обучаться. Кажется, все происходит в реальном времени, как в шутерах от первого лица (FPS), а на самом деле, большую часть времени в нашем мозгу исполняется когнитом, который обучился за десятки лет нашей жизни.
Например, Григорий утверждает, что за время нашего разговора, он не может ни увидеть, ни подумать, ни сказать ничего нового. Он может только креативно комбинировать то, чему уже научился.
Чем нам это поможет на практике? Решить с сегодняшнего дня делать все правильно — недостаточно
Мы говорим джуну: «Тебе надо давать читаемые имена идентификаторам», и нам кажется, джун, как в FPS, взял новый BFG из Doom и пошел в бой. Но нет, джун в пошаговой стратегии: чтобы новый навык приобрести, ему нужно множество раз повторить одно и то же действие.
Чтобы проявить свободу воли и освоить новый навык, нужно практиковаться в течение нескольких месяцев.
Например, мы учим новый язык программирования Ruby. Мы прочитали книгу «Руби для чайников», у нас активировалось множество смыслов в когнитоме, а потом потухло. Через месяц мы не помним практически ничего, кроме нескольких кусочков, которые задели наш эмоциональный отклик. Чтобы действительно выучить Ruby, нужно кодить на этом языке и методично практиковать написание каждого элемента синтаксиса, который нам плохо знаком.
Для запоминания нового обязательно используйте интервальные повторения (Spaced repetition). Можно пользоваться приложениями наподобие Anki или специализированными программами. Даже в IDE есть функции, которые подсказывают, что здесь можно было использовать hotkey, а здесь - такую-то особенность языка. Сотни повторений в разных контекстах - верный путь к успеху.
Мы есть то, что мы делаем: не думаем, не мечтаем, а именно делаем. Если просто слушаем и читаем что-то о навыке, то мы те, кто хорошо читает и слушает, но не те, кто этим навыком владеет.
Чтобы добиться результатов, нужно:
- определить, какой навык хотим прокачать;
- сфокусироваться на нем, не ожидая быстрого результата;
- повторять в разных контекстах и разными способами.
Звучит просто, а на практике? Рассмотрим на примере онбординга.
Онбординг разработчика с разных точек зрения
Допустим, к нам приходит новый мидл или сеньор. При онбординге мы три часа что-то объясняем, ненадолго активируя пять-семь частей когнитома нового программиста, которые помещаются в его рабочую память. Потом мы объявляем перерыв на обед, и после него рабочая память новичка абсолютно чиста. Как бы крут наш сеньор ни был, большую часть из того, что мы рассказали, он или она забудет к следующему утру. Поэтому при онбординге главное - организовать процесс обучения и повторения.
Например, когда человек приходит в Evrone, информация и лучшие практики выдаются по частям, а соответствующие механизмы и ритуалы, как утренние стендапы и встречи один на один, обеспечивают повторение. Через несколько недель или месяцев человек понимает, как компания пишет код, как деплоить, как устроен GitOps и уникальная конфигурация технологического стека. Просто кинуть человеку документацию сработает в очень редких случаях.
В Evrone перед новым бойцом стоит задача освоить весь инструментарий за первые три месяца и научиться им пользоваться. Для внутреннего общения разработчиков используются slack-каналы. Например, для фронтендера будет доступен канал его проекта и канал фронтендеров. Можно задавать анонимизированные вопросы как в канал фронтендеров, так и в общий технический чат. Также у каждого сотрудника есть доступ к дашборду, где он отслеживает свой текущий уровень и векторы развития.
Взято на TeamLead Conf
Современная разработка софта — это командная игра. Как бы ни был крут сотрудник, он обязан освоить процессы компании.
Можно ли подготовиться к выходу в новую компанию?
Чтобы войти в курс, потребуется несколько месяцев. Хорошо бы проработать ежедневную практику в любой ToDo-программке - десять пунктов, которые вы будете выполнять каждый день: посмотреть как устроены репозитории в компании, пройтись по истории последних коммитов, прочесть одну статью из внутренней wiki, посмотреть один code review и тому подобное. Этот механизм нужно отладить, и после выхода на работу добавлять в список новые элементы, ключевые для конкретной компании.
Как все-таки писать хороший код в реальных условиях?
Идеального мира не существует. Мы часто ограничены либо во времени, либо в ресурсах. Если присутствует хотя бы одно из ограничений, значит сейчас написать код хорошо уже не получится. Надо подумать и честно ответить на вопрос: чем можно пожертвовать и что нанесет минимальный вред в будущем.
Если мы ставим костыли, то готовы ли мы в будущем вернуть технический долг и когда? Договоренности о костылях происходят во время цейтнота, и если не запланировать исправление, костыль останется навсегда. Не потому что программисты плохие люди, а потому что так устроен наш мозг. Чтобы чинить код, нужно организовать процессы. Если релиз выходит с недоработками и костылями, то в системе управления задачами сразу запланируйте с менеджером недостающие часы разработки на решение багов и уборку костылей.
Если удалось избавиться от недоделок, то остается проблема. Как написать простой код, понятный другим разработчикам? Из-за того, что индустрия молодая и нет универсального обучения — мы все самоучки, несмотря на профильное высшее образование. Пятнадцать лет назад обучали ООП, а сейчас Rust и Go считают наследование антипаттерном. Как результат, когнитомы у всех разные. Если взять двух хороших программистов, то пересечение деревьев смыслов у них может быть всего
Крутой код, использующий нишевые свойства языка, будет понятен программисту, который его написал, но не мидлу или генералисту. Они не найдут в нем знакомые конструкции и не смогут поддерживать такой код. Поэтому в определение читаемого кода входит также понимание, кто будет его читать - джуны или сеньоры, генералисты или узкоспециализированные разработчики. Больше про читаемый код можно посмотреть в этом выступлении.
Способность к обучению и возраст
Согласно современным гипотезам, если исключить болезни, с возрастом ломается не способность к обучению, а система подкрепления. Мы перестаем осознавать пользу в новом. С точки зрения мозга, активность по изучению забирает больше ресурсов, чем польза от нового навыка, система подкрепления «душит» эту активность.
Бывает, что пожилой родственник годами не может разобраться с айфоном, а потом что-то происходит, и он за полчаса разбирается и все решает. До этого момента он просто не чувствовал ценность нового знания.
Считается, что если изучение нового стало ритуалом, то система подкрепления держится в тонусе, и проблем с обучением не возникает. Как только человек вышел на пенсию и сел перед телевизором, система подкрепления начинает быстро деградировать. Через несколько лет человек не захочет изучать что-то новое.
Универсальное заклинание
Поделимся методом, который наш спикер использует сам и рекомендует другим.
Разработчик написал код и хочет понять, насколько он хорош. Задаем вопрос: «Рассказывает ли этот код историю?». Если другому разработчику нужно два часа, чтобы разобраться, - это нехорошо.
Как код может рассказывать историю? Идентификаторы отвечают на вопрос «Что это?», а весь код - на вопрос «Зачем?». Важно помнить, что когнитом образованного человека может активировать пять-семь не связанных друг с другом участков одновременно. Поэтому важно писать код, для осознания большинства частей которого не нужно активировать больше пяти участков.
Что такое пять участков?
Приведем пример. Вы запоминаете подряд семь названных вам цифр (пример такого ряда: 1 9 8 4 4 5 1). Каждая цифра - это один элемент, который необходимо удерживать в памяти. Если вашему мозгу удалось распознать паттерн или проассоциировать эти цифры с датами или книгами, то в памяти нужно будет удерживать только две единицы информации (1984 и 451 по Фаренгейту), а не семь. Этот прием называется группированием или свертыванием (Chunking).
Для программистов, читающих код, это может быть создание объекта или проход по списку пользователей. Размеры элементов и смыслы, стоящие за ними, для всех различны. Это добавляет трудности в использовании метода, но Григорий работает над поиском решения и можно ожидать улучшения этого «заклинания».
Напоследок нам хочется отметить, что все люди разные. Кто-то от природы мускулистый, хотя из тяжелого только сумки из супермаркета приносит, а кто-то всю жизнь сидит на строжайшей диете. Есть люди, которые от природы обладают развесистым деревом смыслов, цепкой или расширенной рабочей памятью. Они наверняка пишут крутой код, быстро читают чужой и не имеют с этим трудностей. Для всех остальных - для нас - хороший код писать сложно. Каждому стоит разобраться, почему это сложно лично для него, искать решение проблем и обмениваться опытом с другими. Надеемся, вместе мы сделаем IT-индустрию чуточку лучше.
Рекомендации: что почитать и посмотреть
- Книга Выразительный JavaScript. Современное веб-программирование (Марейн Хавербеке) для программирования в общем, не только на JS.
- Сайт Realpython.com. Там много крутых статей о современных практиках разработки.
- Курс Learning how to learn на Coursera. В нем рассказывается о механизмах Chunking и Spaced Repetition и прокрастинации.
- Книга Кто за главного (Майкл Газзанига) для тех, кто интересуется работой мозга.
Полное видео беседы с Григорием:
<рекламная пауза>
По статистике g-mate, минимум 30–50% работодателей готовы рассматривать удаленку, а релокейт среди локаций на второй месте по популярности. И надоевший всем коронавирус — не препятствие: за время пандемии и в России, и за рубежом наём ускорился в 3 раза.
Регистрируйтесь в @g_jobbot, подходящие вам вакансии с релокейтом будут приходить в Телеграм.
</рекламная пауза>
StjarnornasFred
Вопрос можно расширить до "Хорошее <что-нибудь>, что это?" Понятие хорошести не подлежит точной оценке и субъективно.