创业团队的项目管理,如何面向开发人员优化

  一点前提条件和背景  印象中很多关于产品和开发为了进度撕逼的段子,其实作为一个开发转的产品,对这两块都有所了解,就我的看法是研发效率不止是研发人员本身的技术能力和工作效率,而是整个研发过程和项目管理流程的效率,但我自己理解的高效的研发和项目管理有两个前提:  公司内各团队有个大家认同的沟通协作方式:因为所有的流程和工具都是为人所用的,只有团队有主动性去沟通协作才能提高效率,这也是我这个系列第一

  一点前提条件和背景

  印象中很多关于产品和开发为了进度撕逼的段子,其实作为一个开发转的产品,对这两块都有所了解,就我的看法是研发效率不止是研发人员本身的技术能力和工作效率,而是整个研发过程和项目管理流程的效率,但我自己理解的高效的研发和项目管理有两个前提:

人员优化.png

  公司内各团队有个大家认同的沟通协作方式:因为所有的流程和工具都是为人所用的,只有团队有主动性去沟通协作才能提高效率,这也是我这个系列第一篇写 “异地创业团队如何做团队沟通协作” 的原因。

  尽量清晰的需求定义:产品经理的任务就是让研发团队开发正确的任务,我所碰到的开发延期或者交付失败很多时候就是由于自己对需求的认识不够,开发中过多需求的变更造成的,一个表达清楚,考虑完善的需求定义才能保证下面的研发和管理是不是在做无用功,所以本系列的第二篇是 “聊聊针对异地团队的需求协作和原型、设计的评审”

  说到创业团队的研发和项目管理的实践,就逃不开先要说一下我们研发和项目管理中的工具作为背景:

  即时交流和协作: Slack ,这个我在“异地创业团队如何做团队沟通协作”里重点谈到过,鉴于它的开放性,已经基本连接了我们用到的文件管理,设计评审,持续集成,测试分发,Bug Report等一系列工具。

  代码管理: Git+Gitlab ,在VPN环境内自己搭建Git和Gitlab一定程度上保证了代码的安全性,不过维护和备份都是个会耗费精力的问题,对没有专业运维的创业团队推荐直接Github托管。

  项目管理: Redmine ,老实说Redmine一直都不是项目管理上的最佳方案,专业级的有JIRA,轻量的有Asana、Tower等很多,我们就是已经习惯了,有一套Githooks在上面,并没有什么动力去换。

  持续集成: Jenkins ,虽然Java的坑也很大,维护起来也不时被坑,不过功能和插件确实齐全,搭起来也不易,有兴趣的可以尝试Travis CI或者Gitlab CI。

  最后切入正题了,本篇涵盖的是我们在研发过程和项目管理流程,以及当中在DevOps上做的一些努力去优化开发人员的体验,就试着从各个环节总结一下,因为不同团队的研发流程和项目管理都不一样,各位看官可以挑有兴趣的来看:

  研发环境的搭建 :包括如何kick off新开发者,如何搭建日常开发环境

  代码的管理 :包括源码管理,Code Review和组织公共库

  需求在研发中的生命周期管理 :包括功能需求清单,功能需求定义和其中的开发任务项分配和状态管理

  项目进度的管理 :包括如何通过Redmine有效的执行敏捷开发

  研发阶段的产品测试和反馈 :包括在产品测试和反馈中的一些经验和工具分享

  持续集成和持续发布 :包括如何针对Web, Android和iOS分别搭建持续集成和发布

  一、研发环境的搭建

  如何让团队新的开发者尽快上手

  对新的开发人员,一般都会有开账号,装系统,配环境,跑代码这些过程,我自己发现每次都低估这些工作的耗时,以前就发现有时候不小心就一两天过去了还没跑起来代码,一两周还没搞清楚目前产品的功能,我总结了两点加快这个进度的方法:

  1.加快能让代码跑起来的速度

  有很多可以加速的环节,一个比较重要的就是自动构建代码,就是指开发人员checkout代码后通过简单的构建脚本就能完成代码依赖安装,代码编译,单元测试运行,也就是我们常说的跑起来。以Web为例,可以通过npm的脚本完成npm依赖的安装,然后用gulp完成代码的构建和运行,这也是持续集成的基础。

  2.对产品功能需求和目前进度的了解

  在背景的里说的保持一个尽量清晰的需求定义的一个用途就在这,新的开发人员可以通过浏览产品的需求文档来了解产品功能,我们的做法是在Redmine上把“系统功能汇总(含已排期未完成功能)”作为一个Custom Query,将所有功能的PRD列出来,有两种视图可以选择,一个就是下图这样按照产品线,能看到每个产品线的功能:

  redmine_prds

  另一个视图就是按照功能完成的时间来归类,可以知道以前每个版本都做了什么功能,未来有什么功能正在排期中:

  redmine_prds_by_sprint

  如何方便开发人员进行日常开发调试

  目前对于Web开发来说,一般构建的过程中代码都会进行混淆、合并、CDN地址替换、CSS Sprite生成等等操作,造成在Dev服务器上调试很不方便,我们采取的解决方法是在web的Gulp构建流程中分不同的Build Target,本地调试使用未混淆的代码加本地搭建的Python环境,连接Dev数据库,方便Web开发人员本地调试。

  二、代码管理

  首先最重要的就是代码必须用源码管理工具,我们一直用的Git。代码的查看和管理都在Gitlab上,可以查看代码,code review,合并分支,打版本tag之类的,不过Gitlab对开发者不是必须要用的,所有这些操作都能用git command解决的事情,有两点我觉得需要关注的:

  1.怎么让开发人员高效的使用第三方库

  项目开发的过程中去抽象公共组件,使用第三方库或开发工具都可以提高开发效率,但需要做好模块和版本管理,有时候碰到一个开发人员引入了一个不合理的依赖,或者学习成本陡峭的组件,每个参与开发人员都要增加学习成本。这个一般都是根据不同的技术栈有相应的一套工具可以使用,我们自己在Web、Python、iOS、Android上面都有自己习惯的选择,需要加新的组件或者替换正在使用的都可以一起讨论之后加入,以免发生重复或者后期的分歧。我们主要考虑的点有下面这些。

  2.如何做新功能开发的代码管理

  只要多人开发,而且多功能并行开发都避免不了要考虑如何管理代码,一般有Feature Toggle和Git Branching两种,目前我们根据自己的需求定义了一个Git brancing model,对于复杂的新功能建立feature branch来开发:

  Git-Workflow-bbt-v0.1

  虽然我个人更喜欢Feature Toggle的方式,不过实践起来需要的模板开发和构建方式上的配合,不如Git Branching对开发来说上手更简单一些,暂时就没有更换,建议看一下Baidu FEX的<< Feature Flag 功能发布控制 >>去考虑自己适合哪一种。

  三、需求在研发中的生命周期管理

  对于开发人员来说,开发工作一般是围绕着具体的功能需求进行的,而背景中提到过的“清晰的需求定义”就是研发的主要输入,由负责的PM来主导需求(User Story)的状态更新,本节以一个功能需求(User Story)为例,先上一个时序图来说明单个功能在研发中的生命周期是什么样的:



标签:   团队管理