InfoQ

Interview

Coplien氏とMartin氏、TDDとCDDそしてプロフェッショナルの定義について大いに語る。

話し手: Jim Coplien and Bob Martin 聞き手: Floyd Marinescu 投稿日 2008年5月14日 午前1時13分

コミュニティ
Agile
トピック
ユニットテスト,
アジャイル技術,
Delivering Quality
タグ
テスト,
Refactoring,
Antipatterns,
XP,
TDD
概要
JAOO '07 で「今時、ユニットテストを実施してないコードを納品するのは無責任な開発者だ」というBob Martin氏の主張について、議論が起こった。 このInfoQビデオは、BobとJim Coplien氏がこれに関連する話や、いくつかの他の話題について議論する様子を納めたものだ。TDDと契約による設計(Design by Contract)の比較や、システムとビジネスドメインモデルを調和させるためには、事前にどれくらいのアーキテクチャ設計をしておかなければならないのか、などが議論されている。(翻訳:近藤 修平 - (株)永和システムマネジメント)

バイオグラフィ
Bob Martin氏はアジャイルマニフェストの起草者の一人であり、アジャイルプログラミング、XP、UML、オブジェクト指向プログラミング、C++などの多くの本の著者でもある。 彼はObject Mentor社(www.objectmentor.com)のCEOであり社長である。 Jim Coplienはオブジェクト指向プログラミングとC++とマルチパラダイム設計の第一人者である。 彼は設計において人間が関わる側面の価値を認めており、設計や開発について彼が書いた本は非常に高い評価を受けている。
Floyd Marinescuによる導入部分
Bob Martin: まず最初にこれを言っておく必要があります。今私は、自分にとってヒーローと言える人の隣に座っています。私は1991年から1992年ぐらいにJim氏の本を読み、ソフトウェアに対する私の考え方を改めました。特にC++に対する考え方を。ですから、今この場にいられてとても光栄です。我々の見解の相違は、確信というわけでなくあくまで可能性ですが、観点の違いだと思っています。私の論点というのは、ここ6年の間に何が起きたかを考えると、テスト駆動開発していないソフトウェア開発者は"プロフェッショナル"であると自称できなくなってきているということです。
BobはJimの要望に応え、三つの原則を紹介している。
そうですね。しかし、あなたは、テスト駆動開発の習慣は2007年の現在、プロフェッショナルな行動としての純粋な要件である、という命題については受け入れていないようです。
そうですか。それでは最初の話題に戻りましょう。とても興味深い話ですからね。プロフェッショナルとは何かという話でしたが、その前に、アジャイルコミュニティの中では1999年頃からアーキテクチャというものは重要ではないという意見がありました。アーキテクチャをどうこうする必要はないということです。私たちに必要なのは、テストと、たくさんのストーリーをこなすこと、短いイテレーション、それから魔法のように自ら結合するコード、結局馬糞みたいなものしかできませんが、これが全てだという考え方でした。愚かなことに、アジャイル提唱者の大部分がそれに同意していました。もし、今あなたがKent氏に会いに行って話をしたとしたら、彼がいつも言っているようにこう言うでしょう。「メタファ?そんなものクソくらえだよ」
確かにその通りです。ちょっと話を元に戻して、他の視点で考えてみましょう。アーキテクチャというのはとても重要だと考えています。私自身多くのアーキテクチャに関する論文や書籍を書きましたし、アーキテクチャのかなりマニアだと思います。一方で、アーキテクチャというのは一枚布のようなもので出来るとは思っていません。ちゃんとした設計とアーキテクチャのスキルを使いながら、週や月単位のイテレーションを何回も繰り返し、アーキテクチャを少しずつ積み上げるやり方をするのが普通だと思います。そして、作り出したアーキテクチャを構成する要素のうちいくつかは、捨ててしまうこともあるでしょう。そういう時は、イテレーションを数回使って別のアーキテクチャを試したりすると思います。2~3回のイテレーションを経て、正しいと思えるアーキテクチャに落ち着いた上で、調整フェーズに入ります。つまり、私の考えは、コードを実行することで情報を得て進化し、テストを書くことでも情報を得て進化する、そういうものがアーキテクチャなのです。
では、小さな誤解についての説明と、いくつかそれに対する反論をさせてください。私は、抽象的なメンバ関数や存在しないメンバ関数を持つようなインタフェースを実装することは、まずありません。適切なインタフェースを持つオブジェクトを作るようにしています。Javaで説明すると、そこに何もないような「なんとかインタフェース」を作ることはあったかもしれないですが、いつか実装することがあるかもしれないと、たくさんのメソッドを持つインターフェースを取り入れるようなことはしていません。それが、テスト駆動や要求駆動を使おうとしている理由です。インターフェースを分離したほうがいいきっかけとなるアーキテクチャの不和を、鵜の目鷹の目で探しています。
そうですね。それに同意します。オブジェクトに意味を与えるには、何か実体が必要ですね。それはとても小さなものだと思いますが。
では次に、私は実行可能なコードが将来の判断材料となるようにしていますが、それは大がかりなアーキテクチャや、憶測に基づいた大規模システムにしたくないからです。
では、話を元に戻しますが、実行可能なコードを書き始める前に、どれぐらいの時間を使いますか?例えば、最終的に200万行ぐらいになるシステムだとしたらどうでしょうか?
テストは書かないのですか?関連をテストするための。
素晴らしい!では我々の相違点はどこにあるのでしょうか?おそらくそれはTDDとプロフェッショナリズムの考え方についてではないでしょうか。次はそのことについて話しましょう。
TDDを実践している人達、でしょうか。
ええ。それは私も理解しています。ただ、私はそこから一歩進めたいのです、なぜなら我々の業界はどこかプロフェッショナルの基準というものに欠けているからです。
実際に定義があるわけではなくて、口上みたいなものです。私が思うに、近頃ではユニットテストをしていないコードを納品する開発者は無責任であるということです。これを正すのに一番良い方法は、TDDを実践することでテストしていないコードが納品されないようにすることです。
そういうトラブルは私も経験があります。この話はずいぶん昔に一段落したと思っていました。Eiffelと「契約による設計」を思い出していますが、全てのメソッドに事前条件、事後条件、それからクラスの不変表明を明確にするんでしたよね。テスト駆動開発、またはユニットテストの組み合わせでもいいですが、実質的には同じことをしています。メソッドの引数の入力や戻り値のチェックの組み合わせを明確にしたり、あなたが言っていたような状態空間の調査もします。いつも思うのですが、それは表裏一体の関係です。いつでも契約をユニットテストに置き換えることもできますし、逆も可能です。ただ、あなたも知っているように私は依存関係マニアなので、依存関係の方向が違ういう点が異なるとは言っておきましょう。ユニットテストはプロダクションコードに依存しています。これは問題無いと思います。そしてプロダクションコードはユニットに依存していません。一方で契約はプロダクションコードを汚してしまい、それが悩みの種になります。
コードの量に対する考え方の違いに驚いています。
厄介なテストがあるというところは同意しますが、厄介なコードもあります。あなたは「ツールは誤用されがちなので、それを使うべきではありません。」ということを理由にしていますが、それは良くない考え方です。それを言ってしまうと、何もできなくなってしまいます。
なるほど。そうですか。では、「契約」は広く誤用されていますか?
そうですね。ところで、あと数分しかないので、ささいな疑問に付き合ってください。答えは私も知りません。「○○駆動開発(DD)」を最初に使い始めたのは誰でしょう?先ほどCDDというのを聞きましたし、BDDやTDDもそうです。私が憶えている限りでは、Rebecca Wirfs-Brock氏の責務駆動設計(Responsibility Driven Design)が最初で、他は知りません。これより前にありましたっけ?
show all  show all
ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
Hatena

No comments

返信

ジャンル別一覧

BlazeDSとAMFでWebとデスクトップのアプリケーションを構築する

現在のRIAアーキテクチャにおいて、クライアント/サーバーの通信は重要な位置を占めています。本稿では、James WardとShashank TiwariがアドビによるオープンソースのBlazeDSメッセージングサーバーの世界へ飛び込みます。

業務ソフトに手を加えずに暗号化を実現する~秘文の挑戦~

hibun

ウィルス対策ソフトや情報漏えい防止用のソフトは、いわば影の存在です。ユーザの操作性やGUIを工夫する以上に、いかに目立たない存在となるかにその技術を注ぎ込んでいます。ここでは日立ソフトが開発した「秘文」の事例を紹介します。

Google Chartとgchartrbの紹介

Google Chartは、チャートを作成するためのWebサービスです。本稿では、Google Chartのインターフェースと、Rubyコードから簡単にチャートを生成することができるgchartrbライブラリの説明をします。

SOAを超えて: 動的な業務アプリケーションのための新しいエンタープライズアーキテクチャフレームワーク

全二回からなるこの記事では、ダイナミックビジネスアプリケーション(Dynamic Business Applications:DBAs)の開発についての全体的な眺望を、アーキテクチャと方法論の観点から見ていくことになります。我々のゴールは、「ビジネスの変化や、その他に必要とされる変更に対して、いかにして容易に適応できるアプリケーションを構築していくか」を導きだすことです。

ESB接続形態のオルタナティブ

本稿では、Adrien Louis氏がESBベースのSOAに対する2つの接続形態についての賛否について説明しています。その2つとは、会社での単一のESB対「部門毎」に相互接続するESBによるシステムです。

AjaxプログラマのためのJavaOne2008 -GrizzlyでComet!-

誕生から2年を経てCometは「何が出来るのか」という議論から、「いかに実現するか」という議論に関心が移ってきたように見えます。そこで本稿では同じくJavaOneで数多く取り上げられたNetBeans 6.1とGlassFish v3を使いながら、サンプルを交えてCometを解説していく事にします。

SharePoint Webサービスを始めましょう

この記事では、WSS3とMOSS 2007に難しい設定など一切せず、すぐに利用可能なWebサービスと、Javaと.NETからそのWebサービスを消費する方法に目を向けます。

レトロスペクティブのプライムディレクティブに対する問い

この記事の始まりは、知的で思慮深い人たちの魅力的なグループが食事会を終えて話をしているところです。話はレトロスペクティブ(振り返り)プロセスの要であるプライムディレクティブ(最初の指示)に及んでいます。