InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

Bobおじさんが述べるTDDの適用可能性

作者 Mike Bria , 翻訳者 竹中 翔 - (株)ポータルアイランド 投稿日 2009年11月17日

セクション
プロセス/プラクティス,
デベロップメント,
設計/アーキテクチャ
トピック
Agile ,
アジャイル技術 ,
Ruby ,
プログラミング ,
.NET ,
Java
タグ
テスト ,
TDD

原文(投稿日:2009/11/04)へのリンク

"TDDによってペースが鈍ると考えている人は石器時代で生きつづけているようなものだ"と主張したことで議論を巻き起こしたブログに続き、Bob Martin氏は現実のTDDの適用可能性、役割、恩恵に対する深い洞察を試みている。

氏はまず"TDDはアーキテクテャの代替物か?"という大きな問題を取り上げ、実例を背景に「そうではないですが、しかし...」と答えている。

いちから始めて次々にテストケースを書いていくことで実行可能なアーキテクチャを生成できるという意見は全くばかげたことです。テストしないという決断を下す必要もあります。

もちろんこれらの決断の多くはできるだけ先延ばしにすることができるし、そうすべきです。例えば、データベーススキーマは恐らく長い時間待つことが可能なものです。Spring、JSF、Hibernate、JPAなどを使うかどうかの決断もたぶん待つことができます。ビジネスルールの美しさはデータベースやGUIモデルとは独立して実装することができるし、またそうすべきです。
...
ここが肝心なところです。TDDで完全なアーキテクチャを導き出すことはできません。TDDはアーキテクチャ上の決断にいくらかの情報を提供することはできますが、アーキテクチャビジョンなしにプロジェクトを始めることはできません。だから、前もっていくつかのアーキテクチャは必要です。アーキテクチャのアクティビティの中で最も重要なもののひとつはアーキテクチャ要素が先延ばしにできるのか否かを決めることです。

アーキテクチャの疑問に答えた後、Martin氏は次の話題"TDDは設計の代替物か?"に挑んでいる。この疑問に対する回答のエッセンスはこのようなものだ。

答えはノーです。設計スキルは必要です。設計原則やデザインパターンについての知識はやはり必要です。UMLについて知っているべきです。そして、ソフトウェア設計の軽量モデルを作るべきです。
...
肝心なのはTDDが設計テクニックのひとつであり、唯一のものであるべきではないということです。古い設計ルールやスキルは今でも生かすことができます。そしてTDDはそれらに情報を与え、増補するためのパワフルな方法です。

Martin氏の"石器時代"ブログの発言に戻ってみると、氏は"コードの全ての行にTDDを使うべきか"という疑問に結論を下している。再度、答えは"ノー"だと述べている。

使うべきではありません。TDDが有効ではないものがあります。GUIはその一例です。
...
もちろん、GUIだけではありません。キーはいじるという概念です。コードを伝達しなければならない場合、顧客の要求のためにいくつかの側面をいじる必要がある場合、編集と実行の迅速なサイクルによって解決できるとはっきりしない場合、TDDは恐らく助けになるよりも邪魔になります。
...
これを管理するための秘訣は強力な分離です。いじる必要がないコードを識別し、TDDを使って書けるモジュール内にコードを分離し、いじられたコードは隔離されておりかつ最小限であるようにしてください。

いくつかのテストはで書いた方がよいという事実を認め、Martin氏は必要な時("いじる"ことが必要とされた時)にだけすべきかについて再度取り組んでいる。氏はテストが初めに書かれていない場合、ほとんどの訓練されたプログラマでさえある程度のテスト困難なコードを書かなければならなくなるということを説明し、"全ての行、全ての決断がテストされるチャンスを大きく広げる"という、この背景にある第一の理由を述べている。

そして、Bobおじさんは"テストの必要性を受け入れるなら、なぜテストファーストに反対するのか"という面白い問題を提示している。このため、氏はコードが徐々に増えていくと考えることができない人がいる、という仮説を立てている。

正直なところ、なぜテストファーストに対してこのような強い抵抗があるのか私はわかりません。どのみち我々はテストを書くつもりなので、明らかにそれは生産性の問題ではありません。

たぶん、テストを最初に書くことがフローの中に割り込んでくることを望まない人々がいるのです。それは正しく、テストを最初に書いている時、アルゴリズム全体を書くことはできません。1つずつテストケースを追加しながら、少しずつアルゴリズムを組み立てなければなりません。もしかすると、この方法を心地よい作業だと感じない人々がいるのかもしれません。

Martin氏は最後に「高いテストカバレッジを気にかけずに早く先に進めばいいのでは?」というよくある意見に答えている。氏はまずレガシー環境(コードがテストを持たない環境)で高いカバレッジを得ることはコストが高く、長期の投資を要求すると認めている。だが非レガシー環境やレガシー環境の新しいコードに対しては、氏の答えは異なるものである。このようなケースでは、高い自動テストのカバレッジは作業を迅速化してくれる。なぜなら

第一に、大量のデバッグが不要になります。実際にコードの全ての行をテストしたらどうでしょうか?私自身の経験で言えば、デバッグ時間はほとんど消えてなくなります。昨年のFitNesseの開発で私はデバッグにほとんど時間を使いませんでした。時間にして5時間かそれ以下でした。

第二に、不注意でコードをこわしてしまうことがありません。テストスィートは数秒でこのような破損箇所を見つけ出します!これは私を怖いもの知らずにしてくれます。怖いもの知らずであれば、ずっと早くできるようになります。

第三に、テストはシステムがどのように動くかの例になります。システムのある部分がどうやって動くか忘れた時はいつも、私はテストを読みます。これらによってすぐにスピードを取り戻すことができます。

第四に、私はフィールドからのバグの連発と戦っていません。何千ものユーザーがいるにも関わらず、バグリストは小さなものです。サポートに使った時間は1週間に1時間以下で、大抵はユーザーガイドの正しい場所を教えてあげることだけです。

Bobのブログで詳細とこれらのアイディアの具体例を見ることができる。そして、少し時間をとってコメントのかなりの量のフィードバックとさらなる貴重な投稿も読むべきだ。

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。