ソフトウェア開発における設計
ソフトウェア業界全体が「ソフトウェア設計の開発」と「ソフトウェア設計」の本質の違いに関する微妙な点を見逃している ソフトウェア業界はハードウェア エンジニアリングとの誤った類似点を作り出し、完全に有効な類似点を見落としている
コードをソフトウェア設計と見なすことで、他のすべてを圧倒する事実ある
50-100行のコードを2日で書けるとして、このコードが実行できる処理はとても複雑な内容でありうる
ソフトウェアのような複雑なものをこれだけの短時間で設計できるのはほかのエンジニアリング分野ではみられない 同時に、ソフトウェアの複雑性が短期間で膨れ上がる原因でもある ソフトウェア設計を困難でエラーが発生しやすいプロセスにする要因 複雑性は、ソフトウェア設計自体、会社のソフトウェア組織、そして業界全体に存在する
ソフトウェア仕様は流動的である傾向があり、通常は設計プロセスが進行中に、急速かつ頻繁に変更される
ソフトウェアはハードウェアよりも、複雑な社会的または有機的なシステムに似ている
ハードウェアエンジニアは、設計の検証と改良にかなりの時間を費やす
橋の設計を考えてみましょう。このような設計が実際に建設される前に、エンジニアは構造解析を行い、コンピューター モデルを構築してシミュレーションを実行し、スケール モデルを構築して風洞などでテストします。つまり、設計者は、設計が実際に建設される前に、考えられる限りのことをすべて行って、設計が適切であることを確認します。新しい旅客機の設計はさらに悪く、設計予測を検証するために、実物大のプロトタイプを構築してテスト飛行を行う必要があります。
ソフトウェア設計はハードウェア設計と同じ厳密なエンジニアリングを経ないという見解を持つ人が多い
とはいえ、ソース コードを設計と見なすと、ソフトウェア設計者は実際に設計の検証と改良をかなり行っていることになる
ほとんどの人はテストとデバッグを本当の「エンジニアリング」とは考えていません。ソフトウェア業界では特にそうです。その理由は、実際のエンジニアリングの違いというよりも、ソフトウェア業界がコードを設計として受け入れることを拒否していることに関係しています。
テストは現在の設計を正しくすることだけでなく、設計を改良するプロセスの一部である
ハードウェアシステムでモデルを構築して感触を掴むのと同じ
ソフトウェアではそのようなモデルは作れないのでテストを利用する
ソフトウェア開発の大きな問題は、すべてが設計プロセスの一部であるということです。コーディングは設計であり、テストとデバッグは設計の一部であり、私たちが通常ソフトウェア設計と呼ぶものもやはり設計の一部です。ソフトウェアは構築コストは安くても、設計コストは信じられないほど高くなります。ソフトウェアは非常に複雑なため、さまざまな設計側面と、その結果生じる設計ビューが多数存在します。問題は、さまざまな側面がすべて相互に関連していることです
ソフトウェア設計のさまざまな側面の間には、重要性の階層はありません。最下位のモジュール レベルでの誤った設計は、最上位レベルでのミスと同じくらい致命的になる可能性があります。ソフトウェア設計はあらゆる面で完全かつ正確でなければなりません。そうでないと、その設計に基づいて構築されたすべてのソフトウェアにエラーが発生します。
ソフトウェア設計ドキュメントをコードの前ではなく後に書くと、はるかに正確なドキュメントが作成されるということを、すべてのプログラマーが知っています。その理由は明らかです。コードに反映された最終設計のみが、ビルド/テスト サイクル中に改良されるものです。このサイクル中に初期設計が変更されない確率は、プロジェクトのモジュール数とプログラマー数に反比例します。急速にゼロと区別がつかなくなります。
ソフトウェア エンジニアリングでは、すべてのレベルで優れた設計が絶対に必要です。特に、優れたトップ レベルの設計が必要です。初期の設計が優れているほど、詳細な設計が容易になります。設計者は役立つものはすべて使用する必要があります。構造図、Booch 図、状態表、PDL など、役立つものがあれば使用してください。ただし、これらのツールや表記法はソフトウェア設計ではないことを覚えておく必要があります。最終的には、実際のソフトウェア設計を作成する必要があり、それは何らかのプログラミング言語で作成されます。したがって、設計を導き出すときに、それをコーディングすることを恐れてはいけません。必要に応じて設計を改良する意欲を持つ必要があります。
言語に依存しない設計を後から別の人に翻訳してもらうよりも、元の設計者に元のコードを書かせた方がよい
設計という言葉には構造やアーキテクチャという意味と、その構造やアーキテクチャを事前に決めたものという意味があるのだけど、ここでは前者です。あと、よく言われるコーディングを伴わない事前作業としてのソフトウェア設計は、構造やアーキテクチャを決めきれておらず、その意味での「設計」になってないんじゃないかというのもありますね。大体は作ることを決める仕様決めの作業になってる。