一覧SE-10-1 · 開発の可視化と運用接続

WIP制限と作業の完了条件

早く着手すること、早く価値を届けること、完了件数を増やすことを、それぞれの時刻と条件から説明します。

説明

着手した仕事を増やしても、完了する仕事が増えるとは限りません。着手済みで未完了の件数をWIP、受付から完了までをリードタイム、着手から完了までをサイクルタイムと呼びます。どこを受付・着手・完了とするかを決めてから集計します。

四つの仕事を使い、WIPの上限と担当者数を変えて完了時刻を計算します。各仕事の作業量は4、担当者は1刻みで作業量1を処理し、切替えの時間は0とするモデルです。最後に、仕事の分割と「完了」の条件が数値に与える影響を確認します。

早く着手すること、早く価値を届けること、完了件数を増やすことを、それぞれの時刻と条件から説明します。

1四つの仕事と受入条件

backlog.csvのcreatedは受付時刻、effortは作業量、dependsは先に完了が必要な仕事、acceptanceは受入条件です。

cat backlog.csv受付時刻・作業量・依存関係・受入条件を表示する

A〜Dはすべて時刻0に受け付けた作業量4の仕事です。AはCSV出力、Bは検索のように、利用できる結果を受入条件にしています。

2四つを同時に着手した場合

担当者1人でWIP上限を4にします。着手済みの仕事を順番に1刻みずつ進めます。

python3 flow.py --wip 4着手済みの上限を4件にする --workers 11刻みに1人分の作業を進める

全件が時刻0に着手されますが、最初の完了は13、最後は16です。平均リードタイムは14.5。着手が早いだけでは、利用者へ早く届けたことになりません。

3一つずつ完了させる場合

同じ仕事と担当者で、WIP上限だけを1に下げます。

python3 flow.py --wip 1前の仕事を完了してから次に着手する --workers 1

Aが4、Bが8、Cが12、Dが16で完了します。全件の終了時刻は同じ16ですが、平均リードタイムは10、平均サイクルタイムは4になります。受付後に待った時間はリードタイムへ含まれます。

4担当者を増やしても上限が低い場合

同じ仕事へ2人を割り当てます。ただし、このモデルでは一つの仕事を同じ刻みに2人で進められません。

python3 flow.py --wip 1 --workers 2同時に処理できる仕事を最大2件にする

終了は16のままです。capacity_ticks=32のうちwork_ticks=16しか使っていません。WIPを小さくすれば常に速くなるという関係でもありません。

5二人が別の仕事を進める場合

担当者2人のままWIP上限を2にします。

python3 flow.py --wip 2二つの仕事へ並行して着手できるようにする --workers 2

AとBが4、CとDが8で完了します。平均リードタイムは6、単位時間当たりの完了件数は0.5です。この条件では、担当者が待たずに仕事を進められる上限になりました。

6先に使える部分を切り出す

Aを固定列のCSV出力A1と、列の選択A2へ分けます。A2にはA1の完了が必要です。担当者1人・WIP上限1で再計算します。

cat split.csv分割後の受入条件と依存関係を読む python3 flow.py --input split.csv分割後の仕事で完了時刻を計算する --wip 1 --workers 1

A1は時刻2で使えるようになり、A2は4で完了します。作業量の総計は16のままです。件数が4から5へ変わるため、平均8.4と元の10だけを比較して効率改善と判断することはできません。

7実装終了を完了とした集計

次は別の作業記録done.csvを集計します。coding_endは実装終了、test_endは試験終了、acceptedは受入完了です。空欄はその段階が終わっていないことを表します。

cat done.csv実装・試験・受入の時刻を読む python3 done.py --criterion coding_end実装終了を完了時刻として集計する

実装終了なら4件すべて完了、平均リードタイムは10です。しかし試験や受入まで済んだ件数ではありません。どの列を完了とするかで、利用者へ渡せる状態との対応が変わります。

8試験終了と受入完了で集計する

同じ記録を、試験終了と受入完了の二つの基準で集計します。

python3 done.py --criterion test_end試験終了まで進んだ件数を集計する python3 done.py --criterion accepted受入まで終わった件数を集計する

試験終了は3件、受入完了はAとDの2件です。受入完了の平均12は完了した2件だけの平均で、未完了のB・Cの待ち時間は入っていません。平均と未完了件数を一緒に確認します。

まとめ

WIP上限と処理能力の組合せで、着手時刻と完了時刻が変わります。

分割によって先に使える成果を届けられますが、件数の変化を効率の向上と混同しないようにします。

完了条件と集計対象をそろえ、平均だけでなく未完了の仕事も確認します。

操作履歴と解説を振り返れます。

シェル / Python 3

1
cat backlog.csv
id,created,effort,depends,acceptance
A,0,4,,CSVを出力して内容を確認できる
B,0,4,,指定語で検索できる
C,0,4,,対象ファイルを取得できる
D,0,4,,日付順に並べられる
2
python3 flow.py --wip 4 --workers 1
A: start=0 end=13 lead=13 cycle=13
B: start=0 end=14 lead=14 cycle=14
C: start=0 end=15 lead=15 cycle=15
D: start=0 end=16 lead=16 cycle=16
completed=4 elapsed=16 mean_lead=14.5 mean_cycle=14.5
throughput=0.25 average_WIP=3.625 capacity_ticks=16 work_ticks=16
3
python3 flow.py --wip 1 --workers 1
A: start=0 end=4 lead=4 cycle=4
B: start=4 end=8 lead=8 cycle=4
C: start=8 end=12 lead=12 cycle=4
D: start=12 end=16 lead=16 cycle=4
completed=4 elapsed=16 mean_lead=10 mean_cycle=4
throughput=0.25 average_WIP=1 capacity_ticks=16 work_ticks=16
4
python3 flow.py --wip 1 --workers 2
A: start=0 end=4 lead=4 cycle=4
B: start=4 end=8 lead=8 cycle=4
C: start=8 end=12 lead=12 cycle=4
D: start=12 end=16 lead=16 cycle=4
completed=4 elapsed=16 mean_lead=10 mean_cycle=4
throughput=0.25 average_WIP=1 capacity_ticks=32 work_ticks=16
5
python3 flow.py --wip 2 --workers 2
A: start=0 end=4 lead=4 cycle=4
B: start=0 end=4 lead=4 cycle=4
C: start=4 end=8 lead=8 cycle=4
D: start=4 end=8 lead=8 cycle=4
completed=4 elapsed=8 mean_lead=6 mean_cycle=4
throughput=0.5 average_WIP=2 capacity_ticks=16 work_ticks=16
6
cat split.csv python3 flow.py --input split.csv --wip 1 --workers 1
id,created,effort,depends,acceptance
A1,0,2,,固定列のCSVを出力できる
A2,0,2,A1,出力列を選択できる
B,0,4,,指定語で検索できる
C,0,4,,対象ファイルを取得できる
D,0,4,,日付順に並べられる
A1: start=0 end=2 lead=2 cycle=2
A2: start=2 end=4 lead=4 cycle=2
B: start=4 end=8 lead=8 cycle=4
C: start=8 end=12 lead=12 cycle=4
D: start=12 end=16 lead=16 cycle=4
completed=5 elapsed=16 mean_lead=8.4 mean_cycle=3.2
throughput=0.3125 average_WIP=1 capacity_ticks=16 work_ticks=16
7
cat done.csv python3 done.py --criterion coding_end
id,created,coding_end,test_end,accepted
A,0,4,5,6
B,0,8,,
C,0,12,13,
D,0,16,17,18
criterion=coding_end finished=A,B,C,D
completed=4/4 mean_lead_of_completed=10 pending=
8
python3 done.py --criterion test_end python3 done.py --criterion accepted
criterion=test_end finished=A,C,D
completed=3/4 mean_lead_of_completed=11.6667 pending=B
criterion=accepted finished=A,D
completed=2/4 mean_lead_of_completed=12 pending=B,C

演習完了