以前読んだ本。 3種類の図を描いて、モヤモヤなどがすっきりするらしい。 手書きではなく Office系アプリ でもなくて PlantUML で描けるかどうかやってみました。
はじめに
図の種類と、それぞれどのような問題解決に適するかはつぎのとおり。 表紙と本文より抜粋。
- ブランチ
- 問題をわかりやすく整理する道具
- ごちゃごちゃスッキリ!
- クラウド
- 「あちらを立てればこちらが立たず」の板挟みを解消する道具
- もやもや解消!
- アンビシャス・ターゲットツリー
- 障害を予想して、目標を実現する道具
- どんよりバイバイ!
ではさっそく、やってみましょう。
ブランチ
今はこれが精一杯。
バナナ
が描けない。(バナナ の意味は、書籍を参照)もし
かつ
ならば
を図中に入れるのはむずかしい。上図ではむりやり入れてみた。
ポイント
- 通常の
rectangle
は角が直角なので、角を丸くするようにskinparam
で設定。(3種共通) - 上述を特定のものだけに適用されるように、
ステレオタイプ
を設定。(3種共通) - 記述を簡潔にするため、同じ手続きが生じるものは
procedure
で整理。(3種共通)
クラウド
今はこれが精いっぱい。
- 何か描画を追加すると、途端にレイアウトが崩壊する。
D:行動
-D':行動
間の矢印をギザギザにできない。
ポイント
B:要望
とC:要望
の中間にA:共通目的
を配置するように、ダミーのボックスを配置。- ダミーのボックスを表示しないよう、
ステレオタイプ
を設定してこれを非表示するように指示。 - 上述のような小細工をしているためか、レイアウトが綱渡り状態。
アンビシャス・ターゲットツリー
今はこれがせいいっぱい。 でも、3つの中ではいちばんいい出来かもしれません。
- なんか、右側に謎の空白がある
- ボックス間、もう少し詰めて描画しないと、全体がどんどん大きくなりそう
障害
を 表示 OR 非表示 にできるようにしていますが、その影響で謎の空白部分が出ている可能性があります。
なお、障害
も表示させるとこんな感じ。
ポイント
- 種類ごとに
ステレオタイプ
を設定し、それぞれの背景色をskinparam
で設定。 - 最終的な
目標
を0
、それ以外を1
~ とし、数値で扱えるようにしている。
まとめ
PlantUMLで、本に載っていた図を(むりやり)描いてみました。
考えるときには、手書きでガンガン書き出し続けるほうが効率がよいと思います。しかし清書に手間がかかります。 清書するときには、ExcelやPowerPointなどを使うほうがきれいに完成すると思います。しかし常にレイアウトを気にしなければなりません。 そのちょうど中間、書き出しの効率 と 整然とした配置 の両方を満たせる可能性があります。
書籍はこれです。
ソースコード
共通部分
▶ソースコードはこちら(クリックすると展開されます)
/' 考える力をつける3つの道具 に登場する図を描いてみた '/ ' どれを描画するか選択する !$MODE = "BRANCH" !$MODE = "CLOUDS" !$MODE = "ATT" ' 旧デフォルト配色にする skin rose ' Rectangle の角に丸みをつける skinparam rectangle { RoundCorner<<branch>> 15 RoundCorner<<clouds>> 15 RoundCorner<<att_goal>> 15 RoundCorner<<att_hurdle>> 15 RoundCorner<<att_interimgoal>> 15 RoundCorner<<att_action>> 15 } ' Rectangle の背景色を設定する skinparam rectangle { backgroundColor<<att_goal>> PaleTurquoise backgroundColor<<att_hurdle>> LightPink backgroundColor<<att_interimgoal>> GreenYellow backgroundColor<<att_action>> PaleGoldenRod } ' ステレオタイプ<<.....>>の文字を非表示にする hide <<branch>> stereotype hide <<clouds>> stereotype hide <<att_goal>> stereotype hide <<att_hurdle>> stereotype hide <<att_interimgoal>> stereotype hide <<att_action>> stereotype
ブランチ
▶ソースコードはこちら(クリックすると展開されます)
!if ($MODE == "BRANCH") /' ブランチ '/ title __ブランチ__ ' ボックスを描き識別名を設定する !procedure $branchbox($n, $as) rectangle "$n" as $as <<branch>> !endprocedure !procedure $ifthen($A, $B) ' もし A ならば B $A -up-> $B !endprocedure ' ボックスとそれぞれの識別名を設定する $branchbox("収入が無い", A) $branchbox("働かない", B) $branchbox("失業給付金の\n給付期間が終了する", C) ' もし→ならば をつなげる $ifthen(B, A) $ifthen(C, A) ' コメント skinparam noteBackgroundColor White note bottom of B : もし note bottom of C : かつ、もし note left of A : ならば /' ブランチ 終了 '/ !endif
クラウド
▶ソースコードはこちら(クリックすると展開されます)
!if ($MODE == "CLOUDS") /' クラウド '/ title __クラウド__ !$cA = "//A:共通目的//\n" + "ラクして生きていきたい" !$cB = "//B:要望//\n" + "お金がほしい" !$cC = "//C:要望//\n" + "のんびりしたい" !$cD1 = "//D:行動//\n" + "働く" !$cD2 = "//D':行動//\n" + "働かない" ' ボックスを描き識別名を設定する !procedure $cloudsbox($n, $as) rectangle "$n" as $as <<clouds>> !endprocedure hide <<dummy>> together { circle dummya1 <<dummy>> $cloudsbox($cB, BB) $cloudsbox($cD1, D1) } together { $cloudsbox($cA, AA) circle dummy <<dummy>> circle dummy2 <<dummy>> } together { circle dummya2 <<dummy>> $cloudsbox($cC, CC) $cloudsbox($cD2, D2) } together { $cloudsbox($cB, BB) $cloudsbox($cC, CC) } together { $cloudsbox($cD1, D1) $cloudsbox($cD2, D2) } ' 位置調整 dummya1 -d-> AA AA -d-> dummya2 BB -d-> dummy dummy -d-> CC D1 -d-> dummy2 dummy2 -d-> D2 AA <-[#blue]right- BB AA <-[#blue]right- CC BB <-[#blue]right- D1 CC <-[#blue]right- D2 D1 <<-[#red]down->> D2 /' クラウド 終了 '/ !endif
アンビシャス・ターゲットツリー
▶ソースコードはこちら(クリックすると展開されます)
!if ($MODE == "ATT") /' アンビシャスターゲットツリー '/ title __アンビシャスターゲットツリー__ ' 障害 を表示するとき、コメントアウト OR true にする !$ATT_SHOW_HURDLE = %false() !if ($ATT_SHOW_HURDLE == %false()) ' 特定のステレオタイプを持つボックスを表示しないようにする hide <<att_hurdle>> !endif '================================================================ ' procedure ' 障害のボックスを描く !procedure $atthurdle($num, $txt) !$n = %string($num) !$as = "h" + $n rectangle "//障害($n)//\n$txt" as $as <<att_hurdle>> !endprocedure ' 目標(中間目標)のボックスを描く !procedure $attgoal($num, $txt) !$n = %string($num) !if ($num == 0) !$as = "g" + $n rectangle "//目標//\n$txt" as $as <<att_goal>> !else !$as = "i" + $n rectangle "//中間目標($n)//\n$txt" as $as <<att_interimgoal>> !endif !endprocedure ' 行動のボックスを描く !procedure $attaction($num, $txt) !$n = %string($num) !$as = "a" + $n rectangle "//行動($n)//\n$txt" as $as <<att_action>> !endprocedure ' 障害、中間目標、行動 をつなげる !procedure $attbind($num) !$i = "i" + %string($num) !$a = "a" + %string($num) $a -up-> $i !if ($ATT_SHOW_HURDLE != %false()) !$h = "h" + %string($num) $h -right-> $i !endif !endprocedure ' ボックスを描く !procedure $attbox($num, $hurdle, $goal, $action) !if ($num == 0) $attgoal($num, $goal) !else $atthurdle($num, $hurdle) $attgoal($num, $goal) $attaction($num, $action) $attbind($num) !endif !endprocedure ' 目標 or 中間目標 と次の行動をつなげる !procedure $attnext($num_prev, $num_next) !$p = "i" + %string($num_prev) !if ($num_next == 0) !$n = "g" + %string($num_next) !else !$n = "a" + %string($num_next) !endif $p -up-> $n !endprocedure '================================================================ ' これ以降に記入する ' 目標 (番号は 0 固定) $attgoal(0, "再就職する") ' 障害、中間目標、行動 を設定する $atthurdle(1, "働きたい会社が無いかもしれない") $attgoal(1, "働きたい会社を見つける") $attaction(1, "就職支援サービスやハロワに行く") ' それぞれをつなげる $attbind(1) ' 1つの procedureで設定する場合 $attbox(2, "入社できない", "面接に合格し内定を取る", "面接を受ける") ' 途中で改行したい場合は、行末に "\" $attbox(3, "家族の合意が得られない", \ "家族の合意を得る", \ "条件を丁寧に説明する") ' 目標 または 中間目標 と次の行動をつなげる $attnext(1, 2) $attnext(2, 0) $attnext(3, 0) /' アンビシャスターゲットツリー 終了 '/ !endif