Coderetreatの構造


## このドキュメントの目的

当ドキュメントは http://coderetreat.org/facilitating/structure-of-a-coderetreat の翻訳を基に、Coderetreatのファシリテーターになる方の助けとなるドキュメントをまとめたものです。

このページは、Coderetreatをどのように進むか、その概要と、実際によく使われているファシリテーション上のTipsをまとめたものです。[CoreyはCoderetreatのファシリテーターの役割について、ブログを執筆しています。(英語)](http://blog.coderetreat.com/on-the-role-of-the-coderetreat-facilitator)

## 構造

Coderetreatはプログラミングの実践に集中するために最適化され、何度も実施され、確立された構造があります。

- 課題:[コンウェイのライフゲーム](http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)
- 1セッションの時間: 45分
- 開催時間: AM 8:30 〜 PM 5:00 か PM6:00
- Coderetreatではペアプログラミングを必須としています。ペアプログラミングには知識の伝達という、Coderetreatに必要不可欠な活動を含むためです。
- TDD(テスト駆動開発)をするように推奨する
- セッションが終了したら、ペアを入れ替える
- セッションが終了したら、書いたコードを消してください。ブランチを作成したり、stashするのではなく、その日の足跡をただ消してください。

Coderetreatの1日は5、6セッションから成り立ちます。それぞれのセッションは、前のセッションの学びを元に進められます。朝は、参加者が問題領域を十分に考えられるよう、また古い習慣を破り自己探求を始められるようにすることに注力します。午後はペアプログラミングに挑む事でテスト駆動開発や疎結合なモジューラーデザイン、抽象化などの理解など、彼らのスキルを限界まで高めることに挑みます。

多くのグループでは、最初にソフトウェア開発とモジューラーデザインの基礎である、シンプルな4つのルールを紹介します。新たな学びを押しこむ、と言うよりはむしろ、これらのコンセプトの実践に1日を費やします。

下記は、Coderetreatにおける1日の概要です。

08:00 - 08:45 : 会場 受付 コーヒー/朝食
08:45 - 09:00 : 設営, 導入, 課題の説明
09:00 - 09:45 : セッション#1 
09:45 - 10:00 : 休憩、ふりかえり
10:00 - 10:45 : セッション#2 
10:45 - 11:00 : 休憩、ふりかえり
11:00 - 11:45 : セッション#3 
11:45 - 12:00 : 休憩、ふりかえり
12:00 - 13:30 : 昼食、歓談タイム
13.30 - 14:15 : セッション#4
14.15 - 14:30 : 休憩、ふりかえり
14.30 - 15:15 : セッション#5
15.15 - 15:30 : 休憩、ふりかえり
15.30 - 16:15 : セッション#6
16.15 - 16:30 : 休憩、ふりかえり
16.30 - 17:00 : 全体ふりかえり 

(下記の時間割は、実際に福井で開催した時のものです。)

09:00 - 09:30 会場 受付 コーヒー等
09:30 - 10:00 設営、趣旨説明、準備 
10:00 - 10:45 セッション#1 
10:45 - 11:00 休憩、ふりかえり 
11:00 - 11:45 セッション#2 
11:45 - 12:00 休憩、ふりかえり 
12:00 - 12:45 セッション#3 
12:45 - 13:00 休憩、ふりかえり 
13:00 - 14:30 昼食、歓談タイム
14:30 - 15:15 セッション#4 
15:15 - 15:30 休憩、ふりかえり(おやつタイム)
15:30 - 16:15 セッション#5 
16:15 - 16:45 休憩、ふりかえり 
16:45 - 17:30 セッション#6 
17:30 - 17:45 休憩、ふりかえり
17:45 - 18:15 全体ふりかえり 

## 各セッションで取り上げたいトピック

長い期間をかけ、セッション中のペアを観察する経験を元に、ファシリテーター達はこれらの広範囲に及ぶトピックを取り上げるべき事を学びました。経験の浅いファシリテーターは、下記にあげたトピックを使ってCoderetreatを進めるとよいでしょう。

### セッション #1

問題領域について、ペアが感覚を得られることを念頭においてください。コンウェイのライフゲームを初めて見た人もいます。このセッションでは、ライフゲームについて、ペアで十分に考えられるようにしてください。最初のセッションの後、「コードを消す」という行為について、話してみる事もよいでしょう。何人かの人は、「コードを消す」という行為について抵抗を覚える人もいるからです。親切に、これらのルールについて説明するようにしましょう。

### セッション #2

問題における適切なデータ構造について議論しましょう。セルを覚えるのに、配列を使うのが本当に良いのでしょうか？primitive obsession(primitive型への執着)という話しを紹介するのもよいでしょう。

### セッション #3

彼ら自身で出来るだけやってみるように持ちかけてみましょう。booleanのフラグを使う事よりも良い解決案として、ポリモーフィズムを使えないか議論してみましょう。primitive obsessionをさらに避けるよう提案してみましょう。さらなる抽象化ができないか、提起してみましょう。

### 昼食

昼食は長めに時間をとりましょう。午前中の出来事について参加者が議論したり、歓談できる機会を作りましょう。

### セッション #4, #5, #6

午後は各々が午前中にぶつかった限界について取り組むように説明しましょう。下記の制限は、個々のペアの経験を元に紹介するとよいでしょう。

- if文を使わない
- ループを使わない
- 小さなメソッド（メソッドを5行以下にするには？1行にするには？）
- 言語が用意するプリミティブ型を使わない
- あなたが知っていたTDDで実装してみる

### 全体ふりかえり

Coderetreatの終わりに一緒に全体を通したふりかえりをすることはとても重要です。よくやるやり方は、全体ふりかえりで参加者全員に3つの質問を答えてもらいましょう。人数が多い場合は、短くするように伝えてください。2,30人もいると、結構時間がかかります。

その3つの質問とは、

- なんでも良いので、今日学んだことを話してください。
- なんでも良いので、今日驚いた事について話してください。
- なんでも良いので、これまでとは違ったやり方でこれから実践することについて話してください。

### プログラミング言語は何でもOK！

Coderetreatでの練習と提示しているアイディアは、どんなオブジェクト指向言語にも適用できます。この目的を達成するため、Coderetreatでは、明確に複数のプログラミング言語を使う事を提案しています。Coderetreatは新しい言語を学ぶための日ではありませんが、業務等では使っていない、普段は親しんでいない言語を使ってみるには丁度良い日です。ファシリテーターは参加者に各自ノートPCを持ち込むように強調してください。予想に反し、開発環境のセットアップに貴重な45分の大部分を使ってしまわないよう、参加者にはきつく伝えてください。