
ソフトウェア(SW)は、コンピュータの実行を指示するコンピュータプログラムで構成されています。[ 1 ]ソフトウェアには、設計文書や仕様書も含まれます。
ソフトウェアの歴史は、20世紀半ばのデジタルコンピュータの発展と密接に結びついています。初期のプログラムは、ハードウェア固有の機械語で記述されていました。1958年に高級プログラミング言語が導入されたことで、より人間が読みやすい命令が可能になり、ソフトウェア開発が容易になり、さまざまなコンピュータアーキテクチャ間での移植性も向上しました。プログラミング言語で記述されたソフトウェアは、コンパイラまたはインタプリタを通して、アーキテクチャのハードウェア上で実行されます。ネットワーク、オペレーティングシステム、データベースの発展に伴い、ソフトウェアは時とともに複雑化してきました。
ソフトウェアは一般的に、大きく2つの種類に分類できます。
クラウドコンピューティングの台頭により、サービスとしてのソフトウェア(SaaS)という新しいソフトウェア配信モデルが登場しました。SaaSでは、アプリケーションはプロバイダーによってホストされ、インターネット経由でアクセスされます。
ソフトウェア開発プロセスは、いくつかの段階から構成されます。これらの段階には、ソフトウェア設計、プログラミング、テスト、リリース、保守が含まれます。ソフトウェアの品質保証とセキュリティは、ソフトウェア開発において非常に重要な側面です。バグやセキュリティ脆弱性は、システム障害やセキュリティ侵害につながる可能性があるからです。さらに、ソフトウェアライセンスや知的財産権といった法的問題も、ソフトウェア製品の流通において重要な役割を果たします。
コンピュータ プログラムを説明するために「ソフトウェア」という言葉を初めて使用したのは、 1958 年の数学者ジョン・ワイルダー・テューキーであるとされています。 [ 2 ] [ 3 ] [ 4 ] 1940 年代末に登場した最初のプログラム可能なコンピュータは、[ 5 ]機械語でプログラムされていました。機械語はデバッグが難しく、異なるコンピュータ間で移植できません。 [ 6 ]当初、ハードウェア リソースは人的リソースよりも高価でした。[ 7 ]プログラムが複雑になるにつれて、プログラマの生産性がボトルネックになりました。1958年に高水準プログラミング言語が導入されたことで、ハードウェアの詳細が隠蔽され、基盤となるアルゴリズムがコードで表現されるようになりました。[ 8 ] [ 9 ]初期の言語には、Fortran、Lisp、COBOLなどがあります。[ 9 ]

ソフトウェアには主に2種類あります。

ソフトウェアは、その展開方法によっても分類できます。従来のアプリケーションは、特定のバージョンのソフトウェアの永久ライセンスで購入され、ダウンロードされ、購入者のハードウェア上で実行されます。 [ 18 ]インターネットとクラウドコンピューティングの台頭により、サービスとしてのソフトウェア(SaaS)という新しいモデルが可能になりました。[ 19 ]このモデルでは、プロバイダーがソフトウェアをホストし(通常はレンタルされたインフラストラクチャまたはプラットフォーム上に構築されます)[ 20 ] 、多くの場合サブスクリプション料金と引き換えに、顧客にソフトウェアの使用を提供します。[ 18 ] 2023 年までに、通常はWeb アプリケーションを介して提供される SaaS 製品は、企業がアプリケーションを提供する主要な方法になりました。[ 21 ]

ソフトウェア企業は、高品質の製品を期限内に予算内で提供することを目指しています。課題の一つは、ソフトウェア開発の工数見積もりが不正確な場合が多いことです。[ 22 ]ソフトウェア開発は、プロジェクトの構想、実現可能性の評価、ビジネス要件の分析、ソフトウェア設計の作成から始まります。[ 23 ] [ 24 ]ほとんどのソフトウェアプロジェクトは、市販の既製品(COTS)またはオープンソースソフトウェアのいずれかの形で既存のソフトウェアを再利用または組み込むことで、開発を加速します。[ 25 ] [ 26 ]ソフトウェア品質保証は通常、他のエンジニアによる手動コードレビュー[ 27 ]と自動ソフトウェアテストの組み合わせです。時間の制約により、テストではソフトウェアの意図された機能のすべての側面を網羅できないため、開発者は多くの場合、最も重要な機能に焦点を当てます。[ 28 ]形式手法は、コードの正しさを証明するために、安全性が重要なシステムで使用されます。 [ 29 ]一方、ユーザー受け入れテストは、製品が顧客の期待を満たしていることを確認するのに役立ちます。[ 30 ]ソフトウェア開発手法にはさまざまな種類があり、すべてのステップを順番に完了するものから、並行モデルや反復モデルまで多岐にわたります。[ 31 ]ソフトウェア開発は、将来のユーザーから得られた要件に基づいて進められますが、保守は変更要求などのイベントに基づいて進められます。[ 32 ]
開発チームの時間や資金が尽きると、ソフトウェアは不完全な状態でリリースされることがよくあります。 [ 33 ]テストと品質保証にもかかわらず、事実上すべてのソフトウェアには、システムが意図どおりに動作しないバグが含まれています。リリース後のソフトウェア保守は、これらのバグが見つかったときに修正し、時間の経過とともに環境が変化するにつれてソフトウェアが動作し続けるようにするために必要です。[ 34 ]新機能はリリース後に追加されることがよくあります。時間の経過とともに、保守のレベルは徐々に制限され、製品が市場から撤退すると完全に停止されます。[ 35 ]ソフトウェアが古くなると、レガシーソフトウェアとして知られるようになり、修正方法を知っている人がいなくなっても、何十年も使用され続けることがあります。[ 36 ]製品のライフサイクル全体で、ソフトウェア保守は総開発コストの75%以上を占めると推定されています。[ 37 ] [ 38 ]
ソフトウェアプロジェクトを完了するには、ソフトウェアプログラマーだけでなく、テスト、ドキュメント作成、プロジェクト管理、グラフィックデザイン、ユーザーエクスペリエンス、ユーザーサポート、マーケティング、資金調達など、さまざまな専門知識が必要です。 [ 39 ] [ 40 ] [ 24 ]
ソフトウェアの品質は、明示された要件と顧客の期待の両方を満たすことと定義されます。[ 41 ]品質は、コードの正しい効率的な動作、再利用性と移植性、または変更の容易さを指す包括的な用語です。[ 42 ]通常、開発プロセスの後半で品質を追加しようとするよりも、最初から製品に品質を組み込む方が費用対効果が高いです。[ 43 ]高品質のコードは、信頼性が高く保守が容易であるため、サプライヤーと顧客の両方にとってライフサイクルコストを削減します。[ 44 ] [ 45 ]安全性が重要なシステムでのソフトウェア障害は、負傷や死亡を含む深刻な被害につながる可能性があります。[ 44 ]一部の推定では、品質の低いソフトウェアのコストは、売上の20~40%にも達する可能性があります。[ 46 ]開発者は完全に意図どおりに動作する製品を提供することを目標としていますが、事実上すべてのソフトウェアにはバグが含まれています。[ 47 ]
インターネットの台頭により、悪意のある攻撃者がリモートでサイバー攻撃を実行できるようになったため、コンピュータ セキュリティの必要性も大幅に増加しました。[ 48 ] [ 49 ]バグがセキュリティ リスクを生み出す場合、それは脆弱性と呼ばれます。[ 50 ] [ 51 ]ソフトウェア パッチは、特定された脆弱性を修正するためにリリースされることが多いですが、未知のままの脆弱性 (ゼロ デイ) やパッチが適用されていない脆弱性は、依然として悪用される可能性があります。[ 52 ]脆弱性は、悪意のある攻撃者によって悪用される可能性が異なり、 [ 50 ]実際のリスクは、脆弱性の性質と周辺システムの価値に依存します。[ 53 ]システムの可用性を損なうサービス拒否攻撃にのみ使用できる脆弱性もありますが、他の脆弱性では、攻撃者がユーザーに気づかれることなく独自のコード (マルウェアと呼ばれる)を注入して実行することができます。 [ 50 ]サイバー攻撃を阻止するためには、システム内のすべてのソフトウェアが外部からの攻撃に耐え、そこから回復するように設計されなければならない。[ 49 ]セキュリティを確保するための努力にもかかわらず、かなりの割合のコンピュータがマルウェアに感染している。[ 54 ]

プログラミング言語は、ソフトウェアを記述するフォーマットです。1950年代以降、数千もの異なるプログラミング言語が発明されてきました。数十年にわたって使用されているものもあれば、使われなくなったものもあります。[ 55 ]定義によっては、機械語(ハードウェアによって直接実装される正確な命令)とアセンブリ言語(機械語よりも人間が読みやすい代替手段で、そのステートメントは機械語に1対1で変換できる)をプログラミング言語として分類しています。[ 56 ]ソフトウェアを作成するために使用される高水準プログラミング言語で書かれたプログラムには、いくつかの主要な特徴があります。機械語の知識はプログラムを作成するために必要ではなく、他のコンピュータシステムに移植でき、機械語よりも簡潔で人間が読みやすいです。[ 57 ]それらは人間が読みやすく、かつコンピュータハードウェアの明確な命令に変換できる必要があります。[ 58 ]
高水準プログラミング言語の発明は、それらを自動的に機械語に変換するために必要なコンパイラの発明と同時期でした。 [ 59 ]ほとんどのプログラムは、実行に必要なすべてのリソースを含んでいないため、外部ライブラリに依存しています。コンパイラの機能の一部は、プログラムをハードウェアで実行できるようにこれらのファイルをリンクすることです。コンパイルされたプログラムはオブジェクトファイルとして保存でき、ローダー(オペレーティングシステムの一部)はこの保存されたファイルを取得して、コンピュータハードウェア上でプロセスとして実行できます。 [ 60 ]一部のプログラミング言語は、コンパイラの代わりにインタプリタを使用します。インタプリタは実行時にプログラムを機械語に変換するため、コンパイルされたプログラミング言語よりも10~100倍遅くなります。[ 61 ] [ 62 ]
ソフトウェアは、不完全であったりバグが含まれていることを承知の上でリリースされることが多い。購入者はそのような状態であることを承知の上で購入するため、ソフトウェア製品に対する責任は他の製品に比べて大幅に制限されるという法的制度が生まれている。 [ 63 ]

1970年代半ば以降、ソフトウェアとそのソースコードは著作権法によって保護されており、所有者にはコードをコピーする独占的な権利が与えられています。基礎となるアイデアやアルゴリズムは著作権法では保護されていませんが、企業秘密として扱われ、秘密保持契約などの方法で隠蔽されることがあります。[ 64 ]ソフトウェアの著作権は、多くの場合、ソフトウェアに資金を提供したり、ソフトウェアを作成した個人または企業が所有しています(ソフトウェアの作成に協力した従業員や請負業者との契約によって異なります)。[ 65 ]一部のソフトウェアはパブリックドメインにあり、使用、コピー、共有、変更できる人に制限はありません。注目すべき例としては、米国政府が作成したソフトウェアがあります。フリーソフトウェアやオープンソースソフトウェアも、いくつかの特定の条件付きで、自由に使用、共有、変更することができます。[ 65 ]一部のソフトウェアの使用は、著作権者が作成し、ユーザーに課す 契約(ソフトウェアライセンス)によって規定されています。プロプライエタリソフトウェアは通常、使用と共有を制限する制限付きライセンスの下で販売されます。[ 66 ]一部のフリーソフトウェアライセンスでは、改変版は同じライセンスの下でリリースされなければならないと規定されており、ソフトウェアが独占的な制限の下で販売または配布されることを防いでいる。[ 67 ]
特許は、発明者に新規の製品またはプロセスに対する独占的かつ期間限定のライセンスを与えます。[ 68 ]ソフトウェアが何を実現できるかについての考えは法律で保護されておらず、具体的な実装は著作権法で保護されています。一部の国では、主張された発明が物理世界に影響を与えることが、ソフトウェア特許が有効とみなされるための要件の一部となっている場合もあります。[ 69 ]ソフトウェア特許は歴史的に論争の的となってきました。1998年のState Street Bank & Trust Co. v. Signature Financial Group, Inc.事件以前は、ソフトウェア特許は米国では一般的に認められていませんでした。この事件で、最高裁判所はビジネスプロセスは特許を取得できると判断しました。[ 70 ]特許出願は複雑で費用がかかり、特許に関する訴訟は製品のコストを押し上げる可能性があります。[ 71 ]著作権とは異なり、特許は一般的に発行された管轄区域でのみ適用されます。[ 72 ]

エンジニアのケイパーズ・ジョーンズは、「コンピュータとソフトウェアは、教育、仕事、戦争、娯楽、医療、法律、その他すべての人間の生活のあらゆる側面に大きな変化をもたらしている」と書いています。[ 74 ]先進国では、日常生活に遍在するようになりました。[ 75 ]多くの場合、ソフトウェアは、家電製品やエレベーターなどの既存のテクノロジーの機能を拡張します。[ 76 ]ソフトウェアはまた、インターネット、ビデオゲーム、携帯電話、GPSなどのまったく新しいテクノロジーを生み出しました。[ 76 ] [ 77 ]電子メール、フォーラム、ブログ、マイクロブログ、ウィキ、ソーシャルメディアなどの新しいコミュニケーション方法は、インターネットによって可能になりました。[ 78 ]紙ベースの図書館をはるかに超える膨大な量の知識が、今では簡単なウェブ検索で入手できます。[ 77 ]ほとんどのクリエイティブ専門家は、コンピュータ支援設計、3Dモデリング、デジタル画像編集、コンピュータアニメーションなどのソフトウェアベースのツールに移行しました。[ 73 ]ほとんどすべての複雑なデバイスはソフトウェアによって制御されています。[ 77 ]
コンピュータの動作を制御するコンピュータプログラムのことである。