TDD challenge #1 に参加してきました

概要

2017年8月18日に株式会社ミクシィ 渋谷本社にて開催されたTDD challengeに参加してきました。

このワークショップは、テスト駆動開発(TDD: Test Driven Development)の講義と、ペアプログラミングの形式をとった実習から構成されていて、講義と演習を交互に行うものでした。

当日の流れ

開始前

11:00より受付とのことだったので、あらかじめ場所を確認しておいて、定刻どおりに受付まで行いました。
JR渋谷駅のすぐ近くだったので、迷わずに済みました。

各種設定(演習用)

予め決められたペアで演習を行いました。パートナーの方と共通して使用できる言語がJavaしかなかったので、使用言語はJavaとしました。

全体としては、Javaを使用するペアが多数でしたが、他にもRubyPythonなどを使用するペアもあって、多種多様でした。
とはいえ、私たちのペアは両者ともにしばらくJavaを書いていなかったので、些か不安でした。

講義

なぜTDDが必要なのか、どのような状況でTDDがその威力を発揮するのか、TDDを始めるにあたって意識すべきことは何か、といった点に重点を置いた講義だったように感じました。

TDDでは、その名にあるとおり、

  1. テストを書く
  2. テストを失敗させる
  3. (テストを通すように)実装する

の順で開発を行います。リファクタリングは最後、つまりテストが通っている前提で行うべき、とのことでした。 特に、TDDにおいて意識すべきことやメリットが次節の演習で大きく効いていた印象を受けました。

演習

講義の合間合間に複数の課題が発表されて、要求された仕様を満たすようにペアでTDDによる実装を行います。

一見実装が楽に思える仕様でも、TDDを意識して、テストを先に完成させることに重点を置きました。 私たちのペアはJavaを使用したので、テストフレームワークとしてJUnitを採用しました。
両者ともにJUnitは未経験だったため、講師の方々に助けて頂きながら試行錯誤しました。

演習の前半ではつい実装の方に手を伸ばしてしまいそうになっていましたが、後半ではテストを書くことに多くの時間を割くようになっていました。
各課題ともに1~2時間程度(正確に測ったわけではないのでそれ以上の可能性もある)の時間が設けられていましたが、テストの作製に時間を要したこともあって、すべての課題を完成させることはできませんでした。

しかし、テストを作成するにあたって、テストがコード自体(クラスなど)の設計に直結しているように感じて、テストを完成させたあとの実装は想像以上に速く行うことができたように思いました。

その他

エンジニアの方々とともに昼食をいただきました。8月18日が「お米の日」(「米」を分解すると八 十八 になることから。米寿の由来と同様?)ということで、釜めしをいただきました。お茶漬け用の出汁もあり、二重の楽しみがあって大変おいしくいただきました。

食事中にはエンジニアの方と研究の話題や普段のコーディング、プログラミング言語全般など、様々なお話をさせていただいて、大変有意義な時間となりました。

まとめ

普段私はプロジェクト(もしくはオブジェクト指向としてのクラス)を設計するとき、必要なメソッド群を脳内で雑に実装を始める、といったことをしていたのですが、実際はそれはTDDに直結していて、そのまま置き換えられるように感じました。
TDDではテストがそのまま実装される関数群を網羅していて、かつテストケースとして期待する振る舞いを記述することから、むしろ仕様がテストに表れている印象を受けました。
期待される動作がテストに書かれているため、実装の際に混乱することを抑制することができ、実装をスムーズに行うことができたように思います。

言語によってテストフレームワークは異なりますが、幸い普段私が使用する言語は優秀なフレームワークが整っているようなので、今後TDDを活用していきたい、と強く感じたワークショップとなりました。

最後になりますが、ワークショップを通して丁寧に指導してくださった講師の皆様、本当にありがとうございました。 また、参加者の皆さん、お疲れ様でした。