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

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

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

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

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

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

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

А что же программисты? Разработчикам ведь не нужно проводить хирургические операции, не нужно играть сложные мелодии в одиночестве стоя перед огромным тёмным и пугающим залом. Зачем же ежедневно тренироваться в написании кода, если можно просто открыть 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. На этом сайте есть множество задач с разным уровнем сложности. Ученики могут проверить своё решение задачи и посмотреть, как её решали другие. Можно даже объединяться в кланы и суммировать результаты.

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

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


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

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

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

Ответ

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

Комментарии (22)


  1. Krasnoarmeec
    15.09.2023 18:39
    +2

    Выздоравливайте, Александр!

    Ждём от Вас новых статей!


  1. serginho
    15.09.2023 18:39
    +4

    Для меня например Ката - это решение шахматных задач. Для программиста важно держать нейроны в тонусе. Шахматы - один из вариантов.


    1. Alcpp
      15.09.2023 18:39
      +2

      Изучение человеческих языков тоже держит нейроны в тонусе.


    1. Akela_wolf
      15.09.2023 18:39
      +1

      Из подобных игр го загружает больше зон мозга, чем шахматы.


  1. ZekaVasch
    15.09.2023 18:39

    Узнал, что оказывается велосипеды с ножным тормозом еще существуют.


    1. ritorichesky_echpochmak
      15.09.2023 18:39
      +4

      Всегда ездил только на таких... потому что тормозить ногами как-то более естественно, чем руками или головой через руль


    1. vvbob
      15.09.2023 18:39
      +4

      Да полно, велики с планетарной коробкой передач часто с таким тормозом. Как по мне это довольно удобно. Тоже довольно долго привыкал к ручным тормозам.

      Но я, кстати, в детстве падал прямо очень много с велика, любил повыделываться, тогда, в советском детстве, все это никак никто не называл, просто гоняли по разным неприспособленным (и опасным) для этого местам, по разным узким тропинкам, в вагонном депо (от сторожей удирали :)) и много что еще творили похожего, поэтому падал много и у меня уже был навык (в тему статьи, кстати, та самая ката) более-менее безопасного падения с велосипеда, поэтому серьезных травм не было ни разу, только синяки, порезы, ссадины.


    1. Batalmv
      15.09.2023 18:39
      +4

      Планетарка, широко применяется на городских/круизерах

      Себе и дочке купил такой, очень удобно, если покатушки по дорожкам без фанатизма


  1. profFortran
    15.09.2023 18:39
    +8

    Да нет, вот эти все Codewars, LeetCode и прочие HackerRank именно что скучно, занудно и оторвано от реальности чуть более, чем полностью. Решать их, по крайней мере у меня, не возникает ни малейшего желания. Начинал несколько раз, бросал, в конце концов окончательно забил.

    И вообще, есть работа, 8 часов в день. Можно какой-нибудь свой проект запилить или просто поизучать что-нибудь. Я вот работаю с движком UNIGINE и его же на досуге изучаю. На кой ещё какие-то высосанные непонятно из чего задачки решать?


  1. Vpan
    15.09.2023 18:39
    +5

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


    1. ritorichesky_echpochmak
      15.09.2023 18:39
      +4

      Да. Есть такой фокус, что человек не может одновременно помнить всё и фокусируется только на нескольких сущностях (кошелёк Миллера), но через освоение более высокоуровневых сущностей можно держать в уме более крупные структуры (т.к. мелкоуровневые сущности объединяются по какому-то знакомому паттерну в одну сущность)


      1. Vpan
        15.09.2023 18:39
        +1

        Неожиданное сравнение. Согласен.


    1. bak
      15.09.2023 18:39
      +2

      Решение сложных задач тоже тренируется, только по другому. Надо не одну и ту же простую задачу решать по 100 раз, а решать 100 средних / сложных задач по 1 разу.


  1. amvasiljev
    15.09.2023 18:39
    +2

    Искренне сочувствую, я откатал лет пять по 10 000 в год, но только дискачи и обязательно шлем. "Убирался" было, но в основном на мокрой разметке. Сейчас у меня сингл и я не очень хочу переворачивать втулку на фикс - возраст не тот ))))

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


    1. avost
      15.09.2023 18:39
      +1

      Только в слепую и только двумя руками.

      Штирлиц выстрелил в слепую. Слепая упала.

      (сорри, не смог удержаться) :)


      1. amvasiljev
        15.09.2023 18:39
        +4

        1000 знаков в минуту, но ничего не понятно ))


  1. WASD1
    15.09.2023 18:39
    +5

    Мифический человеко-месяц. 1975г.

    Во сколько раз там опытные (т.е. отработавшие больше 3х лет в языке Х) программисты были производительнее неопытных?

    ПС
    Ну и правильно написали выше - автоматизации поддаётся только что-то очень простое.
    - слепая печать
    - знание основных 100-200 функций наизусть
    - best practice (+ необходимые "вспомогательные API") языка наизусть.
    Решение же сложной задачи по-умолчанию неавтоматизируемо.


  1. Dmitriy_Mironiuk
    15.09.2023 18:39
    +3

    Александр, интересную тему тебе подкинул неприятный случай. Как говорится - всегда найдутся свои плюсы. Я вот раньше и не знал про "ката". А эта техника ведь присутствует везде в нашей жизни. Например, когда я учил симфонию Бетховена "К Элизе" на гитаре, то сначала это не похоже было даже на мелодию, но после 1000 повторов одних и тех же действий стало получаться. Сейчас могу сыграть закрытыми глазами, тело запомнило и пальцы перемещаются по ладам и струнам без особого контроля со стороны мозга. Можно повторять хотя бы раз в месяц, и все остаётся на том же уровне))

    А ещё мне эта тема напомнила про книгу Дэна Милмэна "Мирный воин". Автор поднимает такой важный вопрос как взаимодействие разума и тела. Иллюстрирует различные методики по усвоению практик через путь главного героя.

    Классная статья, спасибо!!


  1. Kahelman
    15.09.2023 18:39

    Слишком много пиара Роберта Мартина, кто нибудь в курсе что он написал кроме уники, которая, если честно достаточно сомнительна. (В качестве ссылки на авторитетах рекомендую Ousterhout “A Philosophy of Software Design), для тех кто не в курсе это создатель TCL, и Ричарда Хипа - создателя SQLight, который улучшал свои навыки программирования, изучая код TCL


  1. AlexanderS
    15.09.2023 18:39

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

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


    1. Akela_wolf
      15.09.2023 18:39
      +2

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

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


      1. AlexanderS
        15.09.2023 18:39

        Ну вот если практическая ценность ката для боевых искусств как-то понятна, то с точки зрения программирования, лично мне, как-то не очень)
        Знание и умение — это понятно, но это не ката. Прочитав много умного когда начинаешь что-то делать сам, то начинается хождение по грабелькам. Архитектурно ты представляешь как должно быть потому что уже это делал, но при столкновении с реальностью выясняются особенности другого языка программирования, грабли синтаксиса и прочее. Я вот например недавно скрипт писал для микротика: "Ну что я, скрипты что ли никогда не писал" — и вдоволь наотлаживался без знания, что переменные с подчеркиванием/дефисом нужно в кавычки заключать. Времяпрепровождение интересное, но уж сильно времязатратное)