ソフトウェア開発とは、特定のユーザーのニーズやビジネス目標を満たすために、ソフトウェアアプリケーションを設計、作成、テスト、保守するプロセスです。このプロセスは、プログラミングやコードの記述よりも包括的で、目標の構想、実現可能性の評価、要件の分析、設計、テスト、リリースが含まれます。このプロセスは、組織管理、プロジェクト管理、構成管理などの側面も含むソフトウェアエンジニアリングの一部です。 [ 1 ]
ソフトウェア開発には、プログラミング、テスト、ドキュメンテーション、グラフィックデザイン、ユーザーサポート、マーケティング、資金調達など、多くのスキルと専門分野が関わっています。一般的なツールとしては、コンパイラ、統合開発環境(IDE)、バージョン管理などがあります。
開発作業に用いられるプロセスの詳細は様々です。プロセスは、正式に文書化された標準に準拠する場合もあれば、開発作業に合わせてカスタマイズされ、その場で発生する場合もあります。プロセスは、各主要フェーズ(設計、実装、テストなど)が完了するまで次のフェーズを開始しないシーケンシャルなアプローチである場合もありますが、小さな側面を個別に設計、実装、テストする反復的なアプローチを採用することで、リスクとコストを削減し、品質を向上させることができます。

利用可能な各手法は、さまざまな技術的、組織的、プロジェクト、およびチームの考慮事項に基づいて、特定の種類のプロジェクトに最適です。[ 3 ]
多くのプログラミング手法におけるもう一つの焦点は、セキュリティ脆弱性やバグなどの問題をできるだけ早い段階で発見し(シフトレフトテスト)、それらを追跡および修正するコストを削減するという考え方である。[ 13 ]
2009年には、ソフトウェアプロジェクトの32%が納期と予算内で完全な機能を備えて納品されたと推定された。さらに44%は納品されたものの、少なくとも1つの機能が欠けていた。残りの24%はリリース前にキャンセルされた。[ 14 ]
ソフトウェア開発ライフサイクルは、ソフトウェア開発プロセスの典型的な段階を説明するものです。[ 15 ]
ソフトウェア製品のアイデアの源泉は豊富です。これらのアイデアは、潜在的な新規顧客、既存顧客、製品を拒否した見込み客の人口統計、他の社内ソフトウェア開発スタッフ、または創造的な第三者など、市場調査から得られる可能性があります。ソフトウェア製品のアイデアは通常、まずマーケティング担当者によって、経済的実現可能性、既存の流通チャネルとの適合性、既存の製品ラインへの影響、必要な機能、および会社のマーケティング目標との適合性について評価されます。マーケティング評価フェーズでは、コストと時間の想定が評価されます。[ 16 ]実現可能性分析では、プロジェクトの投資収益率、開発コスト、および期間が推定されます。この分析に基づいて、会社はさらなる開発に投資するというビジネス上の決定を下すことができます。[ 17 ]ソフトウェアの開発を決定した後、会社は、推定コストと時間以下で、高い品質基準(つまり、バグがない)と望ましい機能を備えた製品を提供することに注力します。しかし、ほとんどのソフトウェアプロジェクトは遅延し、締め切りに間に合わせるために機能や品質で妥協が行われることがあります。[ 18 ]
ソフトウェア分析は、ソフトウェアのビジネスニーズを把握するための要件分析から始まります。 [ 19 ]ニーズの特定における課題は、現在または将来のユーザーが異なる互換性のないニーズを持っている可能性があり、自身のニーズを理解していない可能性があり、ソフトウェア開発の過程でニーズが変わる可能性があることです。[ 20 ]最終的に、分析の結果は、開発者が作業できる製品の詳細な仕様となります。ソフトウェアアナリストは、コスト効率、効率性、信頼性を高めるために再利用できる、より小さなオブジェクトやコンポーネントにプロジェクトを分解することがよくあります。 [ 19 ]プロジェクトを分解することで、マルチプロセッサコンピュータで大幅に高速に動作するマルチスレッド実装が可能になる場合があります。 [ 21 ]
ソフトウェア開発の分析および設計フェーズでは、構造化分析が、顧客の要求をソフトウェアプログラマが実装できる部分に分解するためによく使用されます。[ 22 ]プログラムの基盤となるロジックは、データフロー図、データ辞書、擬似コード、状態遷移図、および/またはエンティティ関係図で表現できます。[ 23 ]プロジェクトにモデル化されていないレガシーソフトウェアが組み込まれている場合、このソフトウェアをモデル化して、新しいソフトウェアと正しく統合されるようにすることができます。[ 24 ]
設計には、どのプログラミング言語やデータベース ソフトウェアを使用するか、ハードウェアやネットワーク通信をどのように構成するかなど、ソフトウェアの実装に関する選択が含まれます。設計は、試行錯誤のプロセスでユーザーのニーズについて相談しながら反復的に行われる場合があります。設計には、データベース設計、画面アーキテクチャ、サーバーやその他のハードウェアのパフォーマンスなどの側面に精通した人々が関わることがよくあります。 [ 19 ]設計者は、オブジェクト指向プログラミングで再利用できる個別のモジュールを派生させるために、ソフトウェアの機能にパターンを見つけようとすることがよくあります。その例として、グラフィカル ユーザー インターフェイスとバックエンド間のインターフェイスであるモデル ビュー コントロール (MVC)があります。[ 25 ]
ソフトウェア開発の中心となるのは、望ましい機能を実装するソフトウェアを作成し、理解することです。[ 26 ]コードの記述にはさまざまな戦略があります。凝集性の高いソフトウェアは、互いに独立したさまざまなコンポーネントで構成されています。[ 19 ]結合は、異なるソフトウェアコンポーネント間の相互関係であり、保守の難易度を高めるため、望ましくないと考えられています。[ 27 ]ソフトウェアプログラマーは、業界のベストプラクティスに従わないことが多く、その結果、非効率的で理解しにくく、機能に関するドキュメントが不足しているコードになります。[ 28 ]これらの標準は、締め切りが迫っている状況では特に破綻しやすくなります。[ 29 ]その結果、コードのテスト、デバッグ、および修正がはるかに困難になります。コードのリファクタリングは、外部動作を変更せずに既存のコードを再構築する手法であり、多くの場合、設計、可読性、または保守性を向上させることを目的としています。[ 30 ]
大規模言語モデルの普及以来、AI支援ソフトウェア開発は、 AIに構文を処理させ、コードを書かせることで人間のプログラミングを補強するために使用されてきた。[ 31 ]

テストとは、コードが正しくエラーなく実行されることを保証するプロセスです。デバッグは、各ソフトウェア開発者が自分のコードに対して実行し、コードが意図したとおりに動作することを確認します。特に、結果が間違っていても、ソフトウェアがすべての入力に対して実行されることが重要です。[ 32 ]他の開発者によるコードレビューは、プロジェクトに追加された新しいコードを精査するためによく使用され、一部の推定によると、テスト完了後に残るバグの数を劇的に減らします。[ 33 ]コードが提出されると、品質保証(ほとんどの大企業ではプログラマー以外の独立した部門)がソフトウェア製品全体の正確性をテストします。テスト活動は、使用する方法論に応じて、ソフトウェア開発ライフサイクル全体にわたって行われることもあります。[ 34 ]元のソフトウェア要件から派生した受け入れテストは、このための一般的なツールです。[ 32 ]品質テストには、ストレスおよび負荷チェック(ソフトウェアが大量の入力や使用に対して堅牢かどうか)、統合テスト(ソフトウェアが他のソフトウェアと適切に統合されていることを確認するため)、および互換性テスト(異なるオペレーティングシステムやブラウザ間でのソフトウェアのパフォーマンスを測定する)も含まれることが多い。[ 32 ]コードの前にテストを作成する場合、これはテスト駆動開発と呼ばれる。[ 35 ]
生産とは、ソフトウェアがエンドユーザーに展開される段階です。[ 36 ]生産中、開発者はユーザー向けの技術サポートリソース[ 37 ] [ 36 ]や、以前には検出されなかったバグやエラーを修正するプロセスを作成する場合があります。ユーザーのニーズが変わったり、誤解されたりした場合は、以前の開発段階に戻る可能性もある。[ 36 ]

ソフトウェア開発は、通常チームで働くソフトウェア開発者によって行われます。チームメンバー間の効率的なコミュニケーションは成功に不可欠です。これは、チームが小規模で、一緒に働くことに慣れており、互いに近い場所にいる場合に、より容易に達成できます。 [ 38 ]コミュニケーションは、開発の初期段階で問題を特定し、重複した作業を回避するのにも役立ちます。多くの開発プロジェクトでは、複数の作業者が各コンポーネントに精通していることを確認することで、1人の従業員だけが持つ重要な知識を失うリスクを回避しています。[ 39 ]ソフトウェア開発には、ソフトウェアプログラマーだけでなく、製品の戦略とロードマップを設定するプロダクトマネージャー、 [ 40 ]テスト、ドキュメント作成、グラフィックデザイン、ユーザーサポート、マーケティング、資金調達を専門とする個人など、さまざまな分野の専門家が関わっています。プロプライエタリソフトウェアの作業者は報酬を受け取りますが、オープンソースソフトウェアの貢献者のほとんどはボランティアです。[ 41 ]あるいは、ソフトウェアの販売ではなく、サービスやオープンソースソフトウェアの変更など、別のビジネスモデルを持つ企業から報酬を受け取る場合もあります。 [ 42 ]
コンピュータ支援ソフトウェアエンジニアリング(CASE)は、ソフトウェア開発の部分的な自動化のためのツールです。 [ 43 ] CASEを使用すると、設計者は、これから作成するプログラム、または既に存在するプログラムのロジックをスケッチして、新しいコードとの統合やリバースエンジニアリング(たとえば、プログラミング言語を変更するため)に役立てることができます。[ 44 ]
ドキュメントは通常、ソフトウェア開発者向けのものと、エンドユーザーがソフトウェアを使用する際に役立つように提供されるものの 2 つの形式で別々に管理されます。[ 45 ] [ 46 ]ほとんどの開発者向けドキュメントは、アプリケーション プログラミング インターフェイス(API) (他のソフトウェアからソフトウェアにアクセスする方法) と実装の詳細を網羅する、各ファイル、クラス、メソッドのコード コメントの形式です。[ 47 ]このドキュメントは、新しい開発者がプロジェクトに取り組み始める際に、プロジェクトを理解するのに役立ちます。[ 48 ]アジャイル開発では、ドキュメントはコードと同時に作成されることがよくあります。[ 49 ]ユーザー向けドキュメントは、テクニカル ライターによって作成されることが多いです。[ 50 ]
正確な見積もりは、実現可能性の段階と、製品を納期と予算内で納品する上で非常に重要です。見積もり作成プロセスは、多くの場合、プロジェクトマネージャーに委任されます。[ 51 ]工数見積もりはアプリケーション全体の規模に直接関係するため、要件に機能を追加すると大きく影響を受けます。要件が多いほど、開発コストは高くなります。ソフトウェア開発者の経験やコードの再利用性など、機能とは関係のない側面も、見積もりにおいて考慮する必要があります。[ 52 ] 2019年現在ソフトウェア開発に必要な時間とリソースを見積もるためのツールのほとんどは、従来型のアプリケーション向けに設計されており、Webアプリケーションやモバイルアプリケーションには適用できません。[ 53 ]

統合開発環境(IDE)は、単純なテキストエディタと比較して、強化された機能でソフトウェア開発をサポートします。[ 54 ] IDEには、自動コンパイル、構文エラーの強調表示、 [ 55 ]デバッグ支援、[ 56 ]バージョン管理との統合、テストの半自動化などが含まれることがよくあります。[ 54 ]
バージョン管理は、ソフトウェアに加えられた変更を管理する一般的な方法です。新しいバージョンがチェックインされるたびに、ソフトウェアは変更されたすべてのファイルのバックアップを保存します。複数のプログラマーが同時にソフトウェアを作業している場合、ソフトウェアはコードの変更のマージを管理します。ソフトウェアは、2つの変更セット間に競合がある場合を強調表示し、プログラマーが競合を修正できるようにします。[ 57 ]

ビューモデルとは、ソフトウェア開発プロセスで使用される、システムとその環境に関する視点を提供するフレームワークです。これは、ビューの根底にある意味論をグラフィカルに表現したものです。
ビューポイントとビューの目的は、人間のエンジニアが非常に複雑なシステムを理解し、専門分野を中心に問題の要素を整理できるようにすることです。物理的に負荷の高いシステムのエンジニアリングでは、ビューポイントは多くの場合、エンジニアリング組織内の能力と責任に対応します。[ 58 ]
適合性機能は、新しい開発が確立された制約、チェック、およびコンプライアンス管理から逸脱しないことを保証するための自動化された客観的なテストです。[ 59 ]
開発者がオープンソースのコードやライブラリを独自の製品に統合する場合、知的財産権が問題となることがあります。これは、ソフトウェアに使用されるほとんどのオープンソースライセンスでは、変更を同じライセンスの下でリリースする必要があるためです。代替案として、開発者は独自の代替手段を選択するか、独自のソフトウェアモジュールを作成することができます。[ 60 ]