В прошлую субботу я был тренером в Legacy Code Retreat Milan 2013, организованном @ gabrielelana вместе с @ filippo и @ andreafrancia . Вот краткий обзор целей мероприятия и опыта.
Зачем?
Code Retreat является день , посвященный осознанной практики, где программисты воссоединить и работать в парном программировании на одного задач для каждой итерации. Каждая итерация состоит из секции кодирования (или проектирования) 45 ‘и ретроспективы, проведенной всей группой.
Целью Code Retreats является улучшение определенного навыка в обстановке без давления и сроков; весь код удаляется в конце каждой итерации, чтобы передать сообщение о том, что важен не конечный результат выполнения (попадание в то же место, с которого вы начали), а пройденный путь и полученное обучение.
Legacy Code Retreat — это особый вид Code Retreat, где устаревший код предоставляется в виде хранилища исходного кода, содержащего версию игры Trivial Pursuit (доступной для нескольких языков программирования). В нашей реализации цель была разной для каждой итерации:
- 1-ая итерация: создание массивного сквозного автоматизированного теста для кода, называемого Golden Master. Это настоятельно рекомендуется из существующего материала по Legacy Code Retreat: вы можете изменять только тот код, который охватывается автоматическими тестами.
- Вторая итерация: упростите добавление новой категории вопросов.
- Третья итерация: добавьте модульные тесты для функции roll (), проверяя ее вывод и конечное состояние.
- Четвертая итерация: найдите все запахи кода и исправьте 3 из них.
- 5-я итерация: удалите все дубликаты.
- Шестая итерация: сделать введение различных штрафных правил однострочным изменением (ката открытого / закрытого принципа).
Вот презентация Габриэле, содержащая введение в день и цели.
Золотой мастер
Первая итерация особенная и служит настройкой для остальной части дня; результат этой итерации не (по крайней мере, концептуально) отбрасывается, а вместо этого сохраняется и запускается как тест end2end для выявления какой-либо регрессии.
Непростая проблема унаследованного кода всегда одна и та же: ее сложно проверить на наличие неясных зависимостей и глобального состояния, но вы не можете изменить ее, чтобы упростить работу, пока у вас нет тестов, которые гарантируют, что вы ничего не сломаете , И тестирование, и рефакторинг требуют друг друга.
Фактически, цель первой итерации состоит в том, чтобы создать такой тест end2end без изменения кода в хранилище: вы могли бы сказать «просто добавить новые исходные файлы» или «использовать только безопасные рефакторинги» для языков, которые их разрешают. Сам код не имеет определенного глобального состояния (такого как таблицы базы данных), за исключением того факта, что он вызывает функции random () для генерации результата броска игральных костей.
Это означает, что выполнение кода несколько раз всегда дает разные результаты:
"Chet is the current player","They have rolled a 6","Chet's new location is 6",... "Chet is the current player","They have rolled a 4","Chet's new location is 4",...
Задача создания золотого мастера состоит в том, чтобы обеспечить инициализацию глобального состояния генератора случайных чисел, чтобы можно было повторять выполнение игры. Если у вас есть 100 итераций с разными инициализациями, вы можете сохранить их и повторить один и тот же процесс, чтобы выяснить разницу в результатах игры. Любая разница может указывать на то, что рефакторинг унаследованного кода сломал его, и необходимо использовать «git reset» или вашу любимую отмену.
Поскольку итерации всегда независимы, в конце первой мы предоставили ветку golden-master в хранилище для всех пар. Таким образом, даже тот, кто не достиг цели (что является нормальным с учетом коротких временных рамок) или имеет грубое решение, мог использовать настроенный тестовый пример для остальной части дня; Наличие более золотых мастеров позволяет также изменять пары на каждой итерации, а компоненты переключать языки программирования.
Как прошло?
Мероприятие было распродано, и 30 человек пришли (к счастью, четное число, чтобы упростить программирование пар). Как тренеры, мы перемещались между парами, стараясь не прерывать их, если они были сосредоточены, но предлагали помощь застрявшим парам и тем, кто отошел от цели.
Финальная ретроспектива вывела несколько товаров:
- хороший формат: каждая итерация практически независима.
- Четко определенные цели.
- Разнообразие языков и людей.
- Расположение и еда (Talent Garden в Милане и завтрак, предлагаемый XPeppers).
И несколько плохих, чтобы решить для следующих выпусков:
- нет теоретического введения о том, как работать с устаревшим кодом.
- Сложности в использовании класса извлечения в отношении метода извлечения и поля извлечения, которые являются локальными изменениями.
- Трудности с введением юнит-тестов.