iSt0ne's Notes

使用Trello提高团队工作效率

Trello由Joel Spolsky创建的Fog Creek公司开发,是一种在线的看板式管理应用程序,从创建以来一直不断改进,已经有多家公司开始使用它来管理敏捷项目。

Trello作为一种看板式的管理应用程序,实现了三种主要概念:看板(Board),用来放置项目相关的内容;
trello board
列表(List),代表内容所处的不同阶段;
trello list
卡片(Card),代表各种工作任务。
trello card

此外,使用这个应用还可以方便地实现以下功能:

  • 将卡片(任务)分配给特定的成员。
  • 在卡片中添加各种格式的附件。
  • 为卡片指定不同的标签加以区分。
  • 在卡片中发起投票。
  • 在卡片中增加检查列表(checklist)。
  • 指定卡片(任务)完成的截止日期。
  • 在卡片列表之间自由地移动卡片。
  • 对看板、列表和卡片归档。

Trello的方便之处还在于他支持快捷键:
trello shortcuts

在日常运维工作中使用下面6个看板进行管理:

  • 当前任务
  • 收件箱
  • 故障管理
  • 研究中的项目
  • 知识库
  • 计划

其中“当前任务”为核心看板,他包含下面几个列表:

  • 接下来的任务–其中包含了接下来要进行的工作,并按优先级排序。 在此将任务分配给小组成员,并通过@小组成员进行通知。
  • 当前任务–当前正在做的任务,小组成员领到任务后就可以将任务从“接下来的任务”列表中移动到这个列表中。并通过标签将任务状态设置为“进行中”。 如果在完成过程中需要等待其他资源,需要将任务状态设置为“等待” 。
  • 检查任务–任务完成后,小组成员将任务移动到此列表,并将任务状态改为“等待检查”。小组长负责检查此列表中的任务,没问题后移动到“完成的任务”列表中。
  • 完成的任务–小组长每周对完成的任务进行一次归档。小组成员可以review此列表中的任务(写周报时非常有用)。

“当前任务”看板中的任务除来源于邮件、Mantis、jira外还来自于下面三个看板:

  1. 收件箱–小组成员将对工作的一些想法添加到收件箱中,每周对这些想法进行讨论,有价值的想法转移到“接下来的任务”中。
  2. 故障管理–运维中的故障通过trello api发送到此看板中,值班人员监控此看板,并解决故障。对于可固化的故障需要将其移动到“当前任务”看板中,通过自动化脚本等进行固化。
  3. 研究中的项目–技术储备看板,对于运维中出现的新技术进行研究,成熟后根据需要部署到线上环境。

所有有价值的卡片完成后都移动到“知识库”看板进行分类,以便于以后查询、参考。

“计划”看板供管理人员使用,对整个运维工作进行方向性描述,成熟后移动到“当前任务”看板进行实施。

工具链:

  1. Boards for Trello Chrome浏览器插件:它能很方便的打开你的看板。在Chrome Store搜索下载后安装。
    boards for trello
  2. Trello-Bookmarklet用于将Mantis、Jira等发送到你的列表中形成卡片。在Chrome浏览器下需要先安装SpellBook,将Trello-Bookmarklet添加为Bookmarklet标签。然后右键->SpellBook->To Trallo->获得Trello api key。之后就可以自由添加card了。
    bookmarklets sent mantis to trello
    get api key
  3. 移动应用:Trello支持iPhone/iPad、Android、WinPad,可以随时随地查看Trello中的任务。
    trello app
  4. Trello Api:通过Trello api可以在事件发生时自动建立卡片。py-trello是一个经过python语言包装后的Trello api,通过他可以很方便的编写python脚本添加卡片。
    ```python
    #!/usr/bin/env python

    -- coding: utf-8 --

import trello

‘’’在‘故障管理’看板的‘故障’列表中添加‘test’卡片’’’

api_key = r’0f3f9a978007f17ee91b6b471e65xxxx’
token = r’07a6975515c5d9583988c36da85cc3f6c98d865885c26cab5772a35b8213xxxx’
board_id = r’5158dab22959f319310036d6’
board_name = ur’故障管理’
list_id = r’5158dab22959f319310036d7’
list_name = ur’故障’
card_name = ur’test’
card_desc = r’test card’

tc = trello.TrelloClient(api_key, token)

print ‘Trello Boards:’
for b in tc.list_boards():
print u’ID: %s, Name: %s, Description: %s, Closed: %s’ \
%(b.id, b.name.decode(‘utf-8’), b.description.decode(‘utf-8’), b.closed)

board = trello.Board(tc, board_id, board_name)

print ‘Trello Lists:’
for l in board.all_lists():
print u’ID: %s, Name: %s, Closed: %s’ % (l.id, l.name.decode(‘utf-8’), l.closed)

list = trello.List(board, list_id, list_name)

card = list.add_card(card_name, card_desc)

print ‘Trello cards:’
for c in list.list_cards():
print u’ID: %s, Name: %s, Description: %s, Closed: %s’ \
%(c.id, c.name.decode(‘utf-8’), c.description.decode(‘utf-8’), c.closed)

Stone:trello dongliang$ python test.py
Trello Boards:
ID: 5157d0f3c1aff4504a0025cb, Name: 当前任务, Description: , Closed: False
ID: 5157cbac5a67bd3c4a0023dc, Name: 收件箱, Description: , Closed: False
ID: 5158dab22959f319310036d6, Name: 故障管理, Description: , Closed: False
ID: 5158db00b508607146003391, Name: 知识库, Description: , Closed: False
ID: 5157d7510162359b6b002485, Name: 研究中项目, Description: , Closed: False
ID: 5157d104c405e861130026c2, Name: 计划, Description: , Closed: False
Trello Lists:
ID: 5158dab22959f319310036d7, Name: 故障, Closed: False
ID: 5158dab22959f319310036d8, Name: 处理中故障, Closed: False
ID: 5158dab22959f319310036d9, Name: 完成处理的故障, Closed: False
Trello cards:
ID: 5160148c14e18d7f5a000666, Name: test, Description: test card, Closed: False
```
参考资料

Wrappers

Tools Using the client-side library (client.js)

Misc