ジョエルのテストにテスト駆動開発が欠けているのはなぜですか?


23

Joel Spolskyが書いたこのブログを読んで、コードを改善するための12の手順を説明しましたテスト駆動開発の欠如は本当に驚きました。だから私はグルに質問を投げたい。TDDは本当に努力する価値はありませんか?


13
その記事は2000年8月9日水曜日(約12年前)に書かれました。その時点でTDDが存在していなかったわけではありませんが、最近のようにTDDがほとんど話題になったとは思いません。
マイク

12
Joelテストは、単なる一般的なガイドラインのセットです。「努力に値する」すべてがそこに収まるわけではありません。
ヤニス

2
' 私は、ソフトウェアチームの品質を評価するために、非常に無責任で、ずさんな独自のテストを考案しました。それについての大きな部分は、それが約3分かかるということです...ジョエルテストについてのきちんとしたことは、各質問に迅速なyesまたはnoを得ることは簡単であるということです。1日あたりのコード行数または変曲点ごとの平均バグ数を把握する必要はありません... ' -プロジェクトがTDDの恩恵を受けるかどうかを判断するのに3分以上かかる、変曲点ごとの平均バグを計算する必要があるかもしれません-それがリストにない理由です
-gnat

Joel Stack plzに移動します。面白い質問です。
エリックReppen

Joelに直接リンクして引用するという答えは、それよりも信頼できるものではないため、受け入れることを検討する必要があります。Programmers.stackexchange.com/a/189493/6586
Bryan Oakley

回答:


30

テスト駆動開発は Joelがその投稿を書いてから 2年後の 2002年にKent Beckの出版されるまで、事実上不明でした。問題は、なぜジョエルがテストを更新しなかったのか、それともTDDが2000年によく知られていたら、それを彼の基準に含めたのでしょうか?

重要なことは、プロセスの具体的な詳細ではなく、明確に定義されたプロセスを持っているという単純な理由から、彼はそうではないと考えています。これは、特定のバージョン管理システムを指定せずにバージョン管理を推奨する、または特定のブランドを推奨せずにバグデータベースを作成することを推奨するのと同じ理由です。優れたチームは継続的に改善と適応を行い、その特定の時点での特定の状況に適したツールとプロセスを使用します。一部のチームにとって、それは間違いなくTDDを意味します。他のチームにとってはそれほどではありません。TDDを採用する場合は、それが貨物カルトの考え方から外れていないことを確認してください。


1
また...ああ、あなたはいくらかTDDに当たったのですか?
エリックレッペン


27

ジョエルは実際にいくつかの場所でこれに具体的に取り組んできました。

彼は、物事のテストでは多くの重要な問題、特に「このソフトウェアのユーザーインターフェイスはダメですか?」などの主観的な問題をキャッチできないと説明しました。彼によると、Microsoftでの自動化されたテストへの過度の依存が、Windows Vistaの結果となった方法です。

彼は、経験上、ユーザーが実際に発見するバグの種類は、2つのカテゴリーに分類される傾向があることを書きました。1)一般的な使用法で現れるバグ。 、または2)エッジケースが不明瞭であるため、そもそもそれらをカバーするテストを作成しようとは誰も考えなかったでしょう。彼は、彼と彼のチームがFogBugzで修正したバグのごく一部のみが、ユニットテストで検出された種類のものであると述べています。(私は今その記事を見つけることができませんが、誰かが私の言っていることを知っているなら、ここへのリンクを編集してください。)

そして、特にプロジェクトが多くの単体テストを含む非常に大きなプロジェクトに成長し、その後(意図的に)何かを変更し、非常に多くの壊れた単体テストで終わる場合、それは価値があるよりももっと厄介になることができる方法を書いています。 彼は、ユニットテストが引き起こす可能性のある問題を、人々がジョエルテストに13番目のポイントとして追加しなかった理由として、具体的に使用しています。


2
実際、あなたは正しい。ジョエルの通常のMOはストローマンです。TDDは私にとってバグをキャッチしなかったので、それは良いことではありません。TDDはテストに関するものではなく、設計に関するものであるという点を多少見落としています。残されたテストはボーナスです。または、小さな変更で多くの単体テストが中断されると主張することは、彼が間違ったことをしていることを示唆しています。または、SOLID原則を完全に書き換えてから攻撃する。そのようなこと。実際、彼ではなく、彼の支持者が循環論理を使用しています。
pdr

7
私はジョエルのこれらのコメントに完全に同意します。さらに大きな問題は言語であり、単体テストなしでは何もできないと想像できない多くの動的言語であると思います。瞬間?エラーを減らすように設計された静的に型付けされたコンパイル言語では、すべての最も単純なエラーから離れて誘導され、主に論理エラーが残ります。これにより、TDDが提供する種類のフルカバレッジの必要性が軽減されます。
ビルK

2
@MasonWheeler:あなたは、コンパイラ/型安全がユニットテストの必要性を取り除くと真剣に主張していますか?また、TDDの設計上の利点を意図的に無視しますが、さらに重要なことは、何かをリファクタリングするのに時間を要することです。むしろ、逆のことが真実であると考えられています。例えば、TDD方法論に従う.NET開発者は、見返りとして益々役に立たないコンパイラを喜ばせるために書く必要があるコードの量に突然不満を感じます。
pdr

2
@pdr:そもそも「ユニットテストの必要性」は型安全性の欠如だと真剣に主張しています。そして、.NET開発者ではないので、私は彼らの経験についてあまり語ることはできませんが、私自身の経験では、リファクタリングの難しさは2つの要因に完全に基づいていることがわかりました:最初のコードを書いたかどうか場所、および著者がコードを適切に書いたかどうか。(注:ポイント1と2は必ずしも互いに強く相関しているわけではありません!)
メイソンウィーラー

3
@Pdr単体テストはコードを証明しません。それらはほとんど構文チェッカーですが、開発中に非常に役立ちます。ただし、統合テストとシステムテストの方がはるかに理にかなっています。また、静的に型付けされた言語のほとんどのリファクタリングは安全であることが証明できます。実際、リファクタリングとは、変更を導入せずにコードを変換する既知の「安全な」操作のセットです。静的言語では、IDEは、多くの場合、あなたのためにこれらの変更を行うと、彼らが安全であることを保証することができ、したがって、(証明ではない)を支援するために、同じ安全ユニットテストが必要な動的言語では、多くの場合、不可能なもの
ビル・K

25

Joel Spolsky自身が2009年にこの質問に回答しました

ジョエル:テスト駆動開発については議論があります...あらゆる種類のユニットテストがありますか?そのようなもの...ジョエルテストを読んだ後、多くの人が私に書いてくれます。ここにあるもの:単体テスト、すべてのコードの100%単体テスト。」

そして、それは私があなたが必要としないかもしれない何かについてほんの少し教義的すぎると私を打つ。同様に、アジャイルプログラミングの全体的なアイデアは、必要になる前に何かをするのではなく、必要に応じてページフォールトすることです。すべての自動テストは、多くの場合、役に立たないようです。言い換えれば、実際に機能するコードを保証するために、非常に多くの単体テストを作成し、それが機能しないかどうかを確実に確認します。テストを書いてください]、実際にはまだ動作します...わかりません、私はそれをうまく表現していないので、このためにそのようなフレームメールを取得するつもりです。しかし、チームがユニットテストのコードカバレッジを100%本当に持っていた場合、いくつかの問題があると思います。1、彼らはユニットテストを書くのに非常に多くの時間を費やしていたでしょうし、品質を向上させてその時間を支払うことができるとは限りません。つまり、彼らは品質がいくらか向上し、何も壊さないという自信を持ってコードを変更できるようになりましたが、それだけです。

しかし、私が発見した単体テストの本当の問題は、コードの進化に伴って行う傾向のある変更の種類が、単体テストの一定の割合を破壊する傾向があることです。コードを変更して、ユニットテストの10%を壊すこともあります。意図的に。何かのデザインを変更したため...メニューを移動し、そのメニューに依存していたすべてのものが...今、メニューは他の場所にあります。そのため、これらのテストはすべて壊れています。そして、コードの新しい現実を反映するために、それらのテストに行き、それらのテストを再作成できなければなりません。

最終結果は、プロジェクトがますます大きくなるにつれて、本当に多くの単体テストがある場合、それらの単体テストを維持し、最新の状態に保ち、維持するために必要な投資額です。彼らは通り過ぎ、あなたが彼らから得る利益の量に不釣り合いになり始める。


2
本当に?OPの質問に対するJoel自身の回答を投稿することについての投票権は?
ロスパターソン

1
わかりにくい。一部の人々は、「これは便利です」ではなく「私は承認します」という意味で投票を使用しています。これが決定的であるため、これは明らかに受け入れられた答えであるはずです。
ブライアンオークリー

100%のテストカバレッジを持つプロジェクトに取り組んだことはありません。しかし、テスト範囲が0%の場合は... ...かなりわかりやすいです。
クズカイ

ありがとうございました!これは受け入れられた答えとしてマークされるべきだと思います。
ジャラル

5

ジョエル以外の誰も確実にそれに答えることができませんでした。しかし、いくつかの理由/観察を試すことができます。

まず第一に、テストはジョエルのテストに欠席していません

  • テストは12ステップで直接2回言及されます(10および12)
  • ビルドの存在は、最初のポイントの1つです。ビルドするという考えは、それらが壊れているかどうかを確認する能力を得ることです。そこで、ここでテストについても話します。

第二に、Joel Testの全体的なアイデア(私が理解しているように)は、素早く、はい、いいえの質問をすることです。「TDDをしますか?」正確には適合しません(答えは「私たちの一部」、「コードのその部分」、または「ユニットテストを行う」です)。

第三に、「時間の価値がある唯一のもの」(ところで、「あなたはプログラムしますか?」が載っていない)という点は、(ジョエルでさえ)誰も言っていないと思います。将来のチームメンバーとして、または顧客としても、ソフトウェアチームと連絡を取ります。これは、自分のIT部門がどれだけ良いか悪いかについての手がかりを探していた、私の周りの技術者以外の人に与えたリストです。それはすべてではありませんが、3分で倒すのは本当に悪いです。


3
「TDDをしますか?」確かにyes-noの質問として当てはまります。そしてそれは、誰もが強調した「はい」で答える質問であり、実際には「いいえ」を意味するということです。
ヤンニス

2
@YannisRizos:「お金で買える最高のツールを使用していますか?」(はい... wellllll ...理由の範囲内です。)そして「プログラマーは静かな労働条件を持っていますか?」(そうそう... wellllll ...静かにするためにあなたの基準点に依存する、私は推測する。)
pdr

@pdr開いている窓から入ってくるサイレンの音を静かにするかどうかに依存します。
ロバートハーベイ

また、「はい、トップダウンデザインを行います。」;)
イズカタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.