アジャイルアカデミー「TDD実践講座」とは
「TDD実践講座」は、ソフトウェア開発手法の一つ「テスト駆動開発(TDD)」の実践手法を手引きする講座です。
TDDは、CodeZineの連載『C#で始めるテスト駆動開発入門』をはじめとする多くの日本語のドキュメントや、「TDD Boot Camp」といったコミュニティ活動によって普及しており、既にご存じの方、実践されている方も多いでしょう。
一方で、知名度が高い分、「大枠は理解しているけれども実践となると自信がない」「気になってはいるが、独学で調べてたり、コミュニティ活動に参加したりする時間が取れない」といったこともあるかもしれません。
本講座は、そのような悩みを抱える方に向けて、国内におけるTDDの伝道師 和田卓人氏、TDDのエキスパート 太田健一郎氏、安井力(やっとむ)氏といった布陣で、開発の現場で役立つ、最も効率的なTDD導入の勘所をレクチャーする内容となっています。
講座のコンセプトについては、以前CodeZineに掲載した『「書くコードに自信と責任を持ったプロフェッショナルになるために」 ~アジャイルアカデミー開講記念インタビュー』も併せて参照してください。
講座受講に必要なスキル
アジャイルアカデミーは、実際に手を動かすワークショップ形式で、受講者の積極的な参加を重視した構成となっていますが、冒頭に簡単な座学とデモンストレーションがあるため、TDDの基礎知識がない方でも安心して受講いただけます。
また、技術的にも、何かしらの開発言語を習得しているレベルであれば十分です。単体テストツールの使い方も、スニペットなどが用意されており、職業プログラマーではない編集者でも十分ついていくことができました。
例えば、JavaScript(単体テストフレームワークとしてQUnit)であれば、次のようなサンプルが用意されています。
module("QUnit の使い方"); test( "assert.ok の使い方", function(assert) { var truth = true; assert.ok(truth, "assert.ok は引数が truthy であるかどうかを検証します"); var falsy = null; assert.ok(!falsy); }); // QUnit の assert.equal 系は引数の順番が actual, expected の順(JUnit の逆)なので注意してください test( "equal, notEqual の使い方", function(assert) { assert.equal('hoge', 'hoge'); assert.equal(1, '1', 'equal は == を使います'); assert.notEqual('foo', 'bar'); }); ……
なお、当日はいくつかのチームに分かれて共同作業を行うため、事前にアンケートを行い、開発言語ごとの振り分けが行われます。
TDDを行うべき理由
講座が始まると、まず受講者各位がポジションペーパーを書き、自己紹介と参加理由を発表します。参加した回では、社内システムやネットワークインフラ回りを担当されている方が多く、上長からの推薦や部署の意向で受講されたようでした。
具体的な参加目的としては、次のようなものを挙げていました。
- スクラムでTDDをやっているが、一から学び直したい
- 引き継いだコードをきれいにしたい
- 自動化まで踏み込みたい
- そもそもTDDとは何かを知りたい
続いて、TDDというのは、複雑さに立ち向かい、不安を克服し、状況をコントロールする手法であり、目標は、「動作するきれいなコード(バグ対応も追加変更も容易で、作業が予測可能なコード)」を書くことであることを、当日講師を務めたやっとむ氏が説明(注:講師・チューターは開催回ごとにローテーションします)。予測可能であることが、ビジネス・企画側も含めたチームに信頼性を生むと、TDDのメリットを再確認しました。
その後、TDDの具体的な方法論の解説が続きますが、この辺りはCodeZineでも何回か取り上げていますので割愛します。詳しくは次の記事などを参照ください。
TDDで扱うテストの性質
具体的な演習に進む前に、強調しておくべき点として、TDDのテストの性質について注意がありました。
- TDDのテストは、プログラマーの、プログラマーによる、プログラマーのためのテストである
- テストにはさまざまな種類があるが、TDDがカバーしているのは、その一部であり、品質のためのテストの代わりになるものではない
- TDDのテストは、「高速」「独立」「再現性」「自己検証可能」「適時性」(頭文字をとってFIRST)の5つの要件を満たす必要がある(『Clean Code』より)
このようなTDDを体験するための前提知識の解説と、FizzBuzz問題を題材にしたデモンストレーションに続いて、受講者は早速、実際にコーディングを行うハンズオンに取り掛かります。
ペアプログラミングを体験
ハンズオンは、二人で一台のマシンに向かってコードを書く「ペアプログラミング」の形式で進めます。こちらも、ペアプログラミングのプロトコル(手順)や、「ドライバー」「ナビゲーター」といった役割の説明、講師による実際のデモンストレーションなどが行われるので、前提知識がない初心者でも安心です。
ペアプログラミングは、プログラミングを通して二人で会話をする(設計とテストといった担当を交互に入れ替えながら実装を進める)ことで、より上手にプログラミング/設計できるようになる効果があることから、リファクタリングが重要なTDDの演習手法として採用されているようです。
体験してみると、確かに他者のやり方や発想と交わることで、より深い気付きがあり、これだけでもよい経験になりました。
日常でペアプログラミングを行う場は、なかなか得にくいと思いますので、ぜひこういった場で一度体験しておくとよいでしょう。
演習課題
当日与えられた課題は、次のような整数の区間を扱う処理の実装です。区間の生成や、文字列表現での表示、ある区間に整数や別の区間が含まれるかの判定、などの全部で6つの課題が用意されていました。
チームごとに、課題を分割し、TODOを作成して、テストコードに落とし込み、リファクタリングを繰り返す、といった流れで課題を解き進めます。
冒頭の座学やデモを見聞きして、頭では理解したつもりになっていても、実際に手を動かしてみると、思わぬところでつまずいたり、新たな疑問が起こったりするものです。
そこは小人数制のワークショップということもあり、講師やチューターが絶妙なタイミング、ヒントで学習が効率よく進むように導いてくれました。筆者のように、「あのt-wadaがじかにレクチャーしてくれた」というのがモチベーションにつながる方もいるかもしれません。
また、2度ほど、発表とコードレビューの場が設けられ、他者に教える、他者の意見を聞く行為を通じて、より深く理解することにつながりました。
冒頭で、講師が「プログラミングコンテストではないので、最後までやることが重要なわけではない」と説明していましたが、その通りで、見た目の分量よりもはるかに濃密な経験を得ることができると思います。なにより楽しい。
TDDを実践するための次のステップ
ハンズオンの後は、1時間程度の座学と質疑応答の時間があります。
TDDの第一歩を踏み出した後で、今後どのように技術を深め、現場で役立てていけばよいか、学習のステージごとに適した推薦図書や研究データの紹介などが行われました。
当日、講師のやっとむさんが基本レベルと紹介した書籍だけでも、次のとおりで、なかなかTDDの道も奥が深そうです。
- 『JUnit実践入門』
- 『The RSpec Book』
- 『レガシーコード改善ガイド』
- 『データベース・リファクタリング』
- 『xUnit Test Patterns』
- 『ソフトウェアテスト技法ドリル』
- 『ソフトウェア・テスト PRESS 総集編』
- 『実践テスト駆動開発』
- 『テスト駆動開発による組み込みプログラミング』
- 『継続的デリバリー』
- 『システムテスト自動化標準ガイド』
- 『Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン』
- 『組織パターン』
質疑応答の場では、「TDDが向く/向かない領域はどこで、どう使い分けるか」「実際に業務で適用する際に考えられる課題」など、今後現場で活用することを意識した、具体的な相談が目立ちました。経験豊富な講師陣ですので、かなり突っ込んだリアリティーのある内容でも明確な答えを導いてくれると思います。
また、当日参加いただいた受講生の方には、次のようなコメントをいただきました。
「TDDとはどういったもので、どのように利用するのか分かりやすく説明してもらえた。また、TDDに向くシステムと向きにくいシステムの説明も有効だった」
「初歩的な進め方のコツが学べたと思う。明日から実践する自信がついた」
「『テストコード書かなきゃ!でもよくわからないし難しそうだから……』と、なかなか重い腰を上げられない人はもちろん、プログラム初心者にもおススメ」
「ペアプログラミングを初めてやってみて、その雰囲気が分かってよかった」
「ペアプログラミングを行うことで、テストや設計を考えながら実践できた」
次回の開催
講座の流れは以上です。詳細は、ぜひ皆さんがご自身で体験いただければと思います。
次回開催は2015年6月26日(金)です。アジャイルアカデミーのページから奮ってご応募ください。お得なペア割(6000円オフ)もありますので、チームでの参加もオススメです。