вторник, 11 декабря 2012 г.

Всемирный Coderetreat день 2012 в Цюрихе

В субботу 8 декабря мне довелось участвовать в замечательном мероприятии – Global Day of Coderetreat 2012. В этот день программисты в десятках городов по всему миру собираются, чтоб интенсивно попрактиковаться в своем ремесле. Базовые правила следующие:
  • работа в парах, смена партнёра после каждого упражнения;
  • следование лучшим практикам разработки через тестирование (TDD);
  • продолжительность одного упражнения – 45 минут;
  • в конце каждого упражнения код стирается;
  • решается всегда одна и та же задача – игра «Жизнь» Джона Конвея, но с некоторыми ограничениями.
Игра «Жизнь» – она же Conway's Game of Life, или просто CGOL – прекрасный пример того, как всего несколько простых правил порождают невероятно замысловатое поведение системы. Вот тут можно посмотреть очень хорошее объяснение и визуализацию примеров. Есть даже вот такая «фрактальная» реализация. Очевидно, игра «Жизнь» успешно морочит головы математикам и программистам уже более сорока лет.

Вся логика игры «тест-драйвится» отдельностоящим кодером среднего калибра минут за 40–60. Первое упражнения дня как раз и состояло в реализации безо всяких ограничений. У меня опыт программирования CGOL уже был, а моей напарнице было трудновато сходу понять, как оно всё устроено. Поэтому, большую часть 45-минутной сессии я обосновывал предлагаемую мной реализацию. Так что продуктивного кода написали мы всего строчек 10. Но это и нормально. Первое упражнение – подготовительное; его цель – помочь участникам прочувствовать проблему. Тем не менее, в конце, по команде «Всё стираем!» нам было как-то не по себе :)

Потом началось интересное – введение ограничений. Именно ограничения делают упражнения невероятно эффективными, выбивая участников из их зоны комфорта. Вот что было предложено для второго упражнения:
  • запрещено использовать условные операторы,
  • запрещено использовать скалярные значения для представления данных,
  • максимально допустимый размер функции – 5 строк (для Ruby – 4 ;-).
Первая реакция: «Эээ… Ааа… Как так⁈ Что, прям вот совсем нельзя⁈», и тому подобное. Потом приходит: «Ха! Интересно-интересно… А что, если попробовать вот так…» Надо сказать, наличие напарника здорово помогает контролировать соблюдение всех ограничений. Кроме того, обсуждение и конструктивные споры позволяют не убежать слишком далеко по ложному следу. Времени-то совсем мало.

Дальше – больше. В следующем упражнении я должен был честно писать тесты, а мой напарник при написании продуктивного кода должен был играть роль злого гения, который оставляет тесты зелёными, но старается сделать реализацию по сути ошибочной. А! При этом нам было запрещено разговаривать. Это была куча фана. Разговаривать – мы не разговаривали, но ржали оба в голос. Наверное, выглядело очень странно со стороны; нормальным людям не понять. Интересно, что именно в этом упражнении из всех пройденных мы дальше всего продвинулись в реализации. Почему? Именно! Потому что не разговаривали ;-)

Следующая сессия прошла не очень хорошо, так как мы оба хотели попробовать писать на Clojure (до этого у меня были только PHP и JavaScript), но при этом оба были полные noob-ы; особенно я. Поэтому больше боролись со скобками и API-доками, чем собственно с задачей. А ограничения были как раз очень интересные: так называемые детские шажки – на одно действие отводится не более трёх минут: постоянно взводится таймер. Не успел написать продуктивный код, тест, или не успел зарефакторить – откатываешься до предыдущего коммита. По ходу упражнения лимит был вероломно снижен с трёх минут до двух, а потом и до одной. Народ визжал.

Заключаю, что для успешного упражнения необходимо, чтобы хотя бы один из напарников свободно владел используемым языком; как и получилось для меня в следующей сессии, когда мой второй номер мастерски фигачил Java-код, а я был за штурмана. Пожалуй, тут были самые интересные для меня ограничения: было запрещено использовать функции; то есть было запрещено из процедур возвращать какие-либо значения. Всё должно было происходить при помощи чистого обмена сообщениями. Было здорово! Попробуйте сами.

На последней сессии был эдакий фристайл: было предложено выбрать любые ограничения из списка. Мы взяли отсутствие побочных эффектов и подключаемый/изменяемый набор правил. Тут я малость запух, пытаясь тестировать слишком уж много сразу. В итоге пришлось всё стирать на полпути. Эх, надо было двигаться детскими шажками!


В общем, я в восторге! Участвуйте при первой же возможности! При этом советую перед событием хорошенько выспаться. К концу дня мозг прямо-таки вскипает.

Большое спасибо Кори, который всё это начал. Спасибо Гезе, который организовал и вёл #gdcr12 в Цюрихе, а также сделал все фотографии, использованные в этом отчёте. Спасибо компании Намикс (особенно Михаэлю и Надин), которая нас гостеприимно приютила, поила хорошим кофе и кормила горячим обедом.

С наступающим!
Ваш @ikr.

5 комментариев:

  1. А я правильно понял что язык Clojure был новый и для тебя и для партнера. Тогда как вы писали на нем тем более в таких стрессовых условиях? Гуглом позволительно было пользоваться? Готовился ли ты предварительно?

    А вообще читал пост как фэнтези о будущем которого еще не видел сам.
    Действительно класс, четко! (с)

    ОтветитьУдалить
    Ответы
    1. Для нас обоих Clojure – язык, на котором мы бы хотели писать. Просто на работе делать это не получается. Однако, мы оба игрались с Clojure на досуге: я читал книжку и делал на нём задачки с projecteuler.net Но это же совсем не то же самое, как если впахивать на нём по 40 часов в неделю.

      Пользоваться можно чем угодно. Всё на самоконтроле. То есть, в принципе, никто не мешает нагуглить тесты и код именно с такими ограничениями. Но смысл?

      Маленько готовился, можно сказать. За неделю до мы с пацанами вечерком затестдрайвили CGOL на Ruby. В следующий раз я бы с вечера приготовил все среды разработки, и написал бы разок CGOL без ограничений в одной из них.

      Спасибо за одобрение :)

      Удалить
  2. Очень здорово!
    Такие мероприятия доказывают, что программирование - это весело и интересно. Мы занимаемся этим целыми днями, и нам за это еще и деньги платят!

    Я впервые реализовал алгоритм "жизни" на ассемблере Z-80 на спектруме, и обалдел как это быстро, после бейсика не верилось что так много операций можно обсчитать мгновенно. До сих пор помню свой трепет, а еще помню что никто не понял что такое я сделал, почему так возбужден и нафига это нужно :(

    ОтветитьУдалить
  3. Дааа... Действительно, похоже на фантастический рассказ!
    Особенно впечатляет работа в паре по времени..
    Понимаю, что я не рискнула бы, наверное.
    Надо учиться, надо стремиться :)

    ОтветитьУдалить
  4. Абсолютно, Максим! Everything's amazing, and nobody's happy :)

    Cпасибо, Надя. Ничё-ничё, это только поначалу страшно, а потом входишь во вкус ;)

    ОтветитьУдалить