第 4 章 面向团队开发的工具

前面我们用 3 章的篇幅学习了个人如何搭建开发环境以及开发应用。独立开发的时候,保存源码等工作完全可以按照自己喜欢的方法来,而且各种信息和点子直接写到自己的笔记本上就好。

那么,一个由多人组成的团队应该如何进行开发呢?首先,开发出来的成品需要在所有成员间共享。然后,还要有一个用来测试开发成品的环境。另外,需求和技术等信息也必须共享给所有成员,而且成员间交流的场所也必不可少。

本章将以提高团队开发效率为目的,为各位介绍团队开发环境的搭建过程以及一些有用的工具。

4.1 问题跟踪系统

要想让团队开发顺风顺水,首先就要把握每个开发任务的负责人是谁、开发进展到了什么程度等信息,并把这些信息整理起来。在这类任务管理工作上,问题跟踪系统(Issue Tracking System,ITS)是一把好手。

我们可以将开发中的任务添加到问题跟踪系统,然后用该系统来追踪、管理这些任务的状态。多数问题跟踪系统会以问题(Ticket)为单位进行项目管理。一般情况下,我们会把工作任务以问题的形式添加到问题跟踪系统,而不是单纯拿它来管理项目。

问题跟踪系统可以给问题添加状态(新建、进行中、解决、结束、驳回等),设置优先级(紧急、高、普通、低)、负责人、日期等,并且允许用户通过搜索查看信息一览,让我们能随时把握项目的开发情况。

将作业分割成一个个任务,再将任务分配给问题进行管理,这种开发手法称为问题驱动开发(Ticket Driven Development,TiDD)。它与敏捷开发有着很好的相容性,因此在近年来的开发中人们逐渐开始实践这种手法。关于问题跟踪系统的实际运用以及问题驱动开发的相关知识,我们将在第 5 章中进行学习。

4.1.1 Redmine

接下来,我们来了解一款问题跟踪系统——Redmine1。Redmine 是一款开源的问题跟踪系统,它以管理项目内的任务和 Bug 的问题功能为中心,兼具服务于团队开发的功能,比如与 Wiki 和版本控制系统的联动等。

1http://www.redmine.org/

4.1.2 安装Redmine

现在我们来安装 Redmine。首先要安装的是 Web 服务器(Apache)和 Passenger(运行 Rails 应用所需的 Apache 模块)(LIST 4.1)。

LIST 4.1 安装 Apache

  1. $ sudo apt-get install -y apache2 libapache2-mod-passenger

然后安装数据库 MySQL(LIST 4.2)。

LIST 4.2 安装 MySQL

  1. $ sudo apt-get install -y mysql-server mysql-client

在安装 MySQL 的过程中,需要设置 MySQL 的 root 用户密码(图 4.1、图 4.2)。这个密码在随后安装 Redmine 时会用到。

{%}

图 4.1 MySQL 的密码设置

{%}

图 4.2 MySQL 的密码设置(确认)

接下来安装 Redmine(LIST 4.3)。

LIST 4.3 安装 Redmine

  1. $ sudo apt-get install -y redmine redmine-mysql

安装过程中会显示数据库设置的相关界面,请选择“是”(图 4.3)。

{%}

图 4.3 数据库设置

下一步选择我们要使用的数据库。这里选刚才安装的 MySQL(图 4.4)。

{%}

图 4.4 选择数据库

输入 MySQL 数据库管理员的密码。这里输入刚刚安装 MySQL 时设置的密码(图 4.5)。

{%}

图 4.5 管理员密码输入界面

最后设置 Redmine 专用的 MySQL 应用密码。设置加上确认,密码总共要输入两遍(图 4.6、图 4.7)。

{%}

图 4.6 设置 MySQL 应用密码

{%}

图 4.7 确认 MySQL 应用密码

至此,Redmine 安装完毕。

4.1.3 Redmine 的设置

要想通过 Web 浏览器访问 Redmine,需要更改 Apache 的设置,所以接下来我们修改 Apache 的设置文件。LIST 4.4 中的设置将这个 Web 服务器设置成了 Redmine 专用。

LIST 4.4 修改 Apache 的设置文件

  1. $ sudo vi etcapache2/sites-available/000-default.conf

替换 000-default.conf 的如下部分(LIST 4.5)。

LIST 4.5 000-default.conf 的修改

  1. DocumentRoot varwww/html
  2. DocumentRoot usrshare/redmine/public

Redmine 需要一个名为 bundler 的工具,以管理 Gem 包,所以我们还需要安装 bundler(LIST 4.6)。

LIST 4.6 安装 bundler

  1. $ sudo gem install bundler --no-rdoc --no-ri

为保证我们能通过 Apache 对 redmine 目录下执行写入操作,需要修改文件的所有权(LIST 4.7)。

LIST 4.7 变更文件的所有权

  1. $ sudo chown -R www-data:www-data usrshare/redmine

至此,所有设置结束,我们重新启动 Apache(LIST 4.8)。

LIST 4.8 重启 Apache

  1. $ sudo service apache2 restart

如果要把 Redmine 安装在客 OS 上,然后通过本地环境(主 OS)的 Web 浏览器浏览界面,则必须设置端口转发。方法与附录 B.2 一样,需要在 VirtualBox 的端口转发设置中添加一行设置:主机端口(TCP)8000、子系统端口 80(图 4.8)。

{%}

图 4.8 VirtualBox 端口转发设置

现在各位可以打开浏览器访问 http://127.0.0.1:8000/,看看是否能显示出 Redmine 的界面。如果全部设置正确,各位应该会看到如图 4.9 所示界面。

{%}

图 4.9 Redmine 的初始界面

怎么样,看到 Redmine 的界面了吗?

在初始状态下,管理员只要在用户名和密码处都填入 admin 即可登录。请各位登录管理员用户,修改 Redmine 的各项设置。

4.1.4 插件

Redmine 有多种用来扩展功能的插件。下面我们挑几个比较好用的来了解一下。

Redmine reStructuredText Formatter

Redmine reStructuredText Formatter2 用来将问题和 Wiki 的语法从标准 Textile 转换为 reStructuredText(reST)。

2https://github.com/ebrahim/redmine_restructuredtext_formatter

具体使用哪种语法,我们可以按照团队的喜好来定。用 reST 描述的好处在于方便用 Sphinx 整理文章。我们将在第 7 章中学习 Sphinx 的相关内容。

SCM Creator plugin

使用 SCM Creator plugin3 之后,我们就可以通过 Redmine 给项目创建版本库了。

3http://www.redmine.org/plugins/redmine_scm

这个插件的安装和设置请参考 4.2 节。

Slack chat plugin

导入 Slack chat plugin4 之后,Slack 聊天系统将能够接收 Redmine 中的问题更新通知。关于 Slack,我们将在 4.3 节进行了解。

4https://github.com/sciyoshi/redmine-slack

Issue Template plugin

使用 Issue Template plugin5 可以为每种问题分别设置模板,以便开发团队成员明白哪种问题该描述些什么。比如,我们给 Bug 问题设置了模板后,就可以有效防止漏记项目。

5http://www.r-labs.org/projects/issue-template/

Issue Template plugin 的安装和使用方法请参考 5.2 节。

4.2 版本控制系统

在进行团队开发时,我们需要一个地方来集中管理和共享各成员的开发成果。另外,在团队开发的过程中,程序内难免混入 Bug,这就需要对开发成果进行历史管理,以便追踪并掌握 Bug 混入的时间点。

在这一点上,版本控制系统(Version Control System,VCS)能提供很大帮助。顾名思义,版本控制系统就是用来管理源码等内容的开发历史的。当今的版本控制系统主要有集中式的 Subversion 和分布式的 Mercurial、Git。本书选用的是 Mercurial。

Redmine 和 Mercurial 都是面向团队开发的工具,这里将学习如何把它们结合在一起使用。Mercurial 的安装与简单的用法请参考第 1 章,实用性用法请参考第 6 章。

4.2.1 Mercurial 与 Redmine 的联动

如果让版本控制系统和问题跟踪系统两个系统联动起来,可以明确源码的变更和问题之间的对应关系,让二者相得益彰。现在我们就来了解一下 Redmine 和 Mercurial 的联动方法。

如果各位的服务器上还没有安装 Mercurial,那么需要先安装 Mercurial,然后重启 Redmine(LIST 4.9)。

LIST 4.9 安装 Mercurial

  1. $ sudo pip install mercurial
  2. $ sudo service apache2 restart

以管理员身份登录 Redmine,设置版本控制系统。

在图 4.10 所示的配置界面选择“版本库”标签页,勾选“启用 SCM”中的相应系统然后保存。这样我们就可以使用选中的版本控制系统了。

图像说明文字

图 4.10 Redmine 的版本库配置界面

4.2.2 用于生成版本库的插件

虽然实现版本控制系统的联动就可以了,但是我们还希望能直接从 Redmine 创建版本库,这样会更加方便。为此,我们还要安装 SCM Creator plugin6 并进行设置。

6http://projects.andriylesyuk.com/projects/scm-creator

首先创建一个用于生成版本库的目录(LIST 4.10)。这里我们用的目录为 varlib/hg,然后更改它的所有权,让我们能从 Redmine 对它进行写入操作。

LIST 4.10 创建用于版本库的目录

  1. $ sudo mkdir varlib/hg
  2. $ sudo chown www-data:www-data varlib/hg

然后创建设置文件 usrshare/redmine/config/scm.yml(LIST 4.11)。下例是最低限度的设置。关于设置项目的详细资料,请参考该插件的 Web 页面。

LIST 4.11 scm.yml

  1. production:
  2. deny_delete: false
  3. auto_create: true
  4. force_repository: false
  5. max_repos: 0
  6. only_creator: true
  7. allow_add_local: false
  8. allow_pickup: false
  9. mercurial:
  10. path: varlib/hg
  11. hg: usrlocal/bin/hg

插件的安装流程如 LIST 4.12。需要先将下载好的插件解压到 Redmine 的 plugins 目录下,然后执行 rake 命令构建。

LIST 4.12 安装 SCM Creator plugin

  1. $ sudo mkdir usrshare/redmine/plugins
  2. $ wget http://projects.andriylesyuk.com/attachments/download/563/redmine_scm-0.5.0b.tar.bz2
  3. $ sudo tar xfj redmine_scm-0.5.0b.tar.bz2 -C usrshare/redmine/plugins/
  4. $ cd usrshare/redmine/
  5. $ sudo chown -R www-data:www-data plugins/redmine_scm/
  6. $ sudo rake redmine:plugins:migrate RAILS_ENV=production
  7. $ sudo service apache2 restart

重启 apache2 后,插件将被自动加载。我们可以在图 4.11 所示的配置界面里看到插件正常加载的信息。

图像说明文字

图 4.11 Redmine 的插件配置界面

接下来新建一个项目。选择界面左上方的“项目”,然后点击“新建项目”进入新建项目界面(图 4.12)。要记得先指定 SCM(这里指定为 Mercurial)再创建项目。

图像说明文字

图 4.12 新建项目界面

查看刚刚创建好的项目的配置界面,可以看到“版本库”标签页中已经生成了 Mercurial 的版本库(图 4.13)。

图像说明文字

图 4.13 版本库配置界面

至此,Mercurial 与 Redmine 的联动就实现了。

4.3 聊天系统

在团队开发中,必须保证报告、联络、探讨这些交流能顺利进行。说到交流,一般不是面对面开会就是邮件往来,然而面对面开会时,其内容很难与不在场的成员共享,而邮件又难以保证效率。聊天系统则能扬长避短,轻松实现远程实时对话以及团队内信息共享。

聊天系统种类繁多,比如 Skype、Slack、LINE、IRC 等。这里我们来了解一下 Slack7。

7https://slack.com/

4.3.1 Slack

Slack 是一款面向企业和团体的交流工具。除了可以进行一对一的对话之外,还能创建多个频道、内部群组等聊天室,让多名团队成员同时参与对话(图 4.14)。

{%}

图 4.14 Slack

这项服务在 2013 年才刚刚起步,但由于其导入简单、使用方便而广受人们青睐,如今已被许多企业和团体使用。

4.3.2 Slack 的特点

下面我们来了解一下 Slack 的主要特点。

能轻松导入的 Web 服务

虽然 Slack 有专用的客户端,但其很大程度上是基于 Web 的,所以能脱离客户端直接通过浏览器使用。它不像 IRC 那样需要准备服务器,再加上采用了免费增值模式,因此可以免费使用。导入和使用几乎零成本是它的巨大优势。

能与许多外部服务联动

Slack 可以实现与许多外部服务的联动(Integration)。它标配的 Integration 超过 60 种,其中包括了 Dropbox、GitHub、Google Drive、Twitter 等,我们可以从设置界面轻松地开启某项联动功能。联动的内容因服务而异,以 Google Drive 为例,如果我们在聊天室粘贴了 Google Drive 上的文档的 URL,聊天室内就会自动显示出文档的标题。

Redmine 与 Slack 的联动可由 Slack chat plugin for Redmine8 实现。这是一个要用到 Slack API 的插件,将它导入 Redmine 之后,Redmine 就能向 Slack 的聊天室发送通知了。

8https://github.com/sciyoshi/redmine-slack

除 Redmine 之外,Jenkins、Sentry 也可以向 Slack 发送通知(图 4.15)。Jenkins 直接用标配的 Integration 即可。如果使用 Sentry,则要给 Sentry 安装 sentry-slack 扩展 9。

9https://github.com/getsentry/sentry-slack

{%}

图 4.15 Slack 与 Redmine 和 Jenkins 的联动

通过实时显示问题的更新、向版本库的提交、Jenkins 的构建信息等,既可以方便我们掌握团队成员的工作情况,又可以保留作业日志,对团队开发而言是一种极大的帮助。

可创建 bot

Slackbot 是 Slack 标配的 bot。这个功能会对我们设置的关键字作出反应,然后返回特定的消息。比如,如果希望在有人说“我要回家了”的时候,自动回答“您辛苦了”这句话或者别的话,只要在 Slackbot 中进行相应设置就行了。

如果想进行更加复杂的处理,可以用 Slack 附带的 WebHook 功能来创建自己的 bot。

既然是自己的 bot,那它的用处就全看我们的创造力了。

举个例子,假设我们在 Google Drive 的电子表格里存了测试项目与测试结果的数据一览。现在每次查看测试进展情况都要打开一次电子表格,实在太麻烦,所以我们希望这一流程能实现自动化。这时就可以创建一个 bot,让它在电子表格更新时自动获取测试结果一览,并提交给 Slack。有了这个 bot 之后,团队所有成员都能共享测试的情况,这对团队开发大有助益。

强大的 @ 功能加速团队内的信息传递

Slack 有着强大的 @ 功能,这个功能可以让我们在发消息时指定呼叫某个用户。如果在我们使用 Slack 时,有人发消息并 @ 了我们,那么聊天室列表中会显示通知图标,告诉我们“有人 @ 你”。如果我们当时不在线,该消息内容会以邮件形式进行通知。另外,使用 iOS 或 Android 的 Slack 应用时,通知会显示在终端的通知区域里。由于它会借助各种通知手段来通知,因此我们很难漏掉那些 @ 自己的信息。此外,Slack 还有“@ 一览”功能,供用户查看以往所有 @ 自己的信息。

在 @ 别人时,用户名输入到一半会自动弹出用户名候选列表,我们只要从列表中选择用户名即可。这样一来既可以节省时间,又能防止输错用户名。如果要 @ 聊天室中的所有人,需要用 @channel、@group 等特殊名称。

正因为 Slack 的 UI 发 @ 方便、被 @ 醒目,所以很少会出现“想告诉某人一件事,结果某人没注意到”这种沟通失误。对使用 Slack 的团队开发而言,这绝对是一大优势。

URL 和文件的预览功能

在聊天室贴 URL 或向聊天室上传文件后,成员们能预览其内容。Web 页面的 URL 会显示该页面内的文本,图片的 URL 则会显示图片。上传的文件也是同样道理,文本文件会显示文本,jpg 或 png 等图片文件则会显示图片。

借助于这一功能,我们能很轻松地与团队成员共享图片形式的信息(比如尚在开发中的设计方案)。

其他特点

除上述这些之外,Slack 作为一款聊天系统还具备许多方便的功能和特征。

  • 简洁的 UI

Slack的UI设计简洁明了,让人看一眼就能上手使用。虽然目前(2014年11月)只提供了英文UI,但不懂英语的人用起来也不会有什么障碍。

  • 可读性高的 text snippet

用户可以用text snippet功能在聊天室内粘贴源码。这些源码会以语法高亮的形式显示。

  • 可重复利用的消息记录

Slack会给每一条消息设置永久链接,在引用消息内容时会经常用到这些链接。如果我们想引用某条消息,只要在Slack中粘贴它的永久链接,该消息就会显示在聊天框中。这一功能让我们的消息不再转瞬即逝,而是可以随时拿来重复利用。

  • 类似书签的星标功能

如果有想关注的聊天室或者怕忘记的消息,那么可以给它们标上星星。我们可以在星标一览中查看标记过星星的信息。有了这个功能,再久远的消息也能很快找到。

  • 好用的搜索功能

搜索聊天记录的功能拥有跨频道、跨群搜索以及指定日期等多种选择,能很轻松地找到过去的信息或附件。

  • 可添加自定义表情

Slack允许用户添加自定义的表情用于聊天。我们可以添加上限为128像素×128像素的自定义表情,还可以添加公司或产品的Logo,这给我们带来了意想不到的便利。

收费版

前面我们说过,Slack 采用了免费增值模式,所以用户可以免费使用,但它同时还提供了收费版 Slack。收费版的特征如下。

  • 付费

收费版会根据活动用户数量收取费用。

  • 可设置单频道来宾

收费版可创建只能访问一个频道的免费来宾账户,也就是单频道来宾。在项目需要临时与团队外人员交流时,有单频道来宾会方便许多。

  • 不限制记录保存数

免费版只可以保存1万条聊天记录,但收费版没有这个限制。在交流频繁的时候,往往一天会出现几百条消息,1万条记录最多也就能撑半年。无法保存记录就意味着我们无法参考过去的消息,而收费版就不用担心这个问题了。

  • 不限制 Integration

免费版只能添加5个Integration,但收费版没有限制。

Slack 应用

Slack 为 OS X、iOS、Android 准备了专用的客户端。只要在各个系统的应用商城中搜索 Slack 就能找到。

网页版的 Slack 不支持智能手机,所以 iOS 和 Android 要想使用 Slack 必须安装应用。iOS 和 Android 的 Slack 应用运行起来更快,用户能轻松查看消息通知和发送消息,而且新的消息通知会发送到 OS 的通知区域内,不用担心遗漏重要的事情。

截止到现在(2014 年 11 月),Slack 还没有 Windows 专用的客户端,但 Google Chrome 的“创建应用程序快捷方式”功能可以创建 Slack 的快捷方式,我们可以把它当成专用客户端来用。

4.3.3 Slack 做不到的事

但是,Slack 只能让我们与团队内部成员交流。当我们需要与团队外(公司外)的人进行交流时,必须将对方邀请进 Slack 才行。另外,有些时候让团队外的人使用 Slack 本身就是一件难事,因此可以考虑把 Slack 和普及率较广的 Skype 等软件结合起来使用,以便与团队外的人进行交流。

Slack 还无法语音聊天。有些商讨内容打字聊天说不清楚,而语音会议的效果会好很多,这种时候就可以拿 Skype 等带有语音聊天功能的交流工具来配合使用。

4.3.4 Slack 的注册

Slack 的注册需要在 https://slack.com/ 上进行。虽然注册全程为英语,但中间要输入的东西也就是邮箱地址、用户名、团队名、专用域名、邮箱域名、密码而已,并没有什么难的。创建团队后,Slack 会自动分配一个专用域名给我们(专用域名“.slack.com”)。此后,我们只要访问这个地址,就可以进行登录聊天室等操作了。

给团队设置邮箱域名后,所有拥有该域名邮箱的人都可以创建自己团队的账户。比如要在公司里用 Slack,只要我们在这里设置了公司的邮箱域名,公司成员就都可以创建 Slack 账户了。

4.4 对团队开发有帮助的工具

在前面几节中,我们了解了团队开发必不可少的问题跟踪系统、版本控制系统以及聊天系统。除此之外,还有很多能帮助开发团队共享信息和数据的工具。这里我们来了解一下其中的 Dropbox 和 Google Drive。

4.4.1 Dropbox

Dropbox10 是一项能轻松共享开发资料等文件的在线存储服务。用户不必准备文件服务器,只要通过 Dropbox 即可与团队成员共享文件。由于其前期工作只有注册用户这一步,所以可以省去搭建及使用文件服务器的成本。各位可以把它看作一个网络上的文件服务器。

10http://www.dropboxchina.com/

使用 Dropbox 共享文件时不像邮箱或 Skype 那样烦琐,用户只需操作一下本地目录,文件就会自动完成同步,这可以为我们节省大量时间。另外,Dropbox 允许付费增加可用空间,而且为用户准备了个人与团体两个不同使用方案。

4.4.2 Google Drive

Google Drive11 是 Google 提供的一项云服务,用来创建和共享文档。它通过浏览器为用户提供 Microsoft 的 Word、Excel、PowerPoint 等软件。其独特之处在于允许多人同时编辑一个文件,因此可以在文档中实现交流。此外,用户可以详细地为每个文件设置共享用户及权限。

11https://www.google.com/drive/

4.5 小结

本章重点在于了解面向团队开发的工具,内容涉及问题跟踪系统、版本控制系统、聊天系统等。

如果我们能够灵活运用 Mercurial 和 Redmine,把握好开发成果及信息的共享环境,就可以有效提高开发效率。另外,借助 Slack、Google Drive 等工具,我们可以通过网络进行交流、共享信息和数据,开发工作不再受场所限制,减少了交通和交流方面的成本。

如果我们花些心思学会使用工具,还能有效地提高作业效率。动脑筋提高效率同样是一种乐趣。虽然团队开发中的交流更加复杂,但我们可以通过灵活运动工具提高沟通效率,从而做出更大的成果。