多读书多实践,勤思考善领悟

打造高效开发团队

本文于1655天之前发表,文中内容可能已经过时。

一个高效的开发团队包括四个要素:人、过程、技术和团队文化。一群靠谱的人、一套行之有效的团队过程和所采用的实用技术与工具,这三者构成了高效团队的三驾马车,也是团队管理中最为传统的三要素。一个高效的团队更是要具备赢的理念、及时交付的习惯以及达成卓越目标的能力,这是团队久而久之形成的团队文化,团队文化是高效团队的第四个要素。

文化决定团队的基因

先从团队文化这个要素说起,团队文化除了沿袭公司的部分基因外,更是团队管理者所塑造的,性格决定命运,格局决定结局。《易经》中说:“天行健,君子以自强不息。地势坤,君子以厚德载物。”自强不息指个人的努力,至少离成功不会太远,厚德才是持续成功的关键。

在强调扁平化管理的互联网时代,团队是公司中更为独立的一个实体,像《亮剑》中李云龙的独立团,有着独特的气质和文化,一个团队的文化和气质决定了团队的基因。就像一个特别强调规范性和过程的团队,这种基因决定了团队的交付能力会很出色,但创新能力可能被规范所约束;反之一个特别强调创新的团队,必然没有规范可言,但会经常爆发新的创意与想法。

一个团队的能力包括员工思维、员工能力和员工治理三个方面(如图1所示),特别是员工思维,是团队文化的集中体现。大多数团队所做的事情都是被分派和安排的,愿意做是团队中少数人的行为,愿意把事情做好、做到极致是更少数人的行为。如果哪一天整个团队的人都以把事情做到极致作为共同的目标,那么这样的团队还有什么事情做不成?

任何团队的文化是团队领导者文化,创业公司也好,成名的公司也罢,无一例外。一个团队可以选择保持团队文化的单一性,比如团队都认可把产品做到极致,那么这种团队要么像大风口上的猪一样一飞冲天,要么发展到一定阶段成为瓶颈而日渐衰退。同样一个团队也可以选择包容多种文化,比如在极致、创新和遵守规范上选择平衡,那么这种团队适合把一个成熟的产品运营好,既有创新,又有各种形成了习惯和规范的常规手段把日常工作做好。

不管选择什么样的文化,一定要与团队所做的业务相匹配,例如产品型团队可以选择快速交付、结果导向、极致等作为团队文化;解决方案交付团队可以选择规范、专业、可信赖作为团队的文化。这样才能最大化地提升团队的效能,就像古代的侠客选择自己喜欢的兵器一样,要用得顺手,才能发挥自己的全部武功。

img
图1 组织能力的三方面

人是团队的重要基石

一个高效的开发团队需要什么人:他勤奋,每天不是在那里加班耗时间,而是有主动做事情的动机和行动;他热爱自己的产品,珍惜自己和团队成员的成果,以积极主动的姿态对产品持续地优化和改进;他有钻研技术和解决问题的精神,针对技术坚持不懈地努力,寻求解决问题的最优方案并执行。人才是团队的重要基石,没有人,何谈团队。

团队人员中,对于产品或项目需求把握方向的是项目经理和产品经理,大多数团队效能不高的原因有很多种,有给团队的授权问题、业务熟悉程度问题、团队的成熟度问题、项目或产品经理的领导力问题等,但归结到一点就是有技能的人的问题。团队的领导者要具备其应该具备的领导力、规划能力、组织能力等所必备的技能,而团队的主要产出者程序员也应该具备其所具备的能力。

主动学习的能力

互联网时代人人都是产品经理,程序员也不例外。所以产品技能也是程序员需要主动去学习的,再加上技术的更新日新月异,一个优秀的程序员必须要跟上主流技术的发展,经常性地打破自己的瓶颈,而不能抱残守缺,固步自封。程序员的学习手段包括在工作过程中通过阅读书籍或通过互联网搜索等方式获取和工作相关的知识和技术,并对获取的知识和技术进行加工和理解,从而不断地更新自己的知识结构,提高工作效率。但凡优秀程序员都有一定的危机感,担心技术更新得过快导致自己的知识结构过时,正是这种危机感在督促着他们痛并快乐地进步着。

务实精神和坚韧性

程序员的任务是要开发一款有效的可用的软件,而不是在技术方面达到十全十美。如果不能最快地用优美的代码达成目标,他们往往会先选择快速地完成任务,然后空闲时再来慢慢重构和优化自己的代码,这是一种务实精神。当遇到技术问题时,他们往往想尽一切办法去解决它,“衣带渐宽终不悔,为伊消得人憔悴”是对优秀程序员最好的写照,他们非常享受解决问题后的喜悦,这种成就感只有程序员才能体会。

激情与全情投入

高效程序员的激情不能仅仅只在写代码一个方面,对于团队协作,新技术、新工具的引进都要有激情。即使在没有人要求的情况下,高效程序员也会全情投入,付出超出自身能力的努力,通过这些努力增加项目的绩效,或创造出创新的机会。只有这样才能不断完善自我,让自己在从平凡到优秀、从优秀到卓越的道路上不断地前行。

过程是团队达成目标的纽带

我曾给过程下过定义:过程是符合项目实际的最佳实践的积累,是有效结合工具和方法的总结。过程是团队协同工作的基础,不一定体现为文档,更高境界应该体现成团队的共同价值观和文化。任何人都讨厌复杂、效率低的过程,越是简单的过程越能彰显过程的美丽。

程序员最怕过程,因为大家通常会认为过程意味着要产出文档,而文档无疑是程序员的天敌。有的过程粗略,管理者应该注重其结果,有的过程细致,管理者应该关注其过程。其实过程并不值得畏惧,可怕的是不假思索地照搬和套用过程。我曾总结出最为简洁的项目或产品开发过程包括六个要素(如图2所示)。

  • 项目目标是每一个项目或产品所期望取得的结果,如果具体再细分可以分为:业务目标、项目的任务目标和质量目标,所以任何一个项目或产品在做之前必须讨论清楚具体的目标,最终需要团队成员共同认可这个目标。

  • 核心方法是达成目标的最核心的手段,是项目能否成功的重要保障,例如项目的目标是按时交付,最核心的方法就是找到项目的关键路径,并且管理好关键路径。

  • 关键依赖是项目或产品中的一些必要工作,如果没有做到位会影响整个项目的进度和结果,例如做一个移动端产品,产品经理的交互设计原型是UI设计工作的关键依赖,而UI设计又是程序员开发工作的关键依赖。

  • 风险管理直白地说就是判断达成目标有没有把握,团队成员要一起识别风险,针对风险要制订好缓解计划或发生后的应对计划。在项目或产品开发过程中,要时刻关注风险的变化。

  • 需求和估算是把产品需求任务化并且认领到人的必要前提,并且还要管理需求确保需求不被遗漏。团队在拆分的任务上进行估算,这是团队估算和计划的过程,虽然过程简单,但这让团队成员每天都能看到离目标越来越近。

  • 关键测试用例能确保影响项目目标的需求被测试用例覆盖,这是对程序员代码质量的重要保障。

img
图2 项目、产品开发过程的六要素

技术是高效团队的后盾

团队的技术要以核心成员的技术为主,避免用得过于驳杂。如果只能选择某种技术路线,比如团队只会LNMP架构,也能满足业务需要,似乎暂时没有别的更好的办法,只能将就一下了。有人会认为这种原则毫无远见,我倒是认为有些团队的技术选型不需要太多的远见,能用就行。

有些团队的技术选择实际上已经被厂商所绑架,因为所有的基础设施、操作系统、中间件和数据库都是厂商提供的,团队只能在此基础上发挥,即使是这样团队也能找出技术的提升空间。但回归到原点,技术是为了解决业务问题的,是为了项目服务的利器,千万不能为了技术而技术。

小结

对于一家IT/互联网公司来说,无论是项目活动还是运营活动,一个团队要想成功,灵魂人物固然重要,但真正到团队执行层面,就不在于某几个人,而需要所有人的协同。这样才能突破瓶颈,提高效能。

一个团队要持续地改进过程,首先要有过程。作坊式的生产即几个程序员做个模块分工,然后各自开发,找个时间大家再把代码汇集到一起进行集成。也许对于程序员高手来说会比较高效,因为他们水平都高、短板不明显。

大多数团队是由参差不齐的程序员组成的,他们需要过程,即使开始没有,也需要慢慢建立,并且不断地去实践。如鲁迅先生所说:“我想,希望是本无所谓有,无所谓无的,这正如地上的路。其实,地上本没有路,走的人多了,也便成了路。”实践才是检验过程好坏的唯一标准。

团队和管理要效能,文化决定团队的基因,技术是后盾,过程是纽带,人则是挥舞纽带的艺术大师。艺术因团队而美丽,团队因过程而精彩。以冰霜之操自励,则品日清高;以穹窿之量容人,则德日广大;以切磋之谊取友,则学问日精;以慎重之行利生,则道风日远。