鎌玉のよしなしごと

日々のよしなしごとをつぶやいているだけ。由無し言(とりとめもない話)か、良しな仕事(nice job!)かは、あなた次第。

Global Day of Coderetreat 2012 in Matuyama の振り返り #agile459

retreat とは

retreatの意味 - 英和辞典 Weblio辞書
 [名詞]
 1.
  a 退却、後退.
  b 退却の合図.
 2.
  a 静養先,隠れ家,避難所,潜伏場所.
  b (老人・精神障害者などの)収容所.
 3. 黙想(期間).

12/8、 Global Day of Coderetreat(GDCR) 2012 in Matuyama に参加しました。


Coderetreat というイベントがあり、Global Dayというのは世界同時に行う日だそうです。
実際、日本でも松山以外に、東京、大阪、福岡、福井で同時開催され、会場ではアメリカやベトナムなど世界中の会場とGoogle Hangoutで結ばれていました。(主催者の方は、時差と飛行機を利用して3会場ぐらい回られるそうです)

Coderetreat

Coderetreatとは、プログラマのための練習、学習の場です。

課題は「コンウェイのライフゲーム」です。
コンウェイのライフゲームを詳しい解説はWikipediaを読んでください。

また、Googleで検索すると、画面にセル(細胞)が誕生したり、死んだりするのが、うねうねアニメーションされます。
右上には操作ボタンが配置されていて、一時停止や1コマ(ライフゲームでは1世代)ずつ進む操作ができます。

Coderetreatにおいては、Googleがやっているように見栄えをよくする必要はなく、
以下のように世代数と各セルの状態が分かるように標準出力に出力すればいいと思われます。
※リアルタイムで表示できるように出来ればいいですが、45分しかないですよ。


第4世代
000
111
000

第3世代
010
010
010

第2世代
000
111
000

第1世代
010
010
010


この課題を45分*1×6セッション行います。
セッションが終わる毎にコードを破棄して作り直します。


また、Coderetreatでは、ペアプログラミングで挑むことが必須となっています。

当イベントでは、1台のマシンを使用し、5分以内でプログラミング担当者の交代を行うように言われました。


セッションが進む毎に、ファシリテーターから新しい制約の提案が出され、新しいペアでプログラミングをやります。制約を取り入れ、今までとは異なるアプローチで設計・実装に挑む事で、スキルアップを図ります。

制約として出されるのは、オブジェクト指向コード養成ギブスを元にしたもののようです。

ただし、オブジェクト指向コード養成ギブスでは「else禁止」だったものが「if禁止(3項演算子も禁止)」になっていたりします。
また、制約の提案内容は、各会場のファシリテータが参加者の様子を見ながら決めるので、よりセクシーな提案が出される可能性もあります。
ファシリテータから出された制約提案を受け入れるか、別の制約を適用するかは各ペアで決定することだそうです。
実際、別の会場では、会話をせずにコードのみで、お互いの意図を汲み取るという制約を行ったペアがいたみたいです。


そして、Coderetreatでは TDD(テスト駆動開発)が推奨されています。
始めにテストコードを書いてRed(テストに失敗)になることを確認して、プロダクトコードを書いてGreen(テストに成功)することを確認、適当なタイミングでリファクタリングを行うことを、小さなサイクルで回していくことが、スキルアップの手段として薦められています。


このCoderetreatは、プログラマのために用意されているイベントであり、会場代や食事・おやつ代は無料です。
松山でも コワーキングスペース'ダイヤモンドクロス' http://www.d-cross.biz/ 様、株式会社アトラクタ 様、株式会社ウイットプラン 様、合同会社カルチャーワークス 様がスポンサーをされていて、無料で参加できることができました*2
その他にも、出版社のmanning、pragprogやdnsimple、Solano Labs、CODE CLIMATEといった海外企業からサービスの割引券をいただきました。

参加してみての感想

ペアプログラミングとTDDを初めて体験しましたが、自分の勉強不足を痛感しました。

1セッション目では、相手がライフゲームを知らないとのことだったので、説明しながら、テストケースなし/配列あり/初期データはランダムパターンで、大体のプロダクトコード(Java)をつくりました。
さあ、Eclipse上で main関数を呼び出すクラスをJUnitで作成して実行というときに、何故かテストクラスが作れない。
JUnitが入っていませんでした。

普段使用しているのがWindowsデスクトップで、サブのMBA 11インチでペアプログラミングやるのは画面が小さすぎると思って、昔使っていたWindwosノートを引っ張りだしてきていました。
そのノートに、Eclipse 3.7*3JUnitとQuickJUnitを入れたはずなのに…。
実は、そのノートには Eclipseが5個(バージョン違いやPleiades適用版/Classic版など)入っていて、間違ったEclipseを起動していたのです。

2セッション目からはTDDで行うことになったのですが、2セッション目の制約が配列禁止。
この後がボロボロになりました。



セルの生死状態管理や、生死判定ルールのテストコードは容易に書ける。
セルの隣接状態も、配列でなくても管理できるだろう。
でも、最終的にどんなテストすればいいのだろう。
最後の手段として、標準出力結果を目検(めけん、目視検証)すればいいやと安易に考えていた。
テストデータをつくって突合させるか。
でも、正しいテストデータは、どうやって作ればいい。
データを突合させるまでに行うテストは…。
おぉ、これは 途中を省いて一括にテストする、テストの『ビッグバン・アプローチ』や*4


結局、最後まで完成させることはできませんでした。

最後まで、テスト設計の方針が打ち出せず、ペアを組んだ id:nakaji999 さんとともに『テストコードのないレガシーコード』を作成しました。

反省

  1. 開発環境は、ちゃんと整えよう。そして、キーボードのみで操作できるようにしよう(キーボード操作のみの方が開発スピードが上がる。 Coderetreatには、マウス使用禁止という制約もあるそうです)。
  1. TDDのこと、ちゃんと勉強しなきゃ。(下の2冊、所有しているのですけど読み込めていない)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)


実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる (Object Oriented SELECTION)

実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる (Object Oriented SELECTION)

原田さんの言語録

ファシリテータでこられた @haradakiro ( id:kiroh ) さんの言葉で印象に残っているものを記します。

  • TDDについて
    • 単純なSetter/Getterの単体テストは、Oracleにけんか売っているのか?
    • 何でもテストすればいいのではないよ。本当に必要なところをテストすべき。
    • テストデータの作成も(最終的には)プログラムで行えばいいよ。
  • 業務システム開発について
    • お客さんが欲しいと言っている機能は、7割つくらない。
    • ログを仕込んで、実際に機能が使われているか調査をし『ほら使われていないでしょ』と提示する。
    • 1年間に1回や2回しか使われない機能も基本、実装しない。
      • 重要な機能であるのなら、本当にそれ、年に数回しか使われてなくていいの?と相談する。
  • その他
    • ○○が正しいかどうかは、It Dependes(時と場合による)。

備考

  • 朝早くからのイベントだったので、前夜に松山入りました。松山の主催者である上田さんに教えていただいた2000円(駐車場無料)の宿に泊まりました。一方、Coderetreat及び懇親会をやっている最中の駐車料金が2400円でした*5

  • Coderetreatの後、懇親会をやりましたが、通常は懇親会はやらないそうです。みんな、頭がクタクタになっているはずだから。私も、懇親会を中座し、徳島への帰路につきました。しかし、道に迷うは、往路は1回しか休憩を取らなかったのが、復路は疲れたので5回も休憩が必要だわと大変でした。

最後に

主催者である上田さん、ファシリテータの原田さん、おかしのスポンサーである懸田さん、会場を提供していただいたダイヤモンドクロスさん、その他のスポンサーさん、ありがとうございました。

TDDを勉強しなおして、いつかリベンジしたいと思います。


原田さん…。

*1:料理の鉄人スペシャルの調理時間と同じ時間ですね

*2:食事も豪華だったんですが、写真を撮るのをわすれていました

*3:4.2はパフォーマンス問題があるとされているため

*4:ダメダメやん

*5:上限1000円のところに駐めたつもりだったのに