Почему «Игра жизни» Конвея используется для ретритов кода?

15

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

Одна вещь, которую я до сих пор не понимаю, это то, почему «Игра Жизни» является хорошей проблемой для TDD, и каково это хорошее и плохое TDD для нее.

Поймите, что это довольно открытый вопрос, поэтому не стесняйтесь комментировать.

просчеты
источник
Это похоже на дискуссионный вопрос, который лучше всего задать в нашем чате по разработке программного обеспечения .
Адам Лир
@ Анна Лир: Спасибо, но не смотрю в чат, ищу ответы. Если это не хороший вопрос, это хорошо.
промахи
3
@AnnaLear Я думаю, что вопрос больше по теме, чем считает OP.
Том Сквайрс
1
@ Я думал об этом сам, и рад, что у него все хорошо. Рад быть неправым. :)
Адам Лир

Ответы:

26

Первоначально игра «Жизнь» Конвея была выбрана потому, что у нас был Java-апплет для работы на самом первом коде-ретрите в январе 2009 года. Цель дня состояла в том, чтобы поэкспериментировать с некоторыми идеями, связанными с практикой, ограниченной по времени, и мы просто выбрали апплет GoL, потому что у нас это было.

После этого, тем не менее, в качестве нескольких активных фасилитаторов (особенно я во время моего тура в 2009 году в качестве путешественника и Алекса Болбоака в Бухаресте) исследовал использование GoL в качестве инструмента обучения. В то же время мы развивали формат coderetreat до того, каким он стал сегодня. В 2009 году Алекс попытался решить хотя бы еще одну проблему (подсчет покерных рук), но не нашел ее такой полезной, как GoL. Вы можете узнать больше об истории на http://coderetreat.org/history

Coderetreat фокусируется на улучшении нашего понимания простого проектирования (в частности, 4 правил простого проектирования), разработки через тестирование и других фундаментальных аспектов разработки программного обеспечения. Преимущество GoL состоит в том, что он является очень простой для понимания проблемой, но в то же время очень богат с точки зрения структуры. Он легко предоставляет части системы, которые можно использовать в качестве примеров всех тем, которые мы практикуем в coderetreat. Например, общая реализация, которая принимает (x, y) параметры в нескольких методах, является прекрасной возможностью рассказать о принципе СУХОЙ (каждое знание должно иметь одно и только одно представление в вашей системе) в отношении топологии система. Есть много других аспектов, которые можно использовать в качестве примеров построения дизайна, который минимизирует стоимость изменений.

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

coreyhaines
источник
10

«Игра жизни» Конвея подойдет, потому что это довольно простой набор кодов, который дает очень сильные результаты. Что касается его использования для разработки, управляемой тестами, я бы поставил на нее, потому что писать тесты было бы довольно сложно, потому что результаты, которые вы ищете, не очевидны из кода, который вы пишете. Написание кода, который дает вам планер, - это хитрость, если вы не делали этого раньше или не делали это долгое время. Таким образом, он подходит для развития искусства дисциплины, особенно при выполнении в парном программировании, как это обычно бывает в TDD.

Что касается обучения вас полезным вещам; это упражнение в виде латерального мышления. Вы должны осмыслить, как ваш код будет функционировать, запускать его, видеть, как он выходит из строя, собирать данные, проводить рефакторинг и продолжать итерации. Все эти вещи имеют решающее значение для TDD. Связывая это с реальным миром, это похоже на клиента, который вручает вам расплывчатый документ с требованиями, в котором просто сказано: «Я хочу Х». Таким образом, вы даете им X, но добраться до X может быть сложно. Игра жизни Конвея хороша в обучении этому. Это также довольно легко кодировать и обычно не требует тонны кода для этого. ( APL является одним из наиболее экстремальных примеров реализации.) Так что он вполне подходит для коротких сессий, в которых ретрит должен проходить вместо недельной или двухнедельной итерации, как это обычно бывает в производственной среде.

Мировой инженер
источник
10
Я бы посчитал планер «эмерджентным» поведением. Ваши юнит-тесты должны только кодировать правила жизни и смерти клеток с учетом определенного количества соседей.
Роберт Харви
1
Планер - определенно новое поведение. Некоторые участники coderetreats создадут несколько больших тестов, которые включают в себя такие вещи, как планер, но это тесты руководства, а не ориентированные на юнит / тдд тесты. Поведение возникает из построения правил, которые определены хорошо.
coreyhaines
3

Game of Life - это, с одной стороны, очень простой набор правил, с другой стороны, он содержит некоторые наихудшие предостережения передового программирования, связанные с масштабируемостью . Хотя результаты являются детерминированными, существует проблема бесконечного игрового поля и бесконечного числа ячеек для обработки.

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

Вы получили известный ввод и известный вывод после X итераций, и вы знаете все шаги, чтобы туда добраться ... кроме тех, которые занимают слишком много и слишком много времени. Вы должны выполнить несколько довольно экстремальных оптимизаций, чтобы соответствовать спецификациям. Тривиальный алгоритм со сканированием 2-битного массива битов фиксированного размера становится совершенно неадекватным, поскольку его производительность ухудшается с O (n ^ 2) размера. Обработка заполненных блоков как новых порожденных объектов внезапно пожирает тонны памяти и замедляется. Разделение всего на доски ограниченного размера иногда работает, иногда не получается ...

А поскольку большинство «глобальных» тестов не соответствуют стандарту производительности, вам необходимо разрабатывать более мелкие цели, более мелкие суб-тесты, которые устраняют недостатки ...

Научная фантастика
источник
2

Все зависит от того, какой аспект вашего процесса вы хотите практиковать / тренировать.

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

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

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

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

Примеры не всегда легко найти для такого синтетического упражнения. это должно быть просто, чтобы сделать это за день, но не слишком просто, чтобы пройти через день. Это должно быть весело, но не бессмысленно ... Но для меня это должно быть немного оригинально, я не могу вспомнить, сколько раз меня просили заставить студентов создать систему управления видеоклубом для домашней работы ... iiirch.

Newtopian
источник