プログラム仕様(プログラムしよう、英: Program specification)は、プログラムに求められることを定義したものである。プログラムの設計図や開発者から見たユーザーマニュアルの元となる文書のような「非形式的」な形態の場合と、数学的に厳密に動作を定義する「形式的」な形態の場合がある。実際、最もよい仕様は既存のアプリケーションを理解して改善するために書かれたものであることが多いが、重要なソフトウェアは開発前に注意深く仕様を記述する必要がある。仕様は特に常に安定性が求められる外部インタフェースでは重要である。
ウォーターフォール・モデルなどの古典的開発手法では、以下のようにプログラム仕様を分け、トップダウン的に作成していく。
以下では機能仕様について解説する。
ソースコードや技術設計文書とは異なり、機能仕様ではシステムの内部の動きがどうなるかを定義しないことが多い。その代わりに外部の各種エージェント(ユーザー、周辺機器、他のコンピュータなど)から見たそのシステムの振る舞いや相互作用を記述する。
例えば、次のように記述される:
このように、外部エージェント(この場合ユーザー)とソフトウェアシステムの相互作用を記述する。ユーザーがOKボタンをクリックするという入力を与えたとき、プログラムはそのダイアログを閉じるという形でそれに応答する。
機能仕様には様々な目的があるが、主な目的はソースコードやテストケース作成という時間のかかる作業に入る前に開発チーム内でプログラムの機能について意識を合わせることである。
機能仕様は、コード作成やテストケース作成にあたって参照される。例えば、ソフトウェアテストでテスト結果が正しいかどうかは機能仕様の記述に照らし合わせて判断される。