bussorenre Laboratory

hoge piyo foo bar

コンテキストスイッチにどうやって立ち向かうか

「この記事は個人の見解であり、所属する組織の公式見解ではありません」

またこいつは炎上しそうな記事を書いて……と自分で思いましたが、真剣に悩んでいるので人の目に触れる所に置いて意見を貰うことにしました。

本来、コンテキストスイッチとはCPUが複数プロセスを並行して動かしているように見せるために、CPUやメモリの状態を入れ替え差し替えする機能の事を指しますが、この記事では、1人の人間が、文脈の異なるの業務を並行的にこなさなければならない状況で発生する、脳内での業務の切り替え の事を意味します。

前提のお話

コンテキストスイッチにはコストが掛かる

まず、前提として、コンテキストスイッチには、スイッチングコストがかかります。

例えば、1人の人間(P)が100 の業務量をこなせるとします。(単位はまぁ概念的なものなので適当に想像してくれ)

上司は部下にあれこれ仕事を割り振るのですが、その中でも、A-E の業務に着目し、業務量を見積もると、だいたい以下のような感じでした。

A = 70
B = 40
C = 30
D = 20
E = 10

この時、P さんに任せる仕事として最適なのは どういう組み合わせでしょうか?

単純に計算すると、 A + C = 100 だったり、 B + C + D + E = 100 だったりするので、そういう組み合わせが良いと思うかもしれません。

しかし、ここには「人間はコンテキストスイッチングに多少なりとも時間がかかる」という条件が考慮されていません。

例えば、月から金まで働くとして、月火水 は A という業務に着手し、木金は C という業務に着手する。その間に業務の切り替え(コンテキストスイッチ)の発生回数は2回で、(A からC への切り替えと、C からAの切り替え。厳密にはC からA は土日を挟むので発生しないかもしれないがそれはさておき) コンテキストスイッチにだいたい1の業務量を要する。

とすると、A とC のタスクをアサインされている人の業務量は 70 + 30 + 2 = 102 になるわけです。ちょっと残業ですね

では、B + C + D + E = 100 の業務を持つ人が 1回のコンテキストスイッチにかかる業務量を1 として、必ずB, C, D, E の順番で業務を実行していくとどうなるか?というと、業務量は105 になります。

じゃぁ実際に105か?と言われると、そんなことはないです。

例えばBの仕事を実行している時に急遽Eの仕事のクライアントから緊急の電話が掛かってきたりすると、一旦Bの手を止めてEの頭に切り替えなければなりません。要件がすめばまたBに頭を戻せば良いわけですが、この時コンテキストスイッチが2回発生しています。

業務量が更に増え、107 になりました。こうして、残業が増えていくんだなー。

大きな集中力が必要な業務

アートの製作や、複雑なロジックの実装、MVPの検討など、非常に高度な集中力を要する業務というのが存在します。例えば40 の「集中力が必要な業務」の進行中に、だいたい20まで進行したところで、上記のようなクライアントからの緊急の電話等でコンテキストスイッチが発生すると、頭がリセットされて最悪0 からになるかもしれません。0までいかなくても、「で、ええっと何の話をしたんだっけ?ああそうそう」というロスタイムが生じる経験は誰にでもあると思います。同じ議論をやり直しているかもしれない。

集中力が必要な業務中に、コンテキストスイッチが発生しないようにする工夫は必須です。

コンテキストスイッチが発生しまくる現場では、こうした集中力が必要な仕事はなかなか手がつけれません。無理です。

みんな1人月として業務を振ってくる

例えば、A という業務と B という業務、それぞれ別のチームの仕事だったとします。B のチームの人からは、Aのチーム/仕事が見えないので、ついつい P さんに1人月分(=100)の仕事を振ってしまいがちです。

同じことがA でも発生します。例えば、Aチームでは、納期に間に合うか間に合わないかくらいのギリギリなスケジュールで動いていて、「P さん、ちょっとこのチケット持ってもらえませんか?」みたいな会話が発生したりします。まだB に比較的余裕があって「ああ、OK じゃぁA のほう頑張ってくれ」とコミュニケーションできればいいですが、「え、それは困るBもパツってる」とかになってくると、しんどくなります。

そしてコレはただの経験則ですが、だいたいしんどい次期は重複するので、Aがパツってる時にB が余裕ある という事はあんまりありません。パツってる時はだいたい緊急度が高い会話をする必要が多く、それだけコンテキストスイッチも発生し、雪だるま式に業務量が膨張します。

自発的に発生するコンテキストスイッチ

所謂生理現象です。トイレ行きたいとか眠いとか腹減ったとか、そういう生理的欲求による中断の他に、僕は勝手に小さなフラッシュバックと呼んでいるのですが、何か特定の事象を見て、それに興味が奪われたり、忘れていた何かを思い出してしまったりする現象があります。

外部からの割り込み以外にも、自分の中で発生する割り込みも存在します。これも経験則なので根拠微妙ですが、精神的なダメージを負っている時によく発生するイメージがあります。

コンテキストスイッチにどうやって立ち向かうか

そもそも複数業務をアサインしないようにお願いする

上司と相談出来る環境、そして上司がそれを納得して受け入れてくれる環境なら見えてくる選択肢です。 が、だいたい1人の人間に複数種類の業務がアサインされている時はもう上司の時点でパツってるので、この方法が通ることはまずありえません。

もしどうしても、1人の人間に複数タスクをアサインしなきゃいけない時、最も効果的だなって思っているのは 80:20 くらいで、それ以外のアサイン方法でまともなのを知りません。

業務時間を固定する

例えば、80:20 で分割した場合、20のほうの業務を必ず金曜日に行う 等の合意が取れていれば、コンテキストスイッチの発生回数は極端に減ります。 さっきも書きましたが、土日が休みな場合コンテキストスイッチは土日に行われるので、101 くらいの業務量で済みます。

割り込みを回避する

特に集中力を要する仕事で有効な方法だと思っていて、誰からも声を掛けられない場所に引きこもり、チャットツールも閉じる というのが有効だと思っています。人が減りだす 20:00 - 24:00 のオフィスであったり、世間が寝静まった1:00 - 5:00 の間に最も集中力が高まることを感じるのもこれかなと思っていて、理由は割り込み回数が極端に少ないからです。

集中する部屋 みたいなのが固定デスクとは別に設けられているオフィスは良いと思うのですが、そうでなかったり、全域フリーアドレス とかになってくるとものごっつしんどいですね。

自分はどうすればいいのか

さて、じゃぁ今自分がどうなっているかというと、A+B+C+D+E= 120 くらいになっています(限界量100) コンテキストスイッチは頻繁に発生するので、実感値としては200くらいです

さて、どうすれば良いのか。

そもそも複数業務をアサインさせないようにお願いする は既に実行済みですが、「A+B+C+D にはなるかも」って感じで、うーんそれでもまだ4あるのか辛いという状態。次に有効かなと思っているのが、「じゃぁ月曜日、火曜日休みで 土日出社という感じのフレックス制度になりませんか?」 という相談。これは明日試してみるが、多分、人事や総務的な観点からお断りされると思っていて厳しい。

自分の中で、業務時間を固定してその時間はそれ以外のことを一切しない という強い意志表示をする というのが、多分自分に出来る唯一のカードだな。と思っていて、今全力で冷徹になろうとしている。(スケジューラーブロックを完全にブロックして会議を打ち込まれるのを防ぐ等。)

他にどうすればいいのか。

「お前の頭が悪い」と言われたら「すみません」としか言えません。自分の頭の悪さはコントロール出来ないので………。お前が無能だからそういうアサインのされ方をされるんじゃないか?と言われたらぐうの音も出ませんが、無能が加速するのでできれば辞めてほしい所……。

他の人がどういう感じで仕事しているのか、えるちゃん以上に私、気になってます。