使用Org-mode + taskjuggler进行项目管理

Emacs自带的Org-mode可以说是包罗万象,包括了日程管理、GTD、大纲、PPT生成、web页面生成以及文学编程等等强大的功能。如果搭配上taskjuggler的话,它还能胜任项目的管理的工作,而且必要的调度、规划、资源配置等能力都具备。

配置

先安装taskjuggler:

1
$ gem install taskjuggler

然后我们需要让Org-mode支持.tjp文件格式的导出,这里要安装org-plus-contrib插件。在你的.emacs或者其他配置文件中写入下面的内容:

1
2
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
(require 'org-plus-contrib)

然后开启Emacs安装上org-plus-contrib

1
2
3
M-x package-refresh-contents ⤶
M-x package-install ⤶
org-plus-contrib ⤶

其实对我们重要的只是这个插件中的ox-taskjuggler.el文件,我们可以根据我们的需要修改这个.el文件的编译方式并重新编译M-x byte-compile-file,比如开启priority功能:

1
2
3
4
5
6
7
;; 位于~/.emacs.d/elpa/org-plus-contrib-YYMMDD/ox-taskjuggler.el
;; 在类似下面代码的地方,加入priority
(setq org-taskjuggler-valid-task-attributes
'(account start note duration endbuffer endcredit end
flags journalentry length limits maxend maxstart minend
minstart period reference responsible scheduling
startbuffer startcredit statusnote chargeset charge priority)

更通用的.emacs配置需要修改报告的格式、法定节假日等内容。如果需要支持中文还要额外配置一下,总体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
(setq org-taskjuggler-default-reports
'("textreport report \"Plan\" {
formats html
header '== %title =='
center -8<-
[#Plan Plan] | [#Resource_Allocation Resource Allocation]
----
=== Plan ===
<[report id=\"plan\"]>
----
=== Resource Allocation ===
<[report id=\"resourceGraph\"]>
->8-
}
# A traditional Gantt chart with a project overview.
taskreport plan \"\" {
headline \"Project Plan\"
columns bsi, name {width 350}, start, end, effort, chart {scale week width 800}
loadunit shortauto
hideresource 1
}
# A graph showing resource allocation. It identifies whether each
# resource is under- or over-allocated for.
resourcereport resourceGraph \"\" {
headline \"Resource Allocation Graph\"
columns no, name, effort, annualleave, complete, weekly {width 700}
loadunit shortauto
hidetask ~(isleaf() & isleaf_())
sorttasks plan.start.up
}")
)

(setq org-taskjuggler-default-global-properties
"
shift s40 \"Part time shift\" {
workinghours wed, thu, fri off
}
leaves holiday \"National Day\" 2021-10-01 +5d,
holiday \"Dragon Boat Festival\" 2021-06-12 +3d,
holiday \"Mid-Autumn Festival\" 2021-09-19 +2d
")

(setenv "LC_ALL" "zh_CN.UTF-8")
(setenv "LANG" "zh_CN.UTF-8")
(setenv "LANGUAGE" "zh_CN.UTF-8")
(setenv "LC_COLLATE" "zh_CN.UTF-8")
(setenv "LC_CTYPE" "zh_CN.UTF-8")
(setenv "LC_MESSAGES" "zh_CN.UTF-8")
(setenv "LC_MONETARY" "zh_CN.UTF-8")
(setenv "LC_NUMERIC" "zh_CN.UTF-8")
(setenv "LC_TIME" "zh_CN.UTF-8")

项目管理模板

一个项目重点包含taskresource两部分,任务部分详细描述一个任务的工作量与前置条件,资源部分则描述资源的类型、效率已经假期等内容。更详细的关键字需要查阅taskjuggler相关手册,包括:

  • Effort,表示需要的工作时,而不是日历时
  • BLOCKER,前置工作
  • efficiency,表示资源的效率,默认1.0。设置举例:如果一个人顶三个,则设置为3.0即可
  • priority,任务优先级,0~1000之间的整数,如果资源数小于当时需要被配置的任务数时,则根据优先级自己安排
  • limits,最大工作时间
  • leaves,请假
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#+PROPERTY: Effort_ALL 2d 5d 10d 20d 30d 35d 50d
#+PROPERTY: allocate_ALL dev doc test
#+COLUMNS: %30ITEM(Task) %Effort %allocate %BLOCKER %ORDERED

* 开发一款操作系统 :taskjuggler_project:
:PROPERTIES:
:start: 2021-5-20
:END:

** Research Review: 文献与源码理解、调研
:PROPERTIES:
:Effort: 3d
:task_id: review
:priority: 1000
:allocate: doc
:END:

** Project Proposal: 方案、架构、风险
:PROPERTIES:
:Effort: 1d
:task_id: proposal
:priority: 800
:BLOCKER: review
:allocate: doc
:END:

** Software Development
:PROPERTIES:
:ORDERED: t
:BLOCKER: previous-sibling
:priority: 1000
:allocate: dev
:END:

*** OS Kernel POC
:PROPERTIES:
:Effort: 11d
:task_id: osk_poc
:END:

*** OS Kernel Stable
:PROPERTIES:
:Effort: 21d
:task_id: osk_stable
:END:

*** GUI与基本功能开发
:PROPERTIES:
:Effort: 20d
:task_id: osk_basic
:END:

*** 自带小应用开发
:PROPERTIES:
:Effort: 11d
:task_id: os_app
:END:

** Software Evaluation
:PROPERTIES:
:ORDERED: t
:allocate: test
:END:
*** Testing
:PROPERTIES:
:Effort: 25d
:BLOCKER: proposal
:task_id: test
:END:

*** Evaluation
:PROPERTIES:
:Effort: 25d
:task_id: eval
:END:

** Milestones
*** 给个调研报告;OS Kernel POC 方案
:PROPERTIES:
:task_id: start
:BLOCKER: proposal
:END:

*** 跑通OS Kernel,确定测试方案
:PROPERTIES:
:BLOCKER: osk_poc
:END:

*** OS支持基本调度、内存管理等核心功能
:PROPERTIES:
:BLOCKER: osk_stable
:END:

*** 支持基本可用的小程序
:PROPERTIES:
:BLOCKER: osk_basic
:END:

*** 完成开发
:PROPERTIES:
:BLOCKER: os_app
:END:


* Resources :taskjuggler_resource:
** Developers
:PROPERTIES:
:resource_id: dev
:END:
*** Zhen Yi
:PROPERTIES:
:resource_id: zhenyi
:efficiency: 0.5
:END:

** Others
*** ZY for Doc
:PROPERTIES:
:resource_id: doc
:limits: { dailymax 2.0h }
:END:
*** ZT for Test
:PROPERTIES:
:resource_id: test
:efficiency: 0.5
:END:

效果

有三种方式创建.tjp文件,创建后可以用命令tj3生成网页。在版本3以后已经没有Native的GUI了,我们只有web模式,可更容易适配多个平台:

1
2
3
M-x org-taskjuggler-export                   ;; 创建.tjp文件
M-x org-taskjuggler-export-and-process ;; 创建.tjp文件,调用tj3命令生成页面
M-x org-taskjuggler-export-process-and-open ;; 创建.tjp文件,调用tj3命令生成页面,并打开

甘特图

资源配置图