タスク管理ツールを作る - 要件

そろそろタスク管理をしないといけないトシになってきた。個人的には、タスク管理をして"頭がスッキリ"というのは創造性を殺すので反対なんだけど、仕事が多いものはしょうがない。

タスク管理ツールの要件

いろいろと探し回ったけど良いのが見当たらない。かといってhowmのような単機能なツールだと他と連携させづらい。

  • デジタル化する

大昔はいわゆるカードやメモでタスク管理をしていたけど、仕事の殆どはメールなりbugzillaなりなんなりで来るので転記で起こる問題は避けたい。というわけでデジタルなソースからタスクをすぐに(ないし、自動的に)作成できるのは必須。
紙なり何なりに手でアウトプットするのは作業を認識するのに必要なステップだけど、そういう暇は無いので割り切りポイントでもある。タスクの分割を要求するのは悪くない代替だと思うけど、実際にやってみないとなんとも。

  • タスクを分解/連携できる

一般に一つのタスクは非常に細かいステップに分解できる(少なくとも、いわゆるポモドーロ・テクニックなど多くの手法はこれを推奨している)。なので、一つのincommingタスクを複数のタスクに分割して記録できることは重要と言える。
タスクの依存関係も処理できることが好ましい。優先順位をつけるのに役立つ。

  • 時刻情報を持つ

非常に当たり前だが、タスクには締め切りの類が当然有るので時刻情報を管理しないといけない。
会議のようなスポット的な予定も有る。

  • タスクを"フォアグラウンド"にできる

"いつ"そのタスクに取り組んでいたのか/完了または保留したのかを記録しないと、タスクの重みが分析できない。
タスク管理を行う重要な目的はレビューの効率化で、(週次)レビューを行う時に必要な情報が一発で揃わないといけない。全てがソースコードで完結していれば良いけど、ドキュメンテーションのようにdiffを取りづらい性質のものも多い。

FOSSだとMLなりなんなりで議論が有るが、face to faceのプロジェクトでは明示的に議論を保持しないといけない。なので、これとコミットを結びつける上手い手段が必要になる。
タスクを"フォアグラウンド"にできることによって、フォアグラウンドタスクの処理中に発生した自分のコミットを記録するだけで目的が達成できる。

情報は持ち出したりコピーしたり出来ないものも有るので、realmに分割して閉じたシステムを構築出来るようにしている必要がある。複数の端末を同期させるときに、dropboxのような外部のサーバに頼ることも出来ない。
複数のrealmを同時に管理できることが望ましい。"nmosh開発realm"とか"日常realm"(= 牛乳買って帰る)のように他のrealmも考えられる。nmosh開発realmは外部に公開すると面白いかもしれない。
realmを超えた連携は今のところ考えない。realmは細かく分割される必要は無く、純粋に公開範囲だけの問題になる。このシステムをグループウェアにする場合は多少の考察が必要かもしれない。

デザイン

UIは複数ページに別れる。もっとも、最初の実装はいわゆるdumb端末で行うので見た目はページでない。

  • Topic ページ

Topicページは現在取り組んでいるタスクに関する情報を表示する。

 Topic: Implement libssh2 proxy library

 Start: 15min ago

 tasqnet> 

このページからtopicを変えたりタスクを完了したりする。

 Topic: Implement libssh2 proxy library

 tasqnet> complete

  git commit
    A: xxxx - ssh2: add proxy library
    S: xxxx - ssh2: add libssh2 proxy test
 tasqnet> checkin AS
 tasqnet> leave

タスクを完了すると、topic期間付近でのコミットを列挙してタスクにコミットを関連づけることができる。(AやSは行指定用のマーク。A-H^Dのようにして、AからH但しDを除く のように指定する。)
topicはpushやpop、switchを行える。取り組んでいるトピックの切り替えは多くのテクニックで推奨されていないが、僕は下っ端なので割り込みを減らすのは現実的でない。

  • Incomming ページ

タスクの元になるBug投稿やメールはIncommingページでリストされる。

 Incomming: 2012 8/22 13:07 (1/304)
 A: BZxxxxx: Cannot connect ssh server
 S: BZyyyyy: blah blah ...
 D: BZzzzzz: blah blah ...
 F: Takamura: [Desktop] Question about desktop client
 H: ....

 tasqnet> A
(Aのエントリが表示される)
 tasqnet> task A -- fix libssh2 proxy bug in Linux i386 host (タスクの新規作成)
  • Table ページ

"テーブル"に載っているタスクを一覧するページ。このページからタスクをtopicに遷移させる。
テーブルには基本的に1週間とか1日分の期間で取り組みそうなタスクや予定を載せる(期限のあるタスクは自動で載る)。
Tableとtopicだけはアプリケーションのトップレベルに位置し、realm間で共有される。

  • Task ページ

システムに記録されたタスクをqueryするためのページ。テーブルに載せたり、タスクを編集するなどもここから。

タスク

早速、このシステムをエミュレートしてみる。

  • UI詳細の検討
    • タスク間の依存関係を確立するコマンドとその方法
    • タスクからBugを起票したりメールを出したりを記録する方法
    • タスクの絞込み検索の方法
  • 対話ライブラリの作成 - プロンプトを出したり、TAB補完するなどは他のアプリケーションでも有用なのでライブラリ化する。netshみたいなのを創れるように。
    • パスワード入力モードも必要
  • メールfetch手段の作成
    • libcurlプラグインの作成 - とりあえずlibcurlがIMAPをアクセスできたはずなのでそれを試してみる
  • Webソース取り込み手段
    • HTTPパスワードを暗号化して保存する方法? - めんどくさいのでとりあえずGPGを使う
  • libgit2プラグインの作成
  • エディタ起動I/Fの作成
  • 日本語入力の検討
  • データファイル構成の検討