OSSプロジェクトのドキュメントの整備プランを立ててみた

ご無沙汰してます。[Personium Project](http://personium.io)のhideakikondoです。

> 注）記事は全て個人の見解であり、会社・組織を代表するものではありません。

前回の記事に記載の通り、OSSプロジェクトとして致命的な点「__[ドキュメントがPoorである](http://qiita.com/hideakikondo/items/3b44acb012d26c5a9102#%E3%81%9D%E3%81%AE2-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%83%A2)__」という問題を解消すべく、ドキュメント整備をどうすべきかということに頭を抱えてきました。
今回は、今のところの答えと今後の取り組みについて書こうと思います。

## OSSのドキュメントをどう整備していくか、という問題

まずはじめに考えなければならなかったことは、ここでした。
最初は__手当たり次第書く__、ということをしていたのですが、途中で沸いてきた疑問がありました。

* どんなドキュメントをどういう順番で出していくことが正解なのか
* 今どの程度の進捗で現在地がどこなのか

一般的にオープンソースプロジェクトが、ドキュメントをどういう観点で拡充していくかということに関しては、__未だに明確な解が無い__と思ってますが、自分で作業をしたり考えた結果、以下のような観点が重要かなと考えています。

1. ユーザーストーリー
2. 学習曲線
3. メンテナビリティ

1は、「誰が、どんなことに困ってドキュメントを探すか」を的確に定義して、それを効果的にサポートするための情報資材を準備していく、ということです。特に、プロジェクトという__集団__で多くのドキュメントを作成する必要があるので、この定義が曖昧だと__完成したドキュメントが意味をなさない__ということが起こりえます。（過去起こりました）

2は、「読者の理解度に合わせて、説明の流れや形式を工夫する」ということです。その学習曲線に応じて__理解のプロセスをデザインする__ことが理想だと思います。具体的には、技術者でない人は[動画](https://youtu.be/uBFfsCIwGq4)で説明する、技術者には具体的なコードを示す、といったことだったりすると思います。

3は、「メンテナンスにかける時間やコストを最小化する」ということです。たいていのプロジェクトは、ドキュメントをはじめとする情報資材を整備する専門の人員を用意することは非常に困難です。解決策はまだ模索していますが、たとえばWebサイトだと__「GitHubページを使う」だったり、「markdownで原本をGit管理してHTMLへ自動変換・デプロイする」__といったことが考えられます。

この他に、__Qiitaのようなオープンな場に下書き段階から公開していく__ということも、オープンソースプロジェクトが今後どういう整備方針なのかを示すという点において、重要だと考えました。

## ターゲットと整備すべきドキュメントを決める

上記の3つのルールをベースに、
「どんな人が」
「どんなことをするため」
「どういうものを用意する」
ということを定義して、リストを起こしました。それが以下になります。

| # | ターゲットユーザー <br>英名                                               | 行動目的（何がしたい）                                                                                                         | ドキュメントの候補 |想定するスキル別分類                                              | スキル範囲、言語                                                     | ドキュメント・実装                 |
|---|-----------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|----------------------------------------------------------------------|--------------------|
| 1 | 一般ユーザ <br>End User                                                    | とりあえず知りたい、理解したい                                                                                                 | 対象者ごとの文書<br>（企画系、技術者系、アプリ利用者系など）                                                                               | A:非技術者 <br>B:技術企画者、マネジメント                      | なし（企画系） <br>あり（技術系）                                         |      [Webページ](http://personium.io) <br>Personium仕様共通説明（すぐ必要）             |
| 2 | Personiumアプリ開発者 <br>App Developer                                    | PersoniumのAPIを使用して、アプリを開発したい                                                                                   | アプリ開発ガイドREST API リファレンス（BoxAPI）                                                                    | C:Webフロントエンドエンジニア <br>G:ネイティブアプリエンジニア | HTMLアプリ（Javascript） <br>ネイティブアプリ（Android/iOS/Win）          |   [APIリファレンス](https://personium.github.io/ja/apiref/1.5.0/000_Rest_API_Reference.html)  <br>__アプリ開発ガイド（執筆予定）__<br> [サンプル実装]()  |
| 3 | Personium Cell 管理クライアント開発者 <br>Cell-Client (Home-App) Developer | PersoniumのHomeアプリを開発したい                                                                                              | Homeアプリ開発ガイドREST API リファレンス（CellAPI）                                                               | C:Webフロントエンドエンジニア <br>G:ネイティブアプリエンジニア | HTMLアプリ（Javascript） <br>ネイティブアプリ（Android/iOS/Win）          |   [APIリファレンス](https://personium.github.io/ja/apiref/1.5.0/000_Rest_API_Reference.html)  <br>[Homeアプリ実装例](https://github.com/fujitsu-pio/home-app)                 |
| 4 | Personiumユニット管理者 <br>Unit Administrator                             | 自社サービスを提供するため、構築済みのPersoniumユニットを管理したい<br>自社のPDSアプリをユーザーに利用してもらいたい                                  | ユニット管理ガイド（Cell管理マニュアル）UnitManager/PCUI <br>REST API リファレンス（UnitAPI）                           | D:システム管理者                                          | HTTP REST API(Curl)<br>（サーバログインはしない） |  [APIリファレンス](https://personium.github.io/ja/apiref/1.5.0/000_Rest_API_Reference.html)                 |
| 5 | Personiumサーバソフトウェア運用者 <br>Server (Infra) Operator              | OSSソフトウェアを利用して、所有環境でPDSサービスを運用したい                                                                   | 環境構築ガイド、Ansible、Heat Templete <br>ミドルウェア一覧<br>運用・セキュリティポリシーの参考情報（XXしたほうがよいの類） | E:インフラエンジニア                                      | サーバ運用（Linuxなど）インフラ構築スクリプト言語（Shell, Ansible）  |  [Ansible](https://github.com/personium/ansible)<br>[Heat テンプレート](https://github.com/personium/openstack-heat)<br>構築ガイド   |
| 6 | Personiumサーバプラグイン開発者 <br>Plugin Developer                       | 自社の既存環境と最適化するなどのため、サーバ機能を拡張したい<br>そのために、プラグイン・エンジンエクステンションを開発して利用したい | Core Plugin開発ガイド<br>Engine Extension開発ガイド                                                                    | F:サーバサイドエンジニア                                  | Java<br>LinuxServer                                                                 |   Personiumプラグイン開発ガイド<br>コントリビューターガイド      |
| 7 | Personiumサーバ開発者 <br>Software Developer                               | PersoniumのOSSの機能を開発したい<br>OSSにコミットしたい                                                                            | Personium本体開発ガイド<br>コントリビューターガイド                                                                    | F:サーバサイドエンジニア                                  | Java<br>LinuxServer                                                                 |       Personium本体開発ガイド<br>コントリビューターガイド               |

これをまとめたことによって、いくつかの__メリット__があることに気付きました。

1. これから整備すべきドキュメントを俯瞰できた（ゴールと進捗が分かりやすくなった）
2. ターゲットが定義されて整備するための共通認識ができた
3. 不足しているコンテンツが何であるか、どの順番で整備していくかを議論しやすくなった
4. プロジェクトのスタンスをオープンにすることができた（この記事で）

などです。

現状の整備段階の中では、ほとんどのドキュメントができていないなあということがはっきりしたので、あとはどんどん書いていくだけ（泣）という状況になっています。

> OSSなので執筆してくれる方も募集してます！(｀･ω･´)

## さあドキュメントを整備しよう

整備計画が立ったところで、はじめの取っ掛かりとしては

__アプリ開発ガイド__
を
 __Qiitaで順次執筆・公開しよう__

と考えています。

理由は、

* アプリがPersoniumエコシステムを形成するためのキーになる

、そして、

* Qiitaで公開することで仕様に関する議論を巻き起こして最適解を出したい

からです。
これを読んで、__アプリを作ってくださる方__や__仕様へのご意見を下さる方__が現れることを期待しています！

## とりあえずの「アプリ開発ガイド：目次」

1. [Personiumアプリとは]() 
 * [概要]()
 * [Cellの分類　（アプリCell　、ユーザCell　）と認証フロー]()
 * [Homeアプリからの起動]()
 * [Appマーケットからインストールする]()

2. [Personiumアプリのデータ構造]()
 * [Collectionの設計　（WebDAV、OData）]()
 * [ACL]()
 * [Boxのスキーマ定義（bar ファイル）とインストール機構]()
 * 
3. [Personiumアプリで使用するAPI（認証、権限設定、データCRUD、ログetc）]()
 * [認証API]()
 * [データCRUD (BoxAPI)]()
 * [barインストール]()
 * [メッセージ（BoxBound）、データ開示依頼]()

4. [アプリの実装]()
 * [HTML/Javascript　アプリ]()　
 * [Android　アプリ ]()
 * [iOS アプリ]()
 
##### 応用編

a. [サーバサイドJavascript（Engine service)の利用]()
b. [engine extensionを使って、Engineの機能を拡張する]()
c. [Homeアプリを開発する]()
d. [アプリマーケットで公開する]()
・公式（？）マーケットを使用する場合
・Webサーバを使用する場合

> コンプリートまで長い道のりですが地道に頑張ります…

## 意気込み

積年の課題だったドキュメント整備が、この記事をもってやっとスタート地点に立てました！
私個人としては、ドキュメントをQiitaに書いていくという取り組みを試してみたかったので、まずは最初の執筆ができて良かったです。
ここに書いていったことが、（多言語対応ののちに、、）Personiumプロジェクトの公式ドキュメントに昇格することになりますので、応援・いいねのほど宜しくお願い致します！

では、スマイルスマイル～(∩´∀｀)∩