Pull to refresh

Ката программиста — путь к недостижимому идеалу. Или как я упал с велосипеда этим летом

Reading time8 min
Views16K

Эту статью я пишу одной рукой. В начале августа я очень неудачно упал с велосипеда. Одну из причин моего падения можно сформулировать примерно так: «Неправильно сработала память тела». Дело в том, что с самого детства я всегда катался на велосипедах с ножным тормозом. Иногда пользовался и ручными тормозами на некоторых велосипедах, но только как дополнительными, чтобы слегка притормаживать. А совсем недавно я пересел на велосипед, оборудованный только ручными тормозами. Ножной тормоз на нём отсутствовал. 

Мне удалось довольно быстро приучиться «тормозить руками», но перезаписать память тела оказалось не так-то просто. Насколько я помню, в сознательном возрасте я никогда не падал с велосипеда. Но в критической ситуации тем ранним субботним утром мой мозг не успел применить новые знания, зато тело по сорокалетней привычке попыталось затормозить ногами (на большой скорости). А дальше всё произошло почти по классике: упал, потерял сознание, открытый перелом, очнулся — гипс.

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

Ежедневно мы, сами того не замечая, делаем множество вещей «на автомате». При этом мозг занят чем-то другим, например, обдумывает решение замысловатой рабочей задачи. Такой автоматизм достигается путём долгих тренировок.

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

От контроля к автоматизму

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

А что же программисты? Разработчикам ведь не нужно проводить хирургические операции, не нужно играть сложные мелодии в одиночестве стоя перед огромным тёмным и пугающим залом. Зачем же ежедневно тренироваться в написании кода, если можно просто открыть Stack Overflow и поискать готовое решение?

И всё же программисты тоже тренируются, играют свои «гаммы» — раз за разом решают одну и ту же задачу, ежедневно пишут один и тот же код с небольшими вариациями. На первый взгляд это кажется бессмысленной тратой времени. Но не всё так однозначно. Давайте разбираться.

Изящный танец на клавиатуре

С лёгкой руки Дейва Томаса, соавтора книги «Прагматичный программист», периодические тренировки программистов в написании кода называются «ката». Это название было позаимствовано Дейвом из терминологии карате.

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

У ката есть много интересных особенностей. Например, считается, что они обладают медитативным воздействием. Ещё говорят, что цель ката — это достижение полного совершенства в своих движениях. Но достичь этой цели невозможно, к ней можно только стремиться, постоянно асимптотически приближаясь в абсолютному идеалу. С каждой тренировкой мастер стремится к тому, чтобы научить своё тело безупречно выполнять предусмотренные ката движения. Все фигуры ката объединяются в хорошо продуманную последовательность, которая очень похожа на изящный танец. Хорошо исполняемые ката очень красивы.

У программистов ката — это простая задача, которую нужно решить, написав программу. Пример такой задачи: написать функцию, которая раскладывает целое на простые множители. Программист выполняет ката не один раз, а многократно, день за днём решая одну и ту же задачу. На первый взгляд это может показаться абсурдным. Мы привыкли к тому, что работа программиста — это поиск решения задачи и его реализация в программном коде. Если решение найдено, то к задаче обычно не возвращаются. Разве что для рефакторинга кода или поиска более оптимального решения. Но основная цель ката — совсем не в том, чтобы найти решение задачи. Мы и так знаем, как её решать, алгоритм известен.

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

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

Отточенные навыки кодирования

Главная цель ката — это закрепление в подсознании пар «задача — решение». Помните, как в школе нас «натаскивали» на решение каких-нибудь уравнений? Сначала было непросто, зато потом всё получалось само собой: раскрываем скобки, берём корень и вот он искомый икс — в левой части равенства. С кодированием стандартных задач всё обстоит примерно так же.

Конечно, сложно предусмотреть все варианты задач, которые возникнут на нашем профессиональном пути, но с каждым натренированным ката в нашем арсенале будет появляться готовый кирпичик, который мы при необходимости сможем умело применить в работе, освободив ресурсы мозга для более важных (и интересных) задач.

Роберт Мартин приводит ещё несколько целей тренировок ката в программировании:

  • запоминание горячих клавиш, интерфейса среды разработки и идиом навигации;

  • изучение принципа разработки через тестирование (TDD);

  • изучение принципа непрерывной интеграции (CI);

  • оттачивание навыков кодирования для обеспечения возможности импровизации.

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

Применяем ката на практике

Как же правильно использовать ката в тренировках? Давайте опять обратимся к книге Роберта Мартина. Вот, что он пишет: «Я ежедневно выполняю одну-две ката, часто в процессе погружения в работу. Я пишу их на Java, Ruby, Clojure или на каком-нибудь другом языке, который я хочу поддерживать в рабочем состоянии. Я использую ката для тренировки конкретных навыков (например, приучая пальцы к использованию клавиш ускоренного доступа) или приёмов рефакторинга.»

В любых тренировках очень важна периодичность. Поэтому мы можем самостоятельно составить своё собственное расписание занятий, которое нам будет комфортно. Например, это может быть «10-минутная разминка по утрам и 10-минутная релаксация по вечерам». В некоторых источниках предлагают использовать более длительные тренировки — до 30 минут. Тут нет универсальных установок, всё зависит от наших предпочтений и возможностей. Кстати, решением ката очень легко увлечься, поэтому лучше взять за правило обязательно останавливаться, когда отведённое время тренировки закончилось.

Теперь про сами задачи. В сети есть специальные сайты, где собраны «классические» наборы ката, которые мы можем взять за основу. Например, http://codekata.com или http://katas.softwarecraftsmanship.org.

Если известные ката кажутся скучными и неинтересными, мы можем попробовать придумать свои собственные. Поделюсь одним из своих упражнений: смоделировать заставку из фильма «Матрица» со стекающими по экрану струйками зелёных символов. Я решал эту задачу на множестве языков программирования. Когда-то очень давно я писал такие скринсейверы на Visual Basic, в институте на Delphi, а когда начинал знакомство с Python, в первую очередь написал свою традиционную маленькую консольную версию «Матрицы».

Ещё можно программировать многочисленные клеточные автоматы — хотя бы игру «Жизнь». Или мистического муравья Лэнгтона (Муравей Лэнгтона — загадочный клеточный автомат). Такие задачи очень хорошо подходят для ката — у них простые условия и несложная реализация. Вообще, изобретать свои собственные ката — это не менее интересная задача, чем их решать. Почему бы не создать свою уникальную коллекцию упражнений?

Ещё можно попробовать выполнять ката под музыку — интересно проверить, какие музыкальные жанры лучше соответствуют решению разных типов задач.

Если скучно решать ката в одиночку, мы всегда можем подыскать себе компанию. Например, соединить концепции тренировок ката и парного программирования. В джиу-джитсу это называется «вадза» — один напарник точно запоминает и воспроизводит действия другого. Движения повторяются раз за разом, а потом напарники меняются местами. Можно попробовать упражняться с более опытным наставником по известному принципу: «Делай как я».

Для коллективных тренировок существуют специальные сайты, например: https://www.codewars.com. На этом сайте есть множество задач с разным уровнем сложности. Ученики могут проверить своё решение задачи и посмотреть, как её решали другие. Можно даже объединяться в кланы и суммировать результаты.

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

Всем крепкого здоровья, берегите себя и своих близких.


Угадаете, кто ещё ежедневно, систематически и неуклонно тренировал свои профессиональные навыки, чтобы потом блестяще использовать их в своей работе? Приведу цитату из статьи этого автора:

«Искусство делать выводы и анализировать, как и все другие искусства, постигается долгим и прилежным трудом, но жизнь слишком коротка, и поэтому ни один смертный не может достичь полного совершенства в этой области. Прежде чем обратиться к моральным и интеллектуальным сторонам дела, которые представляют собою наибольшие трудности, пусть исследователь начнет с решения более простых задач. [...] Поначалу это может показаться ребячеством, но такие упражнения обостряют наблюдательность и учат, как смотреть и на что смотреть.»

В этом абзаце есть всё: и про долгие тренировки, и про стремление к недостижимому идеалу, и про оттачивание навыков на простых задачах. А имя автора — в скрытом блоке.

Ответ

Автор цитаты — Шерлок Холмс :) Это фрагмент книги Артура Конан Дойла «Этюд в багровых тонах».

Tags:
Hubs:
Total votes 31: ↑29 and ↓2+35
Comments26

Articles