設計スタミナ仮説

2007年6月20日

ソフトウェアをきちんと設計する価値はあるのか?

時折、優れたソフトウェア設計が価値のある活動かどうかについて、間接的な議論をします。これらの議論を間接的と言うのは、ソフトウェア設計が無意味だと言う人に今まで出会ったことがないからです。通常は、「来年の目標を達成するために迅速に動かなければならないため、<何らかの設計活動>を削減しています」といった形で表現されます。

そこには、設計はより高速化のためにトレードオフできるものという考えがあります。実際、設計の努力は、スピードを落とすにもかかわらず、プログラマを満足させるために容認されているという印象を何度か持ったことがあります。

もし設計に努力を費やすことがプログラミングの効率を低下させるのであれば、私は反対します。実際、もしそうであれば、ほとんどのソフトウェア開発者は設計に反対するでしょう。開発者は何が優れた設計であるかについて意見が異なるかもしれませんが、彼らが支持する優れた設計のブランドを支持するのは、それが生産性を向上させる(そしてここで「設計」とは、事前設計またはアジャイルのアプローチ、つまり計画的または進化型設計を意味します)と信じているからです。

設計活動は確かに時間と労力を要しますが、それらはソフトウェアを将来に向けて進化させることを容易にするため、報われます。設計を無視することで短期的な時間を節約できますが、これは技術的負債を蓄積し、後で生産性を低下させます。ソフトウェアの設計に努力を費やすことで、プロジェクトのスタミナが向上し、より長く高速で作業を進めることができます。

これを視覚化する一つの方法は、次の擬似グラフです。

この擬似グラフは、優れた設計と設計なしの2つの架空の典型的なプロジェクトについて、提供された機能(累積)と時間をプロットしています。設計を行わないプロジェクトは、事前設計であろうとアジャイル手法であろうと、設計活動には一切努力を費やしません。これらの活動に費やされる努力がないため、このプロジェクトは当初はより速く機能を生成します。

設計なしの問題点は、設計に努力を費やさないことで、コードベースが悪化し、変更が難しくなり、生産性(線の勾配)が低下することです。優れた設計は生産性をより一定に保つため、ある時点(設計ペイオフライン)で、設計なしのプロジェクトの累積機能を追い越し、引き続き優れた成果を上げます。

これは仮説と呼んでいます。なぜなら、この現象が実際に起こるという客観的な証拠がないからです。科学的な用語では、テストするのが困難なため、非常に良い仮説ではありません。生産性を測定することはできませんし、設計の質を測定することもできません。

しかし、仮説にすぎないにもかかわらず、私を含む多くの人々にとって公理でもあります。この効果が起こる客観的な証拠はないかもしれませんが、私たち多くの人は、これが現場で私たちが見るものを質的に説明していると感じています。それは私にとって公理であり、ソフトウェア設計に関する著述家としての私のキャリア全体を支える仮定です。もし設計が何らかの形で生産性を実際に向上させないのであれば、私の著作のほとんどは無価値です。

仮説を公理として扱うことは多くの人にとって奇妙に聞こえると思いますが、それはよくあることです。私は、この仮説が正しいと判断するために自分の判断力を使っていますが、仮説の客観的な弱点を無視することはありません。それを証明する方法、そしてそれを反証する方法を見つけることを願っています。

この仮説には、設計ペイオフラインから導かれる系があります。最初のリリースの機能が設計ペイオフラインを下回っている場合、スピードのために設計品質をトレードオフする価値があるかもしれません。しかし、ラインを上回っている場合、トレードオフは幻想です。デリバリーが設計ペイオフラインを上回っている場合、設計を無視すると常にリリースが遅れます。技術的負債の観点から言えば、ローンを組むが、元本を非常に長い間使わないため、使う頃には利息の支払いを多く支払っているようなものです。

これは、そのラインがどこにあるかという疑問を提起します。設計スタミナ仮説を受け入れる人々の中でも、ペイオフラインの位置については、かなりの、そして重要な違いがあります。私は、ほとんどの人が考えているよりもはるかに低いと考えています。通常は数週間ではなく数か月です。しかし、これもまた判断によるものです。

これは技術的負債の結果につながります。技術的負債は素晴らしいアナロジーであり、私は頻繁に使っています。しかし、設計ペイオフラインは、技術的負債を負うのはある程度までしか価値がないことを思い出させてくれます。提供された価値が利息の支払いを上回っているかどうかを考慮するだけでなく、デリバリーがそもそもペイオフラインを上回っているかどうかを判断する必要もあります。