TDD Boot Camp 札幌を開催しました

1/22-23と2日間に渡り、id:t-wadaさんをお招きし、テスト駆動開発の体験型勉強会「TDD Boot Camp」を札幌にて開催しました。テスト駆動開発は結構前から話題にはあがっていましたが、ここ1〜2年でぐっと身近になってきた感覚があります。それは、TDDの伝道師id:t-wadaさんによるTDD BootCampの開催や各種勉強会での発表などが強く触媒となっているのでしょう。そして、TDD Boot Camp名古屋、TDD Boot Camp北陸と地方開催を促進しました。そんな流れの中、TwitterにてTDD Boot Camp札幌の開催を相談したのが昨年の11月頃です。id:t-wadaさんには開催の申し出を快諾して戴き、札幌開催は1月となります。その後、福岡開催も3月に決まり、他の地域でのTDD Boot Campの開催も計画されています。
というわけで、簡単ですが、イベントのレポートをお送りします。

概要

札幌開催では宿泊型のイベントはあまり馴染みもなく、参加表明が遅い傾向もあるため避け、1日目・懇親会・2日目で独立させて行いました。1日目は基礎的なセミナーと入門的な体験、2日目は実践編ということで名古屋開催に近い構成です。
参加者数は1日目25名、懇親会16名、2日目21名でした。これは開催準備期間に予想していた人数と概ね近い人数です。想定していたのは1日目2日目共に25前後、懇親会15なので、2日目の人数が少し足らなかった程度ですね。これは次の日が休みならばもう少し増えたのかな?とも思います。
尚、キャンセルは1−2名*1でしたが、ドタキャンや無断キャンセルは0という素晴らしい出席率でした。これはid:t-wadaさんも驚かれていました。とはいえ、ギリギリまで予定をいれない*2道民の参加登録タイミングはいつもはらはらです。

1日目

1日目はテスト駆動開発入門ということで、ユニットテストに関する基礎的なセミナーやゼロベースのテスト駆動開発を体験します。タイムスケジュール的には10:00開始で19:30までと余裕がありました*3
オープニングでオライリージャパン様よりサプライズがありました。なんと「プログラマが知るべき97のこと」を3冊とフリースをいただいたのです。景気づけに最初にじゃんけん大会を行いました。どちらも1回で規定人数が残るというスタートでした。オライリージャパン様、ありがとうございます!

午前1

午前中はid:t-wadaさんによるテスト駆動開発に関するセッションです。はじめに「プログラマが知るべき97のこと」からテストに関連するエッセイを中心に紹介されました。「34. API設計の黄金律」「79.テストのないソフトウェア開発はあり得ない」「90. コードを見る人のためにテストを書く」あたりは自分も深く共感したエッセイです。今、ブログでエッセイ毎に自分なりの感想や思うところを書いていますが、人によって感じる部分が違う所もあり、同じ所もありと興味深く聞かせていただきました。経験や知識が違うので当然と言えば当然ですが、他の人が感じた事をもっと知りたいです。

午前2

続けてユニットテストテスト駆動開発に関する話です。なぜテストをするのか?誰のためのテストなのか?テストの目的は?テストの手法は?と理想的なテストに関して、これまでの経験などを絡めて話されていました。その中でも大きく印象に残っていたのは「健康」というキーワードです。「テストをすることでプログラムのコードが「健康」に保てる、健康なコードであれば安心もできるし、変更も怖くなくなる」という事なのですが、「健康」という表現は非常に適切に表しているように思えます。

ここでお昼。お昼はお弁当を用意しました。隣のイーアス札幌にてお弁当を注文しておいたので、スムーズに昼食がとれました*4

午後1

午後の最初の時間は、初めにテスト駆動開発ペアプロのデモを行いました。正直な所、id:t-wadaさんと参加者の皆さんが見ている前でペアプロするのは非常に緊張していました。そして嬉しかったし楽しかったです!ちなみに、実は事前にデモはやる*5と聞いていたのですが、ペアでやるとは聞いていませんでしたw
内容としては定番のFizzBuzzです。まずはゼロベースでテストを書くこと、テストの内容もクラスとかは作る必要はないというやり方は意外でした。Javaだととりあえずはクラスを作る傾向がありますが、まずはテスト内容ということで、これからは意識したい所です。Javaをホーム言語としている人ばかりでもなかったため、Eclipseによるショートカットやクイックフィックスも興味深く映っていたようです。

午後2

その後、3時くらいからは、ペアを作りお題を行いました。内容はキャッシュ機能を持つマップのような入れ物(LRUキャッシュ)です。前半の2時間で基本部分を作っていき、後半の2時間で仕様変更に対応していくような流れでした。それぞれ最後の方で半分くらいのペアに「どんな状況だったか?」を報告して貰う形式でしたが、あれは中々面白いしためになります。
同じ課題をみんなで解いて、他の言語ではどうやっているかなども含めて他の人の成果をみれるのは新鮮でした。北海道開発オフなどでは、異なる課題を勝手にやって最後にそれぞれ成果発表をしています。それはそれで面白いですが、同じ課題をやって共有するのは非常に勉強になるので、Javaコミュニティの勉強会にも応用したいと思います。
尚、言語比率としてはJavaが7組、JavaScriptが2組、VB,Ruby,Smalltalkがそれぞれ1組といった割合でした。

懇親会

会場は1日目は全日借りて、たっぷりと勉強会の時間がとっています。なので19:30まで会場、その後20:00から懇親会という流れです。懇親会の方ではテストのこと、普段の開発のことなど盛り上がりましたが、次の日もBoot Campは続くので22:30くらいにはお開きです。

2日目

イベント計画時はもっと基礎的なテストテクニックもと思っていましたが、最終的に名古屋と同じような構成となり、2日目は応用編となりました。応用編というよりも実践編というのが正しいかもしれません。1日目はゼロベースで理想のコードを書いていく形でしたが、実際の開発では理想通りにいかない事も多くなります。そう、レガシーコードと戦わなければならないのです。
レガシーコードの定義は人によりけりですが、「テストのないコードはレガシーコード」を合言葉に講義が始まります。

午前1

午前中はレガシーコードと戦うための心得を伝授していただきました。1日目のセッションの内容はTDDの資料などからある程度は理解していた所もありますが、2日目のセッションの内容は目から鱗です。他の参加者も同じようなことを感想で述べていましたが、その中でも「あきらめない」という心構えと「仕様化テスト」という技法については勇気を与えられたと思います。
あきらめないーレガシーコードとの戦いは何度も何度も心が折れそうになります。投げ出したくなる気持ちもあります。作り直したい気持ちにもなります。とりあえず改修してしまおうという気持ちになります。でも、諦めずに少しずつコツコツと向き合うこと、そして1人でなくてチームで向き合おうというのは重要なんだなと思いました。午後にはそれを実感することになります。
また、「仕様化テスト」という技法については、これまでやってきたやり方が間違っていないという事で自信がつきました。やり方自体はもの凄く細かく小さく少しずつやる方法でしたが、その目的は同じです。まずは「今動いているもの」をテストで動かし、その後に「正しい形へ修正」していくのです。レガシーコードではテストはありませんが、同じくらいの確度で仕様書もありません*6。なので、まずは現在の動きを把握することが重要です。細かく読み込んでいくことも大切ですが、それをテストコードにしてしまうということです。テストコードにすればTDDの土俵に持ち込めますし、回帰テストにもなります。

午前2

昨日に引き続き、id:t-wadaさんとデモでペアプロを行いました。こちらも非常に楽しいもので、レガシーコードを相手にしていても一緒に戦うというだけでこんなに違うんだなーと思いました。懇親会での名言の1つに「これまで孤独だった」というのがありましたが、レガシーコードを相手にするときは特に孤独です。周りに理解されず、黙々と粛々とプログラミングをするのは、不幸なことです。楽しく複数人でやっていくことは精神的にも良いもので、それは品質にも影響していくんだと思いました。

午後1

午後は参加者で実践編です。言語毎に分かれ、レガシーコード相手に乱取り形式で挑みます。乱取り形式とは、1つのPCに対して3−5名くらいの人数で行います。5分程度の時間を区切り、時間が過ぎたらば次の人にバトンタッチを繰り返していく方式です。われわれのチームはJava界隈でちょっと前に話題になった某認定資格のコードにチャレンジしました。ある程度の覚悟はしていましたが、これが「本物」のレガシーコードでした・・・。
詳しい経過については別途エントリーしますが、何度も何度も心が折れそうになりました。しかし、1人より2人、2人より3人です。3人で乱取り形式で回すことにより、テンポ良く諦めずにチャレンジすることが出来たと思います。
また、改めて思ったこととして、レガシーコードは教育に良いということです。レガシーコードはアンチパターンの宝庫です。命名規則・コメント・例外の握りつぶし・継承・誤った例外の利用方法・テストしやすい設計としにくい設計・・・それらがダメな理由が説明できなくてはなりません。さらに戦うための技を駆使する必要があります。そして、それらをの技を使っていくことで技は伝承されていくのです。
最終的には仕様化テストは諦め、回帰テスト的なシナリオテストになりましたが、諦めずにテストを作るところまでは達成しました。自分にとっても良い経験となりました。尚、成果物はこちらです。

午後2

2日目は17:00に完全撤収なので、16:00くらいから振り返りです。20名強ということで全員に一言ずつ感想を話して貰いました。色々と良い話を聞けましたが、その中でも「楽しかった」「明日から戦う勇気が沸いた」「TDDをもっと勉強したい」といった感想を戴き、本当に良かったと思います。
TDD Boot Campテスト駆動開発というちょっと解りにくくなんか難しそうなイベントに思えますが、これほど楽しい勉強会はないと思います。勿論、勉強になる事も多いですが、勉強になる勉強会は幾らでもあるでしょう。でも、心底楽しいと思える勉強会はほとんどありません。「役に立った」「興味がわいた」「勉強になった」「帰って試したい」という感覚ではなく、「ヘトヘトになるまで楽しんだ」です。

総括

TDD Boot Camoを札幌で開催できて本当に良かったと思います。講師のid:t-wadaさんには体調が優れない中、登壇していただき本当に有り難うございました。ゆっくりと北海道を楽しむ暇もなく2日間、お疲れ様です。師匠の心はしっかりと道民にも伝わったと感じています。
また、会場設営など手伝って戴いたスタッフの皆様、ありがとうございました。フォローとバックアップがなければ運営も難しかったと思います。
オライリージャパンの高さんには、プログラマが知るべき97のこととフリースを送って戴きありがとうございました。これで自分も最後までエントリーを書く覚悟が決まりました。
勿論、参加して戴いた皆様にも最大の感謝です。参加するまでは「どうなんだろうなぁ・・・」と半信半疑な状態で参加したのではないでしょうか?そうだとしても、帰り際には満足感を感じて戴いたと確信しています。

次回予告

何度も書いていますが、今年は全国的にTDDの波が来るのではないかと感じています。3月には福岡で開催され、その後も幾つかの地域で開催されていくでしょう。t-wadaさんもあちこちに遠征するようになるでしょうから、次に札幌に呼べるのは何時になるか解りません。
しかし、心は伝わっています!まずはTDD Post Campをやりましょう!時期的には3月か4月頃、今回参加された方がそれぞれの環境やプライベートで勉強し、詰まったり何かを掴めてきた頃合いになるかと思います。そこでもう一度、TDDの心を思い出すために集まりましょう。勿論、新規参加者も歓迎です。1回目の参加者は新しく参加してくる人にTDDの心を伝えてください。そして晩夏頃にもうTDD Boot Camp 札幌02を開きましょう!機会があれば道内の他の地域でも開催したいですね。

*1:仕事の都合などでしょうから、責めるつもありは毛頭ありません

*2:最終1週間で一気に5−6名増えた

*3:超長丁場

*4:お茶+お弁当が参加費に含む

*5:冷静に考えればペアプロのデモですがww

*6:あるいは間違いだらけ