Какое настоящее отступление

Это было 4 мая 2018 года, и когда я вошел в офис в 8:55, в воздухе витала почти неописуемая энергия. Нет, это была не Сила, а нечто столь же мощное. Любопытство и страсть к решению проблем движут каждым кодировщиком, когда они запускают свой VIM / Emacs / Notepad ++. Это был Code Retreat.

"Но ждать!" воскликнете вы. «Что это за Code Retreat, о котором вы говорите?»

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

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

На каждом занятии участников распределяют по новым парам, поэтому каждое объединение в пары дает возможность найти решение проблемы. Каждая пара длится 45 минут, после чего следует 15-минутное групповое размышление о том, как все прошло. Как правило, этого времени недостаточно для полного решения задачи, поэтому пары должны сосредоточиться на определенных аспектах, которые они хотят решить в ходе сеанса. Вам также рекомендуется использовать подход TDD (Разработка через тестирование), при котором разработчики пишут тесты до кода, чтобы заставить их пройти, а не просто слепо писать код, решающий проблему. Чтобы узнать больше об отступлениях кода (и Глобальном дне отступления кода), посетите https://www.coderetreat.org/.

Итак, следующее, о чем вы, вероятно, думаете: Ну, это кьюл. Но какие проблемы решаются при отступлении кода? Хотя теоретически можно использовать любое количество задач, в большинстве отступлений по коду используется Игра жизни Джона Конвея, простая задача моделирования, которая имеет множество решений / подходов, но четко описывает результаты успеха.

История / объяснение «Игры жизни» Конвея

В 1970 году Джон Конвей опубликовал математическую игру, которая пытается имитировать рост / сокращение населения. Вот основные правила игры:

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

1. Любая живая клетка с менее чем двумя живыми соседями умирает, как будто из-за недостаточного населения.
2. Любая живая клетка с двумя или тремя живыми соседями доживает до следующего поколения.
3. Любая живая клетка с более чем тремя живыми соседями умирает, как будто из-за перенаселения.
4. Любая мертвая клетка с ровно тремя живыми соседями становится живой клеткой, как если бы в результате размножения.

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

- - Из Википедии, https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life#Rules

Вот гифка игры в действии, чтобы лучше понять, что все это значит:

Сначала это может быть немного неясно, но если вы рассмотрите 4 правила, приведенные выше в отношении каждого квадрата в GIF, это будет иметь немного больше смысла. Каждое поколение / итерация / ход каждый квадрат смотрит на количество окружающих квадратов и подсчитывает количество живых соседей. Это будет определять, будет ли этот квадрат живым или мертвым на следующем ходу. В случае вышеуказанного GIF (известного как мигалка) цикл повторяет одни и те же две позиции навсегда: вертикальная линия, а затем горизонтальная линия.

Для тех из вас, кто знаком с кодированием, вы, вероятно, уже можете представить себе некоторые из проблем, представленных здесь:

  1. Как вы показываете доску пользователю?
  2. Как вы храните статус каждой ячейки?
  3. Как вы рассчитываете здоровье данной клетки для будущего поколения?

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

Удаление паутины (первые несколько занятий)

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

Создание пары с Исааком

Сначала я объединился с Исааком, одним из наших старших программистов. Он был немного новичком в компании, но я встречался с ним несколько раз, так что он был не новичком (мы оба любим смотреть старые фильмы). Поскольку мы оба были в некотором роде новичками в этом упражнении (это было мое второе отступление по коду и первое отступление Айзека), мы применили довольно консервативный подход к проблеме.

Обычно мы пишем код, используя ООП (объектно-ориентированное программирование), поэтому мы выбрали этот подход. Мы написали класс Board, который действовал как базовый класс, в котором все существовало. Тогда у него будут атрибуты ячеек, в которых будет храниться двумерный массив, где каждый элемент был либо истинным, либо ложным (представляющим состояние ячейки во время каждого поколения). Затем мы сосредоточились на написании логики расчета следующего поколения. Это была основа того, над чем мы работали, и на это ушло около 2/3 нашего времени.

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

Взаимодействие с Доном

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

Для этого раунда я, возможно, был слишком амбициозен. Я предложил Дону попробовать чисто функциональный подход к проблеме. Это означало отсутствие классов и побочных эффектов, только функции, которые принимают входные данные и производят выходные данные. Если вы не знакомы с тем, что такое функциональное программирование (поскольку для этого поста потребуется слишком много времени, чтобы углубиться в детали), ознакомьтесь с этой замечательной статьей, в которой сравнивается ее с ООП: Дискуссия о объектно-ориентированном программировании и функциональном программировании. краткое содержание для новичков .

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

В конце концов, мы не зашли слишком далеко, но я все равно считаю этот раунд успешным, потому что мне нужно было критически рассмотреть то, что я объяснял, что только помогло мне углубить мое понимание как проблемы Игры Жизни, так и ООП. против функционального программирования.

Вступление в пару с Мэдлин

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

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

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

Круглые столы в середине сессии (обсуждение между раундами)

Помимо собственно парного программирования, вторым компонентом (и, возможно, самой важной частью) были групповые ретроспективы, которые происходили между сессиями. Здесь все собирались вместе и обсуждали вещи, которые, по их мнению, были трудными / интересными / скучными в их раундах. Тогда я впервые услышал об идее использовать хэш-карту для хранения информации о живых клетках (от наших данных «сумасшедшего» ученого Бена). Также было интересно услышать от пар, которые пробовали совершенно разные языки и каков был их опыт (наши фронтендеры в какой-то момент смогли написать всю игру в одной строке ... Javascript, будь глупым).

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

Смысл игры в жизнь - основные выводы дня

Итак, с учетом всего сказанного, что я считаю наиболее важными аспектами дня? Что ж, если бы я поместил это в красивый небольшой список пунктов, это могло бы выглядеть так:

  • Обучение на основе сотрудничества через обмен идеями
  • Изучение концепций / поездка домой, объясняя их другому человеку (который может быть менее осведомлен, чем вы, по данной теме)
  • Укрепление хороших привычек (TDD, построение диаграмм / логическое моделирование до кодирования / тестирования интуиции)

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

Консультации по запуску собственного ретрита кода

Итак, вы хотите провести собственное отступление по коду?

Потрясающие!

Однако вот несколько советов о том, что вы можете сделать, чтобы подготовиться:

  1. Дайте себе немного времени. Если это ваше первое отступление по кодам (или даже если это не так), не планируйте отступление завтра внезапно. Помните, что людям есть чем заняться (особенно если вы планируете это для своей компании). Дайте себе немного времени, чтобы спланировать целый день ничего, кроме отступления от кода. Это означает сокращение сроков, завершение отложенных проектов, перенос встреч. Убедитесь, что у всех участников есть время для выполнения своих основных обязанностей.
  2. Примите участие в ретрите по программному обеспечению. Это особенно актуально, если вы никогда раньше не участвовали в ретрите. Вы можете посетить https://www.coderetreat.org/, чтобы узнать, где найти мероприятие.
  3. Планируйте перерывы между каждыми двумя занятиями. Хотя вы можете скопировать официальное расписание Code Retreat или составить собственное, не забудьте выделить время между каждыми несколькими занятиями, чтобы люди могли размять ноги. туалет, или просто передохнуть. Помните, это отступление, а не спринт.
  4. Предоставьте несколько закусок (или попросите людей принести их с собой) - следуя пункту 4, убедитесь, что поблизости есть закуски, которые могут быть у людей. Ничего слишком тяжелого, но что-то вроде миндаля или апельсина отлично подойдет.
  5. Удачи!

Хотите присоединиться к нам на следующем выпуске кода? Мы нанимаем!