「全部やる」は、もうやめだ。海外のトップエンジニアが実践する「仕掛かり(WIP)制限」という最強の人生ハック

聖徳太子じゃないんだから!「マルチタスクの罠」と僕が海外のC#開発現場で学んだたった一つの真実

(本日はこの「起」の部分を執筆します)

さて、突然ですが、あなたの今のタスクリスト、どんな感じですか?

  • 機能Aの設計
  • 機能Bのプロトタイプ作成
  • 昨日見つかったバグCの修正
  • チームメイトのコードレビュー(3件)
  • 来週のスプリントプランニングの準備

…みたいな感じで、パンパンになってません?

日本で働いていた頃の僕が、まさにこれでした。特に僕の専門であるWIPF(Windows Presentation Foundation)を使ったデスクトップアプリ開発って、結構「全部入り」になりがちなんです。

UI(XAMLでのレイアウト)、ロジック(C#でのViewModel)、時にはデータベース接続やAPI連携まで、一人で見なきゃいけない範囲が広い。だから、あちこちから「これお願い!」「ちょっとこれ見て!」ってタスクが飛んでくるのが日常でした。

で、日本にいた時の僕は、それを「マルチタスクでさばく俺、カッコいい」とさえ思ってたフシがある(苦笑)。「はい、やります!」「大丈夫です、進めておきます!」と快く(?)引き受けて、夜遅くまで残業してなんとか帳尻を合わせる。それが「デキるエンジニア」の証だと信じてました。

ところが、海外に来て、その「常識」は木っ端微塵に砕け散りました。

僕が今いるチームに配属されて最初に関わったのは、金融系のトレーディング用デスクトップアプリのリニューアルでした。WIPFを使って、大量のリアルタイムデータをグリッドに表示しつつ、複数のウィンドウが連携して動く…みたいな、WIPFエンジニアとしては「腕が鳴る」タイプの、かなり複雑なやつです。

当時の僕は、もうやる気満々。「日本のエンジニアの底力、見せたるで!」と息巻いてました。

スプリントが始まり、僕は3つの「そこそこデカい」タスクを同時に抱えることになりました。

  1. リアルタイムデータグリッドのパフォーマンス改善(表示速度が遅い)
  2. 新しい注文入力画面の設計とプロトタイプ作成(MVVMパターンの構築)
  3. 既存の別機能で発生していた、稀なケースでのみ発生するメモリリークの調査

どれも一筋縄ではいかないタスクです。でも、僕はいつもの調子で「OK、ボス。全部やっておくよ」と引き受けました。

そして、地獄が始まりました。

まず、メモリリークの調査(タスク3)に取り掛かる。デバッガとにらめっこし、プロファイラを回す。…が、再現性が低い。数時間格闘して「ちょっと気分転換に」と、今度はグリッドのパフォーマンス改善(タスク1)に着手。XAMLのDataTemplateを見直し、Virtualization(仮想化)が効いているかチェックし、Bindingのボトルネックを探る。

そうこうしているうちに、プロダクトオーナー(PO)からSlackが飛んでくる。「Hey、注文画面(タスク2)のモックアップ、いつ頃見れそう?」

「あ、やべ。それもやらなきゃ」

僕は慌ててgit stash(作業の一時退避)し、ブランチを切り替え、今度は注文画面のXAMLを書き始める。ViewModelの設計を考え始めたところで、さっきまで調べていたメモリリークの件で「あ、あのパターン試してない」と思い出す。またgit stashしてブランチを切り替える…。

もう、頭の中はぐちゃぐちゃ。まるでCPUがコンテキストスイッチ(タスクの切り替え)を頻繁に起こして、本来の処理が全然進まない状態。WIPFの複雑なUIロジックと、非同期処理と、メモリ管理と、新しいビジネスロジックが、僕の脳内で大渋滞を起こしていました。

結果、どうなったか?

1週間の終わり。僕は「めちゃくちゃ忙しかった」。朝から晩までキーボードを叩き続け、頭は常にフル回転。残業もした。

でも、僕の成果は「ゼロ」でした。

いや、正確に言うと、「全部『やりかけ(In Progress)』」でした。

  • メモリリークは、原因の「当たり」はついたけど、修正コードは書けてない。
  • グリッド改善は、いくつか試したけど、決定的な改善には至ってない。
  • 注文画面は、ラフなXAMLは書いたけど、ロジックは手付かず。

スプリントレビューの時、僕のマネージャー(仮に「マーク」とします)は、カンバンボードの僕のレーンを見て、静かにこう言いました。

「君は今週、ものすごく忙しそうだった。それは知ってる。でも、何も『完了(Done)』していない。チームにとって、君の今週のバリュー(価値)はゼロだ」

ガツン、と頭を殴られたような衝撃でした。

日本では「頑張ってるね」「遅くまでありがとう」とプロセス(努力)を評価されることもありました。でも、マークが指摘したのは「結果」だけ。彼らにとって、「仕掛かり中(WIP)」のタスクは、100個あっても価値はゼロ。「完了(Done)」して初めて、1の価値が生まれる。

僕は反論しました。「いや、でも3つも同時にやってて…」「どれも複雑で…」

するとマークは、僕の隣に座っていたシニアエンジニア(仮に「サラ」とします)を指差しました。彼女のレーンは、週の初めに「In Progress」になったタスクが、綺麗に「Done」に移動している。同時に抱えている「In Progress」は、常に「1つ」だけ。

マークは言いました。「サラも複雑なタスクをやってた。でも彼女は『一つずつ』終わらせた。だからチームは彼女の成果を使って、次のステップに進める。でも君のタスクは、全部中途半端だから、誰もそれを使えない。わかるかい?」

悔しくて、情けなくて、同時に「何が違うんだ?」と混乱しました。

僕は、聖徳太子(しょうとくたいし)みたいに、全部のタスクを同時に処理できるスーパーマンになろうとしていたんです。でも、現実はただのキャパオーバー。コンテキストスイッチのコストで、すべてのタスクの進捗を(自分自身で)妨害していただけでした。

僕が「忙しく働くこと」に満足し、「頑張ってる自分」に酔っていた間に、サラは「価値を生み出すこと」だけに集中していた。

この強烈な失敗体験こそが、僕が「WIP(Work in Progress)制限」——つまり、「同時にやる作業の数を、意図的に制限する」という概念に出会った瞬間でした。

そう、今回のブログのテーマです。

「WIP制限」は、アジャイル開発やカンバンの単なる専門用語じゃありません。

これは、**海外のシビアな成果主義の環境で、自分自身のパフォーマンスを最大化し、精神をすり減らさずに生き抜くための「最強の武器」であり「人生術」**なんです。

「より速く」成果を出すために、「より少なく」やる。

この一見、矛盾しているようなアプローチこそが、僕のエンジニア人生を、いや、海外での働き方そのものを根本から変えてくれました。

次の「承」のセクションでは、なぜこの「WIP制限」がそんなに強力なのか、その具体的なメカニズムについて、僕がサラやマークから教わったことを、余すことなく解説していきます。

なぜ「やらないこと」が「速さ」を生むのか?WIP制限の驚くべきメカニズムと心理的効果

(「承」ここから)

前回の「起」では、僕が海外のC#開発現場で「聖徳太子」になろうとして見事に爆死した話、つまり3つの複雑なタスクを同時に抱えて「全部やりかけ(In Progress)」のまま1週間を終え、マネージャーのマークに「君の今週の価値はゼロだ」とバッサリやられた話をしました。

その一方で、シニアエンジニアのサラは、常に「WIP=1」(仕掛かりは1つだけ)を徹底し、着実にタスクを「Done(完了)」させてチームに価値を提供していました。

「仕事を制限する」ことが、なぜ「速さ」につながるのか?

「より少なくやる」ことが、なぜ「より多くを達成する」ことにつながるのか?

正直、当時の僕はまったく理解できませんでした。むしろ「逆だろ!」と。「同時にたくさんやれば、その分早く終わるに決まってる!」と本気で思ってましたから。

でも、それは大きな、本当に大きな間違いでした。

今日は、僕がマークとサラから叩き込まれた、WIP制限が機能する2つの冷徹なメカニズムと、それが僕らエンジニアの心にもたらす絶大なメリットについて、徹底的に掘り下げていきます。

ここを理解できるかどうかで、あなたのエンジニアとしての生産性は、マジで変わります。

メカニズム①:最大の敵、「コンテキストスイッチ」という名の”脳の税金”

まず、僕らエンジニアの仕事、特に僕が専門にしているWIPF(C#)でのデスクトップアプリ開発を思い浮かべてみてください。

あれって、めちゃくちゃ「深い集中」を要する作業の連続ですよね。

例えば、ある画面のパフォーマンス改善(「起」で僕がやったタスク1)をやるなら、

  • XAMLのDataTemplateの構造は適切か?
  • ItemsControlVirtualization(仮想化)は正しく効いているか?
  • ViewModel(C#のロジック)側で、INotifyPropertyChangedが余計なイベントを発火させてないか?
  • Bindingが複雑になりすぎて、UIスレッドを圧迫してないか?
  • そもそも裏で動いてる非同期処理(async/await)にボトルネックはないか?

…など、大量の「前提知識(コンテキスト)」を脳内にロードして、それらを複雑に組み合わせながら思考する必要があります。いわば、脳内に「WIPFパフォーマンス改善モード」の環境を構築するわけです。

では、この「深い集中」の最中に、別のタスクが割り込んできたらどうなるでしょう?

「起」での僕の例です。グリッド改善(タスク1)の途中で、POから「注文画面(タスク2)の進捗どう?」とチャットが来た。僕は慌ててgit stashし、ブランチを切り替え、注文画面の設計を始めます。

この瞬間、僕の脳内で何が起こったか。

まず、脳はさっきまでロードしていた「WIPFパフォーマンス改善モード」の全コンテキストを、一旦メモリから追い出します(アンロード)。そして今度は、「注文画面のMVVM設計モード」のコンテキスト(新しいビジネス要件、画面遷移の仕様、ViewModelの責務、リポジトリパターンの設計…)をイチからロードし直すんです。

これが、悪名高き「コンテキストスイッチ・コスト」。

もっと分かりやすく言えば、「脳の切り替え税」です。

問題なのは、この「税金」が、僕らが思っているよりべらぼうに高いこと。

研究(※)によれば、作業の切り替えは、たとえ短時間であっても、作業時間の最大40%を非効率なものにする可能性があると言われています。(※ジェラルド・ワインバーグの法則など、多くの研究で指摘されています)

たった2つのタスクを頻繁に行き来するだけで、あなたの労働時間の4割が、実際の作業ではなく「脳の環境構築のやり直し」だけに消えていくイメージです。最悪ですよね。

僕がやっていたのは、まさにこれ。

「メモリリーク調査(タスク3)」→(税金支払い)→「グリッド改善(タスク1)」→(税金支払い)→「注文画面設計(タスク2)」→(税金支払い)…

僕は、自分の脳のCPUパワーの大半を、この「切り替え税」の支払いに充てていたんです。そりゃ、どのタスクも進むわけがない。git stashを叩くたびに、僕の貴重な集中力と思考はリセットされ、ドブに捨てられていたんです。

WIPを「1」に制限する、というのは、このバカ高い税金の支払いを、断固として拒否するということです。

脳のCPUパワー、そのメモリのすべてを、今、目の前にある「たった一つ」のタスクに全振りする。

WIPFのパフォーマンス改善なら、そのことだけを考える。一度ロードしたコンテキストを手放さず、問題の根っこまで一気に潜っていく。

だから、タスクAとタスクBを並行してやって、両方とも3日かかる(合計6日)よりも、Aに集中して2日で終わらせ、次にBに集中して2日で終わらせる(合計4日)ほうが、総作業時間は圧倒的に短くなる。

これが、「やらないこと」が「速さ」を生む、一つ目のメカニズムです。

メカニズム②:「渋滞学」で考える。「リトルの法則」という残酷な真実

コンテキストスイッチは「個人の生産性」の話でした。

次に、WIP制限が「チームのスピード」にどう影響するかの話をします。

これ、マネージャーのマークにカンバンの前で叩き込まれた、目からウロコの概念でした。それが「リトルの法則(Little’s Law)」です。

名前は難しそうですが、言ってることは超シンプル。

元々は「待ち行列理論」という分野の法則で、要は「道路(=開発プロセス)が混んでれば混んでるほど、目的地(=Done)に着くのに時間がかかる」という、当たり前の話です。

もうちょっとエンジニアっぽく言うと、こういう関係性があります。

平均リードタイム = 平均WIP ÷ 平均スループット

  • 平均リードタイム:僕らが知りたい「速さ」。タスクが「In Progress」になってから「Done」になるまでの平均時間。
  • 平均WIP:今、仕掛かってるタスクの平均数。
  • 平均スループット:チームが1週間(とか一定期間)に「Done」にできるタスクの平均数。

この式を変形すると、見えてくるものがあります。

スループット(チームの地力)が一定だと仮定すると、

平均リードタイム(タスクが終わるまでの時間) は、 平均WIP(仕掛かり数) に比例する

つまり、今やっている作業(WIP)を2倍に増やしたら、タスクが終わるまでの時間(リードタイム)も2倍かかる、ということです。

残酷なまでにシンプルですよね。

「起」での僕とサラの例で見てみましょう。

仮に、タスクA、B、Cが、それぞれ「集中すれば1週間で終わる」タスクだったとします。そして、チームのスループットは「週に1タスク」だとしましょう。

  • サラのやり方(WIP=1)
    • WIPが常に「1」。リトルの法則通り、リードタイムは「1週間」です。
    • 1週目: タスクAに着手し、完了(Done)。
    • 2週目: タスクBに着手し、完了(Done)。
    • 3週目: タスクCに着手し、完了(Done)。
  • 僕のやり方(WIP=3)
    • WIPが「3」。リトルの法則によれば、リードタイムは「3週間」になります。
    • 1週目: タスクA, B, C に同時に着手。進捗はそれぞれ33%。Doneはゼロ。
    • 2週目: タスクA, B, C を継続。進捗はそれぞれ66%。Doneはゼロ。
    • 3週目: タスクA, B, C を継続。ようやく全部完了(Done)。

「あれ? どっちも3週間で3タスク終わってるなら、同じじゃない?」

ここが、日本で働いていた僕が陥っていた最大の罠でした。

まず、さっきのメカニズム①(コンテキストスイッチ・コスト)を思い出してください。僕のやり方では、この「税金」が大量にかかるので、実際には3週間じゃ終わりません。4週間、5週間と平気で遅延します。

でも、仮に100歩譲って、僕が超人で「税金ゼロ」で3週間で3タスクを同時に終わらせられたとしましょう。それでも、チームと顧客にとっての「価値」は、天と地ほどの差があります。

サラのやり方では、1週目の終わりには、タスクAが「Done」になっています。

つまり、プロダクトオーナー(PO)はそれをレビューできるし、QA(品質保証)チームはテストを始められる。もしタスクAがバグ修正なら、顧客は1週目にはもうその恩恵を受けられるんです。

価値が「流れて」いるんです。

一方、僕のやり方だと、3週目が終わるその瞬間まで、「Done」はゼロ。

POもQAも、3週間ずっと「待ちぼうけ」。顧客は3週間、価値を何も受け取れません。価値の流れが、僕という「ダム」で完全にせき止められている状態です。

**WIPを制限する(=道路の交通規制をする)**というのは、まさにこれなんです。

高速道路の入り口に車(タスク)を詰め込みすぎると、全員がノロノロ運転になり、結果として誰も目的地に着けない。それなら、入り口で台数制限(WIP制限)をして、道路がスムーズに流れる状態を維持したほうが、1台1台は確実に目的地に到着し、結果として全体の交通量(スループット)も上がる。

「WIP制限」は、タスクを渋滞させず、価値をスムーズに顧客に届けるための「交通整理」そのものだったんです。

心理的効果:「完了(Done)」がもたらすドーパミンとチームの信頼

そして、このWIP制限には、超合理的なメカニズムだけでなく、僕らエンジニアの「心」を守る、絶大な心理的メリットがあります。

「起」で話した、あのスプリントレビューの日の僕の気持ち。

「あんなに朝から晩まで必死で働いたのに、『価値はゼロ』と言われた…」

あれは強烈な無力感と自己嫌悪でした。

人間、特に僕らモノ作りが好きなエンジニアは、「何かを完了させること」で達成感を感じ、脳内にドーパミン(いわゆる「やる気ホルモン」)が放出されるようにできています。

WIPだらけの状態(=僕の状態)というのは、常に「あれも終わってない」「これも中途半端だ」という心理的な負債を大量に抱えている状態です。脳のバックグラウンドプロセスで、常に「あのタスク、ヤバいな…」という思考が動き続け、貴重なメンタルリソースを食いつぶしていく。これが燃え尽き(バーンアウト)の入り口です。

一方、サラが実践していたWIP=1の働き方は、この真逆。

「よし、タスクA終わった!プルリク投げるぞ!」

「お、レビュー通った!マージしてDoneだ!」

「さて、スッキリした頭で、次のタスクBに取り掛かろう」

この「小さな完了のサイクル」を、短期間で何度も何度も経験できる。

そのたびにドーパミンが出て、「次もやるぞ!」というモチベーションが湧いてくる。精神衛生上、これほど良いことはありません。

さらに、これは**チームの焦点(フォーカス)**にも影響します。

僕が3つのタスクで「全部ヤバいです…」と溺れていた時、チームメイトは誰も僕を助けられませんでした。だって、何から手伝えばいいか分からないから。

でも、WIP=1でやっていると、「今、チームが集中すべきこと」が明確になります。

もしサラがタスクAで詰まったら、「今、チームの最優先事項はタスクAだ。サラがブロックされてる。全員で助けよう」と、チームのエネルギーを一点に集中できるんです。

WIP制限は、個人プレーを「全員で、一つのことを、完了させる」という最強のチームプレーに変えるスイッチの役割も果たしていたんです。


「WIP制限」は、根性論や精神論なんかじゃ、まったくない。

  1. コンテキストスイッチという「無駄な税金」の支払いを拒否し、
  2. リトルの法則という「物理法則」に従って、価値の流れを最大化し、
  3. 「完了」のサイクルでドーパミンを回し、チームの焦点を定める。

これ以上ないほど合理的で、エンジニアの脳と心に優しい、最強のテクニックだったんです。

「より少なくやる」ことは、「サボる」ことじゃない。

それは、「より速く価値を届けるために、賢く働く」ということだった。

僕はこの真実を、マークとサラに(文字通り)叩き込まれて、自分の働き方を根本から見直すことになりました。

…とはいえ、理屈は分かった。

「よーし、明日から俺もWIP=1で働くぞ!」

……で、どうやって?

現実はそんなに甘くありません。マネージャーからは「これ、急ぎだから」とタスクが飛んでくる。POからは「あの機能まだ?」とチャットが来る。

理屈を振りかざすだけじゃ、チームは動かない。

そう、WIP制限を導入する上で最大の壁は、メカニズムの理解じゃない。

**「交渉」と「合意形成」**です。

次回の「転」では、この最大の難関——WIP制限をチームで「どうやって合意し、運用していくか」、僕が実際にマークやサラとぶつかり、時には失敗しながら学んだ「現場のリアルなネゴシエーション術」について、具体的にシェアしていきたいと思います。

「ノー」と言う勇気:現場でのWIP制限ネゴシエーション術とボトルネックの見つけ方

(「転」ここから)

僕がWIP制限を実践しようとして、最初にぶち当たった壁。それはもちろん、「割り込み」です。

日本の「空気読めよ」文化ほどじゃないにせよ、海外だって「緊急」と名のつく割り込みは毎日発生します。僕が「よし、今日こそWIP=1で、このC#のロジックリファクタリングに集中するぞ!」と意気込んでも、必ず誰かがそれを邪魔しに来る(笑)。

この「割り込み」という名の悪魔と、僕はどう戦ったのか。

その鍵は、「ノー」と言うことではなかったんです。

交渉術①:「ノー」と言うな。「どちらを?」と問い返せ

マーク(マネージャー)やPOから「急ぎのタスクB」を振られた時、僕が最初にやっていた失敗は「う…、OK。やります…(そしてWIPが2になる)」という自己犠牲。これでは「起」の爆死と同じ。

次に僕が試したのが「ノー」。

「ごめん、マーク。今、タスクA(WIPFのパフォーマンス改善)で手が離せないんだ。WIP制限を試していて…」

マークの反応は、最悪でした。

「は? WIP? 何それ。こっちは緊急なんだよ。君のローカルルールより、顧客の問題が優先だろ?」

……撃沈。

この失敗から、僕を救ってくれたのは、あのシニアエンジニア、サラの一言でした。僕がマークに怒られて凹んでいるのを見て、彼女はこう言いました。

「交渉の仕方が下手ね。あなたは『イエス』か『ノー』で答える必要はないのよ。あなたは**『優先順位付け』という、彼ら(マネージャーやPO)が本来やるべき仕事を、肩代わりしてあげてるだけ**。それを彼らに突き返しなさい」

……ん? どういうこと?

具体的に、サラはこうやるんだ、と見せてくれました。

POがサラに「急ぎのタスクB」を持ってきた時、サラはこう返したんです。

「OK、PO。そのタスクB、緊急なのね。理解したわ。

今、私はカンバンにある通り、タスクA(優先度3)をやっている。私のWIPは『1』よ。

質問はシンプル。タスクBは、タスクAより重要? もし重要なら、私は今すぐタスクAを『中断(On Hold)』して、タスクBを『In Progress』にする。

ただし、その場合、タスクAの再開はタスクBが終わってからになるから、今週のスプリントコミットメント(約束)だったタスクAの完了は、おそらく来週になる。

このトレードオフ(交換条件)を理解した上で、あなたは『どっち(Which one?)』を私にやってほしい? 決めるのは、あなたよ」

……完璧でした。

POは一瞬「うっ」と詰まりましたが、状況を理解し、「…わかった。タスクAは今週絶対必要だ。タスクBは…緊急だけど、タスクAほどじゃない。他の人を探すか、来週に回す」と判断しました。

見えますか? サラは「ノー」とは一言も言っていません。

彼女がやったのは、

  1. 相手の要求を一度受け入れる(共感):「OK、緊急なのね」
  2. 現在の状況(事実)を提示する:「今、Aをやってる。私のWIPは1」
  3. 「割り込み」がもたらす「コスト(影響)」を明確に言語化する:「Aは止まる。完了は来週になる」
  4. 「ノー」ではなく「選択肢(トレードオフ)」を提示する:「Aを続ける?」or「Bをやる?」
  5. 優先順位付けの「責任」を、本来の責任者(PO)に返す:「決めるのは、あなたよ」

これを僕は「Which one?(どっち?)交渉術」と名付けました。

これを使い始めてから、僕のストレスは激減しました。

マークが「C#の緊急バグ(タスクB)!」と飛んできても、「OK、マーク。今WIPFの画面設計(タスクA)をやってる。どっちが優先かな? Bをやるなら、Aの設計は明日のレビューに間に合わないけど、本当にそれでOK?」と返す。

これを繰り返すうちに、マークやPO側も「あいつにタスクを振ると、必ず『どっち?』と聞かれて、面倒なトレードオフを迫られる」と学習するんです(笑)。

その結果、彼らも「本当に緊急で、本当に今やってるタスクより優先なのか?」を、僕に話しかける前に一瞬、考えるようになる。

これこそが、WIP制限の「交渉」の第一歩。個人のキャパシティが有限であることを、相手に論理的に認めさせる作業なんです。

交渉術②:「個人ルール」から「チームルール」へ昇格させろ

とはいえ、この「Which one?交渉術」、結構エネルギー使います。毎回毎回、個人で戦うのは消耗しますよね。

僕が次にやったのは、このWIP制限を、「僕のローカルルール」から「チームの公式ルール」に昇格させることでした。

ここで武器になったのが、「承」で解説した「リトルの法則」です。

僕はチームのレトロスペクティブ(振り返りミーティング)で、こう切り出しました。

「みんな、最近『なんか仕事が進まない』『全部が中途半端』って感じることない? 僕はある」

(チームメイト、何人か頷く)

「僕、日本で働いてた時、マルチタスクこそ正義だと思ってて、海外に来て爆死したんだよね(笑)。で、サラの働き方を見て学んだんだけど…」

僕はそこで、ホワイトボードに「リトルの法則」の簡単な図(道路の渋滞の絵)を描きました。

「僕らが今やってるのは、高速の入り口に車(タスク)を詰め込みすぎてる状態。だから全員がノロノロ運転になってる。結果、誰も目的地(Done)にたどり着けてない」

「WIP制限っていうのは、この入り口で交通規制(WIP制限)をかけること。道路(プロセス)をスイスイ流して、1台ずつでも確実に目的地に着かせたほうが、結果的に全体の交通量は上がる。僕らも『完了』のドーパミンが出る。POもハッピー。じゃない?」

僕の拙い説明でしたが、エンジニアチームにはこの「ロジック(理論)」が刺さりました。特に「渋滞」の例えは万国共通。

マネージャーのマークも、「個人のローカルルール」としてWIP制限を振りかざされた時は怒りましたが、「チーム全体のリードタイムを短縮し、スループット(価値の流量)を上げるための、合理的な戦略」として提示された時は、彼の「マネージャーとしての成果」に直結する話なので、真剣に聞いてくれました。

結果、僕のチームでは「実験的に」WIP制限を導入することになりました。

カンバンボードの「In Progress(開発中)」の列の上に、「WIP Limit: 5」(チームメンバーが5人だったので、まずは「1人1タスク」という意味で)と、デカデカと付箋を貼ったんです。

これで、WIP制限は「僕のわがまま」ではなく、「チーム全員で合意したルール」になりました。

POが無理な割り込みをしようとしたら、僕個人ではなく、「チーム」として「おいおい、PO。カンバンのルール(WIP=5)を見てくれよ。今、枠はパンパンだ。それでも入れるなら、どれを『Stop』にするか、チームで決めよう」と言えるようになったんです。

これは本当に、本当に大きな一歩でした。

WIP制限が暴き出す「真の敵」:ボトルネックの発見

さて、チームでWIP制限(交通規制)を始めた僕ら。

スイスイ流れ始めたか…と思いきや、現実はもっと面白かったです。

WIP制限を始めると、必ず「新たな渋滞」が発生します。

それこそが、WIP制限がもたらす最大の恩恵——「ボトルネックの可視化」です。

僕のチームでは、WIP=5のルールを導入して数日後、カンバンボードは異様な光景になりました。

  • 「To Do(未着手)」:ガラガラ
  • 「In Progress(開発中)」:ガラガラ(WIP=5のルールで制限されてるから)
  • Code Review(レビュー待ち)」:タスクのカードが溢れかえって、大渋滞!!

これ、何が起こったか分かりますか?

WIP制限がなかった頃、この問題は隠蔽されていました。

なぜなら、開発者(僕も含む)が複数のタスクを「In Progress」で抱え込み、ノロノロと開発していたから。タスクが「レビュー」の段階に上がってくるスピード自体が遅かったんです。

ところが、WIP制限(WIP=5)の導入で、開発者全員が「1つのタスク」に集中し始めた。

その結果、開発スピード(個人の作業完了スピード)が上がり、タスクが「Done(開発完了!あとはレビューだけ!)」になるペースが、一気に上がったんです。

その結果、次の工程(コードレビュー)に、タスクが洪水のように押し寄せた

そして、僕のチームの「真のボトルネック」が明らかになりました。

そう、**シニアエンジニアの「サラ」**です。

皮肉なことに、僕にWIP制限の極意を教えてくれたサラこそが、チームの最大のボトルネックだったんです。

なぜなら、僕らが作っていたC#とWIPFの複雑なロジックを、最終的にレビューし、マージの「Approve(承認)」ボタンを押せる権限を持っていたのが、当時、チームでサラ一人だけだったから。

WIP制限がなかった頃は、「サラが忙しいから、レビューが遅れてる」ではなく、「開発者の開発スピードが遅い(=僕がマルチタスクで爆死してる)」が問題に見えていました。

しかし、WIP制限が、この構図をひっくり返した。

「違う、開発者は速い。レビューが詰まってるのが、チーム全体の速度を落としている唯一の原因だ!」

これが、WIP制限の「真の力」です。

カオスの中に隠れていた「本当の敵(ボトルネック)」を、強制的に白日の下に晒け出す。

この「レビュー待ち渋滞」が可視化された瞬間、僕らのチームは初めて、「個人の頑張り」ではなく、「チームのプロセス改善」について、本質的な議論を始めることができたんです。

「サラがボトルネックだ!」と彼女を責める話じゃありません。

「サラ一人にレビューを依存している、この『プロセス』がボトルネックだ」という議論です。

僕らはレトロスペクティブで、カンバンボードの「大渋滞」を前に、対策を話し合いました。

  • サラじゃなくてもレビューできる、軽微な修正(WIPFのXAMLのタイポとか)は、僕(筆者)や他の中堅がレビューしてApproveできるようにしよう。
  • 複雑なロジックは、サラがレビューする前に、開発者同士で「ペアレビュー」を必須にしよう。
  • そもそも、サラのレビュー負荷を下げるために、「コーディング規約」をもっと厳格にして、自動化できるチェック(Lint)は全部CIでやらせよう。

これらの対策が打てたのは、ひとえにWIP制限が「レビュー待ち」というボトルネックを、誰の目にも明らかな「渋滞」として可視化してくれたおかげでした。


「転」では、WIP制限という「理屈」を、いかにして「現場の実践」に落とし込むか、僕の血と汗(と少しの涙)の交渉術と、その結果として見えてきた「チームの本当の課題」についてお話ししました。

「ノー」と言うのではなく「どっち?」と問う。

「個人ルール」ではなく「チームルール」にする。

そして、可視化された「ボトルネック」から、目をそらさない。

このWIP制限の導入は、僕にとって単なる「仕事のテクニック」の導入ではありませんでした。

それは、「なんとなく頑張る」という、日本で染み付いた働き方を捨て、「ロジックと交渉で、自分の働きやすさとチームの成果を両立させる」という、海外で生き抜くための「戦い方」そのものを学ぶプロセスでした。

そして、この「戦い方」は、僕のエンジニアリングの仕事だけでなく、僕の「人生」そのものに対する考え方まで変えていくことになったのです。

次回「結」では、このWIP制限という最強の武器が、いかにして僕の「人生術」にまで昇華していったのか、その最終的な気づきについて、お話ししたいと思います。

「WIP制限」はただのルールじゃない。海外で「賢く」生き抜くための最強の人生術だ

(「結」ここから)

僕がWIP制限という考え方をチームに導入し、格闘していたあの日々。僕は、あることに気づきました。

これって、僕が毎日WIPF(C#)で書いているコードの「設計思想」と、まったく同じじゃないか?と。

僕らWIPFエンジニアは、「UIスレッド」というものの存在に、異常なまでに敏感です。ご存知の通り、WIPFアプリにおいて、UI(画面)の描画や操作を受け付けるスレッドは、**原則として「一つ」**しかありません。

もし、この貴重なUIスレッドで、重たいデータベースアクセスとか、時間のかかるファイルI/Oとかを「同期処理」で実行したら、どうなりますか?

アプリは、固まります(フリーズ)。

ユーザーからは「応答なし」と罵られ、最悪、タスクマネージャーから強制終了させられる。アプリとしては「死」です。

だから、僕らは「非同期処理(async/await)」を徹底的に使いますよね。

重い処理はawait Task.Run(…)で別スレッド(バックグラウンド)に投げ、UIスレッド様には「応答可能な状態」を維持していただく。そして処理が終わったら、Dispatcher経由でUIスレッドに結果をそっとお戻しする。

UIスレッドという**「たった一つの、超貴重なリソース」を、「ブロックさせない(固まらせない)」**こと。

これこそが、僕らWIPFエンジニアが叩き込まれる、パフォーマンス設計の神髄です。

……もう、お分かりですよね。

僕ら自身の「時間」と「集中力(メンタルリソース)」こそが、この「UIスレッド」なんです。

それは、僕らの人生において「たった一つ」しかない、絶対にブロックさせちゃいけない、超貴重なリソース。

「起」で僕がやっていた、3つの複雑なタスクのマルチタスク。

あれはまさに、UIスレッド(=僕自身)で、3つの重たい処理を「同期処理」で同時に実行しようとしていたのと同じ。

そりゃ、固まります。

僕の脳はフリーズし、「応答なし(=価値ゼロ)」とマネージャーに宣告された。当然の結果です。

WIP制限(特にWIP=1)を実践する、ということは、この「人生のUIスレッド(=自分)」を、フリーズさせないための最強の「非同期設計」なんです。

今、集中すべき「たった一つ」のタスクA(WIP=1)を、自分のUIスレッドで実行する。

「転」で話したような、マネージャーからの「緊急バグ(タスクB)」という名の割り込みは、awaitで待機させる(=バックログに置く)。

そして「Which one?(どっち?)」と問いかけ、もしタスクBの優先度が高いと判断されたなら、タスクAを安全にstash(中断・待機)させ、UIスレッドの実行コンテキストをタスクBに切り替える。

WIP制限は、僕らエンジニアの脳みそを、最も効率的に、最も「応答可能な状態」に保つための、セルフ・スレッドマネジメント術だったんです。

この事実に気づいた時、僕は「WIP制限」という言葉を使うのをやめました。

これは「制限(Limit)」じゃない。

これは、自分の貴重なリソースを守り、最大のアウトプットを出すための「戦略的フォーカス(Strategic Focus)」なんだ、と。

なぜ、これが「海外」でこそ最強の武器になるのか

この「戦略的フォーカス」は、日本で働いていた時よりも、海外で働く「今」のほうが、何倍も重要だと痛感しています。

理由は3つあります。

1. 「完了(Done)」だけが評価される世界だから

日本での残業は、「あいつ、頑張ってるな」というプロセス評価(同調圧力?)に繋がることもありました。

でも、僕が今いる現場は、良くも悪くもドライです。「起」のマークの言葉を思い出してください。「君がどれだけ忙しかったかは知ってる。でも価値はゼロだ」

海外の成果主義とは、「完了(Done)」の数と質でしか評価されない世界です。

「やりかけ(In Progress)」が100個あっても、給与明細には1円も反映されない。

WIP制限は、「頑張ってるフリ」を許しません。その代わり、自分を「完了(Done)」を生み出す最短距離へと強制的に導いてくれる。「Done」こそが、海外で僕らの価値を証明する唯一の通貨なんです。

2. 「自分」を守る最強の「論理武装」だから

海外では、「空気を読んで察してくれる」文化はありません。

自分のキャパシティが限界でも、黙っていたら「あ、こいつ無限に仕事振れる便利な奴だ」と見なされ、文字通り「死ぬ」までタスクが降ってきます。

「転」で紹介した「Which one?(どっち?)」交渉術は、そのための「盾」です。

「感情的(Tired/Busy)」に「ノー」と言うのではなく、「論理的(WIP/Capacity/Trade-off)」に「選んでくれ」と交渉する。

これは、自分のメンタル(人生のUIスレッド)をフリーズさせないため、そしてプロフェッショナルとして相手と対等に「優先順位」を議論するための、必須の「論理武装」なんです。

3. 「仕事」以外の人生のWIPが、多すぎるから

これが一番、僕が伝えたいことかもしれません。

海外で働くって、仕事だけが人生じゃないですよね。

  • 終わらない英語(現地語)の勉強
  • 複雑怪奇なビザの更新手続き
  • 慣れない現地でのコミュニティ作りや友人関係
  • 家族がいるなら、子供の学校や現地でのサポート
  • 日本にいる家族や友人との、時差のあるコミュニケーション

…僕らの人生のカンバンボードは、「仕事」のレーン以外もタスクで溢れかえってる。

もし、仕事のレーンでWIPを溢れさせ、脳のUIスレッドをフリーズさせてしまったら?

そのしわ寄せは、どこに来るか。

**「仕事以外の、人生のタスク」**です。

「今週も忙しすぎて、英語の勉強ができなかった…」

「疲れて、家族との会話も上の空だった…」

これじゃ、何のために海外に来たのか、わからなくなりますよね。

**仕事のWIPを制限する(=戦略的にフォーカスする)**ということは、人生の他の大切なレーン(学習、家族、健康)のために、**僕らの貴重な「UIスレッド(=時間と集中力)」を意図的に空けておく(確保する)**行為なんです。


「全部やる」は、もうやめだ。

僕がこのブログシリーズで伝えたかったのは、これに尽きます。

僕らが目指すべきは、「24時間戦えますか」な「忙しいエンジニア」じゃない。

「価値を確実に生み出し、人生の他の時間も楽しんでるエンジニア」であるべきです。

そのために、僕らエンジニアは「賢く」ならなきゃいけない。

僕らの最大の武器は、C#のコードを書くこと以上に、その背骨にある「ロジック(論理)」です。WIP制限は、そのロジックの結晶のようなテクニックです。

この記事を読んでくれたあなたも、明日から、いや今日から、まずは自分のタスクリストを眺めて、「今日の俺のWIPは『1』だ」と決めてみてください。

いきなりチームのカンバンを変える必要はありません。

まずは「自分カンバン」のルールを決める。

そして、横から「急ぎだ」という割り込みタスクが飛んできたら、僕と一緒に、心の中で(あるいは、勇気を出して口に出して)こう問い返してみましょう。

「OK、理解した。ところで… Which one?(どっち?)

あなたのC#エンジニアライフが、そしてあなたの海外での貴重な人生が、「やりかけ」のストレスではなく、「完了(Done)」の喜びに満ちたものになることを、心の底から願っています。

僕もまだまだ、この「人生のUIスレッド」をフリーズさせないよう、毎日格闘中です。

同じ空の下(時差はあるけど!)、一緒に賢く、戦い抜きましょう。

最後まで読んでくれて、本当にありがとうございました!

コメント

タイトルとURLをコピーしました