ソフトウェアプロトタイピングとは、ソフトウェアアプリケーションのプロトタイプ、つまり開発中のソフトウェアプログラムの不完全なバージョンを作成する活動のことです。これはソフトウェア開発において行われる活動であり、機械工学や製造業など他の分野で知られているプロトタイピングに匹敵するものです。
プロトタイプは通常、最終製品のごく一部の側面のみをシミュレートするものであり、最終製品とは大きく異なる場合がある。
プロトタイピングにはいくつかの利点があります。ソフトウェア設計者と実装者は、プロジェクトの初期段階でユーザーから貴重なフィードバックを得ることができます。クライアントと請負業者は、作成されたソフトウェアが、ソフトウェアプログラムの構築基準となるソフトウェア仕様に合致しているかどうかを比較できます。また、ソフトウェアエンジニアは、初期プロジェクト見積もりの正確性や、提案された期限やマイルストーンを無事に達成できるかどうかについての洞察を得ることができます。プロトタイピングの完成度と使用される手法は、1970年代初頭に提案されて以来、開発と議論が続けられてきました。[ 1 ]
プロトタイプの目的は、ソフトウェアのユーザーが、説明に基づいて設計を解釈および評価するのではなく、実際に試用することによって、最終製品の設計に関する開発者の提案を評価できるようにすることです。ソフトウェアのプロトタイピングは、ソフトウェアの機能と潜在的な脅威または問題を理解するのに役立ちます。[ 2 ]プロトタイピングは、エンドユーザーが考慮されていない要件を説明し、証明するためにも使用でき、これは開発者とクライアント間の商業的関係における重要な要素となる可能性があります。[ 3 ]特にインタラクションデザインでは、この目的のためにプロトタイピングが多用されます。
このプロセスは、1960年代から1970年代にかけて主流だった、プログラム全体を最初に構築し、その後設計と実装の矛盾点を解消するというモノリシックな開発サイクルとは対照的です。モノリシックな開発サイクルは、ソフトウェアコストの高騰や、時間とコストの見積もりの不正確さを招きました。このモノリシックなアプローチは、「(ソフトウェア)ドラゴン退治」手法と呼ばれています。なぜなら、ソフトウェアの設計者と開発者が、たった一人でドラゴン全体を退治しなければならない英雄であると想定しているからです。プロトタイピングは、完成したソフトウェア製品を変更する際の多大な費用と困難を回避することにもつながります。
プロトタイピングの実践は、フレデリック・P・ブルックスが1975年の著書『人月の神話』と、その10周年記念記事「銀の弾丸はない」の中で指摘している点の1つである。
大規模ソフトウェアプロトタイピングの初期の例としては、 Ada プログラミング言語用の NYU の Ada/ED トランスレータの実装が挙げられます。[ 4 ]これは、Ada 言語の実行可能な意味モデルを作成することを目的としてSETLで実装され、速度や効率よりも設計とユーザー インターフェースの明確さが重視されました。NYU Ada/ED システムは、1983 年 4 月 11 日に認証された、最初の検証済み Ada 実装でした。[ 5 ]
プロトタイピングのプロセスは、以下の手順で構成されます。
ニールセンは著書『ユーザビリティ・エンジニアリング』の中で、プロトタイプの様々な側面を要約している。
ユーザーインターフェースのプロトタイプを表す一般的な用語は、水平プロトタイプです。これは、データベースアクセスなどの低レベルのシステム機能よりもユーザーインタラクションに焦点を当て、システム全体またはサブシステムの全体像を広く示します。水平プロトタイプは、次のような場合に役立ちます。
垂直プロトタイプとは、単一のサブシステムまたは機能を詳細に具体化した、より高度なプロトタイプです。特定の機能に関する詳細な要件を取得するのに役立ち、以下のような利点があります。
ソフトウェアのプロトタイピングには多くのバリエーションが存在する。しかし、それらの手法はすべて、使い捨てプロトタイピングと進化型プロトタイピングという2つの主要な形態に基づいている。
クローズドエンド型プロトタイピングとも呼ばれます。使い捨て型プロトタイピングまたはラピッドプロトタイピングとは、最終的に納品されるソフトウェアの一部となるのではなく、最終的に破棄されるモデルを作成することを指します。予備的な要件収集が完了した後、システムのシンプルな動作モデルが構築され、完成したシステムに要件が実装された際にどのようなものになるかをユーザーに視覚的に示すことができます。これもラピッドプロトタイピングの一種です。
使い捨てプロトタイプを使用する最も明白な理由は、迅速に実施できることです。ユーザーが要件について迅速なフィードバックを得られれば、ソフトウェア開発の初期段階で要件を洗練させることができる可能性があります。開発ライフサイクルの初期段階で変更を加えることは、やり直しがないため非常にコスト効率が良いです。プロジェクトがかなりの作業を完了した後に変更される場合、ソフトウェアシステムには多くの依存関係があるため、小さな変更でも実装に多大な労力が必要になる可能性があります。時間と予算が限られているため、使い捨てプロトタイプに費やす費用は少なく、スピードが使い捨てプロトタイプの実装において非常に重要です。
使い捨てプロトタイピングのもう一つの強みは、ユーザーがテストできるインターフェースを構築できることです。ユーザーインターフェースは、ユーザーがシステムとして認識するものであり、それを目の前にすることで、システムがどのように機能するかをはるかに容易に理解できます。
プロトタイプは、外観、操作性、タイミングの点で実際の製品にどれだけ忠実に似ているかによって分類できます。低忠実度の使い捨てプロトタイプを作成する方法の1つは、ペーパープロトタイピングです。このプロトタイプは紙と鉛筆を使用して実装されるため、実際の製品の機能を模倣しますが、見た目は全く似ていません。高忠実度の使い捨てプロトタイプを簡単に作成するもう1つの方法は、GUIビルダーを使用してクリックダミーを作成することです。クリックダミーとは、目標システムに似ているが、機能を提供しないプロトタイプです。
ストーリーボード、アニメーション、または図面の使用は、使い捨てのプロトタイピングと全く同じではありませんが、確かに同じ範疇に属します。これらは機能的な実装ではありませんが、システムの外観を示すものです。
概要:このアプローチでは、プロトタイプは破棄されることを前提として構築され、最終システムはゼロから構築されます。このアプローチの手順は以下のとおりです。
進化型プロトタイピング(ブレッドボードプロトタイピングとも呼ばれる)は、使い捨て型プロトタイピングとは大きく異なります。進化型プロトタイピングを用いる際の主な目的は、構造化された方法で非常に堅牢なプロトタイプを構築し、それを継続的に改良していくことです。このアプローチを採用する理由は、進化型プロトタイプが構築された時点で新しいシステムの核となり、その後、改良点や新たな要件が組み込まれていくからです。
進化型プロトタイピングを用いてシステムを開発する場合、システムは継続的に改良され、再構築される。
この手法を用いることで、開発チームは要件定義や設計段階では考えられなかった機能を追加したり、変更を加えたりすることが可能になる。
進化型プロトタイプは、使い捨て型プロトタイプに比べて、機能的なシステムであるという利点があります。ユーザーが計画したすべての機能を備えていない場合もありますが、最終システムが納品されるまでの暫定的な手段として使用できます。
進化型プロトタイピングでは、開発者はシステム全体を開発するのではなく、自分が理解しているシステムの一部を開発することに集中できる。
最終製品は、個別のプロトタイプとして構築されます。最後に、これらの個別のプロトタイプが統合され、全体的なデザインが完成します。段階的なプロトタイピングを用いることで、ユーザーとソフトウェア開発者の間の時間的なギャップが短縮されます。
エクストリームプロトタイピングは、特にWebアプリケーション開発において用いられる開発プロセスです。基本的に、Web開発を3つのフェーズに分割し、各フェーズは前のフェーズに基づいて構築されます。第1フェーズは、主にHTMLページで構成される静的プロトタイプです。第2フェーズでは、シミュレーションされたサービスレイヤーを使用して画面をプログラミングし、完全に機能させます。第3フェーズでは、サービスを実装します。
ソフトウェア開発においてプロトタイピングを使用することには多くの利点があり、具体的なものもあれば抽象的なものもあります。[ 12 ]
時間とコストの削減:プロトタイピングは、開発者に提供される要件と仕様の品質を向上させることができます。変更は開発の後半で発見されるほど実装コストが指数関数的に増加するため、ユーザーが本当に何を求めているかを早期に判断することで、より速く、より安価なソフトウェアを実現できます。[ 7 ]
改善され、ユーザー参加が増加: プロトタイピングにはユーザーの参加が必要であり、ユーザーがプロトタイプを見て操作することで、より良く、より完全なフィードバックと仕様を提供できるようになります。[ 6 ]ユーザーがプロトタイプを検証することで、双方が相手が自分の言ったことを理解していると思い込んでいる場合に発生する多くの誤解や意思疎通の行き違いを防ぐことができます。ユーザーは開発チームの誰よりも問題領域をよく知っているため、インタラクションの増加は、有形無形の品質がより高い最終製品につながります。最終製品は、外観、操作感、パフォーマンスに対するユーザーの要望を満たす可能性が高くなります。
プロトタイピングの利用、あるいは誤用には、デメリットも伴う可能性がある。
分析不足:限定的なプロトタイプにばかり注目すると、開発者はプロジェクト全体を適切に分析できなくなる可能性があります。その結果、より良い解決策を見落としたり、仕様書が不完全になったり、限定的なプロトタイプが保守が困難な設計の不十分な最終プロジェクトに変換されてしまう可能性があります。さらに、プロトタイプは機能が限られているため、最終成果物の基礎として使用した場合、拡張性に問題が生じる可能性があります。開発者がプロトタイプをモデルとして構築することに集中しすぎると、この点に気づかないかもしれません。
プロトタイプと完成システムの混同:ユーザーは、廃棄予定のプロトタイプを、単に仕上げや調整が必要な最終システムだと考え始めることがあります。(例えば、プロトタイプには含まれていないエラーチェックやセキュリティ機能を追加するために必要な労力を、ユーザーはしばしば認識していません。)そのため、開発者の意図とは異なり、プロトタイプが最終システムのパフォーマンスを正確にモデル化していると期待してしまう可能性があります。また、ユーザーは、検討のためにプロトタイプに含まれていたものの、最終システムの仕様から削除された機能に愛着を持つようになることもあります。ユーザーが提案されたすべての機能を最終システムに含めるよう要求できる場合、これは対立につながる可能性があります。
開発者によるユーザー目標の誤解:開発者は、より広範な商業的問題を理解しないまま、ユーザーも自分たちの目標(例えば、コア機能を期日通りに予算内で提供すること)を共有していると思い込んでいる場合があります。例えば、エンタープライズソフトウェア(PeopleSoftなど)のイベントに参加したユーザー代表は、「トランザクション監査」(変更がログに記録され、差分グリッドビューに表示される機能)のデモを見たかもしれませんが、この機能には追加のコーディングが必要であり、追加のデータベースアクセスを処理するためにハードウェアが必要になることが多いことを知らされていない可能性があります。ユーザーはすべてのフィールドで監査を要求できると考えているかもしれませんが、開発者はユーザー要件の範囲について思い込みをしているため、これは機能の肥大化だと考えているかもしれません。ユーザー要件がレビューされる前に開発者が納品を約束してしまった場合、特にユーザー管理側が要件の実装失敗から何らかの利益を得ている場合は、開発者は板挟みの状態になります。
開発者のプロトタイプへの執着:開発者は、多大な労力を費やして作成したプロトタイプに執着してしまうことがあります。これは、適切な基盤となるアーキテクチャを備えていない限定的なプロトタイプを最終システムに変換しようとするなど、問題を引き起こす可能性があります。(このことから、進化型プロトタイピングではなく、使い捨て型プロトタイピングを採用すべきであることが示唆されるかもしれません。)
プロトタイプの開発時間の過剰:プロトタイプ作成の重要な特性の一つは、迅速に行うことです。開発者がこの点を忘れてしまうと、複雑すぎるプロトタイプを開発してしまう可能性があります。プロトタイプが破棄された場合、そこから得られる綿密に練られた要件は、プロトタイプの開発に費やした時間を補うほどの生産性向上にはつながらないかもしれません。ユーザーはプロトタイプの詳細について議論に巻き込まれ、開発チームの作業を妨げ、最終製品のリリースを遅らせる可能性があります。
プロトタイピング導入のコスト:プロトタイピングに特化した開発チームを構築するための初期費用は高額になる可能性があります。多くの企業は既に開発手法を確立しており、それを変更するには再教育、ツールの刷新、あるいはその両方が必要になる場合があります。多くの企業は、従業員の再教育を十分に行わずに、いきなりプロトタイピングを開始してしまう傾向があります。
プロトタイピングは、何らかの形で常に活用すべきだという意見もある。しかし、プロトタイピングが最も効果を発揮するのは、ユーザーとのインタラクションが多いシステムにおいてである。
バッチ処理や主に計算を行うシステムなど、ユーザーとのインタラクションが少ないシステムは、プロトタイピングの恩恵をほとんど受けません。システム機能を実行するために必要なコーディングが複雑すぎる場合があり、プロトタイピングによって得られる潜在的なメリットが小さすぎる場合もあります。[ 6 ]
プロトタイピングは、洗練されたヒューマンコンピュータインターフェースを設計するためのツールとして頻繁に使用されています。「これまでのところ、ラピッドプロトタイピングの最も生産的な用途の1つは、反復的なユーザー要件エンジニアリングとヒューマンコンピュータインターフェース設計のためのツールとしてです。」[ 7 ]
動的システム開発手法(DSDM)[ 14 ]は、プロトタイピングをコア技術として重視するビジネスソリューション提供のためのフレームワークであり、それ自体がISO 9001認証を取得しています。DSDMは、プロトタイプの一般的な定義を拡張したものです。DSDMによれば、プロトタイプは図、ビジネスプロセス、あるいは本番環境に導入されたシステムである場合もあります。DSDMのプロトタイプは段階的に進化し、単純な形態からより包括的な形態へと発展していくことを意図しています。
DSDMプロトタイプは、使い捨てのものもあれば、進化型のものもあります。進化型のプロトタイプは、水平方向(幅を広げてから深さを増す)または垂直方向(各セクションを詳細に構築し、さらに反復を重ねて後続のセクションを詳細化する)に進化させることができます。進化型のプロトタイプは、最終的に最終システムへと発展する可能性があります。
DSDMが推奨するプロトタイプの4つのカテゴリーは以下のとおりです。
プロトタイプのDSDMライフサイクルは以下のとおりです。
運用プロトタイピングは、使い捨てプロトタイピングと進化型プロトタイピングを従来のシステム開発に統合する方法として、アラン・デイビスによって提案されました。「これは、迅速かつ粗雑な開発と従来型の開発の両方の利点を合理的な方法で提供します。設計者は、進化型ベースラインを構築する際に、十分に理解されている機能のみを開発し、使い捨てプロトタイピングを使用して、十分に理解されていない機能を実験します。」[ 8 ]
デイビス氏の考えでは、2つのアプローチを組み合わせようとする場合、「迅速なプロトタイプに後付けで品質を付加する」のは正しい方法ではない。彼の考えは、進化型プロトタイピング手法を採用し、進化のたびにシステムの機能を迅速にプロトタイプ化することである。
具体的な方法論は以下の手順に従います: [ 8 ]
言うまでもなく、この手法の鍵は、ユーザーサイトに赴いて作業できる、十分な訓練を受けたプロトタイピング担当者を確保することである。運用プロトタイピング手法は、複雑で事前に要件がほとんど分かっていないシステムにおいて、多くの利点をもたらす。
進化型システム開発とは、進化型プロトタイピングを正式に実装しようとする手法群である。その中でも特に、システムクラフトと呼ばれる手法は、ジョン・クリニオンが著書『進化型システム開発』の中で解説している。
Systemscraftは、実装される特定の環境に合わせて修正・適応されるべき「プロトタイプ」的な手法として設計された。
システムクラフトの基本は、進化型プロトタイピングと同様に、初期要件から動作するシステムを構築し、一連の改訂を重ねてそれを発展させていくことです。システムクラフトでは、システム開発全体を通して従来型の分析手法を非常に重視しています。
進化型迅速開発(ERD)[ 15 ]は、国防高等研究計画局(DARPA)の情報技術局の技術開発および統合エージェントであるソフトウェア生産性コンソーシアムによって開発されました。
顧客/ユーザーからの意見を募るため、関係者との定期的な会議や臨時の会議が頻繁に開催されます。設計/実装の決定が確定する前に、システム機能のデモンストレーションを実施してフィードバックを募ります。システムがユーザーや顧客のニーズをより良くサポートする方法についての洞察を得るために、ベータ版などのリリースが頻繁に公開されます。これにより、システムが既存のユーザーニーズを満たすように進化することが保証されます。
システムの設計フレームワークは、既存の公開標準または事実上の標準に基づいています。システムは、パフォーマンス、容量、機能性を考慮した一連の機能を進化させることができるように構成されています。アーキテクチャは、サービスとその実装(COTSアプリケーションなど)をカプセル化する抽象インターフェースによって定義されます。このアーキテクチャは、システムの複数のインスタンスの開発をガイドするためのテンプレートとして機能します。また、複数のアプリケーションコンポーネントを使用してサービスを実装できます。変更される可能性の低いコア機能セットも特定され、確立されています。
ERDプロセスは、ステークホルダーがニーズと期待を伝える手段として、紙の成果物ではなく、実証済みの機能を使用するように構成されています。この迅速な納品という目標の中心となるのは、「タイムボックス」方式の使用です。タイムボックスとは、特定のタスク(例えば、一連の機能の開発)を実行する必要がある固定期間のことです。漠然とした目標を満たすために時間を延長するのではなく、時間は固定され(暦週と人時の両方で)、これらの制約内で現実的に達成可能な目標が定義されます。開発が「ランダムウォーク」に陥らないように、イテレーションを導くための長期計画が定義されます。これらの計画は、システム全体のビジョンを提供し、プロジェクトの境界(例えば、制約)を設定します。プロセス内の各イテレーションは、これらの長期計画のコンテキストで実行されます。
アーキテクチャが確立されると、ソフトウェアは毎日統合され、テストされます。これにより、チームは進捗状況を客観的に評価し、潜在的な問題を迅速に特定できます。一度に統合されるシステムの量は少ないため、不具合の診断と修正は迅速に行えます。システムは通常いつでも実行可能な状態にあるため、ユーザー向けデモンストレーションも短期間で実施できます。
プロトタイピングを効率的に使用するには、組織が適切なツールと、それらのツールを使用する訓練を受けたスタッフを備えている必要があります。プロトタイピングで使用されるツールは、迅速なプロトタイピングに使用される第4世代プログラミング言語などの個別のツールから、複雑な統合CASEツールまで多岐にわたります。Visual BasicやColdFusionなどの第4世代ビジュアルプログラミング言語は、安価でよく知られており、比較的簡単かつ迅速に使用できるため、よく使用されます。要件分析をサポートするCASEツール(要件エンジニアリング環境(下記参照)など)は、軍や大企業によって開発または選択されることがよくあります。GE研究開発センターのLYMBなどのオブジェクト指向ツールも開発されています。ユーザーは、スプレッドシートでアプリケーションの要素を自分でプロトタイプ化することもできます。
ウェブベースのアプリケーションの人気が高まるにつれ、そのようなアプリケーションのプロトタイプを作成するためのツールも進化してきました。Bootstrap 、Foundation、AngularJSなどのフレームワークは、概念実証を迅速に構築するために必要なツールを提供します。これらのフレームワークは通常、開発者がウェブアプリケーションのプロトタイプを迅速に作成できるようにする一連のコントロール、インタラクション、および設計ガイドラインで構成されています。
画面生成プログラムもよく使われており、プロトタイプ開発者はこれを使って、機能しないものの画面がどのように見えるかを示すユーザーシステムを提示することができます。ユーザーにとってインターフェースは実質的にシステムそのものであるため、ヒューマンコンピュータインターフェースの開発は、開発作業において極めて重要な部分となる場合があります。
ソフトウェアファクトリーは、すぐに使えるモジュール型コンポーネントを組み合わせることでコードを生成できます。このため、最小限の手作業で目的の動作を持つプログラムを迅速に提供できるため、アプリケーションのプロトタイプ開発に最適です。
アプリケーション定義ソフトウェアまたはシミュレーションソフトウェアと呼ばれる新しいクラスのソフトウェアを使用すると、 ユーザーはコードを書かずに、別のコンピュータプログラムの軽量でアニメーション化されたシミュレーションを迅速に構築 できます。アプリケーションシミュレーションソフトウェアを使用すると、技術者と非技術者の両方が、シミュレーションされたプログラムを体験、テスト、共同作業、検証でき、注釈、スクリーンショット、回路図などのレポートが提供されます。ソリューション仕様の手法として、アプリケーションシミュレーションは、リスクは低いが機能が限定的なテキストまたは図面ベースのモックアップ(またはワイヤーフレーム)(紙ベースのプロトタイピングと呼ばれることもあります)と、時間のかかる高リスクのコードベースのプロトタイプの中間に位置し、ソフトウェア専門家が開発開始前に要件と設計の選択肢を早期に検証できるようにします。そうすることで、ソフトウェア実装に関連するリスクとコストを大幅に削減できます。[ 16 ]
アプリケーションをシミュレートするには、コンピュータベースのトレーニング、デモンストレーション、顧客サポートのための、実際のソフトウェアプログラムをシミュレートするソフトウェアを使用することもできます。例えば、スクリーンキャストソフトウェアなどが挙げられます。これらの分野は密接に関連しているためです。
「1985年からローマ研究所で開発されている要求工学環境(REE)は、複雑なシステムの重要な側面を迅速に表現、構築、実行するための統合ツールセットを提供します。」[ 17 ]
要求工学環境は現在、米国空軍がシステム開発に使用している。それは以下の通りである。
REEは3つの部分から構成されています。1つ目はprotoと呼ばれる、迅速なプロトタイピングを支援するために特別に設計されたCASEツールです。2つ目はRapid Interface Prototyping System(RIP)と呼ばれる、ユーザーインターフェースの作成を容易にするツール群です。REEの3つ目は、RIPとprotoへのグラフィカルなユーザーインターフェースであり、使いやすさを重視しています。
REEの開発元であるローマ研究所は、REEを自社の要件収集方法論を支援するために開発した。その方法論は主に3つの部分から構成されている。
1996年、Rome LabsはSoftware Productivity Solutions(SPS)と契約し、REEをさらに強化して「要件仕様、シミュレーション、ユーザーインターフェースのプロトタイピング、要件とハードウェアアーキテクチャのマッピング、コード生成をサポートする商用品質のREE」を作成しました。[ 18 ]このシステムはAdvanced Requirements Engineering Workstation、略してAREWと呼ばれています。
非関係的なデータ定義(例えば、Cachéや連想モデルの使用)は、シミュレーションの各イテレーションでデータを正規化する必要性を遅らせたり回避したりすることで、エンドユーザーによるプロトタイピングの生産性向上に役立ちます。これにより、ビジネス要件の明確化がより早期に、より明確になる可能性がありますが、要件が対象となる本番システムにおいて技術的にも経済的にも実現可能であることを具体的に保証するものではありません。
PSDL は、リアルタイム ソフトウェアを記述するためのプロトタイプ記述言語です。[ 19 ] 関連ツール セットは CAPS (Computer Aided Prototyping System) です。[ 20 ] 厳密なリアルタイム要件を持つソフトウェア システムのプロトタイプ作成は、タイミング制約によって実装とハードウェアの依存関係が生じるため困難です。PSDL は、宣言的なタイミング制約を含む制御抽象化を導入することでこれらの問題に対処します。CAPS はこの情報を使用して、コードと関連するリアルタイム スケジュールを自動的に生成し、プロトタイプ実行中にタイミング制約を監視し、一連のパラメータ化されたハードウェア モデルに比例したリアルタイムで実行をシミュレートします。また、不完全なプロトタイプ記述の実行を可能にするデフォルトの仮定を提供し、プロトタイプ構築をソフトウェア再利用リポジトリと統合して効率的な実装を迅速に実現し、要件と設計の迅速な進化をサポートします。[ 21 ]