对于提供IT专业服务的公司来说,具备专业服务能力的人才和团队就是企业的核心资产,直接决定企业提供服务的能力,进而影响企业的盈利能力。当企业处于快速发展阶段,人员规模迅速扩张,每个团队都充斥着许多新人。在这种团队杠杆(Leverage)非常高的场景下,如何保持原有的专业服务能力,不被稀释,并为企业的持续盈利做好人才储备,是摆在所有团队面前的一道考题。
背景
过去的一年半是ThoughtWorks西安办公室迅速发展壮大的一年,其人数规模从不到十个人发展到目前的七十多个人。在此期间,我们和一家国外的客户展开了长期的战略合作。面对大量新招聘的人员,特别是毕业生的加入,顺利实现交付并且与客户维持良好的合作关系就给团队的能力建设带来很大的挑战。下面我会以Home
Ideas团队为例谈谈我们在这方面的经验。
一年前Home Ideas项目的开发工作正式启动时,最初的五个开发人员中有四个是新人,其中两个新人虽然有几年工作经验,但是却没有与该项目相关的技术背景,还有两个新人是刚入职的女毕业生,技术基础非常薄弱。在随后的日子里,又陆续有新人加入,一个十人左右规模的团队内,最多时一共有五个毕业生,开发人员中只有一个已经通过了试用期。不仅如此,团队的人员流动还非常频繁,项目开始后的半年内,先后有两个有经验的新人和一个毕业生离职,并且平均每个月都有一至两次的人员变动。为了应对这样的人员结构和能力状况,Home
Ideas团队进行了如下尝试。
编程作业
最紧迫的莫过于培养毕业生最基本的读代码和写代码的能力。一般认为结对编程是最好的培养毕业生的方式,但是在实际中,和毕业生结对的效率太低,讲
授的很多内容都很难让毕业生在结对的时候就接受并消化了,主要原因是毕业生不熟悉项目的代码和技术。Home
Ideas团队每天让有经验的同事给他们布置一些作业,主要是让他们去理解和掌握项目中的代码和技术,并且这部分代码通常和他们正在做的用户故事相关,第二天要求毕业生给布置作业的人讲述他对那部分代码的理解。通过这种方式,能让毕业生迅速熟悉项目的代码和技术,使得他们在结对编程中的学习更有效率。
另一种作业是基本编程能力的练习,我们通常用一些典型的面向对象编程练习题。通过和毕业生一起对题目分析,将解决方案拆分成一个任务列表,要求毕业生必须用TDD的方式,每次完成一两个任务,并提交代码到Github上,布置作业的人就会检查并提出重构的建议,然后毕业生修改后提交,通过检查后,再做下一个任务。我们将这种“小步前进”式的编程作业称之为“持续提交”(Continuous
Commits)。经过一段时间反复的练习,能够提高毕业生的基本的面向对象编程、TDD、重构、任务分解等方面的能力。需要注意的是,布置的作业一定要检查,否则,就相当于没有布置,只有这样才能形成一个完整的戴明环。
知识分享
在团队内,通过做session实现能力培养和知识传递是一种很常见的方式,不过在项目不同的阶段session的内容会有明显差别。早期的session主要是关于项目中用到的技术,目的是为了快速学习和掌握必要的技术以便顺利进行开发。这时,可以利用“团队技术能力图”来标明项目相关的各种技术,评价当前的团队技术能力状态,并且和客户共同设定每个季度的能力成长目标,到了季度末再来评价团队技术能力是否达到了目标。此外,还可以进一步细化,用Excel表格来定期评价和跟踪所有团队成员对各种技术的掌握程度。这些都是非常有效的管理能力建设的方式。
通过近似于强制性的要求团队成员频繁地做session,在团队内部逐步形成积极的知识分享的氛围,不仅仅有人愿意分享,而且有人主动喊出想要知道某方面的知识。于是为了将知识分享的供需可视化,可以建立一个session墙,分成两部分,一边由团队成员写出来想要了解的技术知识,相当于是session的需求方;另一边写着根据需求而安排的session,相当于是session的提供方,这样清楚明了,便于跟踪。
随着项目的进展,代码量的积累,代码质量的问题逐渐暴露了出来,这一阶段的session主要针对代码质量和软件设计,Home
Ideas团队推出了“软件设计检讨会”系列session。起初,代码问题较多的团队成员检查自己的代码,并且和其他人一起讨论代码设计或重构方案,每周做一次到两次;并且把需要重构的问题专门记录在一个共享文档里,以便跟踪;不用太长时间,这些人的代码设计能力就逐步成长到能够发现整个团队的代码设计问题,并且由主讲人变成了组织者,带动其他团队成员讨论代码问题。经过这一阶段,团队成员的软件设计能力和项目的代码质量都明显提高。
下来一个阶段的session主要关注特定功能和问题的解决方案和特定技术的专项提高,比如在实现了与第三方系统的集成后,主要参与设计和实现的项目成员就做了这部分工作从实现方案,到使用的技术,到具体代码设计的全套session。此外,code
jam也是常用的专项技术能力提升的方式。比如团队中的前端开发人员就连续组织多次CSS专项提高练习,他每次都会根据主题设计一系列小练习,层层深入,覆盖所有的知识点。
“一人一技”
项目用到的技术和知识挺多,想要所有团队成员同时研究这些技术和知识,从资源利用和效率的角度来讲都是不可取的。相反,让每个人选择其中一项技术进行重点研究,对这个人着重培养这方面的技能,并且集中优势资源给予支持,而后再进行知识传递,效果往往更好。Home
Ideas团队将此命名为“一人一技”,并进行了实践。比如一个团队成员专攻DevOps,团队就把他送到客户现场加入客户的DevOps团队六周一起工作;另一个团队成员的主要目标是成为UI开发人员,团队就从别的办公室邀请来资深的前端开发人员和他结对,客户来访时,也让他和客户的前端开发人员结对编程,并且在平时的工作中让他多做和前端直接相关的工作;还有一个团队成员研究BDD和端到端测试,当这方面的技术专家来西安出差时,就让他们结对编程,还专门让这个团队成员去客户现场和客户那边的QA
Lead探讨端到端测试的问题,等等。
实际效果是,两三个月的时间就可以将一个人打造成团队内部某个特定技术的专家,再假以时日,甚至可以成为业界这个领域的佼佼者,比如那个研究DevOps的团队成员此后不久就去InfoQ做过关于DevOps的主题演讲。
试想,如果让所有人都去研究某个技术,我们会得到怎样的效果?要么我们不可能送所有人都去客户现场加入他们的DevOps团队,要么到西安出差的技术专家要在一两周时间内和所有人结对工作,收效微乎其微。需要特别注意的是,“一人一技”的实践最终是否成功,取决于知识传递是否充分,良好的知识分享的机制和氛围是“一人一技”的重要前提。如果没有将重点培养形成的单个团队成员的技术积累传递出去,对项目的运行也是有潜在的风险。
成长计划
我们常说要不断拓展个人的舒适区,在一个项目团队中如何来实现呢?团队领导者有责任和每一个团队成员进行沟通,帮助其设立个人的成长目标;而每一个团队的成员,都应该不断思考自己的成长计划,并努力实现。
目标的设立应遵从SMART原则,有一定的挑战性,有具体的验收条件,并且结合项目运行和梯队建设的需要。在通过不断拓展舒适区来帮助团队成员成长的同时,也能保证团队成员始终感受到项目带来的挑战性和成就感,这也正好符合组织行为学中的双因素理论,挑战性的工作、个人的成长、更多的职责、个人的成就和获得的认可等等都是可以让一个人在自我实现方面得到满足的激励性因素。Home
Ideas团队从今年初以来,每个团队成员每个季度都会设立个人的短期成长目标,而在季度末会回顾目标是否达到,比如一个团队成员在二季度的目标就是进一步提高前端开发能力并且能够替代另一个资深前端开发人员在团队中的作用,可以采取的行动是在资深前端开发人员的帮助下带着其他团队成员做CSS和Javascript的专项提高练习,并且运用前端技术独立开发一个小应用。
梯队建设
上述的各项措施,能够提升团队的技术能力,但是面对频繁的人员变动和大量的毕业生加入,就要从根本上、从长远考虑形成团队成员的有效培养机制,
提高有经验的团队成员培养新人的意识和能力,逐步形成一两个团队领导者,依仗多个技术骨干,再带少量新人和毕业生的团队结构,降低团队杠杆过高的风险。培养新人是我们对于每一个有经验的团队成员的期望,也是他们自身的责任和义务。每当有新人加入项目团队时,我们就会分配一个有经验的成员重点负责这个新人的培养,比如及时提出反馈,布置和检查作业,督促学习技术和做知识分享等等。团队领导者要时常询问和督促这个有经验的成员在这方面的工作是否及时和周到。久而久之,有经验的成员也就形成了培养新人的意识,也提高了其培养新人的能力。在Home
Ideas团队,毕业后加入公司两年甚至一年的团队成员都能够指导今年刚刚入职毕业生了。他们除了要自身具备较强的技术功底,还要具备培养新人的意识和能力。此外,在项目中的一些重要技术领域,也要有意识的培养后备人员,Home
Ideas团队在DevOps方面前后培养出三个技术骨干,在前端开发方面培养出两个出色的开发人员,等等。
后记
在我看来,在交付项目中,实现交付只能看作是成功了一半,也就是说,除了交付,一个团队还应该有其他的产出,比如和客户建立了良好的合作关系,扩大了客户和本公司的合作范围;或者在开发过程中,进行了技术创新和突破,等等。那么建设卓越的团队,输出优秀的人才也肯定是一种成功。Home
Ideas团队输出的几个毕业生中,有的去了国内项目上做咨询,有的被别的项目团队点名要走,还有的基本可以独立去做一个小项目,其他成员也都有令人欣喜的成长。而且在输出了这些开发人员之后,补充进来的新人也能快速成长,Home
Ideas团队也没有出现过人员流动带来的风险。不仅如此,这对保持员工的新鲜感和挑战性,为公司留住优秀的人才,也都大有裨益。
|