Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!

Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 
Показаны сообщения с ярлыком tetris. Показать все сообщения
Показаны сообщения с ярлыком tetris. Показать все сообщения

среда, 16 января 2013 г.

Refactoring: По чуть-чуть

Все говорят - делайте рефакторинг по чуть-чуть. Не накапливайте технический долг. Супер. Но я не видел, кроме как в книге Мартина Фаулера, демонстрации рефакторинга "по чуть-чуть".

Не так давно мы с другом Виталиком учились ТДД. Мы играли в tetris coding dojo, но в отличие от ребят игравших одновременно с нами мы делали акцент в сторону обучения. И вот в какой-то момент на руках у нас был код.

    String answer(String figure, int x, int y, String glass, String next) {
        if (glass.charAt(0) == ' ') {
            return "left=4, drop";
        }
        if (figure.equals("I") && glass.charAt(1) == ' ') {
            return "left=3, drop";
        }
        if (glass.charAt(2) == ' ') {
            return "left=2, drop";
        }
        if (figure.equals("I") && glass.charAt(3) == ' ') {
            return "left=1, drop";
        }
        if (glass.charAt(4) == ' ') {
            return "drop";
        }
        if (figure.equals("I") && glass.charAt(5) == ' ') {
            return "right=1, drop";
        }
        if (glass.charAt(6) == ' ') {
            return "right=2, drop";
        }
        if (figure.equals("I") && glass.charAt(7) == ' ') {
            return "right=3, drop";
        }
        if (glass.charAt(8) == ' ') {
            return "right=4, drop";
        }
        if (figure.equals("I") && glass.charAt(9) == ' ') {
            return "right=5, drop";
        }
        throw new UnsupportedOperationException();
    }

Очень неидеальный код. Но дело в том, что нам надо было чтобы фигурки тетриса расскладывались, и ТДД привело нас именно сюда. В какой-то момент я предложил - а давай порефакторим этот код - тут чертовски много дублирования. Виталик согласился. Глядя на этот код сразу видно, что тут необходим цикл. Но написать родить его одним махом не получилось. Прошло 15 минут, а кода рабочего небыло. И тут я предложил тот самый рефакторинг "по чуть-чуть". Еще через 20 минут у нас был код, отражающий ход наших мыслей.

    String answer(String figure, int x, int y, String glass, String next) {
        boolean isO = figure.equals("O");

        int dx = 0;
        while (dx <= 10) {
            if (isFree(glass, dx)) {
                return getCommand(dx);
            }
            dx += (isO)?2:1;
        }
        throw new UnsupportedOperationException();
    }

    private String getCommand(int dx) {
        if (dx < 4) {
            return left(dx);
        } else if (dx == 4) {
            return drop();
        } else {
            return right(dx);
        }
    }

    private String left(int dx) {
        return "left=" + (4 - dx) + ", drop";
    }

    private boolean isFree(String glass, int dx) {
        return glass.charAt(dx) == ' ';
    }

    private String drop() {
        return "drop";
    }

    private String right(int dx) {
        return "right=" + (dx - 4) + ", drop";
    }
Да, тут осталось пару магических констант, но в контексте исходного класса, не сложно догадаться что это за 4-ки, 2-ка и 1-ка.

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

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


В тот день Виталик спросил "и хорошо, а сколько по времени стоит делать рефакторинг?". Вопрос хороший. У меня есть свой фирменный ответ. Делай рефакторинг до тех пор, пока код не станет оражать твои мысли настолько просто, насколько у тебя это получится. В целях практики делай рефакторинг даже немного дольше. Не беда, если забрел не туда - откатись и попробуй еще раз, но после перерыва. Пиши тесты - без них ты сапер без миноискателя. Как только сделал хорошо - коммить. Всегда можно сделать еще чуть лучше, но не всегда за один ход, порой надо сделать шаг в сторону усложнения, чтобы потом код упростился. Экспериментируй с кодом.

Надеюсь, пригодится. Виталик, спасибо тебе! Классно покодили в тот день!

четверг, 15 ноября 2012 г.

Отчет о Tetris Coding Dojo #3 Киев DataArt XPDays

Привет! Мы в очередной раз собрались, чтобы погаматься в тетрис.
Спасибо Коле Алименкову, офису DataArt, а именно Антону Михайлюку и Саше Лылке которые помагали нам с организационной стороны, а так же и всем участникам этой встречи.

Ребят было достаточно много и теперь не только джависты, но и C# программисты. Кодили на лиспе, пхп, питоне...


Ребята не жалели бумагу


Уходили глубоко в себя :)


Но первым на Level 2 перешел AlexeyZ и тут же вся комната наполнилась смехом, потому как алгоритм не умел расскладывать квадратики, и относился к ним как к палочкам - вот и получилась занятная лесенка.


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


А вот Игорь потирает руки. Мы-то с Серегой знаем, что он бывал на всех прошлых встречах и у него в загашнике есть хороший рабочий алгоритм - долго ждать не пришлось :) Игорь вскоре запустил его.


Мы понаблюдали-понаблюдали, а когда алгоритм стал портить статистику всех играющих, Игорь получил в бан. Хорошо, что часть фреймворка написана на скриптовом языке - простой фикс и справедливость восстановлена!



Призами на этот раз были игрушки из нашего детства



Номинации выбирали по ходу, выслушивая уникальные истории ребят о том, как они кодили свой решалку тетриса.

Саша и Леша находясь на втором уровне сложности умудрились заработать столько очков, что вышли на третье место среди ребят находящихся на 5 уровне.
За то, что они поделились секретом как они это сделали - мы вручили им один тетрис на двоих :)

Получили по тетрису так же тройка лидеров.

Призеры писали на php в паре. Тут они еще не знают, что попадут в тройку.

Двое ребят не побоявшиеся писать на Closure - им достались не такие тетрисы, как всем...
...в партии, что мы купили к сегодняшней встрече как раз было два тетриса, которые отличались от всех остальных. Так и на встрече - все писали на С# и Java, а ребята решили на Closure. И молоды! Клиенты мы потом у них заберем и к делу подошьем :)

А вот эти ребята писали тесты и потому немного отстали от всех :) Просто тесты имеют такое свойство - вначале ты их, а потомо ни тебе.



А вот вкратце вся игра, ускоренная в 10 раз


Остальные фотки тут

понедельник, 29 октября 2012 г.

29 Октября - JavaDay 2012 "Игры на работе: Coding dojo своими руками"

Вчера выступали с Серегой на JavaDay 2012. Большущее Спасибо организаторам конференции за эту возможность. Еще одно, отдельное, Спасибо за то, что конференция участникам не стоила ни копеки - я очень рад был видеть там знакомых ребят из числа студентов. Кстати, обыно я наблюдаю за нетворкингом на конференциях и могу сказать что на JavaDay он удался.

Мы с Серегой докладывались во втором потоке, но людей собралось не мало.



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

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

Далее, глядя на эти тезисы (которые для удобства стоит выписать на небольшие карточки), стоит взять диктофон и еще раз рассказать все, что приходит в голову. Снова прослушать и дополнить карточки-тезисы новыми. Снова поменять порядок если надо и еще раз расскзаать на диктофон.

В общем, это делается 5-7 раз до полной готовности доклада. Больше готовить ничего ненадо. Доклад заучен и отрепитирован. Следующий шаг - сделать слайды из карточек.

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

С одной стороны, я побуждал ребят, чтобы они, вооружившись своими знаниями, полученными в ходе работы на комерческих проектах, доставали из своих долгих туду ящиков идеи и пробовали реализовывать их. А чтобы дело пошло искали себе напарников. Второе - это пример того как мы с Серегой проделали то же самое с Tetris Coding Dojo.

Вот каким получился наш доклад. Серега, спасибо тебе за tetris dojo и за помощь в подготовке доклада.

Надеюсь кому-то пригодится.

суббота, 22 сентября 2012 г.

Отчет о Tetris Coding Dojo 2012-09-20

Состоялось! Мы собрали наших друзей и провели tetris coding dojo. Цель собрания - посмотреть насколько жизнеспособен фреймворк, собрать фидбеки ребят на тему "как сделать еще круче" и просто весело провести время.

Спасибо большое офису Сиклума, который приютил нас в самой высокой точке Киева, а именно на 20 этаже бизнес-центра, в котором размещен. Вид оттуда просто превосходный.


 Ребята приходили и тут же открывали ноутбуки и ...

...как говорит Лиана Шишкина - становятся похожими на улиток. Кстати Лина и Наташа Тренина были у нас в гостях, но в обществе улиток им вскоре стало скучно и они, к сожалению, нас кпокинули.

У игры небыло официального старта - как только Серега со своей командой отловил хитрый мемори лик игра стартовала. К этому времени все реюята были в сборе.


Нашу компанию посетил Леша Солнцев и поделился ценным фидбеком с точки зрения огранизации. Я не успевал записывать идеи и замечания. У Леши дар давать фидбек.


Похоже Лина права - программисты-улитки :) В будущем будем прививать парное программирование, чтобы ребятам было веселее. К нам раз зашла девочка Саша, огранизатор ивента со стороны Сиклума - так на ее вопрос все ли у нас хорошо, один из игроков ответил "мы сейчас не тут, мы сейчас где-то там"...


Толик в глубоком трансе - как я ему завидую...


Интересное наблюдение - хром посчитал, что писали игру турки

 
А вот и Серега подглядывает - "а кто это вырвался вперед?".
 

Leaderboard со всеми тетрисами и очками был на проекторе всю игру. Было интересно наблюдать как играют ребята..


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


А вот и общий счет на конец игры. Глубокие минуса - мы это исправим. В ходе обсуждения игра после игры мы пришли к тому, что штрафов не будем начислять вообще!


Обсуждение не прекращалось в троллейбусе, а потом плавно перешло в пиццерию...


А вот все остальные фотки