(我本来计划将研发环境和管理流程分开来讲的,最后还是放在一起便于理解。)
软件研发最重要的场景就是在有限的时间和资源下把需求落地为产品/项目,也就是研发和项目管理,毫无疑问,这个阶段的主角是开发人员。
是不是应该多思考下怎么面向开发人员来优化整个研发过程和项目管理流程?
本文将介绍如何通过优化开发环境搭建、代码管理来提高研发过程中开发人员效率,并通过持续集成和交付让开发中的问题更早暴露,通过合理的测试反馈工具让开发人员更早定位和解决问题。
说到团队的研发和项目管理的实践,就逃不开先要说一下笔者所在公司研发和项目管理中的工具作为背景:
- 即时交流和协作:QQ
- 办公信息平台:诺明
- 代码管理:SVN
- Jar管理:Nexus
- 项目管理:Redmine
- 持续集成:Jenkins、ansible
切入正题,本篇分享涵盖的是在研发过程和项目管理流程,以及当中在DevOps上做的一些努力去优化开发人员的体验,就试着从各个环节总结一下:
- 研发环境的搭建:包括如何kick off新开发者,如何搭建日常开发环境
- 代码的管理:包括源码管理,Code Review和组织公共库
- 需求在研发中的生命周期管理:包括功能需求清单,功能需求定义和其中的开发任务项分配和状态管理
- 项目进度的管理:包括如何通过Redmine有效的执行敏捷开发
- 研发阶段的产品测试和反馈:包括在产品测试和反馈中的一些经验和工具分享
- 持续集成和持续发布:包括如何针对Web, Android和iOS分别搭建持续集成和发布
一、研发环境的搭建
如何让团队新的开发者尽快上手
对新的开发人员,一般都会有开账号,装系统,配环境,跑代码这些过程,我自己发现每次都低估这些工作的耗时,以前就发现有时候不小心就一两天过去了还没跑起来代码,一两周还没搞清楚目前产品的功能,我总结了几点加快这个进度的方法:
1.加快账户开通和权限分配的速度。
笔者公司的帐号包括OA,svn,nexus,redmine,ftp,jenkins,Sonar。这些系统的用户管理和权限无非基本都是通过数据库或者xml进行管理,那么是否可以梳理规则然后通过自动化来实现呢?
- 整理各系统,角色、权限对应的sql表和字段或xml键值对
- 开发同步小程序,建立OA同步至其他系统的相应场景(创建、禁用、密码修改、职位调整等等)
2.加快开发IDE环境搭建的速度
同一产品部门或同一工种日常所使用研发IDE环境,基本都是一样的,难道要每一个新入职的同事如果都自行去确认IDE,下载和安装?我们可以统一研发所需使用的IDE组件和版本组装成一键安装包。
- 收集研发IDE工具及版本。如svn,Eclipse、maven、ant、xshell及其他
- 统一组件安装目录。如:D:/develop
- 编写环境插入bat文件
- 编写环境检查,开发指引文件,开发标准规范配置说明
- 通过Winrar创建自解压包,自动安装相应软件,执行bat配置环境变量
(注:环境插入的bat文件,部分windows系统版本无法插入,需手动添加)
3.加快能让代码跑起来的速度
有很多可以加速的环节,一个比较重要的就是自动构建代码,就是指开发人员checkout代码后通过简单的构建脚本就能完成代码依赖安装,代码编译,单元测试运行,也就是我们常说的跑起来。以Web为例,可以通过maven的pom完成依赖的安装、代码的构建和版本提交,这也是持续集成的基础。
4.对产品功能需求和目前进度的了解
保持尽量清晰的需求定义,新的开发人员可以通过浏览产品的需求文档来了解产品功能。
可以知道以前每个版本都做了什么功能,未来有什么功能正在排期中:
如何方便开发人员进行日常开发调试
目前对于Web开发来说,一般构建的过程中代码都会进行环境文件DLL/SO,CDN地址等替换、CSS Sprite生成等等操作,造成配置切换很不方便,我们采取的解决方法是在web的maven构建流程中分不同的Build Target,自动构建切换至对应环境配置,连接对应数据库,方便Web开发人员调试。
二、代码管理
首先最重要的就是代码必须用源码管理工具,我们一直用的SVN。代码的查看和管理都在SVN服务器上,可以查看代码,code review,合并分支,打版本tag之类的。
有两点我觉得需要关注的:
1.怎么让开发人员高效的使用第三方库
项目开发的过程中去抽象公共组件,使用第三方库或开发工具都可以提高开发效率,但需要做好模块和版本管理,有时候碰到一个开发人员引入了一个不合理的依赖,或者学习成本陡峭的组件,每个参与开发人员都要增加学习成本。这个一般都是根据不同的技术栈有相应的一套工具可以使用,在java开发上我们使用的是Nexus来管理, iOS、Android上面也有自己习惯的选择,需要加新的组件或者替换正在使用的通过专家小组评审讨论之后加入,以免发生重复或者后期的分歧。
2.如何做新功能开发的代码管理
只要多人开发,而且多功能并行开发都避免不了要考虑如何管理代码。一般有Brunch和Trunk开发两种
传送门:SVN版本管理
三、需求在研发中的生命周期管理
对于开发人员来说,开发工作一般是围绕着具体的功能需求进行的,而 "清晰的需求定义"就是研发的主要输入,由负责的PM来主导需求(User Story)的状态更新,本节以一个功能需求(User Story)为例,先上一个时序图来说明单个功能在研发中的生命周期是什么样的:
从功能需求(User Story)的时间线上可以看出来其分为下面几个状态:
可以划分为需求确认,需求开发,需求测试和上线三个阶段:
PM创建后协作编写需求文档(New) -> 需求确认(Confirmed) -> 开发中(In Progress) -> 待测试(Wait for test) -> 已完成,可以上线(Finished) -> 完成,可以关闭(Closed) |
1. 需求确认
对于需求文档的编写和确认,不同团队方式不一样,我的理解是包括功能需求的前置条件和后置条件,用户流程和规则,完整的产品交互原型,评审确认的设计稿。
2. 需求开发
在需求定义清晰后,开发前需要整个开发团队的参与确认任务的分配。任务分配的原则就是将功能需求对应的任务按树形结构分解,敏捷开发里的学名是"Work Breakdown Structure (WBS)",保证其中每个任务都是可以开发,并且是可以测试的。
具体到其中一个单独的任务项(Task),里面会有它所属的功能需求(User Story),当前的状态,优先级,任务指派的开发者,任务所属的产品线,一个简单的任务描述的,所属的里程碑,预计开发时间和结束时间,任务当前的状态和进度等等。
从上文中"需求在研发中的生命周期"的时序图上可以看出其对应的任务的生命周期是如何管理的,包括前端和后台之间的任务协作是如何完成的,简单来总结的话Task有下面几种状态:
新建 -> 开发中 -> 待代码复查(目前仅junior developer需要被code review) -> 待测试 -> 反馈 -> 完成(可以上线) -> 关闭(上线以后可以关闭) |
开发人员主要负责的就是开发的同时更新自己任务的状态,状态蛮多,如果开发需要每次登录redmine来改也确实蛮累,在实践的过程中我们可以引入一些优化的方法:
- 为Redmine自定义一些SVN hooks来更新状态。通过自定义SVN提交语法,让SVN提交能自动更新在Redmine相应的版本更新上。
- 参考资料:SVN提交后自动更新Redmine版本库
3. 需求测试和上线
由于这里讲的是单个功能需求的研发周期,而测试和上线更多是在整个项目这个 范围 上来讨论,所以针对测试和上线的部分在后面持续集成和发布的部分会来细说。
四、项目进度的管理
笔者公司的的实践并非Scrum,但比较接近,我们的迭代比较频繁,通常每周至少都往Production上做一次同步。项目的进度管理推荐参考Scrum的实践里的三个Meeting:
五、研发阶段的产品测试和反馈
产品发布到测试渠道后的反馈
当产品发布到测试渠道就是希望在正式发布前得到业务和测试团队的反馈,对比开发人员的测试反馈,业务和测试团队的反馈会更专业、清晰、充分,这些反馈需要通过相应的工具来进行管理:
六、持续集成和持续发布
一个完善的持续集成应该包括代码提交后的构建->部署->测试->发布几个阶段,两张图对比应用持续集成和持续集成之后的研发过程:
自动构建
Jenkins支持定期检测SVN代码更新,会在代码提交成功后能在持续集成服务端(CI Server)触发相应的Server,Web,iOS或android端的自动构建。
持续部署
部署分为客户端部署和服务端部署两种,就是构建以后要把可运行的代码发布到相应的服务器和手机端。
持续测试
分为单元测试和集成测试,理论上来说能在持续集成的过程中执行测试,是对产品质量极大的提升,不过对团队的规模和时间要求比较高,一般还是按自己的实际情况来,非长期维护产品慎用,建议做产出分析。
持续交付
将发布的dev,test和production分为三个不同的服务器: