プログラミング
「ソフトウェアエンジニアリング」はエンジニアリングではない
"Software Engineering" Is Not Engineering (web.archive.org)
要約
この記事は、ソフトウェア開発が従来の「エンジニアリング」とは異なり、客観的な評価基準が確立しにくい理由を論じています。物理的なエンジニアリングが物理法則に縛られるのに対し、ソフトウェアは数学のように内部的な一貫性さえあれば多様な「現実」を創造できるため、設計の優劣を客観的に判断することが困難であると主張しています。
全文翻訳
「コンピュータサイエンス」は科学ではなく、「ソフトウェアエンジニアリング」はエンジニアリングではない 更新日 2005年3月8日 私は多くの「ソフトウェアエンジニアリング」の議論に参加してきました、おそらく多すぎたのでしょう。「ソフトウェアを作る正しい方法」について強い意見があるのに、それらを客観的に比較して長年の議論を解決する簡単な方法がないのはフラストレーションです。私はその理由を熟考し、研究してきましたが、ようやく説明できるようになったと思います。もしソフトウェア分野が「科学」であるなら、科学的なプロセスが議論を解決するために利用可能であるはずです。しかし、それは失敗するように見えます。代わりに「科学」ではなく「エンジニアリング」であると示唆する人もいます。しかし、エンジニアリングは応用科学にすぎません。例えば、エンジニアリングでは、橋の設計は長期的には現実に対してテストされます。短期的でさえ、橋のモデルは現実をシミュレートする環境でテストできます。シミュレーションは現実への近道ですが、有用でありたいなら現実に基づいている必要があります。もし橋が最終的に失敗し、その失敗が建設や材料の欠陥でない場合、非難されるべきは橋のエンジニアリングです。エンジニアのモデルは、物理学と化学の法則に厳密に結びついている必要があります。エンジニアは、望むと望まざるとにかかわらず、法則と結婚しています。しかし、ソフトウェア設計では、ほとんどの場合、これらはありません。入力と出力がどのように見え、特定の操作が許容される最大時間を示す実行時制約など、要件はあります。しかし、これらの間の多くのことは、客観的な指標には捉えにくいものです。一般的に議論されているほとんどの技術やパラダイムは、通常、要件を満たすことができます。これは、それらが「チューリング完全」であり、基本的に十分な時間とリソースがあれば、明確に指定されたアルゴリズムを実装できる能力があるためです。結論として、必要な結果を達成することは区別要因ではありません。それらはすべてそれを実行できます。人工知能のような一部の専門分野では、答えが必ずしも「固定」されているわけではありません。その「答え」は、多かれ少なかれ連続的な尺度で判断されます。このような状況では、異なるアルゴリズムが比較され、結果がランク付けされます。例えば、知能テストのためのラットの迷路テストに似た指標を実行してパフォーマンスを評価できます。しかし、あるアルゴリズムが優れていると知られているからといって、それが「正しい」または唯一可能なアルゴリズムであるとは限りません。それは現時点では「知られている限り最良」かもしれませんが、それ以上の結論はあまり引けません。後述するように、私たちは自分が知らないことを知りません。議論されている一部のオプションは実行速度が遅いかもしれませんが、それは通常、議論の的となる点ではありません。誰かが、開発者の生産性の高さが遅い速度(またはより大きなマシンが必要なこと)を補うと主張するか、あるいは数十年後にはチップが十分に速くなるので問題にならないと主張するでしょう。開発者の生産性はおそらく測定可能な別の指標ですが、変数が多すぎるため、依然として捉えにくいです。生産性は重要な問題なので、後で戻ってきます。
物理的なエンジニアリングが本当に科学(より正確には「応用科学」)であるのに、ソフトウェア設計が同じパターンに従わない場合、ソフトウェア設計とは何でしょうか?おそらくそれは数学です。数学は本質的に物理世界に縛られていません。一部の人は、仮説的または現実の代替宇宙で有効ではない可能性があるため、それに縛られていると論争的に主張していますが、実用的な目的のためには、一般的に既知の物理学、自然、生物学などの法則から独立していると見なすことができます。数学の最も有用な点は、ほぼ無限のモデルを作成できることです。これらのモデルは、既知の(または期待される)自然法則、または数学者が突然作り出した法則を反映している場合があります。数学には、代替宇宙と代替現実を作成する魔法のような特性があります。唯一のルールは、これらのモデルが内部的な一貫性を持たなければならないということです。それらはそれ自身のルールと矛盾することはできません。(まあ、できるかもしれませんが、矛盾すると、常にクラッシュするプログラムのように、それらは一般的にあまり有用ではありません。)ソフトウェアは数学に非常に似ており、定義によっては数学であるかもしれません。ソフトウェアを使用して代替現実を作成できるという事実は、ゲームの世界に現れています。ゲームは、実際の現実をさまざまな程度で反映する仮想現実を作成することでエンターテイメントを提供しますが、希望して興味深い方法で現実を曲げます。人気のある例は「The Sims」で、これは単なる典型的な「アクション」ゲームに見られる物理的な動きだけでなく、社会における社会的相互作用をシミュレートするゲームです。ほとんどのゲームは、物理世界の側面や法則を借用する傾向があります。これは、ゲーム購入者が何らかの形で関連付けられるものを購入する可能性が高いからです。しかし、物理世界とはほとんど、あるいは全く関係のない世界を作成することも可能です。例えば、反重力が豊富にある世界を作成できます。物が上に落ちるでしょう。あるいは、時間が逆行したり、横に進んだり、他のタイムラインにぶつかったりする可能性があります。(知っています、私はスター・トレックを見すぎました、認めます。)私たちは通常、固定または静的であると仮定している社会的および経済的ルールを操作することもできます。研究者は、ダーウィンの自然選択説を実験するために、「遺伝的アルゴリズム」を使用して単純な人工生命体を進化させてさえいます。これには、人工の食物、人工のエネルギー、人工の性的および無性生殖などが含まれます。唯一の制限は、仮想世界の作成者の想像力(そしておそらくコンピューターリソースの厄介な制限)です。ルールを明確に定義できる限り、そのルールに従う宇宙を作成できます。彼らはルールをソフトウェアに組み込み、「実行」ボタンを押し、そして座って見守ります。もしあなたが神になろうとする衝動を持っているなら、ソフトウェアは現在、町で最高のゲームです。あなたの義理の親や赤ちゃんの兄弟とは異なり、コンピューターはあなたの支配の試みについて文句を言いません。このソフトウェアのほぼ無限の柔軟性が、客観的なソフトウェア設計評価がほぼ不可能である理由であると結論付けました。ソフトウェア内部には客観的な現実が存在しないのです。これがすべての議論の頭痛の種である秘密の原因です。私たちは精神病院にいる狂人の集まりで、自分たちのうち誰が本物のナポレオンか、あるいは最高のナポレオンかについて議論しているようなものです。違いは、サイバースペースでは私たち全員がナポレオンになれることです。一部の人は、客観的な指標がない理由はその分野について十分な知識がないためだと示唆しています。つまり、まだ方法や測定方法を学んでいないだけだと。しかし、問題は、私たちが「知っている」ものを製造できることです。今日はサンタクロース、明日はクレオパトラです。これは、ロールプレイングゲームのような文字通りの意味でも、ソフトウェア組織の原則のような比喩的な意味でも可能です。ソフトウェア設計には、正しい答えを提供するための多くの異なる設計パスがあります。しかし、同じ問題に多くの解決策がある場合、どれが「より良い」のでしょうか?一つの可能な答えは、「おそらく重要ではない」ということです。ソフトウェアが入力から正しい出力を生成する限り、それがどのように機能するかを気にする必要があるでしょうか?ブラックボックスが機能するなら、内部がどのように機能するかを心配する必要があるでしょうか?内部が重要である理由の一つは、異なるプログラマーが他の人が作成したソフトウェアコードを保守(修正または変更)しなければならないからです。私たちの神のたとえ話を使用すると、神が休暇を取ったり引退したりした場合、彼の後継者はそれを実行し続けるために世界がどのように機能するかを知る必要があります。本物の神は無限の理解力を持っているかもしれませんが、人間は組み込みの理解力の限界を持っています。何かがどのように機能するかを理解するには、時間とお金がかかります。したがって、ある人が別の人の仕事を容易にするような慣習があるのは良いことです。しかし、次の論理的なフォローアップの質問は、一部の慣習が本質的に「より良い」のかどうかということです。慣習だけではコミュニケーションに役立つかもしれませんが、すべての慣習は平等に作られているのでしょうか?これらの慣習は共同に関連しているため