Coderetreat for Girls #2に参加して丸一日ペアプログラミングした感想と反省 

2018/6/30にお茶の水大学で開催された[Coderetreat for Girls #2](https://wit.connpass.com/event/86033/)に参加しました。
エンジニア向けの教育プログラムに参加して学んだことや反省点など。

# Coderetreatとは
* [イベントページ](https://wit.connpass.com/event/86033/)から引用

>Coderetreatではライフゲームといった単純なお題に、45分のセッションを繰り返し取り組みます。すべてのセッションはペアプログラミングやモブプログラミングで行われ、セッションごとに新しい人と組み直します。書いたコードもセッションごとにすべて消します。
2009年に米国で発祥し、今や世界中の各地で開催されており、毎年秋にはGlobal Day of Coderetreatが世界中で一斉に開催されます。

* [Coderetreat～プログラミングのスキル向上に効果的な教育プログラム～](https://www.ogis-ri.co.jp/otc/hiroba/Report/Coderetreat2012/)

>Coderetreat の特徴
Coderetreat は プログラマの retreat（避難所とか静養所という意味）です。普段の業務では常にリリースで追われていて、プログラミング・設計・テストなどの基礎テクニックを習得する機会を作れていないという方は多いと思います。そこで納期とは無縁な場所で基礎テクニックを習得する機会をプログラマに与えるのがこのイベントの趣旨です。

# 参加のきっかけ
開催三日前に下の@miholovesqさんのツイートが回ってきたのがきっかけ。
一般のファシリテーター枠で参加。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今週土曜の <a href="https://twitter.com/hashtag/CoderetreatForGirls?src=hash&amp;ref_src=twsrc%5Etfw">#CoderetreatForGirls</a> 女子学生枠2つ、一般枠5つ空いてます！ ペアプロで45分間のコーディングセッションをペアを変えながら6回しする充実したワンデーイベントです。美味しいランチ飲み物おやつ出ます。これを逃したら次は来年なので迷ってる方はぜひどうぞ〜！<a href="https://t.co/kwigKEg7Em">https://t.co/kwigKEg7Em</a></p>&mdash; Miho🍺Nagase (@miholovesq) <a href="https://twitter.com/miholovesq/status/1011641860782059520?ref_src=twsrc%5Etfw">2018年6月26日</a></blockquote>


# 当日の内容

* イベントページによると学生22人とファシリテーター10人前後参加
* 課題は[ライフゲーム](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)の実装
* 45分のペアコーディングを毎回ランダムに決められた相手と6回繰り返した。ペアコーディングの様子↓
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">お茶大にてcoderetreat やってます！<a href="https://twitter.com/hashtag/enPiT?src=hash&amp;ref_src=twsrc%5Etfw">#enPiT</a> <a href="https://twitter.com/hashtag/WiT?src=hash&amp;ref_src=twsrc%5Etfw">#WiT</a> <a href="https://t.co/R2JJR1SBF1">pic.twitter.com/R2JJR1SBF1</a></p>&mdash; enpit_tsukuba (@enpit_tsukuba) <a href="https://twitter.com/enpit_tsukuba/status/1012902543112851457?ref_src=twsrc%5Etfw">2018年6月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

* 当日のタイムテーブル

>09:00 - 09:30 開場
09:30 - 10:00 趣旨説明、準備
10:00 - 11:00 セッション#1
11:00 - 12:00 セッション#2
12:00 - 13:00 ランチ
13:00 - 14:00 セッション#3
14:00 - 15:00 セッション#4
15:00 - 15:30 おやつ
15:30 - 16:30 セッション#5
16:30 - 17:30 セッション#6
17:30 - 18:00 クロージング

* 私はすべてのセッションで学生とペアになったけど、マッチングは完全ランダム(!)なのでファシリテーター同士のペアもあった模様。
* ６回のセッションのうち、２回は４５分以内でライフゲームの完成までいった。（完成させることがセッションの目的じゃないけど）
* 完成しなかったセッションもいい所までは進んだので、総じてお茶大の学生は優秀だなぁと。
* ペアプロだけでなくモブプログラミングもしてたりして楽しそうだった。

# 感想
* **Coderetreatはすごい短期集中の教育効果の高いプログラム** 
* **ペアコーディングは楽しい** 
* **みんなでワイワイやるのも楽しい**

# 学んだこと
* **ペアコーディングは教える側にも学びがある**
 * ペア相手が学生ばかりだったので、TA的な立場になるのかと思ったけど、全然そんなことはなかった。
 * 基本的に自分はナビゲーターだったけど、今立ち向かっているプログラミング上の課題の解決策に対して、「なぜその解決策がよいのか」を学生にわかるように説明することは非常に学びがあった。<BR>⇒あと地味にソースを口頭で説明するの大変だとわかった。『array[y][x]』とか難しい。<BR>

* **同じ課題を異なる言語で実装するのは教育的効果が高い**
  * 例えばpythonだと「5×5の二次元配列を生成してランダムな0/1で初期化」は下のように１行で書ける。これをCで実装した経験がある子に伝えるとコードの少なさに驚いてくれた。
  * ちなみにPythonでint(条件式)でBooleanを直接intに変換できることは、セッション中に学生と一緒に調べて初めて知った。

```py
>>> board = [[int(random.random() > 0.5) for x in range(5) ] for y in range(5) ]
>>> print(board)
[[0, 0, 0, 0, 1],
 [1, 1, 1, 0, 1], 
 [1, 0, 1, 0, 0],
 [1, 0, 0, 1, 0],
 [1, 0, 1, 0, 1]]
```

* **「消えるコードを書く」経験** 
 * 各セッションはまっさら状態から始める。なので、セッション中に書いたコードはどんなに綺麗でどんなに再利用性が高くても消えることになる。<BR>⇒コードを消すルールを徹底することで、（コードを生産することが目的ではなく）学びを得ることが目的なのがはっきりすると感じた。<BR>

* **学びの連鎖**
 * 学生同士のペアを組んでたときに、学生がファシリテーターから学んだことを他の学生に教えていた。各セッションごとにペアを変えることで、学びの連鎖が短期間に起きていることを感じた。<BR>
* **同じ課題を別の人とやるので、人によってやり方が全然違うのが面白い**
 * ただ、ある学生にコードの修正案を提示したら、「別の人からこうしろって言われたんですけど…」と困った顔をされて苦笑してしまった。ペアを変える以上仕方ないとは思うけど、学生を混乱させてしまったかもしれない。                <BR>⇒実務でもあるある…<BR>
* **やっぱりHRT大事**
 * いつも言われていることだけど、ペアコーディングでは特に「Humility（謙虚）」、「Respect（尊敬）」、「Trust（信頼）」が大事だなと再確認した。
 * ただ、自分が学生相手に謙虚に振舞えていたかは怪しいので、精進したい。
 * ちなみに私が組んだ学生さんのHRTは何の問題もなかったです。素晴らしい。

# 嬉しかったこと
* 参加費、ランチ、お菓子、飲み物、おやつが全部無料で最高だった。スポンサー企業様に感謝。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今日は、お茶の水女子大で CodeRetreat for Girlsです。午後も盛り上がってます。スポンサーさまからランチとオヤツもいただきました。ありがとうございます！<a href="https://twitter.com/hashtag/CodeRetreatForGirls?src=hash&amp;ref_src=twsrc%5Etfw">#CodeRetreatForGirls</a> <a href="https://t.co/PerLwQYdzX">pic.twitter.com/PerLwQYdzX</a></p>&mdash; enPiT女性部会WiT (@enPiT_WiT) <a href="https://twitter.com/enPiT_WiT/status/1012918686355578880?ref_src=twsrc%5Etfw">2018年6月30日</a></blockquote>

* 学生が全員積極的だった。
 * 強制じゃくて、自主参加だから意欲的な学生が集まった？
 * 大学生で一日中コーディングするイベントに参加する時点でえらすぎる。

# 反省
* ファシリテーション難しい
 *  注意していたが、どうしても答えをそのまま教えてしまうことが何度もあった。
 *  趣旨からいって、もっと学生自身に自分で考えさせるような進め方をしないといけなかったなと反省
 
* オブジェクト指向設計、TDDの実践が少なくて、とにかく動くこと中心としてしまうことがあった
* ふりかえりで上手くフィードバックできていなかった。
 * 成果についてばっかり話してた気がする。過程についてもっとコメントすればよかった。
 * 誉める内容や誉め言葉のパターンが少ない。語彙力増やしていけ。
* コーディングが嫌いになってほしくなくて一部で指摘を控えてしまった。
 * 小言が多いなと思われたくなかったのもあり、相手のレベルに応じて細かいところは目をつぶった。
 * 本当はこういう機会にこそ綺麗なコードを目指すべきなのだろうけど、うーん、難しい。
 * ようやくforの書き方を知ったような人に、デザインパターンについて語ってもなぁとは感じる。

* 未経験の言語にチャレンジすべきだったけど、教える立場のみで終えてしまった。
 * 最終的にはC、python、javascriptで課題をやったけど、どれも経験済みの言語。
 * ただ、Cは10年前に会社の研修でやったきりだったので学生に教えられるシーンも…
* アクティビティ（制約へのチャレンジ）が少なめだった
 * 基本的なアクテビティの「ナビゲーターとドライバー」ばかりしてしまっていたが、TDDピンポンとか、ループ禁止とかにチャレンジしてもよかった

# 各セッション詳細
## セッション#1
* 学生は三年生、言語：Python、環境：cyber-dojo
* アクティビティ：ナビゲーター
* 「cyber-dojoとか、基本的なことがわかってないので一通りしたい」とのことだったので、ベーシックにcyber-dojo上でテストコードの作成から、いけるところまでライフゲームの実装を実施。
* 言語は「C,Java,Python,Rubyを知っていて（すごい！）、pythonが一番興味がある」とのことだったので相談してPythonに。
* 最終的に、簡易判定のライフゲームの実装と表示まではできた。周辺のセル探索による判定までは時間が足りなかったけど、十分。飲み込みが早くてびっくり。

## セッション#2
* 学生は一年生、言語：C言語、環境：emacs+gccコンパイル（授業で使ってる環境らしい。古風）
* アクティビティ：ナビゲーター、IDE禁止
* 「１セッション目は１年生同士のペアで何も進まなかったので、少しでも知ってる言語で課題を進めたい」とのことだったので、Cでやることに。
* 最初、emacsで上書き保存するたびにファイルを閉じてたから、理由を聞いてみたら「ファイルを閉じずに保存する方法を知らないんです…」とのことだったので、emacsの上書き保存のやり方を教えるとこからスタート。
* 大学一年生で「配列の宣言をちょうど今授業でやってます」という状態でライフゲームの実装はつらかろう…と思ったけど、簡易判定のライフゲームの実装までできた。

## セッション#3
* 学生はM1、言語：Python、環境：cyber-dojo⇒ローカルのpython2系
* アクティビティ：ナビゲーター、IDE禁止、完成
* 「セッション１回目は途中から来たのでルールがわからず、すべてのアクティビティを守らないといけない(※)と勘違いしていたため進まず、２回目は学生同士だったので、今回はとにかく課題を最後までやりきりたいです！」とのことだったので、Pythonで進めることに。<BR>　　※すべてのアクティビティを守ろうとすると、マウス禁止＋if禁止＋for禁止＋1メソッド4行以下になる。流石にそれは無理だ。
* 環境は最初はcyber-dojo上でやってたけど、途中で「コンソールでピコピコ表示を切り替えたい」となり、ローカル実行に移行。
* 結局、サクサク進んでライフゲームの完成までできた。ランダムでの初期状態生成やコンソールの定期表示更新も実装できたので、かなりそれっぽいものができた。

## セッション#4
* 学生はM1、言語: python、環境：IDE＋python3系
* アクティビティ：ナビゲーター、完成
* 「前回pythonでかなり完成に近いところまで来たので、完成させたい」とのことだったので、一応まっさらな状態から始めつつも言語は引き続きpython。
* セッションも４回目だからか、本人がライフゲームを理解してて、pythonにも精通してたのでハイペースで進む。
  * 画面にライフゲームを表示する際、各セルの状態を0/1ではなく□/■で表示するなど、見た目もわかりやすくできた。
* 終始順調でコードも綺麗だったが、完成したと思ってセッションの最後に２０ループぐらい回して確認してみると**なぜか全セルが死滅に収束するバグ**を見つけてしまう
 * 納得いかなかったので、セッション終わったあとに原因究明。結局、周囲の探索する際のrangeの範囲が1足りてなくて、3×3を探索すべきなのに2×2しか探索していないのが原因だった。おやつ時間に解決（やはり開発にはおやつが必要）。

## セッション#5
* 学生は三年生、言語：html+javascript、環境：テキストエディタ＋chrome
* アクティビティ：ナビゲーター、IDE禁止
* 「これまででCとjavaでライフゲームの実装まではある程度できたので、未知の言語にチャレンジしたいです！」とやる気溢れる感じ。
* 言語は型制約の少ない言語を知って欲しくてjavascriptにした。
* せっかくjavascritpなので表示系も作ることに。簡単なHTMLにスクリプトを埋めこんで、chromeのデバックモードで開発した
 * MacでF12押してもブラウザがデバックモードにならないのが強敵だった…
* 途中、ブラウザにセルの状態を□/■で表示する際に、Macの特殊文字のサイズ違いでつまづいた。□/■だと幅が揃わなかったので、仕方なく〇/●で表示することに。
* ５回目のセッションで疲れているだろうと思ったけど、最後まで集中力が続いていて感心した。
* 結局、制限時間の４５分ギリギリで、ブラウザ上でライフゲームっぽいアニメーション表示するところまでできた（ただし状態変化は完全ランダム）。
* 最終的にできたアニメーションの表示を見て、学生から**「これ、ずっと見ていられますね」って言われてすごい同意した**。わかる。
* 学生はjavascript、HTML共に未経験な状態だったけど、そこから短時間で動くモノが作れるのはJavascriptのいい所だと思う。

## セッション#6
* 学生は一年生、言語：C言語、環境：emacs＋gcc
* アクティビティ：ナビゲーター、IDE禁止、完成
* c言語で途中まで作ってたのを最後まで作りきって、ライフゲームが動くところまで完成した。
* できた後に「今朝は何も知らない状態だったのに、今日一日でかなりできるようになりましたよ。これ、単位貰えないんですかね？」と言われて笑ってしまった。<BR>私の学生時代の経験でいえば、数か月分の内容を１日に詰め込んでるから、単位認定されてもおかしくないわ。
* 実際、この４５分×６コマの有識者とのペアコーディングを経験した人と、そうでない人の間には、かなりの差がついてると思う。

# 余談
* お昼休みの最中に、ファシリテーター５～６人がホワイトボードの前でひたすらライフゲームについて議論してた。すごいエンジニアって感じで面白かったし、学生がその姿を見てたのも興味深かった。
* 学生が"int a"のような変数を使おうとしていたので、「変数名、わかりやすい名前を考えてみようか」ってコメントしたら「今日はみなさんからそれ言われます…」って困った顔で言われて面白かった。<BR>もし君が、名前付けが大事なことを覚えて帰ってくれていれば、今日に意味があったと思うよ。
* ライフゲームは、実装前に四隅の端の生死判定をどう行うかを認識あわせしたほうがいいと思った。<BR>今回は簡単にするために、端は全部死滅にしたけど、上下左右をくっつけて循環させる仕様もありらしい。
* Coderetreatはコーディング版のビリーズブートキャンプだと思う。

# 最後に
今回のイベントを主催してくださった[WiT](http://wit.enpit.jp/)様、お茶の水大学の関係者の方、スポンサーの[株式会社アトラクタ](https://www.attractor.co.jp/)様、[株式会社ホロラボ](http://hololab.co.jp/)様、[株式会社ローカルイノベーション](https://local-innovation.com/)様、ありがとうございました。
とても素敵なイベントでした。