エクセルやワードの仕様書をマークダウン仕様書に変えよう


## マークダウンで書く必要性

職業としてソフトウェアを書くには仕様書が必要です。ジョエルのいう[機能仕様書](http://japanese.joelonsoftware.com/Articles/PainlessFunctionalSpecifi-2.html)でもなんでも良いですが、ソフトウェアには動きを定義した文書が必要なことは皆さんもご承知のとおりです。

現在、日本のソフトウェア開発現場では仕様書といえば未だにエクセルやワードをお使いの組織も多いと思います。特に企業が最近のツール導入に貪欲でなく、今までのやり方を重視してきた場合、その傾向が強いと思います。

この仕様書環境へマークダウンを持ち込むと、飛躍的に生産性が高まる可能性があります。たとえば仕様書がテキストファイル化されることでバージョン管理システム上での変更管理が容易になり、GitHubのようなプルリクエスト型の業務フローと連動できます。Jenkins等の自動化システムとの相性も高まります。

エクセルやワードを使いつづけることによって、生産性を向上する機会を逃している可能性があります。ありがちな症例を以下にまとめてみます。皆様の職場はどちらでしょうか。

|シーン|エクセル、ワードの仕様書|マークダウン仕様書(HTML)|
|:---|:---|:--|
|変更管理|変更管理ページを設け記載するため、変更記録に抜け漏れが発生する|バージョン管理ツールにログとして記載するため変更に抜けがない|
|差分|とれるツールもあるが良くわからない|Diffで明確にわかる|
|修正点の指摘|指摘リストのエクセルなどを作り、担当が修正し、再度確認を行っている。|プルリクエストで第三者も容易に修正提案ができ、マージを終了した時点で修正が完了し、再度確認をする必要もない。|
|仕様書参照|技術的には可能だが運用されていないため、毎回文書を開き直し、該当箇所を探している|相互にリンクを貼ることが当たり前になっていて、問題の箇所がすぐに見られる|

## 本稿で行うこと

本稿での仕様書については、USDMという仕様書の書き方、考え方に則った仕様書をマークダウンで書くことを取り上げます。USDMはアプリケーションで行って欲しいこと、つまり「要求」があり、それに紐付いてアプリケーションの振る舞いを特定する「仕様」があると考え、要求仕様書を記述する方法です。抜け漏れのない品質の高い仕様書を作成できます。（なお、USDMについては末尾の参考資料をご参考ください。）

なので、本稿では仕様書をマークダウンで書くということは「要求」や「仕様」をどんなマークダウンで書くか？という問題として扱います。もちろん、それ以外の仕様書の書き方でも、ちょっとした工夫で対応できると思います。

## 仕様書をマークダウン化してみる。

要求と仕様とマークダウンに次のような一定の関係を持たせるだけで、要求仕様書をマークダウンの文書に置き換えることが可能です。

|USDM要素|マークダウンに対応させた書き方|
|---|---|
|要求|# [要求識別番号]要求内容|
|サブ要求|## [要求識別番号]サブ要求内容|
|要求の理由/説明|要求の下にテーブルを作成|
|仕様グループ|<仕様グループ内容>|
|仕様|* [仕様番号]仕様内容|

[USDMでの要求仕様書事例](http://www.sessame.jp/workinggroup/WorkingGroup2/POT_Specification.htm)を使うと以下のようにかけると思います。

```
# [pot-210] コンセント抜き差しで、ポットを利用できない/利用できる状態にする。

|要求の補足|内容|
|:---|:---|
|理由|特別なハード部品なしに利用できない状態/できる状態にした。|
|説明|２．１章～５章は、コンセントを差し込んでいる時の要求仕様である。|

* [pot-210-11] コンセントを差し込むと、設定値にはデフォルト値がセットされ、ポットが機能する状態（アイドル）になる。【説明】各要求に対する仕様の＜デフォルト＞を参照。

* [pot-210-12] コンセントを抜くと、ポットは蓋の開け閉め以外は何も機能しなくなる。

# [pot-220]アイドルの状態で、蓋を閉じたら、水位を確認し、条件に合えば沸騰行為をする。

|要求の補足|内容|
|:--|:--|
|理由|蓋を閉めるという行為で加熱（沸騰）の指示をしたい.|
|説明|沸騰行為の詳細は、３章の「温度制御行為」に記載する。蓋センサがonになって3sec経過するのを待つ理由は、注水やポットの移動の直後に、水面が波打っている状況が考えられるので、水面状態が安定する時間を想定したためである。|

＜蓋「閉」を確認する＞
* [pot-220-11]蓋センサが3sec以上onとなったら、蓋が閉じられたと判断する。

```

## マークダウン化した結果

上記のように記載した場合、以下のようなマークダウン仕様書が作成されます。特に拙作の[Sunny Place Editor](http://qiita.com/kitfactory/items/7f080a0ac79efef2a813)をお使いの場合、各要求や仕様にリンクが自動的に埋め込まれ、非常にスムーズに仕様や要求に参照できます。（って、いつまで更新をサボっているのかと。。。）

# [pot-210]コンセント抜き差しで、ポットを利用できない/利用できる状態にする。

|要求の補足|内容|
|---|---|
|理由|特別なハード部品なしに利用できない状態/できる状態にした。|
|説明|２．１章～５章は、コンセントを差し込んでいる時の要求仕様である。|

* [pot-210-11] コンセントを差し込むと、設定値にはデフォルト値がセットされ、ポットが機能する状態（アイドル）になる。【説明】各要求に対する仕様の[デフォルト](http://www.google.com/)を参照。
* [pot-210-12] コンセントを抜くと、ポットは蓋の開け閉め以外は何も機能しなくなる。

# [pot-220]アイドルの状態で、蓋を閉じたら、水位を確認し、条件に合えば沸騰行為をする。

|要求の補足|内容|
|---|---|
|理由|蓋を閉めるという行為で加熱（沸騰）の指示をしたい.|
|説明|沸騰行為の詳細は、３章の「温度制御行為」に記載する。蓋センサがonになって3sec経過するのを待つ理由は、注水やポットの移動の直後に、水面が波打っている状況が考えられるので、水面状態が安定する時間を想定したためである|

＜蓋「閉」を確認する＞
* [pot-220-11]蓋センサが3sec以上onとなったら、蓋が閉じられたと判断する。



## まとめ

本稿ではUSDMという仕様書の書き方を例にとって、マークダウンへと変換する一例を書きました。皆さんの工夫で、皆さんの仕様書も意外と簡単にマークダウンに変更できるのではないかと思います。

## (参考)USDMの参考資料

[要求を仕様化する技術・表現する技術](http://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-%E5%85%A5%E9%96%80-%E5%AE%9F%E8%B7%B5-%E8%A6%81%E6%B1%82%E3%82%92%E4%BB%95%E6%A7%98%E5%8C%96%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%E3%83%BB%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93-%E4%BB%95%E6%A7%98%E3%81%8C%E6%9B%B8%E3%81%91%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B/dp/4774142573)USDMを発案された清水吉男さんの書籍です。

[SRAさんのプレゼン資料](http://www.sra.co.jp/public/sra/event_seminar/seminar2014/140905-h/SRA_Seminar_140905-2.pdf)

[USDMサンプル事例](http://www.sessame.jp/workinggroup/WorkingGroup2/POT_Specification.htm)