ぽんぽこ日記

プログラミング、読書、日々の生活

Org-modeでタスク管理をする場合のベストプラクティス

初めに

筆者は20年来のEmacsユーザですが、ここ数年はカスタマイズもせず、昔ながらの使い方しかしてきていませんでした。しかし最近XCodeとEmacsを行ったり来たりするのにうんざりして、この記事のようなカスタマイズをしたことを皮切りに、いろいろなパッケージを試し始めました。

なかでも自分の仕事の生産性向上に大きく寄与したのがorg-modeです。org-modeには多彩な機能がありますが、私は専らタスク管理のツールとして、使っています。

org-modeはあまりにも多機能で、自由度が高いが故に、なかなか使いこなすには至りませんでしたが、自分なりのベストプラクティスを編み出したので紹介してみます。

なお、この方法に比較的向く人は、下記のような人かと思うので、事前にあげておきます。

  • 仕事は終日、少なくとも8割方PCの前に向かって作業する人
  • コーディングその他作業は出来るだけEmacsで行っている人

筆者の会社では、多くのソフトウェア開発会社と同様、定期的にプロジェクトごとにかかった工数を算出して、開発原価を管理しています。開発者には、どのプロジェクトにどれだけ稼働をかけたかを週次で報告することが義務づけられています。

いろいろなタスク管理手法・ツールを試してみましたが、タスクのステート管理をしてくれるものは多いものの、時間計測まで行ってくれるものは少なく、備わっていたとしてもわざわざそのアプリを立ち上げたり、Webの場合はブラウザでそのサイトに行ったりといった手間がおっくうで結局続きませんでした。

Emacsを集中的にカスタマイズする中、org-modeの存在を知りました。当初は試行錯誤したものの、この3ヶ月間org-modeをタスク・工数管理に使ってきましたが、今後も続けていけそうな気がしています。
org-modeを使った場合、タスクの洗い出し→タスクの実行→時間計測→集計が、日頃の作業で使っているEmacs上で出来ることが、続いている理由ではないかと思います。

準備

まずタスクを集約させるorgファイルを指定します。

(setq org-default-notes-file "~/memo/plan.org")
(setq org-agenda-files (list org-default-notes-file ))

筆者の場合、仕事・プライベート問わず、すべてのタスクは、~/memo/plan.orgに集約させることにしました。

plan.orgの初期状態は

* Inbox
* Events
* プロジェクト
* 作業時間集計

という大項目を書いておきます。

プロジェクトの定義

「プロジェクト」の下に自分がアサインされているプロジェクト名を書きます。

* プロジェクト
** プロジェクトA				:projA:
** プロジェクトB				:projB:
** MTG 
*** グループ定例						  :groupMtg:

「MTG」には所属組織の定例MTGなどを記入します。厳密に言うと「プロジェクト」ではありませんが、筆者の場合タスク管理の目的の一つが稼働時間の集計で、こういったMTGは間接費用として別途識別されるため、ここでは「プロジェクト」のカテゴリーに入れます。

ここで重要なこととして、各プロジェクトにはあとで識別が可能なタグを付けることです。タグはタグ名を「:」(コロン)で囲んでプロジェクト名の後ろに指定します。タグを付けておくと、タグ毎、すなわちプロジェクト毎の稼働時間集計が可能になります。

タスクの記入

各プロジェクトで実行すべきタスクを列挙していきます。各プロジェクトの子項目として、タスクを書いていきます。

* プロジェクト
** プロジェクトA				:projA:
*** TODO ○○機能実装
    DEADLINE: [2010-12-27 Mon]
    CLOCK: [2010-12-15 Wed 11:06]
    SCHEDULE: [2010-12-23 Thu]
    :PROPERTIES:
    :Effort:   90
    :END:
    
*** DONE ××機能実装

** プロジェクトB				:projB:
*** DONE 提案書作成
    CLOCK: [2010-12-13 Mon 13:00]--[2010-12-13 Mon 16:00]
    CLOCK: [2010-12-13 Mon 10:00]--[2010-12-13 Mon 10:07]
    :PROPERTIES:
    :END:
** MTG 
*** グループ定例

「○○機能実装」のタスクの下に「DEADLINE」「SCHEDULE」とあります。このような書式で日付を記しておくと、アジェンダ表示画面に残りの日数と併せて表示してくれるようになります。

「DEADLINE」「SCHEDULE」にはそれぞれショートカットが用意されています。

C-c C-d でschedule -- 実行予定日を設定
C-c C-s でdeadline -- 締め切りを設定します。

タスクの実行と計時

実際にタスクを実行するときは、実行するタスク名のところにカーソルを持って行き、

C-c C-x C-i org-clock-in

と押下します。
すると、
とタスクの開始時間が記録され、モードラインにタスク名と経過時間が表示されます。


個人的には、この、モードラインにタスク名が表示される機能というのがorg-modeによるタスク管理の最大のメリットだと思っています。作業をしているとついつい別のことに関心が行きがちなものですが、いま自分が何をすべきか、どれだけ時間がかかってるかを思い起こさせてくれる「錨(いかり)」のように機能してくれます。

また、作業時間の努力目標(effort)を指定することも出来ます。
effortを設定するには、

C-c C-x e org-set-effort

を押下し、努力目標となる所要時間を分単位か時間単位(HH:MM)形式で入力します。
すると、モードラインに実際の経過時間の横に目標となる時間が表示されます。目標時間を超過すると、経過時間の欄が赤く表示されるようになります。

タスクが終了したら、開始したときと同様、タスクの行に移動して、

C-c C-x C-o org-clock-out

を、押下するか、もしくは、モードラインに表示されるタスク名をクリックして、メニューを表示し、「Clock out」を選択します。

すると、タスクの終了時間と経過時間が記録されます。

集計

稼働時間の集計日が来たら、「* 作業時間集計」の下に、下記のようにdynamic blockを書きます。

#+BEGIN: clocktable :maxlevel 4 :scope file :tags "" :tstart "2010-12-12" :tend "2010-12-19"
#+END:

bynamic block とはorgファイル内でelispプログラムを実行し、その実行結果を「#+BEGIN:」と「#+END:」の間に挿入する機能です。

「#+BEGIN:」と「#+END:」の間で、

C-c C-x C-u (org-dblock-update )

を実行すると、

#+BEGIN: clocktable :maxlevel 4 :scope file :tags "" :tstart "2010-12-13" :tend "2010-12-19"
Clock summary at [2010-12-15 Wed 10:57]

| L | Headline          | Time   |      |      |
|---+-------------------+--------+------+------|
|   | *Total time*      | *6:47* |      |      |
|---+-------------------+--------+------+------|
| 1 | プロジェクト      | 6:47   |      |      |
| 2 | プロジェクトA     |        | 3:40 |      |
| 3 | TODO ○○機能実装 |        |      | 1:40 |
| 3 | DONE ××機能実装 |        |      | 2:00 |
| 2 | プロジェクトB     |        | 3:07 |      |
| 3 | DONE 提案書作成   |        |      | 3:07 |
#+END:

「tags」キーワードに特定のタグを指定すると、

#+BEGIN: clocktable :maxlevel 4 :scope file :tags "projA" :tstart "2010-12-12" :tend "2010-12-19"
Clock summary at [2010-12-15 Wed 10:57]

| L | Headline          | Time   |      |      |
|---+-------------------+--------+------+------|
|   | *Total time*      | *3:40* |      |      |
|---+-------------------+--------+------+------|
| 1 | プロジェクト      | 3:40   |      |      |
| 2 | プロジェクトA     |        | 3:40 |      |
| 3 | TODO ○○機能実装 |        |      | 1:40 |
| 3 | DONE ××機能実装 |        |      | 2:00 |
#+END:

org-modeでは、親項目に付けたタグは子項目に継承して認識されるので、プロジェクトにタグを付けておくと、そのプロジェクトに属するタスクはすべて時間集計の対象となります。

まとめ

ポイントとしては、

  • 上位項目に設定したタグが下位項目に継承されることが、プロジェクト>タスクという階層構造で稼働時間を集計することと整合性が高いこと。
  • モードラインにタスク名が表示されることで意識の集中を促す
  • タスク洗い出しから時間計測まで一貫して行えることでPDCAサイクルが回しやすい

といったところでしょうか。

この方法でタスク管理をやってわかったことは、タスクの計時を始めて作業時間を計測するようになると、たいていの場合1つ1つの作業に自分が予測したより多くの時間がかかっていること、思った以上に注意が散漫になっていることに気がつきました。

参考文献

  • org-mode manual

http://orgmode.org/manual/index.html

  • ソフト会社の心臓

ソフト会社の心臓

  • エンジニアのための時間管理術 筆者の書評

エンジニアのための時間管理術