この記事の目的
スケジュール通りに物事が進めるのは本当に難しいです。
この問題を少しでも解決するため、「アルゴリズム思考術」の
第5章を読んで、自分のためにスケジューリングの方法論をまとめてみました。
はじめに
スケジューリングの起源
「生産性を上げるためにはどうすればいいのか?」
そのためのスケジューリングの科学の始まりは産業革命時代の機械工場で「できるだけ機械を効率的に動かすにはどうすればいいのか」と言う問題を考えたのが始まりだそうです。
人間のスケジューリングを考えるのは「単一の機械(としての人間)の生産性をもっとも高めるにはどうすればいいのか」という問題と同じように考えられます。ただし、人間は機械と違ってスケジューリングするのも自分なので、「スケジューリング」も重要なタスクの1つになります。
目標が最適戦略を決める
多くの本の中で色々なスケジューリング理論が展開されているが、それらは一見すると矛盾しているように見えます。
例:仕事は優先度の高いものから片付ける。処理時間の短いものから片付ける。一旦先送りにする。など
その理由は、スケジューリングの目標が異なるからです。もっとも大事な案件を常に片付けたいなら優先度順が最適戦略だし、タスクの件数を減らしたいなら処理時間順が最適戦略となります。つまり、スケジューリングの最適戦略は自分が何を目標にスケジューリングをするのかによって変わってきます。
問題の多くは「手に負えない」
目標が決まり、タスクの洗い出しとその開始時間と所要時間が全て分かったとき、それらのタスクをどうこなすのか最適戦略が存在するはずです。しかし、最適戦略を求めるアルゴリズムは多くの場合において不明です(手に負えない状態)。そのため、完璧なスケジュールを作るというより、ある程度不確実性のあるものだと割り切った上で、幾つかの戦略を場合によって使い分けながらスケジューリングとタスク処理をしていく方が最良な結果が得られそうです。これらの前提を踏まえて私が実践している方法を以下に書いてみます。
不確実でいいからスケジュールを作る
Googleカレンダーでスケジュールを作成
10種類のカレンダーで予定を管理
私はスケジュールを作成するためにGoogleカレンダーで
ライフハック大全 p.45 HACK 021「カレンダーは10種類作って組み合わせる」
を参考にして作っています。この方法では、自分の予定をカテゴリーに分けて、それぞれに対応するカレンダーを作成してカテゴリーごとに色分けて予定を管理する方法です。
例:睡眠や食事などはテンプレートカレンダー。予定には動かせるものとそうでないものがあるので、仕事とプライベートの予定を調整可能かどうかで4つのカレンダーに分けして記入するなどして、10種類ぐらいのカレンダーに色をつけて同じGmailで管理しています。テンプレカレンダーとか忘れてはいけない用事は通知設定などつけると便利です。
(私は夜寝る時間から逆算してカフェインを飲んでいい最終時刻とかも通知してます)
趣味などで習慣的に行いたいものはゴール機能を利用
これは最近使い始めたので、まだレビューできる段階ではないですが、趣味とか運動など習慣的に何かをしたい場合に便利そうです。人工知能が設定した時間と回数をカレンダーの予定の空いているところに入れてくれるので自分の時間を守るのにいいです。また、実行したかどうかなどを学習するので、どんどんに自分にあったスケジューリングをしてくれるようになるっぽいです。
スケジュールの作成頻度と更新
スケジュールを作るのも重要なタスクの一つです。私は以下のようにしてスケジュールの作成と更新をしています。
- 日中に判明した仕事や約束などはその都度記入
- 月初めにその月のタスクのDLを確認。自分の専用の(早めの)DLを記入
- 金曜日に来週のタスクの確認(追加記入)
- 前日にその日のタスクのセーブと翌日のスケジュール詳細を記入
(*特にテキトーにセーブしてるものは名前とかフォルダ整理とかちゃんとする - 当日にロードして仕事する
- 仕事には基本的に通知機能をつけて後述する基準と比較して、優先度が勝ればその仕事に移行する
- 予定にはバッファを設けておいて、先送りした仕事はそこに記入する
(その日の夜、あるいは先送りしたそのときに)
(*タスクは基本的に「やるもの」と考え、そうでないものはタスクではなく、リマインダーにバッチ処理で書いとく)
通知機能と基準に照らしてタスクを実行
不確実な予定なので割り込みに対しては、その時々に適切な目標と最適戦略(基準)で対応する
スケジュールができたら、あとは通知機能などを利用してタスクを実行していきます。その都度「割り込み」のタスクなどがある時は基準に照らし合わせて実行するタスクを選択します。その時にできないものはバッファに移行します。
1. 優先度を保ちつつ合計所要時間
(自分の仕事を待つ人が待つ時間の合計)を減らしたいなら
- 処理時間順重みつけバージョン
新しい仕事が生じるたびに、その重要度を完了するまでの所要時間で割って、今やっている仕事より、新しい仕事の方が重みが大きければ新しい仕事に移る。そうでなければ今の仕事をして新しい仕事は先送りにする
単に合計所要時間を減らしたいなら
- 処理時間順
2. できるだけ納期を守りたいなら
- 最早納期優先
納期の近いものから片付けていく
3. 時間が足りない条件で納期を守れる数を最大化したいなら
- ムーアのアルゴリズム
最早納期優先と同様に納期の近いものから片付けつつ。もっとも時間のかかるタスクの一つを破棄する(このタスクをどうするのかは知らない)
4. とにかく優先度の高いものからしたいなら
- 優先度順
などを場面に応じて使い分けてタスクを処理していく
タスクのやり方
・2分以内のタスクはすぐ実行
タスク処理の時は2分以内で終わりそうなら、すぐ処理してしまいます。
(先送りしてまた見直したり、リマンダーに書く時間があるならパッと実行する方が早いので)
・2分以上かかるタスクはプロジェクト管理
それ以上かかるものはリマインダーでプロジェクトとして
細かいタスクに分けて処理していきます。
例:「発表資料の修正」というタスクに取り掛かる場合。リマインダーに「発表資料修正」というプロジェクト(フォルダ)を作り、そこに具体的な「図の位置ズレを修正する」、「○ページ目の図を△の図と入れ変えてキャプションをつける」と言ったアクションを書いていきます。(ただし数秒でできるものはその場でやりますが)
そうすることで、考える時間と手を動かす時間を分けることができて脳に無駄な負荷がかかりません。
スケジューリング上 大事なこと
- 飽きない、あるいはタスクに取り組むための自分マネジメント
私の場合はタスクをする時間があっても、なんとなく面倒でやりたくないと思う事が多いので、何かインセンティブを設計したり飽きないというか、そのタスクを通知が来た時にちゃんとやるための仕組みを用意しておくのが重要。そのためにもタスクの数は減らしてインセンティブに当たられる時間やお金を置いておくことが必要。
- 先行制約と優先度逆転を意識してタスクをする
スケジューリングにおける先行制約という考え方は目から鱗でした。 別のタスクが完了しないと次のタスクに移れない状況の時、「先行するタスクの重要度は後のタスクの重要度と同じかそれ以上と考えるしかない。」と言う話です。
例:溶液調整とか顕微鏡のピント合わせとか、重要な実験のためには色々「つまらない作業」があるが、これらの作業の重要度はのちの実験と同じだと思ってやるべき
そう考えると日常の色んな面倒なことが重要なものに思えてきます。
- 割り込み
リマインドで開始時間に来たら、新しい仕事と今やってる仕事を基準に従って比較してその都度処理していく「割り込み」で最高ではないが、最良なスケジューリングはできるかも
- 割り込み(コンテキストスイッチ)もただではない
割り込みは不確実性のあるスケジューリングにおいて重要な先約ですが、割り込みによってタスクを中断する際はセーブが必要です。次に戻ったときにすぐに仕事に戻れるようにするためにロードしやすい、リプログラミングしやすくセーブするのが必要があります。しかし、この作業はメタワーク(周辺業務)であり、仕事が前に進むものではありません。コンテキストスイッチが入るたびにメタワークは必要となります。特にプログラミングや本の執筆など全体を把握しながら行う仕事をするにはコンテキストスイッチのたびに大きなメタワークが必要となります。
そう考えると、メタワークのコストが大きい仕事は中断されにくい時間と場所を選ぶ必要があります。
- コンテキストスイッチの時はセーブが大事
割り込み仕事について基準で比較したのち、できない方はGoogleカレンダーのバッファに入れる。優先度の低いものはリマインダーのバッチ処理に入れて暇な時に処理します(あるいは捨てます)
- メモリとスラッシング
マルチワークをすると(実際はシングルワークを行き来する。PCと同じ)メタワークが増えるし、次にするどの仕事をするのか選ぶのにもメモリが使われます。またキャッシュは今やってる仕事を覚えるためなので、コンテキストスイッチのたびに消去されるので、思い出すのにさらにメタワークが増えます。そしてメモリのキャパを超えるとひたすらメタワークすることになり、スラッシングしてシステムダウン(思考停止)になります。
- 応答性とスループットはトレードオフ
応答性をあげればスループットは落ちるので、できるだけマルチタスクを行き来するときは最低限の応答性を担保しつつもできるだけ、1つのタスクをする時間は長くする方が効率が良いです。なので、メールのチェックは何件かたまるのを待ってまとめて行うとかがいいです(応答性は最低限保ちつつ)
SNS, mail, telの通知は10分に一回とかあらかじめまとめておいても便利です。
- スケジューリングのタイミング
月・週・日のスケジューリングは優先度「最高」にして「割り込み」がないだろう時間に設定して通知し、実行します。
ちゃんとできるようにインセンティブも設計しておく必要が私の場合はあります。
*日中出てきたものは、基本はその都度に行う。遅くてもその日のセーブの時間に。
この記事内の用語の定義
セーブ:ゲームのセーブと一緒で、今日の仕事を次にロード(呼び出し)あるいはリプログラミンング(編集)しやすい、状態にすること。基本的にはコンテキストスイッチのたびにやっているはずだが、できてない部分はここでやる。あと日のスケジューリングはここで行う。
ロード:セーブしてたスケジューリングを確認すること。
マルチワーク:複数のタスクの間をいったりきたりすることで「同時に複数の仕事をしているように見える」状態で仕事をすること。
コンテキストスイッチ:タスクの種類が変わる。休憩を取るなどして集中が一旦時切れて、また戻ること。コンテキストスイッチの際には過去の仕事を思い出したり資料を読んだり、机を片付けたりするメタワーク(周辺業務)というコストが伴う。
メモリ:自分の頭の処理能力のこと
キャッシュ:短期記憶のようにタスク中だけ覚えていられる記憶。コンテキストスイッチがあると失われる。
スラッシング:マルチワークによるタスクが増えすぎてコンテキストスイッチのためのメタワーク(周辺業務)にメモリが使い切られてリアルワーク(実質仕事)が何もできなくなった状態。またはさらにタスクが増えすぎたせいで思考停止になっている状態。
今回はここまでです。
最後までお読みいただいてありがとうございました。
コメントをお書きください