開発の概要

更新日: 2011 年 7 月 1 日


最新のソフトウェアは一般に、相互に対話してアプリケーションの実装に必要なタスクを実行する一連のコンポーネントで構成されています。開発では、利用可能な多くの言語のうちの 1 つの言語でソース コードを作成して、これらのコンポーネントを作成します。このコードでは、アプリケーションの設計で指定された最終的な結果を達成するためにコンピューターによって実行される、基本となる個別の操作を定義します。これらの操作は、足し算をする、コンポーネント内のオブジェクトの値を設定する、コードに定義された変数の値の比較に基づいてコードの異なる部分を実行するなどの単純なものでもかまいません。また、コード内でより複雑な数学的計算を行ったり、ロジック操作を適用して必要な結果を生成する場合もあります。開発でのその他の作業には、コードのデバッグによるエラーの特定と修正、定式化された方法論を使用した作業の追跡、共有コード リポジトリの操作、および設計会議、計画会議、フィードバック会議、コード レビュー会議への参加があります。

ここでは、ソフトウェア開発ライフサイクルの観点から開発タスクについて説明します。開発の役割、大まかな目標、実行する手順について理解するのに役立ちます。図 1 に、典型的なソフトウェア開発ライフサイクルの概要を示します。

ソフトウェア開発ライフサイクル

図 1. ソフトウェア開発ライフサイクル

ソフトウェアの作成プロセスには、元の設計から最終的な配置や顧客の受け入れまで、広範なタスクが含まれます。開発での主な作業は、Microsoft Visual Studio などのツールや Visual Basic、C#、JavaScript などの言語を使用して元の設計を動作するコードに変換することです。しかし、個人や少人数のチームでの作業では特に (この場合、開発、テスト、設計を組み合わせて作業することがよくあります)、ソフトウェア開発ライフサイクル全体を通じて概して複雑な事態が生じます。次のセクションでは、ソフトウェア ライフサイクル内の主な開発作業について説明します。

顧客の情報提供とプロジェクトの目標をレビューする

ソフトウェア アプリケーション作成の最初の作業は、情報を入手し、顧客の要件に基づいて概略的な設計を作成することです。概略的な設計から具体的で技術的なドキュメントが作成されるにつれ、ハードウェアの機能や設計の実際的な実装に関するフィードバックを得るために、技術的な実装に関する情報の提供が必要になります。これにより、後から驚くような事態が生じるのを防ぎ、利用可能なハードウェアとインフラストラクチャを使用して妥当な期間内にソフトウェアの最終的な設計を実装できるようになります。

コンポーネントのコードを作成する

これは開発の中心作業であり、ソフトウェア作成プロセス全体を前進させる作業です。コードの作成者は、アプリケーションのコンポーネントやセクションが実行する必要のある操作、生成する必要のある結果、アプリケーションの他の部分と対話する方法が記述された仕様や要件一覧を使用します。この仕様は、標準のモデリング言語で作成されたモデル、機能説明、ホワイトボードの図など、多くの異なる形式のいずれかで記述されます。

開発では、選択されたプログラミング言語の関数を使用して、コンピューターが実行する一連の必要な命令を含むソース コード ファイルを作成します。基本的に、このコードは一連の入力値を受け取り、これらの値を操作し、結果を出力します。これを行う際は、ソフトウェアの他のコンポーネントや関数を使用したり、チームで作成された、またはサード パーティ サプライヤーから入手したコードや関数のライブラリを使用する場合もあります。Microsoft Visual Studio (図 2) などの開発ツールや開発環境は、オブジェクトや変数の名前を表示したり、コンパイルが成功するように構文をチェックしたり、エラーを表示するなど、コードを簡単に作成するのに便利です。

Visual Studio 2010 開発環境

図 2. Microsoft Visual Studio 2010 開発環境

チーム メンバーとのコード レビュー

開発者が作成するコード セクションに正しい解決策が 1 つしかないということはほとんどありません。開発者のスキルはコード言語の機能を使用して必要なタスクを実行するコードを作成する点にあり、これを実行する多くのさまざまな方法が存在する場合があります。さまざまな開発者が若干異なるアプローチや異なるコード命令の組み合わせを使用する場合があります。

同僚や管理者と行うコード レビューには 2 つの重要な目的があります。まず、他のアプローチを提示したり、気付きにくいエラーを指摘したり、コードの改良の余地を提案できる複数の開発者の見解や意見をまとめます。これは、コードの効率性やパフォーマンスの最適化に役立ちます。2 つ目に、専門知識を共有することでチーム メンバー全員の知識を深めるのに役立ちます。これは、チーム全体の業績を継続的に向上させます。

コードのコンパイルとテストを行う

使用するコード言語に応じて、開発作業ではソース コードをコンパイルしてコンピューターで実行可能な形式に変換します。通常、コンパイルは開発ツールや開発環境によって実行されます。チーム メンバー (一般に最初の作成者、次にテスト担当者) はコードを実行し、予期したとおりに動作することを確認します。チームがテスト駆動型設計 (TDD) アプローチを採用している場合、チーム メンバーはコードが正しく実行され、必要な結果が生成されることの確認作業で実行できる単体テストを前もって作成しておきます。

コードのコンパイル、実行、テストは、コードの作成の進行に応じて行われる反復プロセスです。一般的には、概念を試す基本的な最小のコードをまず作成し、コンパイルと実行を行ってから、正しい結果が生成されることを確認しつつ、徐々にコードを追加または更新してパフォーマンスや効率性を最大化します。

コード リポジトリのチェックインと更新を行う

ほとんどの中規模から大規模プロジェクトではコード、ドキュメント、プロジェクト関連情報を格納する Team Foundation Server (TFS) などのチーム情報およびコード リポジトリ システムを使用します。開発者が自身の作成したコードをチェックインすると、コードはプロジェクト全体の一部になり、定期的なビルドで完全なソリューションにコンパイルできます。一般にこのビルドは毎日実行され、テスト チームは毎日新しいビルドを使用して既存の報告済みエラーが解決されていることを確認し、新しいエラーを特定します。

リポジトリには通常、作業項目とレポートが含まれます。開発者は作成したコードに関連する作業項目を更新し、解決済みエラーの作業項目にマークを付け、テスト チームやドキュメント チームを含む他のチーム メンバーに役立つタスク関連のその他の情報を追加します。チームはそれらの作業項目に基づいてレポートを実行し、プロジェクトの進行状況を監視し、未解決の問題を検出できます。図 3 に、Microsoft Visual Studio Team Foundation Server を示します。

Team Foundation Server のコードや作業項目のレポート 

図 3. Microsoft Team Foundation Server のコードや作業項目のレポート

変更を実装し、エラーのデバッグと修正を行う

コードのテスト結果でエラーが報告された場合、開発者はそれらのエラーの原因を戻って突き止め、コードを変更してエラーを解決する必要があります。デバッグはエラーの原因を突き止める作業ですが、この原因はテストで検出された箇所で表面化しただけであり、コード内のあらゆる場所に潜んでいる可能性があります。特にエラーが断続的にしか発生しない場合や再現が困難な場合は、論理的な手法のほかに経験が必要とされるため、デバッグは時に "黒魔術" と考えられることもあります。

しかし、Visual Studio などの最新のツールや開発環境にはチーム メンバーがコードをステップ実行して変数の値を調べ、値の変化を監視できる機能が用意されています。このため、より論理的なプロセスでエラーをかなり簡単に特定できるようになります。実行中のコード プロシージャのリストや、それらがコンピューター プロセッサで処理される方法を提供するその他の機能やツールは、エラーの特定に役立ちます。また、実行されるコードを監視し、エラーの特定に役立つインストルメンテーション (ログ ファイルにイベントを書き込むコードなど) を追加することもできます。

受け入れテストの際は、正確な要件に合わせてソフトウェアを微調整するために、顧客がアプリケーションの機能変更を要求することも少なくありません。開発者は通常、要件のレビューやそれらの変更がソフトウェアの残りの部分に与える可能性のある影響に関する詳細な調査に基づいて、これらの変更を実装します。元の設計が各コンポーネントの役割を適切に分割する優れた設計であれば、アプリケーションの他の部分に影響を与えずにより簡単に変更を実装できます。

ソフトウェア開発ライフサイクルは反復プロセスであり、説明した作業の多くは開発が進むにつれて繰り返し行われます。たとえば、開発の際にチームは一部が完成したバージョンのソフトウェアやコンポーネントを複数作成し、テスト結果と顧客のフィードバックに基づいて改善または変更を加える場合があります。

チームの一員として作業する

個人または少人数のグループで作業する開発者もいれば、大規模なチームで作業する開発者もいます。個人または少人数のチームの開発者は、設計、テスト、配置、および保守を含む開発ライフサイクルのすべての作業を担当する場合があります。大規模なチームでは通常、個別のグループが設計、テスト、配置、および保守を担当し、開発者はコードを作成する主な作業に専念します。

開発ライフサイクルや開発プロセスを管理および監視するため、大規模チームは通常は構造化された方法で運営されます。チームのソフトウェア開発を管理する方法はさまざまです。事前に計画された相互に依存するタスクに基づく従来の設計駆動型サイクル ("ウォーターフォール" アプローチ) や、定期的な顧客の情報提供に基づいて計画と開発作業を並行して行う、よりフィードバック指向の方法 ("アジャイル" アプローチ) があります。図 4 に、ソフトウェア開発のこれらの主な 2 つの手法を示します。

"ウォーターフォール" と "アジャイル" 開発プロセス 

図 4. "ウォーターフォール" と "アジャイル" 開発プロセスの比較

採用する開発手法に関係なく、チーム メンバーとプロジェクト管理者の間の十分なコミュニケーションは不可欠です。多くのチームが 1 つの場所に配置される一方で、あらゆる地域のメンバーがチームに参加する機会がますます増え、電話会議やビデオ会議が利用されます。開発者、ソフトウェア設計者 (アーキテクト)、テスト担当者、プロジェクト管理部門を含むチーム全員が参加する定例会議では、進捗を報告し、活動を計画し、他のチーム メンバーや顧客の意見を聞きます。これにより、開発者はソフトウェア設計の必然的な進化について理解し、ソフトウェアの実装に影響を与える可能性のある定期的なフィードバックに基づいて行動することができます。

まとめ

困難な課題が大いに報われるのであれば、ソフトウェア開発は興味深い作業です。論理的な精神と体系化されたアプローチが要求され、コード言語の習得に直接関係のない多くの作業を伴います。常に、新しく習得する課題、調査する必要のある新しい要件、体験する新しいテクノロジが待ち受けています。最終的なソフトウェア アプリケーションが動作し、チームの一員としてこの目標を達成したときの喜びによって苦労が報われます。現在の世界を作り上げているのはソフトウェアであり、ソフトウェアの作成者は将来に対する影響力を持っています。

ページのトップへ