「このウェブサイトはかなり簡単です。あなたがやるべきことは、X、Y、Zを完了するだけです。あなたは技術がかなりできるように見えるので、それを構築するのにあまり時間をかけずに済むと思います。」
私は時々こういったEメールを受け取ります。これらのメールを書く人は、ほとんどが技術に関係のない人か、最初の製品を研究中の人です。最初のうちは、そのような言葉を聞くたびに、私はたいてい腹が立ちました。彼らは誰とソフトウェア開発に必要な時間について議論しているのでしょうか?しかしその後、私は気づきました。自分のプロジェクトで開発にどれだけの時間がかかるかを見積もることさえ、私にはお手上げなのだと。自分にすらできないのに、なぜ彼らに腹を立てる必要があるのでしょうか?
本当に私を憂鬱にさせるのは、彼らの見積もりの間違いではありません。問題は、彼らが自分で正しい見積もりができると思い込んでいることです。開発者として、私たちはソフトウェア開発の問題において、素人が複雑なことをごく自然に単純だと見積もってしまうことをしばしば目にします。
これは私たちの怒りの言い訳にはなりません。しかし、これによって別の興味深い問題が生じます:なぜ私たちが生まれながらにして持つ複雑さを予測する能力は、プログラミングの問題に直面すると機能しなくなるのでしょうか?
この質問に答えるため、私たちの脳がどのように物事を見積もるのかを見てみましょう。ある事柄は経験がない人でも簡単に正しく見積もることができますが、また別の事柄はそうではありません。
誰かがギターを弾くのを見る場面を考えてみてください。たとえギターを弾いたことがなくても、「メリーさんのひつじ(Mary Had a Little Lamb)」の演奏を見れば、それが簡単で、それほど高い技術がなくても演奏できるとおおよそ推測できるでしょう。同様に、ニ長調の「カノン(Pachabel's Canon)」の演奏を見れば、それが複雑で、演奏できるようになるには長い練習が必要だと容易に推測できるでしょう。
なぜ私たちはこれら2曲の複雑さをこれほど迅速かつ正確に見積もることができるのでしょうか?これは、私たちが物事の簡単さと複雑さを判断するために使う方法に関係しています。私たちの脳には、これを行うための既成のパターンがいくつかあり、まず一つ目は速度に基づくものです。この場合、脳は毎秒演奏されるものを識別します。毎秒どれだけのものが演奏されるかに基づいて、曲の複雑さを直感的に判断するのは簡単です。ギターで曲を演奏することは物理的なプロセスであり、感覚的な活動であるため、私たちの脳はそれに基づいて速度を推測し、それを複雑さに変換しやすいのです。
私たちにはもう一つ、生まれつきの推測基準があります。それは体積です。テントとアパートの建物を並べて比較してみてください。建築学を学んだことがない人でも、通常、テントの設計と建設はアパートの設計と建設よりも簡単だと言えるでしょう。なぜなら、私たちは生まれつき物理的な体積を物事の複雑さの指標として使うからです。
もちろん、上で述べた二つの論理的分析が常に100%有効であるとは限りません。しかし、ほとんどの場合、人々はこの方法でうまくやっています。ほとんどの場合、物理的なプロセスを評価するとき、私たちの脳は物理的な物事を効果的に関連付けることができ、以前の経験に頼る必要はありません。
さて、ソフトウェアについて話しましょう。技術がわからない人がソフトウェア開発の時間を見積もろうとするとき、二つの非常に基本的な直感的指標が彼らを助けています。それは、体積を指標とする複雑さと、速度を指標とする複雑さです。しかし、彼らはソフトウェアが自分たちの想像とは異なることに気づいていません。ソフトウェアは本質的に有形の物質ではありません。体積も速度もありません。そのごく小さな構成要素が、時折コンピュータの画面にちらつくことがあるだけです。そのため、Webアプリケーション(またはあらゆる種類のソフトウェア)の開発に直面すると、私たちの基本的な直感は機能しなくなります。
まず第一に、速度は、素人がソフトウェアを評価するために使えるはずがありません。そして当然のことながら、彼らは体積の指標を使って評価しようとします。それは、仕様書のページ数か、ソフトウェアの機能ユースケース数か、機能数に基づいています。
時には、この評価方法は確かに有効です!特別なデザイン要件がない静的ウェブサイトであれば、素人でもこの方法で開発時間を簡単に見積もることができます。しかし、通常、ソフトウェア開発において、体積は複雑さを実際に効果的に反映するわけではありません。
残念ながら、ソフトウェアの複雑さを推測する唯一の有効な方法は経験に基づくことです。しかも、それはいつもうまくいくわけでもありません。プログラマーとして、私にはわかっています。以前に開発した類似の機能に基づいて、現在の各機能がそれぞれどれだけの開発時間を要するかを見積もれます。それから合計時間を足し合わせれば、プロジェクト全体を完了するのに必要な大まかな時間が得られます。しかし実際には、どのプロジェクトも開発中に二、三のボトルネックに遭遇します。これらのボトルネックは、プログラマーの大量の時間を気ままに消費し、それに遭遇するまでまったく予見できません。それらはプロジェクト全体を足止めし、納期を数週間、場合によっては数か月遅らせることがあります。
これらは、経験のない人が複雑さを評価するときに理解できないことです。彼らは、他のことではうまくいく方法が、ソフトウェア開発ではなぜうまくいかないのかを理解していません。ですから、次に誰かが「あなたなら数日でそれを開発できるでしょう」と言うのを聞いたら、それが誰であっても、腹を立てないでください。深呼吸して、その人にこの記事のURLを伝え、自分はやるべきことを続ければいいのです。