- PVSM.RU - https://www.pvsm.ru -
Кажется, мы делаем всё, чтобы писать хороший код: читаем книги, слушаем подкасты, ходим на конференции и изучаем лучшие практики. Почему же результат оставляет желать лучшего? Новые языки осваиваются медленно, код превращается в адского монстра, а джуны месяцами учатся понятно называть идентификаторы.
Позвали Григория Петрова, DevRel’а Evrone.com (ex. Voximplant, Radmin, Digital October Center) и вдохновителя сообщества Moscow Python [1], рассказать, как писать хороший код самому и научить команду. А еще обсудили, как понять, какие механизмы нас тормозят, и как посмотреть на нейрофизиологию через призму прикладной разработки и руководства технической командой. Разговор оказался настолько интересным, что сделали статью по его следам.
Наш гость сам себя называет генералистом. Пишет на большинстве мейнстримовых языков разработки, кроме Haskell, и интересуется нейрофизиологией. В какой-то момент он посмотрел на свой предыдущий опыт работы и понял, что ему нравится писать документацию, объяснять сложные вещи простым языком и общаться с разработчиками, но не руководить. Поэтому позиция DevRel (Developer Relations) оказалась для него оптимальной.

Объективные критерии назвать сложно, у каждого свое мнение. Главное ― понять, для чего мы пишем код. Конечно, есть разработчики, которые относятся к коду как к искусству, но в основном он нужен бизнесу, чтобы решать бизнес-задачи и позволять людям взаимодействовать друг с другом и с информацией. Добавим, что IT как индустрии всего лет 20–30, и не все компании понимают, что именно они хотят и как написать ТЗ с первого раза. Иногда самое интересное открывается только после начала разработки. Поэтому хороший код ― это поддерживаемый код, который не «гниет» от собственной сложности за полгода, его можно расширять в разные стороны или пивотнуть [2] в любое время. Новые разработчики смогут разобраться с хорошим кодом за разумное время.
Плохой код ― когда бизнес просит поменять цвет кнопки, а разраб отвечает, что это займет неделю, и это не отговорка, а реальное положение дел.
Скорее всего, почти у всех нас было такое: написал какой-то код, все сделал правильно, добавил контроль ошибок, автотесты, написал документацию. Возвращаешься к нему через полгода ― кровь из глаз. Делаешь ревью кода команды ― тоже адище. Год за годом одна и та же ситуация: пишешь код, стараешься, а результат как на картинке ниже.

Взято на Bonkersworld [3].
С обучением молодых разработчиков та же проблема. Обучаешь их азам (как именовать идентификаторы, как писать понятный код, проводить декомпозицию, почему не всегда надо наследовать, что значит юнит в юнит-тестах), а они меняют работу быстрее, чем учатся.
К примеру, у Григория обучение разработчика до уверенного мидла занимало три года. В среднем по рынку разработчик меняет место работы через полтора — поэтому он начал искать способы ускорить обучение. Ведь если мы умеем учить бухгалтеров, то почему с разработчиками так сложно?
Герой перебрал немало методов и остановился на нейрофизиологии, которая дала ответы на некоторые вопросы о и как его правильно использовать.
Современная нейрофизиология понимает множество деталей, но полноценных гипотез о работе памяти или внимания пока не так много, да простят нас популяризаторы науки. Мы понимаем, что в процессе запоминания нейрон и глия вокруг него меняются, но что конкретно из этих изменений обеспечивает память, сказать не можем. Во многом система внутреннего подкрепления (Reward system) выбирает, что именно мы запоминаем. Она связана с эмоциями, но как именно она определяет, что важно, нам тоже до конца неясно. Эмоционально окрашенные вещи запоминаются лучше, на этом основано множество попыток «хакнуть» механизм, но пока безрезультатно.
Сейчас готовых ответов и инструкций, что конкретно делать, чтобы получить результат, нет, но есть вполне интересные теории. Например, теория Грациано (Attention Schema Theory [6]) описывает, что такое личность и как работает сознание. В русской нейрофизиологии есть прекрасная теория когнитома [7] Константина Анохина.

Когнитом. Из презентации [8] К. В. Анохина от 2015 года
Для нас в этой теории самое ценное, что в
Объясним, что это такое. Ребенок рождается с некоторой топологией общего назначения, которая готова к распознаванию лиц и обучению речи, но в ней нет программ, это почти чистый лист. В процессе роста
К двадцати годам получается программист, в голове которого дерево миллионов смыслов. Он использует этот когнитом, чтобы думать, читать и писать код. Элементы дерева связаны с другими элементами практически как граф, у дерева есть некое поведение. Чтобы в когнитом добавить что-то новое, нужно много раз активировать окружающие это смыслы. Например, повторять иностранное слово и его перевод, строить предложения с ним.
У когнитома есть два режима: быстро «думать» уже известным способом, либо очень медленно обучаться. Кажется, все происходит в реальном времени, как в шутерах от первого лица (FPS), а на самом деле, большую часть времени в нашем
Например, Григорий утверждает, что за время нашего разговора [9], он не может ни увидеть, ни подумать, ни сказать ничего нового. Он может только креативно комбинировать то, чему уже научился.
Мы говорим джуну: «Тебе надо давать читаемые имена идентификаторам», и нам кажется, джун, как в FPS, взял новый BFG из Doom и пошел в бой. Но нет, джун в пошаговой стратегии: чтобы новый навык приобрести, ему нужно множество раз повторить одно и то же действие.
Чтобы проявить свободу воли и освоить новый навык, нужно практиковаться в течение нескольких месяцев.
Например, мы учим новый язык программирования Ruby. Мы прочитали книгу «Руби для чайников», у нас активировалось множество смыслов в когнитоме, а потом потухло. Через месяц мы не помним практически ничего, кроме нескольких кусочков, которые задели наш эмоциональный отклик. Чтобы действительно выучить Ruby, нужно кодить на этом языке и методично практиковать написание каждого элемента синтаксиса, который нам плохо знаком.
Для запоминания нового обязательно используйте интервальные повторения (Spaced repetition). Можно пользоваться приложениями наподобие Anki [10] или специализированными программами. Даже в IDE есть функции, которые подсказывают, что здесь можно было использовать hotkey, а здесь ― такую-то особенность языка. Сотни повторений в разных контекстах ― верный путь к успеху.
Мы есть то, что мы делаем: не думаем, не мечтаем, а именно делаем. Если просто слушаем и читаем что-то о навыке, то мы те, кто хорошо читает и слушает, но не те, кто этим навыком владеет.
Чтобы добиться результатов, нужно:
Звучит просто, а на практике? Рассмотрим на примере онбординга.
Допустим, к нам приходит новый мидл или сеньор. При онбординге мы три часа что-то объясняем, ненадолго активируя пять-семь частей когнитома нового программиста, которые помещаются в его рабочую память. Потом мы объявляем перерыв на обед, и после него рабочая память новичка абсолютно чиста. Как бы крут наш сеньор ни был, большую часть из того, что мы рассказали, он или она забудет к следующему утру. Поэтому при онбординге главное ― организовать процесс обучения и повторения.
Например, когда человек приходит в Evrone, информация и лучшие практики выдаются по частям, а соответствующие механизмы и ритуалы, как утренние стендапы и встречи один на один, обеспечивают повторение. Через несколько недель или месяцев человек понимает, как компания пишет код, как деплоить, как устроен GitOps и уникальная конфигурация технологического стека. Просто кинуть человеку документацию сработает в очень редких случаях.
В Evrone перед новым бойцом стоит задача освоить весь инструментарий за первые три месяца и научиться им пользоваться. Для внутреннего общения разработчиков используются slack-каналы. Например, для фронтендера будет доступен канал его проекта и канал фронтендеров. Можно задавать анонимизированные вопросы как в канал фронтендеров, так и в общий технический чат. Также у каждого сотрудника есть доступ к дашборду, где он отслеживает свой текущий уровень и векторы развития.

Взято на TeamLead Conf [11]
Современная разработка софта — это командная игра. Как бы ни был крут сотрудник, он обязан освоить процессы компании.
Чтобы войти в курс, потребуется несколько месяцев. Хорошо бы проработать ежедневную практику в любой ToDo-программке ― десять пунктов, которые вы будете выполнять каждый день: посмотреть как устроены репозитории в компании, пройтись по истории последних коммитов, прочесть одну статью из внутренней wiki, посмотреть один code review и тому подобное. Этот механизм нужно отладить, и после выхода на работу добавлять в список новые элементы, ключевые для конкретной компании.
Идеального мира не существует. Мы часто ограничены либо во времени, либо в ресурсах. Если присутствует хотя бы одно из ограничений, значит сейчас написать код хорошо уже не получится. Надо подумать и честно ответить на вопрос: чем можно пожертвовать и что нанесет минимальный вред в будущем.
Если мы ставим костыли, то готовы ли мы в будущем вернуть технический долг и когда? Договоренности о костылях происходят во время цейтнота, и если не запанировать исправление, костыль останется навсегда. Не потому что программисты плохие люди, а потому что так устроен наш
Если удалось избавиться от недоделок, то остается проблема. Как написать простой код, понятный другим разработчикам? Из-за того, что индустрия молодая и нет универсального обучения — мы все самоучки, несмотря на профильное высшее образование. Пятнадцать лет назад обучали ООП, а сейчас Rust и Go считают наследование антипаттерном. Как результат, когнитомы у всех разные. Если взять двух хороших программистов, то пересечение деревьев смыслов у них может быть всего 10–15 %. Код будет понятным программистам с более похожими участками когнитомов. Поэтому читаемый код ― это код, написанный привычными конструкциями. Привычными в этом языке, в этом стеке и в этом году.
Крутой код, использующий нишевые свойства языка, будет понятен программисту, который его написал, но не мидлу или генералисту. Они не найдут в нем знакомые конструкции и не смогут поддерживать такой код. Поэтому в определение читаемого кода входит также понимание, кто будет его читать ― джуны или сеньоры, генералисты или узкоспециализированные разработчики. Больше про читаемый код можно посмотреть в этом выступлении [12].
Согласно современным гипотезам, если исключить болезни, с возрастом ломается не способность к обучению, а система подкрепления. Мы перестаем осознавать пользу в новом. С точки зрения
Бывает, что пожилой родственник годами не может разобраться с айфоном, а потом что-то происходит, и он за полчаса разбирается и все решает. До этого момента он просто не чувствовал ценность нового знания.
Считается, что если изучение нового стало ритуалом, то система подкрепления держится в тонусе, и проблем с обучением не возникает. Как только человек вышел на пенсию и сел перед телевизором, система подкрепления начинает быстро деградировать. Через несколько лет человек не захочет изучать что-то новое.
Поделимся методом, который наш спикер использует сам и рекомендует другим.
Разработчик написал код и хочет понять, насколько он хорош. Задаем вопрос: «Рассказывает ли этот код историю?». Если другому разработчику нужно два часа, чтобы разобраться, ― это нехорошо.
Как код может рассказывать историю? Идентификаторы отвечают на вопрос «Что это?», а весь код ― на вопрос «Зачем?». Важно помнить, что когнитом образованного человека может активировать пять-семь не связанных друг с другом участков одновременно. Поэтому важно писать код, для осознания большинства частей которого не нужно активировать больше пяти участков.
Приведем пример. Вы запоминаете подряд семь названных вам цифр (пример такого ряда: 1 9 8 4 4 5 1). Каждая цифра ― это один элемент, который необходимо удерживать в памяти. Если вашему
Для программистов, читающих код, это может быть создание объекта или проход по списку пользователей. Размеры элементов и смыслы, стоящие за ними, для всех различны. Это добавляет трудности в использовании метода, но Григорий работает над поиском решения и можно ожидать улучшения этого «заклинания».
Напоследок нам хочется отметить, что все люди разные. Кто-то от природы мускулистый, хотя из тяжелого только сумки из супермаркета приносит, а кто-то всю жизнь сидит на строжайшей диете. Есть люди, которые от природы обладают развесистым деревом смыслов, цепкой или расширенной рабочей памятью. Они наверняка пишут крутой код, быстро читают чужой и не имеют с этим трудностей. Для всех остальных ― для нас ― хороший код писать сложно. Каждому стоит разобраться, почему это сложно лично для него, искать решение проблем и обмениваться опытом с другими. Надеемся, вместе мы сделаем IT-индустрию чуточку лучше.
<рекламная пауза>
По статистике g-mate, минимум 30–50% работодателей готовы рассматривать удаленку, а релокейт среди локаций на второй месте по популярности. И надоевший всем коронавирус — не препятствие: за время пандемии и в России, и за рубежом наём ускорился в 3 раза.
Регистрируйтесь в @g_jobbot [5], подходящие вам вакансии с релокейтом будут приходить в Телеграм.
</рекламная пауза>
Автор: Анна Есина
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/361512
Ссылки в тексте:
[1] Moscow Python: https://moscowpython.ru
[2] пивотнуть: https://l-a-b-a.com/blog/1638-pivot-chto-delat-esli-kompaniya-v-tupike
[3] Bonkersworld: https://bonkersworld.net/building-software
[4] мозге: http://www.braintools.ru
[5] Image: https://t.me/g_jobbot?start=u_habr51
[6] Attention Schema Theory: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4407481/
[7] теория когнитома: https://www.youtube.com/watch?v=UKw_4ERm408
[8] презентации: http://neuroinfo.ru/conf/Content/Presentations/Anokhin2015.pdf
[9] разговора: https://www.youtube.com/watch?v=1FTHuxIuZ1o&feature=youtu.be
[10] Anki: https://www.ankiapp.com/
[11] TeamLead Conf: https://teamleadconf.ru/moscow/2020/abstracts/6365
[12] этом выступлении: https://www.youtube.com/watch?v=SS9ddV622Jk
[13] Выразительный JavaScript. Современное веб-программирование: https://www.litres.ru/mareyn-haverbeke/vyrazitelnyy-javascript-sovremennoe-veb-programm-50447564/
[14] Realpython.com: https://realpython.com/
[15] Learning how to learn: https://www.coursera.org/learn/learning-how-to-learn
[16] Кто за главного: https://www.livelib.ru/book/1002071901-kto-za-glavnogo-svoboda-voli-s-tochki-zreniya-nejrobiologii-majkl-gazzaniga
[17] Источник: https://habr.com/ru/post/541872/?utm_source=habrahabr&utm_medium=rss&utm_campaign=541872
Нажмите здесь для печати.