ソフトウェア工学

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

ソフトウェア工学(ソフトウェアこうがく、テンプレート:Lang-en)は、コンピュータソフトウェアの開発方法を考察の対象としており、しばしば情報工学の一分野としても扱われる。

概要

ソフトウェア工学はソフトウェアの開発・運用・保守に関して体系的・定量的にその応用を考察する分野である[1]

ソフトウェア工学には、設計法と生産法の二つに分類される領域がある。ソフトウェア設計法は、ソフトウェア構造を考察する領域であり、一般的にソフトウェア・アーキテクチャと呼称される。ソフトウェア生産法は、ソフトウェア開発工程を考察する領域であり、一般的にソフトウェア・プロセスと呼称される。これら二つの領域は利点と制約の面で相互関係がある。

ソフトウェア開発工程と呼ばれる技法や手順を含み、ソフトウェアの信頼性や保守性の向上を目的とする[2]。具体的には、高度かつ安全なコンピュータのソフトウェアを短期間で設計するための研究などを行なう。 難易度の高いコード行数が数百万以上になる大規模ソフトウェアの開発に焦点を当てることが多い[3]

software engineering という用語は Brian Randell が考案し、1968年の NATO Software Engineering Conference で F.L. Bauer が使ったことで一般に広まった[4]。 ソフトウェア工学には、要求分析ソフトウェア設計プログラミングソフトウェアテストソフトウェア保守といった作業に関する知識・ツール・手法が含まれる[5]。ソフトウェア工学に関連する学問分野として、計算機科学計算機工学経営管理論数学プロジェクトマネジメント (ソフトウェアプロジェクト管理) 、品質管理人間工学システム工学がある[6]

ソフトウェア工学では、通常、開発対象となるソフトウェアの開発を思いついた時点から、実際に動くソフトウェアが完成し、使用されるまでを、いくつかの工程に分けて考察する(ソフトウェア開発工程)。 これらの工程ごとに典型的な課題が存在し、課題に立ち向かう方法を明確にしようとする。 このため、ソフトウェア工学の対象は広範囲にわたる。

また、他分野とクロスオーバーしていたり、もしくはソフトウェア工学の1分野だったものが独立して別分野を形成したり(例:データベース設計)、別分野で培われた技術や概念がソフトウェア工学の対象となることもある(例:オブジェクト指向技術)。

ソフトウェア工学の曖昧性と論争

ソフトウェア工学の典型的な定義として、以下のようなものがある。

  • ソフトウェアの開発・運用・保守に体系的・学問的・定量的手法を応用する分野」[7]
  • 「ソフトウェア開発のあらゆる面を扱う工学分野」[8]
  • 「実際の機械上で機能する信頼性のあるソフトウェアを経済的に得るための確かな工学原則の確立と利用」[9]

ソフトウェア工学が工学であるかの議論

software engineering という英語の場合、必ずしも工学の一分野を指すわけではなく、以下のような用法もある。

  • 元々、プログラミングおよびシステム分析と呼ばれていた活動などを総称的に software engineering と呼ぶ[10]
  • プログラミングに必要とされる理論的側面を計算機科学と呼び、そうでないあらゆる面を software engineering と称する[11]
  • 「プログラミング」を単なる技巧や技能ではなく工学として扱うことを主張する用語であり、そのような指針を文書化したもので使われる[12]

software engineering は、ある種の学問的訓練、専門教育が必要であり、それにはソフトウェア開発には必ずしも使われないものも含まれるとする人もいる。よく言われる喩えとして、建築に携わる全ての人が建築学者ではないのと同様、ソースコードを書く人が常にソフトウェア工学者とは限らない。また、カナダの Professional Engineers Ontario という団体は、software engineering という呼称自体に反対している。すなわち、ソフトウェア開発は工学と呼ぶには未成熟で、それに携わる人々はプロのエンジニアとは呼べないという[13]

「ソフトウェア工学」を工学の一分野としてどう定義するかは、人によって異なり、論争が行われてきた。デイビッド・パーナスは、ソフトウェア工学は実際に工学の一形式であるとした[14][15]スティーブ・マコネル は工学ではないとしたが、工学へと進化すべきだと主張した[16]ドナルド・クヌースは、プログラミングは技であり科学だとした[17]エドガー・ダイクストラは、software engineeringsoftware engineer という用語が特にアメリカ合衆国で誤用されていると指摘した[18]

ソフトウェア工学は計算機科学であるかの議論

ソフトウェア工学が工学であるとした場合、ソフトウェア工学が計算機科学の一分野であるか、という命題も長年の議論の対象となっている。

ソフトウェア工学は計算機科学の一分野であると信じている者もいる。計算機科学が数理論理学計算複雑性理論などを含む計算全般を扱う学問であるのに対して、ソフトウェア工学はあくまで実用目的でコンピュータ処理を設計するものであり、異なる分野であると考えている者もいる。

ソフトウェア工学は計算機科学でない、という意見の中には、科学か否か以前に、ソフトウェア工学はそもそも工学としての性質すら全く持っていないという考えさえある。

デイビッド・パーナスは「私はソフトウェア工学を計算機科学の一分野としてではなく、土木工学、機械工学、化学工学、電気工学などなどの要素を組み合わせたものとして扱う」としている[19]

ソフトウェア開発方法論

ソフトウェア工学の成果は、ソフトウェア開発方法論にまとめられることがある。

対象物をどのように人間が把握し、設計し、プログラムとして実現するかという視点からは、ソフトウェア開発方法論には次のような分類がある。

開発プロジェクトをどのように運営するかに焦点を当てる場合は、特に「開発プロセスモデル」と呼び、以下の二種類に分類できる。ただし、以下の二種類は組み合わせて利用されることもある。

またオープンソースなどのプロジェクトにおいて、開発者の参加基準などの観点からは、以下の二種類に分類できると言われる(エリック・レイモンド伽藍とバザール』」) [20]

ソフトウェア開発工程

テンプレート:Main 開発工程は、開発着手から終了まで次のように分けられることが多い。ただし用語や詳細な定義は開発方法論ごとにさまざまである。

要求分析
着想したソフトウェアがどのような機能を持つべきかを検討し、必要に応じて文書化する。
設計
機能がソフトウェアとしてどのように実装されるべきかを検討し、必要に応じて仕様化する。
コーディング
仕様に従ってプログラムを作成する。
テスト
作成されたプログラムが機能的な要求を満たしていることを実証する。
運用保守
ソフトウェアを使用したり、新たな要求に応じて機能を追加・変更する。

プロセスモデルにおいては、開発工程をどのように定義・配置するかが各モデルを規定する重要な要素となる。例えばウォーターフォール・モデルでは、要求分析からテスト-運用までを順に、1度ずつ行うことを想定している。スパイラル・モデルでは開発期間を短く分け、短期間に各開発工程を行い、それを繰り返す。

アジャイルソフトウェア開発のいくつかの開発手法(エクストリーム・プログラミングなど)では、例えばコーディング前に(あるいは同時に)テスト用のコードを書き、コーディングはそのテストに通過することを目標にして行う(テスト駆動開発テストファースト)など、順序や各工程の意味づけを大きく変更している。

ソフトウェア開発の技術分類

ソフトウェア開発の技術はプロダクト・プロセス・プロジェクト管理に分類できる。

プロダクト
モデルの表現方法、ソフトウェアのアーキテクチャに関する技術。(ISO/IEC9126UML)などがある。
プロセス
管理工程・手順を定式化した開発技術。(CMM/CMMIISO9001SLCPIEEEソフトウェア規格)などがある。
プロジェクト管理(工程管理)
納期・品質・コスト管理技術・教育など。(ファンクションポイント法PMBOKISBOK)などがある。

主な研究分野

歴史

ソフトウェア工学はコンピュータと共に発展してきた。そのためのツールも書かれたアプリケーションも時と共に進化してきた。

1940年代、初期のコンピュータでは人間が直接機械語を打ち込んでいた。1949年のEDSACにおいて既に、ローダが初歩的なアセンブラの機能を備えていた[21]。その後アセンブリ言語が生まれ、1950年代中ごろには AutocodeFORTRANLISPといった初期の高級言語が生まれた。1960年代には第二世代のコンパイラなどが登場し、生産性や品質の向上に寄与した。60年代末には、大規模プロジェクトが行われるようになり(Future Systems プロジェクトなど)、ソフトウェア危機が叫ばれるようになる。1968年、NATO Conference on Software Engineering が開催された。1970年代になると、UNIX、コードリポジトリ、make などの協調的ソフトウェアツールが登場する。1980年代、パーソナルコンピュータが登場し、急速に広まり、市販ソフトウェアも大量に販売されるようになっていった。Smalltalk-80が公開され、オブジェクト指向が新たなパラダイムとして徐々に注目されていった。1990年代になると、オブジェクト指向プログラミングアジャイルソフトウェア開発エクストリーム・プログラミングが徐々に主流になっていった。2000年代になると、JavaRubyPythonPHP といったインタプリタベースの言語や .NET Frameworkマネージコード などが多用されるようになった。

ソフトウェア工学の最近の傾向

ソフトウェア工学はまだ若い分野であり、今も発展し続けている。最近のソフトウェア工学の重要な傾向を以下に示す。

アスペクト指向プログラミング
ソースコードの様々な場所に定型的コードを追加・削除するツールを提供することで、品質を高める支援をする。アスペクトには、あらゆるオブジェクトや関数が特定の状況でどう振舞うべきかを記述している。例えば、アスペクトを使って、特定の型の全オブジェクトにデバッグ機能、ロギング機能、ロック機能などを追加できる。現在は、アスペクトを使って汎用コードを設計する方法の研究が進んでいる。関連する概念として、自動プログラミングテンプレートがある。
アジャイルソフトウェア開発
目まぐるしく変化する市場に素早く対応できるソフトウェア開発の手法。この手法の信奉者は、従来型の文書を多用する手法は徐々に消えていくと信じている。関連する概念として、エクストリーム・プログラミングリーンソフトウェア開発がある。
実証的ソフトウェア工学
ソフトウェア上で実験を行うことを重視する分野。実際の,もしくは実験的なソフトウェア開発作業やその開発履歴からデータを収集および分析し、そこから法則や理論を導き出そうとする。この手法の信奉者は、実用的な知見を得るためには、現実に存在するソフトウェアやその開発作業に対して手法を適用しその結果を評価することが必要であると考えている。
モデル駆動工学
設計段階でテキストと図を使ったモデルを構築する。モデル変換やコード生成のツールを使って、モデルからコードの断片を抽出し、その後の開発に役立てる。
ソフトウェアプロダクトライン
一連のソフトウェア製品群を体系的に構築する手法。コードの再利用を発展させ、ソフトウェア開発工程を工業化しようとする試み。

脚注

テンプレート:Reflist

参考文献

  • テンプレート:Cite book
  • テンプレート:Cite book
  • テンプレート:Cite book
  • Carlo Ghezzi, Mehdi Jazayeri, Dino Mandrioli: Fundamentals of Software Engineering, 2nd (International) ed.: 2003 (1st ed.: 1991), Pearson Education @ Prentice-Hall
  • Colin Hood,Simon Wiedemann, Stefan Fichtinger, Urte Pautz Requirements Management: Interface Between Requirements Development and All Other Engineering Processes Springer, Berlin 2007, ISBN 354047689X

関連項目

外部リンク

テンプレート:ソフトウェア工学 テンプレート:テクノロジー

テンプレート:Software-stub
  1. “IEEE Standard Glossary of Software Engineering Terminology,” IEEE std 610.12-1990, 1990, quoted at the beginning of Chapter 1: Introduction to the guide テンプレート:Cite web
  2. テンプレート:Cite book
  3. テンプレート:Cite journal, "The 2.5 million lines of newly developed software were approximately six times more than any previous Boeing commercial airplane development program. Including commercial-off-the-shelf (COTS) and optional software, the total size is more than 4 million lines of code."
  4. テンプレート:Cite web
  5. Table 1 in Chapter 1,テンプレート:Cite web
  6. Table 2 in Chapter 1,テンプレート:Cite web
  7. “IEEE Standard Glossary of Software Engineering Terminology,” IEEE std 610.12-1990, 1990.
  8. テンプレート:Cite book
  9. テンプレート:Cite journal
  10. テンプレート:Cite web: "For some, software engineering is just a glorified name for programming. If you are a programmer, you might put 'software engineer' on your business card—never 'programmer' though."
  11. Mills, Harlan D., J. R. Newman, and C. B. Engle, Jr., "An Undergraduate Curriculum in Software Engineering," in テンプレート:Cite book, p. 26: "As a practical matter, we regard software engineering as the necessary preparation for the practicing, software development and maintenance professional. The Computer Scientist is preparing for further theoretical studies..."
  12. テンプレート:Cite web: "We believe that software engineering can only advance as an engineering discipline by moving away from its current dependence upon advocacy and analysis...."
  13. テンプレート:Citation
  14. テンプレート:Cite journal, p. 19: "Rather than treat software engineering as a subfield of computer science, I treat it as an element of the set, {Civil Engineering, Mechanical Engineering, Chemical Engineering, Electrical Engineering,....}."
  15. テンプレート:Cite journal, p. 20: "This paper argues that the introduction of accredited professional programmes in software engineering, programmes that are modelled on programmes in traditional engineering disciplines will help to increase both the quality and quantity of graduates who are well prepared, by their education, to develop trustworthy software products."
  16. テンプレート:Cite book, p. 39: "In my opinion, the answer to that question is clear: Professional software development should be engineering. Is it? No. But should it be? Unquestionably, yes. "
  17. テンプレート:Cite journal 1974年のチューリング賞講演
  18. テンプレート:Cite web
  19. テンプレート:Cite journal, p. 19
  20. ソースコードを非公開としているプロジェクトにおいては原理的に伽藍方式以外をとりえない。ソースコードを公開しているからこそ、見ず知らずの人達が思い思いの拡張をすることが出来るのである。
  21. EDSAC#システムソフトウェアを参照