残念ながらうまくいかなかったTDDを使って数独ソルバーを作成しようとしたRon Jeffriesの試みも参照してください。
アルゴリズムは、アルゴリズム設計の原則を十分に理解する必要があります。これらの原則により、Peter Norvigのように計画的に段階的に進めることが実際に可能です。
実際、重要な設計作業を必要とするアルゴリズムの場合、ほとんどの場合、作業は段階的に増加します。しかし、アルゴリズム設計者の目には小さな「増分」は、この特定のアルゴリズムファミリで同じ専門知識や知識を持っていなかった人にとって、(フレーズを借りる)飛躍的な進歩のように見えます。
これが、多くのアルゴリズムプログラミングの実践と組み合わせたCS理論の基本的な教育が同様に重要である理由です。特定の「技術」(アルゴリズムの小さなビルディングブロック)が存在することを知ることは、これらのインクリメンタルな飛躍的な進歩を遂げるための長い道のりです。
ただし、アルゴリズムの漸進的な進歩とTDDの間にはいくつかの重要な違いがあります。
違いの1つはJeffOによって言及されています。出力データの正確性を検証するテストは、同じアルゴリズムの異なる実装(または同じソリューションを提供しようとする異なるアルゴリズム)間のパフォーマンスを主張するテストとは異なります。
TDDでは、テストの形式で新しい要件を追加し、このテストは最初はパスしません(赤)。その後、要件が満たされます(緑色)。最後に、コードがリファクタリングされます。
アルゴリズムの開発では、要件は通常変更されません。結果の正当性検証テストは、最初に、またはアルゴリズムのドラフト(非常に信頼性は高いが遅い)の実装が完了した直後に作成されます。このデータの正当性テストはめったに変更されません。TDD riteの一部として失敗(赤)に変更しません。
ただし、この側面では、データ分析の要件(入力セットと期待される結果の両方)は人間の理解において大まかに定義されているだけなので、データ分析はアルゴリズム開発とは明らかに異なります。したがって、要件は技術レベルで頻繁に変化します。この急速な変化により、データ分析はアルゴリズム開発と一般的なソフトウェアアプリケーション開発の中間に位置します。ただし、アルゴリズムは多用されますが、要件もプログラマーの好みに合わせて「速すぎ」ます。
要件が変更された場合、通常は別のアルゴリズムが必要になります。
アルゴリズム開発では、パフォーマンス比較テストを失敗(赤)に変更(タイト)するのはばかげています。これは、パフォーマンスを向上させる可能性のあるアルゴリズムの変更についての洞察を与えません。
したがって、アルゴリズム開発では、正確性テストとパフォーマンステストの両方がTDDテストではありません。代わりに、どちらも回帰テストです。具体的には、正確さ回帰テストでは、正確性を損なうアルゴリズムへの変更を防ぐことができます。パフォーマンステストは、実行速度を低下させるアルゴリズムに変更を加えることを防ぎます。
「赤-緑-リファクタリング」の儀式がアルゴリズム開発の思考プロセスに厳密に必要でも、特に有益でもない場合を除いて、個人的な作業スタイルとしてTDDを組み込むこともできます。
アルゴリズムの改善は実際には、現在のアルゴリズムのデータフロー図にランダムな(必ずしも必要ではない)順列を作成したり、以前の既知の実装間でそれらを混合および照合したりすることによって生じると主張します。
TDDは、テストセットに段階的に追加できる複数の要件がある場合に使用されます。
または、アルゴリズムがデータ駆動型の場合、テストデータ/テストケースの各部分を段階的に追加できます。TDDも役立ちます。このため、「新しいテストデータを追加する-このデータを正しく処理するようにコードを改善する-リファクタリング」の「TDDのような」アプローチは、アルゴリズムの目的が人間で記述されるオープンエンドのデータ分析作業でも機能します。中心の言葉とその成功の尺度も人間が定義した用語で判断されます。
それは、1回の試行ですべて(数十または数百)の要件を満たすことを試みるよりも、それを圧倒的に少なくする方法を教えることを意図しています。つまり、ソリューションの初期ドラフトを実装している間、特定の要件またはストレッチゴールを一時的に無視できると指示できる場合、TDDが有効になります。
TDDはコンピューターサイエンスの代わりにはなりません。これは、プログラマーが一度に多くの要件を満たす必要があるというショックを克服するのに役立つ心理的な松葉杖です。
しかし、正しい結果が得られる実装がすでに1つある場合、TDDはその目標が達成され、コードを(リファクタリングまたは別のプログラマーユーザーに)引き渡す準備ができていると見なします。ある意味では、コードが「十分に優れている」というシグナル(客観的にはすべての正当性テストに合格)を与えることにより、コードを時期尚早に最適化しないことをお勧めします。
TDDでは、「マイクロ要件」(または隠された品質)にも焦点が当てられています。たとえば、パラメーターの検証、アサーション、例外のスローと処理など。TDDは、ソフトウェア実行の通常の過程で頻繁に実行されない実行パスの正確さを保証するのに役立ちます。
特定のタイプのアルゴリズムコードには、これらのものも含まれています。これらはTDDに適しています。ただし、アルゴリズムの一般的なワークフローはTDDではないため、このようなテスト(パラメーターの検証、アサーション、例外のスローと処理)は、実装コードが(少なくとも部分的に)作成された後に作成される傾向があります。