****Примечание писателя: Для меня большая честь опубликовать эту статью вместе с This is Learning.
This is Learning — это сообщество, которое разделяет мои ценности: любовь к кодированию, вера в непрерывное обучение и рост, а также приверженность сотрудничеству — это некоторые из лучших элементов глобального сообщества разработчиков и то, к чему мы стремимся на Sema.
Я познакомился с This is Learning благодаря потрясающему подкасту о Code Reviews с Джеем Беллом в начале этого года — посмотрите его. У меня есть все время в мире, чтобы поговорить о наставничестве и росте знаний разработчиков с людьми, которым это тоже очень важно, как Джею.
И, наконец, мне очень приятно находиться здесь, потому что я не могу найти лучшего примера человека, который олицетворяет лучшие качества кодинга, — соучредителя компании This is Learning Сантоша Ядава. История самого Сантоша является примером того, что кодинг — это путь к невероятным возможностям, включая первую звезду GitHub в Индии — если вы делаете работу. И достигнув этого статуса, он сделал своим приоритетом отдачу другим.
Итак, продолжим шоу…
Вступление.
За последние два года я опросил более 1000 разработчиков об их работе:
- что им нравится в кодинге,
- что они хотели бы улучшить, и
- какие препятствия стоят на их пути к достижению личных и профессиональных целей.
Моей целью было получить мнение о инструментах нового поколения, которые могли бы внести положительные изменения, независимо от того, работают ли они над Open Source или частными проектами, от небольших до гигантских команд.
Самым важным, что я усвоил, была метафора, а не какая-то конкретная функция или потребность:
Код — это ремесло, а не соревнование.
Я хотел поделиться с вами своими мыслями и получить ваши отзывы.
Часть 1 Что такое ремесло?
Часть 2 Является ли кодинг ремеслом?
Часть 3 Если кодинг — это ремесло, а я считаю, что это так, то каковы некоторые последствия для программного инструментария, поддерживающего это ремесло?
Давайте углубимся в это.
Часть 1: Что такое ремесло?
Когда инженеры начали говорить со мной об элементах своей работы, похожих на ремесло, я немного почитал об истории и природе ремесла.
Моим любимым источником была книга Питера Корна «Почему мы делаем вещи и почему это важно: образование ремесленника». Это биография мастера-краснодеревщика, но первая треть книги начинается с обсуждения вопросов ремесла и искусства в сравнении с другими профессиями.
На основе этой книги, а также других источников и разговоров я сформулировал свое понимание того, что такое ремесло.
Во-первых, ремесло — это навык, который совершенствуется со знанием и мудростью.
Как гласит старая пословица, знание — это не то же самое, что мудрость.
Знание — это информация в ее самой грубой форме — факты, относящиеся к конкретной области, факты, относящиеся к конкретной методологии, и руководящие принципы.
Мудрость, с другой стороны, требует проницательности. Это способность применять знания в конкретных условиях, чтобы выбрать правильный подход или подход с наибольшей вероятностью достижения желаемых целей.
Когда ремесленник обладает большими знаниями и мудростью, его способность создавать качественный готовый продукт возрастает. Как же происходит этот рост?
Как знания, так и мудрость могут быть открыты самостоятельно, переданы через кодифицированные источники или преподаны. Однако, как и в случае с любым другим навыком, качественное обучение — лучший способ ускорить освоение навыка.
И вот здесь все становится интересным. Хотя знания важны, сами по себе они мало что могут сделать — на самом деле, это то, что кажется более ценным, чем есть на самом деле. По отдельности это может быть просто заучивание или факты, лишенные критического контекста, который необходим для полезного применения.
Когда знание объединяется с мудростью и превращается в мудрость, оно начинает приносить дивиденды. Мудрость — это прикладное знание, используемое для того, чтобы наметить курс с наибольшей вероятностью достижения поставленной цели.
Мудрость, как правило, нельзя запомнить. Вместо этого она выковывается в горниле опыта и повторяющихся ошибок. Когда человек, осваивающий какое-либо ремесло, получает высококачественное обучение, приобретение им Мудрости значительно ускоряется, а также повышается его способность создавать качественный готовый продукт.
Во-вторых, ремесленник получает удовольствие от работы ради нее самой.
Важным для определения ремесла является автотелизм: принцип, согласно которому удовольствие приходит от самой работы, по своей сути, отдельно от каких-либо внешних целей или задач.
Это не означает, что ремесло не приносит внешних выгод — вознаграждения, признания критиков или удовольствия от того, что пользователи оценили творение. Но, как пишет Корн, «есть большое удовлетворение в работе, которая увлекает человека как самоцель».
В-третьих, работа над ремеслом может вызвать состояние потока, когда творец полностью поглощен своим делом.
Очень умный и очень труднопроизносимый социолог Михали Чиксентмихали выделил девять компонентов создания потока:
- На каждом этапе работы есть четкие цели.
- Существует немедленная обратная связь с действиями человека.
- Существует баланс между задачами и навыками.
- Действие и осознание слиты воедино.
- Отвлекающие факторы исключены из сознания.
- Нет беспокойства о неудаче.
- Исчезает самосознание.
- Чувство времени искажается.
- Деятельность становится самоцелью (autoelic).
Работа над своим ремеслом может вызвать такое состояние потока.
В-четвертых, готовое ремесло должно работать.
Это самое большое различие между искусством и ремеслом. Для ремесленника, в отличие от художника, в конечном итоге создаваемый предмет должен функционировать и приносить пользу пользователю. Как говорит Корн о деревообработке:
«У ремесленника нет роскоши двусмысленности. Очень скоро его убеждения подвергаются проверке реальностью. Либо стамеска достаточно острая, чтобы эффективно резать дерево, либо нет. … Прочность стола и удобство стула сразу же бросаются в глаза любому наблюдателю».
Этот стандарт «работает ли это в реальности», хотя его труднее достичь, в конечном итоге приводит к большему удовлетворению:
«Известно, что удовлетворение от конкретного проявления себя в мире посредством ручной работы делает [человека] спокойным и легким. Они, кажется, избавляют [их] от необходимости предлагать болтливые интерпретации [самих себя]… [они] могут просто указать: здание стоит, машина теперь работает….. Ремесло должно считаться с непогрешимым суждением реальности, где неудачи или недостатки не могут быть истолкованы».
Он написал это о деревообработке, но это напоминает мне каждый напряженный разговор, который я вел с разработчиками до, во время и после создания функции или снижения технического долга.
Часть 2: Является ли кодинг ремеслом?
Я считаю, что код соответствует этому определению ремесла. Чтобы разобраться в этом, давайте сравним деятельность по написанию кода с четырьмя постулатами, которые я изложил ранее.
Ремесло — это навык, который совершенствуется с приобретением знаний и мудрости.
Кодирование, несомненно, включает в себя сбор и синтез информации:
- Факты, относящиеся к конкретной области, например, как сделать проект соответствующим GPDR,
- факты, специфичные для методологии, например, структуры баз данных, оптимизация алгоритмов и стилевые соглашения.
- Руководящие принципы: как для отдельного человека (понятный код — приоритет), так и для команды (обзоры кода — приоритет).
И кодеры развивают мудрость тем дольше, чем дольше они кодируют. Самое большое различие между начинающими, продвинутыми, средними, продвинутыми и экспертными кодерами — это способность применять мудрость в конкретной ситуации кодирования.
В мире кодинга:
Знания можно рассматривать как навыки, необходимые для решения определенной проблемы с помощью кода.
Мудрость может включать в себя суждение о том, стоит ли создавать решение, а не использовать стороннюю библиотеку.
Знания и мудрость в области кодирования действительно могут быть открыты самостоятельно, переданы через кодифицированные источники или преподаны.
Хотя можно стать «продвинутым начинающим» разработчиком путем самопознания или исследования, практика обучения ускоряет этот процесс и позволяет достичь гораздо большей зрелости.
Для кодинга «обучение» может включать в себя неформальные вопросы и ответы, обзоры кода, наставничество и курсовую работу в классе (если она уместна и предполагает подлинное общение ученика и учителя).
Преподавая, разработчик также участвует в процессе обучения. Это позволяет им впитывать ошибки и уроки, полученные от разных людей и с разных точек зрения. Они могут научиться общаться с разными уровнями мастерства и компетентности.
Ремесленник получает удовольствие от выполнения работы ради нее самой.
Важным для определения ремесла является автотелизм: принцип, согласно которому удовольствие исходит от самой работы, отдельно от каких-либо внешних целей или задач.
Это фундаментальная руководящая сила почти для каждого разработчика, с которым я разговаривал.
Да, конечно, некоторые разработчики рассматривают свою работу как работу с 9 до 5. Многие ценят, что это бесспорно отличная карьера, если судить по вознаграждению, гибкости и автономии.
Кроме того, почти все инженеры рады видеть, как написанный ими код используется в действии, помогая их организации (или, если повезет, всему миру) быть более успешной.
Но в душе большинство инженеров, с которыми я разговаривал, испытывают огромное удовлетворение от того, что код просто успешно работает, независимо от любых других факторов.
В основе качества кода лежит глубокая страсть к тому, чтобы код работал, и работал правильным образом. Это говорит о преданности инженеров своему ремеслу — преданности созданию работоспособного результата и элегантного решения с непреходящей ценностью. Это вызывает осознанность и благодарность за процесс и побуждает их искать пути его улучшения.
Работа над ремеслом может вызвать состояние потока, когда создатель полностью поглощен процессом.
Кодирование в правильной среде — а это, конечно, не 100% сред! — может привести к состоянию потока:
- На каждом шагу есть четкие цели: Функциональные и нефункциональные требования соединяются в коде, написанном в состоянии потока.
- Существует немедленная обратная связь с действиями пользователя: Код компилируется, или нет, запускается, или нет, проходит тесты, или нет.
- Существует баланс между задачами и навыками: Инженеры могут продолжать работать над более трудными и сложными техническими задачами в командах с более высокими результатами кодирования. Инженер может получать постоянное количество конструктивных отзывов в своих обзорах кода, потому что у него есть возможность продолжать выходить за рамки того, что он уже знает.
- Действие и осознание объединяются: Да!
- Отвлекающие факторы исключены из сознания: Многие члены команды задавались вопросом, почему сообщение в Slack осталось без ответа в первой половине дня. У ума, поглощенного сложностью хорошо решаемой проблемы, нет времени на прерывания или переключение контекста.
- Нет беспокойства о неудаче: Да, бизнес/продажи/финансы давят, но когда человек может сосредоточиться на поставленной задаче, у него есть моменты энергии и ясности без страха.
- Исчезает самосознание. Кодеры погружаются в работу и могут кодить без еды, сна и других потребностей.
- Чувство времени становится искаженным: Я слышал истории сотен инженеров, которые теряли счет времени и дописывали еще ОДНУ функцию или оптимизировали еще ОДИН метод.
- Деятельность становится самоцелью (autotelic): Сроки — это неизбежная реальная часть коммерческой разработки программного обеспечения, но поток не создается понуканиями скрам-мастера или давлением сроков.
Готовое изделие должно работать.
Разгадка чего-то волшебного в коде может быть восхитительным чувством, но почти для всех кодеров важно то, что происходит, когда код используется. В конечном счете, код должен работать.
Для кодера «работать» означает «компилируется ли он», но это также означает «работает ли он для пользователей» и «соответствует ли он уровню стандартов моей команды в данный конкретный момент (поскольку компромисс между лоскутностью и совершенством меняется со временем)».
Что значит относиться к коду как к ремеслу, а не как к соревнованию — и как это сделать.
Если мы выполнили свою работу, вы знаете, что будет дальше: последствия отношения к коду как к ремеслу.
Мы убеждены, что код — это ремесло, а это значит, что инженерные команды и поддерживающие их инструменты и системы должны быть настроены на поддержку создания кода как ремесла, а не соревнования.
Без сомнения, вы можете вспомнить множество примеров, когда к разработчикам и командам разработчиков относились не так — награждение или измерение количества созданных строк кода — наш любимый и худший пример.
Мы считаем, что любой инженерный менеджер или организация, в которой есть разработчики, должны стремиться к тому, чтобы способствовать развитию ремесла у тех, кто разрабатывает для них.
Вот некоторые рекомендации о том, как это выглядит.
Поскольку ремесло опирается на знания, инструменты, позволяющие разработчикам иметь опыт под рукой, невероятно важны.
Именно поэтому Stack Overflow стал одним из самых революционных инструментов для потока разработчиков за последнее десятилетие.
Сопротивляйтесь догме скорости любой ценой.
Вместо этого методично выявляйте и устраняйте препятствия для потока. Очень важны безупречные, всеохватывающие ретроспективы и непрерывное тестирование для поиска лучших методов для потока разработчиков.
Методы обратной связи, в частности, обзоры кода, наставничество и парное программирование, необходимы для передачи знаний и развития мудрости.
Самым важным измерением качества кода является субъективная оценка инженеров, обладающих знаниями и суждениями. Литеры имеют свое место… но истина — это то, что говорят другие ремесленники.
Метрики о кодерах, распространяемые без разрешения, опасны. Выбор, который кодеры делают каждую минуту, час, день, не может быть сведен к обзору роботом вашего кода. И держитесь далеко, далеко от таких показателей, как LOC / день.
Наконец, упражнения по кодированию во время собеседования нужно проводить очень осторожно. Лучший способ понять, как работает кодер, — это наблюдение за его прошлой работой или кодирование/решение проблем в условиях, схожих с теми, с которыми он столкнется во время работы. Здесь может помочь изучение деталей их предыдущей работы — настоящее портфолио, а не только фронт-энд.
Заключение.
Я надеюсь, что эта статья убедила вас и дала вам идеи, которые помогут поддержать ремесло кодирования в вашей организации.
Но если вас это не убедит, я очень надеюсь, что вы примете участие и поможете улучшить эти идеи. Для меня истинная радость сообщества кодеров — это глубокая вера в силу идей и готовность участвовать в улучшении вещей — будь то сообщения в twitter или reddit, статьи или, конечно, код.
В ближайшие недели моя компания объявит о выходе нового поколения нашего бесплатного инструмента для разработчиков — дополнения к GitHub, которое поможет инженерам наладить контакты, получить работу и продвижение по службе.
Мы сделали все возможное, чтобы создать его на основе этих открытых нами принципов… но, конечно, мы знаем, что первая версия будет только началом пути. Создание чего-то совершенного никогда не заканчивается.
Выпьем за прекрасное глобальное сообщество кодеров и, да, за ремесло кода.