Global Day of Coderetreat in Fukui 2013 に参加しました
12/14に福井で行われたイベント「Global Day of Coderetreat in Fukui 2013」に参加してきました。 kanazawa.rb meetup#15に参加されていた@kompiroさんがファシリテーターをされているイベントです。 あの永和システムマネジメントさんが会場ということで、中に入れるのも楽しみでした!
Coderetreatってなに
Coderetreatとは、ざっくり以下のようなルールでペアプログラミングを行うイベントです。
- コンウェイのライフゲームを実装する。
- 45分/1セッションで、複数回のセッションをやる。セッション毎に成果物(コード、メモ)は破棄する。セッション毎に必ず異なるペアを作ること。
- 1セッション毎に15分の振り返りを行う。
- よいコード、よい設計を作る練習をするのが目的。かならずしも完成させる必要はない。
Global Day
昨年のCoderetreat in Fukuiは単独イベントだったようです。今回はGlobal Dayということで、世界中の都市で同時開催している会場のひとつになっていました。 海外の会場とハングアウトを繋いで手を振り合ったりして、Coderetreatの空気を共有している感がすごく良かったです。
参加するにあたっての目標
CoderetreatではTDDが推奨されています。テストの重要性は理解しつつも、テストファーストと言われるとなかなか実践出来ていない現状があるので、次3つの目標を立ててから参加しました。 経験者の方教えてくれくれちゃんです。
- TDDなコーディングと、普段のコーディングの両方やってみる
- がっつりTDDやってる人にナビゲーションして貰う
- TDDのメリットを実感する
当日
セッションでやったこと
session#1
TDD未経験な金大の学生さんと組みました。初回なので普段のコーディングスタイルでやろうということに。こんなインターフェースが必要だよね、内部表現は二次元配列にしようか、フィールドのはじっこの扱いどうしよう、みたいな話をしてざっくり設計、8割くらい実装したところで終わり。お互いライフゲームについてあまり予習していなかったため、問題を整理するためのセッションとして有意義だったと思います。
session#2
愛知から来られた社会人の方と組みました。休憩時間中にRubyでやりたい人居ませんかと声をあげたところ乗っていただけました。TDDでコーディングしてみたい旨を伝えると、RSpecでのTDDをナビゲートしてもらえることに。RSpecの書き方やrubyのゆるふわいい感じなコーディングが勉強になりました。
セルの生死を表す定数を定義するのに、Stringオブジェクトを拡張するというアイディアが面白かったです。最初はSymbolをひも付けていてエラーが出たのも、なるほどsingletonだからかという気づきになりました。
Alive = 'alive' # :alive x Dead = 'dead' # :daed x def Alive.alive?; true; end def Dead.alive?; false; end
もうひとつ、まずはGemfileから書こうとしたらbundle gem使えばいいんじゃない?と言われて、確かにと思いました。git initしてくれるし-tすればRSpecも入るし、細かいファイル生成してくれるし(README)、小さなコードでも使うようにしようと思います。pry or bundle gemみたいな。
session#3
おやつスポンサーでもある(ありがとうございます!)ナンバーフォーの方と組みました。session#2で書いたコードを手に馴染ませたくて、破棄したコードを思い出しながらコーディングしていました。あとは、世代交代のルールをシンプルに定義しなおしました。Javaメインの方に、ruby面白いですねと言ってもらえたのが嬉しかったです。
世代交代のルールは、注目しているセルの状態、その周囲の生きているセル数をパラメータとするとこんな風に書けます。
def rule(alive_neighbours_count, current_state) case alive_neighbours_count when 2 current_state # Alive or Dead when 3 Alive else Dead end
session#4
@kompiroさんと組みました! 実装する役とテストを書く役でやろうと提案していただき、実装役をやりました。このペアプロ手法は、ping-pong(ピンポン)または「ぶつかり稽古」と呼ばれているらしいです。具体的には以下のステップでやっていました。
- 全体の設計(クラス、オブジェクトの関係)をざくっと共有する.
- 実装するクラスのインターフェースを話し合って決める.
- テストコードを書く. 実装役はナビゲーター.
- テストを通す実装をする. テスト役はナビゲーター.
- 2に戻る
これがかなり面白かったです。役割が分かれたことで、TDDをやる上で大きな負荷になる(と思っている)「実装する時とテストを書く時の頭の切り替え」がそんなに要らなくなることが大きいんじゃないかと感じました。 実装役とテスト書く役を交互にやっていくうちに一人で回せるようになるならば、こんなに良い方法は無いと思います。
ともかく、ストレスなくTDDできてるということと、一人では辿りつけないところにいる感じとがあって、ペアプロ最高!って言いたくなるセッションでした。
session#5, 6
金大の学生さんたちとひたすらping-pongしていました。テスト役をやったり、Gitを使って並列で作業してみたり。ここら辺でかなり疲労がきていてgdり感あったかも...
まとめ
- bundle gem使おう
- RSpecちょっと書けるようになった. contextとletでDRY.
- ping-pongかなり良い!
感想
6回のセッションで、2つの目標は達成できました。
- TDDなコーディングと、普段のコーディングの両方やってみる
- がっつりTDDやってる人にナビゲーションして貰う
で、その実践を元に「TDD(テストファースト)のメリットを実感できたかどうか」というと少し弱い手応えです。 ストレスなくテストファーストで書けるようになれば、コーディングミスをした場合の問題の切り分けが楽(細かくテストするため)だろうなとは思います。セッション中にあまりリファクタリングする機会がなかったのもあるかもしれません。
それから「TDDな設計ってなんだろう」という疑問が残っています。あくまで正しい実装を保障するためにテストを書くのであって、正しい設計がテストによって導かれる(?)というのはよくわかりません。今回だって一回目にテストなしのコードを書き捨てながら問題を整理して、それからでなければTDDできなかったように思います。
今回のCoderetreatではping-pong (a.k.a ぶつかり稽古) の良さを知る事ができたのが一番の収穫だと思っています。実感が得られないというのもまだまだバットを振った回数が少ないんだろうなと。kanazawa.rbでは先輩エンジニアにぶつかり、学校では部活の後輩にぶつかられながらTDDを学んでいこうと思います。
おわりに
主催して下さった@kompiroさん、スポンサー企業の方々、ありがとうございました。次の機会に福井で参加できるかはわかりませんが、Coderetreatの面白さを周囲に伝えていきたいと思います!
おまけ
お寿司おいしかったです。これで参加費無料って、チェンジビジョンさん(ランチスポンサー)太っ腹!