Verifiable Plan Language(検証可能な計画言語の思索)
http://plan-language.com/
ってことで、【ネタ的に】ドメインを取って、ひとまず wordpress を立てました。
言語ってことになっていますが、UML のように記号化のところに重きを置くのではなくて、【検証可能な】というのが主題です。なので、プログラム言語自体は、F# でも C# でも何でもいいのです(ってのが目標)。当面は、私の知っている言語が対象になるので、C#, F#, Java, PHP ですねぇ。スクリプト系の言語として、Python か Ruby なんですが。多分、Python になると思います。
さて、Verifable Plan Language 略して VPL は、計画段階からプロジェクト/プロダクトのプロセスの実行までを言語化します…って、こういうと自分でも何を言っているか分からないのですがw、PMBOK の Planning プロセスを言語化するというのが正しいのかなぁ。WBS なり、Gantt Chart なり、IDEF0 や DFD なりと planning から design process にながっる手法はいくつかあるのですが、やっぱり「検証できない」というのが致命的だと思っています。
そう、その計画は「妥当なのか?」というの妥当性は、プロジェクトの最後にならないと分からないとう「不確実性」を抱えたままなのです。勿論、プロジェクトの初期段階では、不確実性が多いのは確かなのですが、プロジェクトの終わりになっても「同じ計画を抱えたまま」では不確実性が多いままになってしまうのが問題です。現実問題として、明日リリースできるものが手元にあるのであれば、不確実性は限りなく 0 に近いと言えるわけです(勿論、不慮の事故というのもあるんですが)。
で、この手の論証なんかは、plan-language.com のほうでやるとして(moonmile.net/blog のほうは、もっと現場に接した「技術」的なところのおすそ分けなので)、ここでは、UIDD 的に WBS を作成するプロセスをプログラミングします。って、言っても分かりづらいので、実例を。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | namespace PlanLanguage.Test { public class TestGanttChart { public void MakeWBS() { // プロジェクトを作成する var proj = new WBSProject( "WBSプロジェクトの作成" ); // トップダウンでWBSを作成する proj.CreateWBS( "100" , "要件定義" ); proj.CreateWBS( "200" , "設計工程" ); proj.CreateWBS( "300" , "実装工程" ); proj.CreateWBS( "400" , "結合試験" ); proj.CreateWBS( "500" , "システム試験" ); proj.CreateWBS( "600" , "試験運用" ); // ブレークダウン proj.WBS[ "100" ].BreakDown( "101" , "機能要件" ); proj.WBS[ "100" ].BreakDown( "102" , "性能要件" ); proj.WBS[ "100" ].BreakDown( "103" , "開発期間" ); proj.WBS[ "100" ].BreakDown( "104" , "開発規模(金額)" ); proj.WBS[ "100" ].BreakDown( "105" , "開発規模(人員)" ); proj.WBS[ "100" ].BreakDown( "106" , "システム概要設計" ); proj.WBS[ "100" ].BreakDown( "107" , "既存システム解析" ); // PERT情報(期間)を設定 proj.WBS[ "101" ].Period = 10; proj.WBS[ "102" ].Period = 10; proj.WBS[ "103" ].Period = 5; proj.WBS[ "104" ].Period = 5; // PERT情報(前後関係)を設定 proj.TopWBS.NextTask = proj.WBS[ "101" ]; proj.WBS[ "101" ].NextTask = proj.WBS[ "102" ]; // 並行作業 proj.WBS[ "101" ].NextTask = proj.WBS[ "103" ]; // proj.WBS[ "102" ].NextTask = proj.WBS[ "104" ]; // 合流 proj.WBS[ "103" ].NextTask = proj.WBS[ "104" ]; proj.WBS[ "104" ].NextTask = proj.WBS[ "105" ]; // マイルストーンの設定 proj.TopWBS.MileStone = new DateTime(2011, 4, 1); // リソースを設定 proj.AddStaff( "masuda" , 0.5); proj.AddStaff( "yamada" , 1.0); proj.AddStaff( "tomoaki" ,1.0); // ガントチャート作成 GanttChart gc = proj.CreateGanntChart(); // クリティカルパスの取得 List<WBS> cp = proj.GetCriticalPath(); } } } |
WBS(Work Break down Structure)の作り方は、各社まちまちなのでここでは解説しませんが、大まかに言えば「トップダウン」で作ります。トップにプロジェクト自身があって、下へ下へとツリー状になっていきます。WBS の良いところは(PMBOK で言われていることは)、各タスクが重複しないところです。トップダウンで分類がされているので、下層にあるタスクは重複しません。
# と同時に、「重複できない」という制限があるのですが。これは論理学的にという意味で。
手順としては、
1. 大項目の WBS を出す。
2. WBS を作業単位になるまでブレークダウンする。
3. PERT 図を作成するための、期間(period)と前後関係(relation)を設定する。
4. Gantt Chart にするために、時間軸(マイルストーンなど)を設定する。
5. リソース(人,場所,機械など)を設定
6. ガントチャートを作成
という流れになります。
# コードのほうは、Project に直接挿入しているけど、本来は Plan ですよね。
# これは後から修正。
で、ここまでは計画段階なので、この計画を基にして実行プロセスを動かします。
PMBOK では、実行プロセスは非常に薄い(進捗管理程度しかない)のですが、現場のプロジェクトとしては、
・各タスクの進捗率
・各タスクの遅延状況
・タスクの削除/追加
・再計画/スケジューリング
が必須になります。あと、人員が減ることもある(俗に言う、ウエディングリスク)ので、これを実行プロセスを言語化します。
もうひとつ、CCPM 的に、タスクの遅延確率(あるいはプロジェクトバッファ)を計算する必要があるので、全体スケジュールに影響を及ぼす可能性のあるタスク(合流タスク、あるいは障壁となるタスク)の監視を行います。
こっちの具体例はのちほど。