ReThought (一): 如何构建理想的开发团队
引言: 过去,关于理想的开发团队似乎是一个热门的话题,所以我也来凑凑热闹。人们想要理想的开发团队,只是因为在传递知识的时候很痛苦。人们总在说,这个地球多你一个不多,少你一个不少。假想有一天你们团队中的主力走了,那么你们的团队会怎样?塞翁失马,焉知非福。
也许上个月我们团队里走了个汉子,来了一个萌妹子。也许下个月会走个老人,那必然也会来个新人。对于个人来说,这是件好事。但是对于团队来说,则有待商榷。于是,也将过去的一系列思考整理成一些文章,方便和以后的想法进行一些对比——有时候会发现最初的想法都挺好的,只是没有记录下来。
最初的团队
有时,我在想最理想的团队莫过于一些创业团队了—— 分工明确。那些还存活着的公司在过去都有着那样理想的团队,然而随着公司业务与团队人数的增长,离这一些越来越远。
在我认识的那些创业公司的前端人员中,多数可能还充当着后台 API、App的开发,原因可归类为:
招不到人
没有钱
不知道招什么人 (他们自己并没有意识到自己不知道)
如《REWORK》一书中所说的那样,只有在你真正受不了时才招人。如果同那些大公司一样,漫无目的地进行撒网,那么早晚会死在这条路上。通常在那些存活下来的团队(也包含没有存活下来的团队)里,一个人可能身兼多职,会有小部分的重叠,但是不会太多。
在这一个时期主导团队往往是Idea的所有者,Owner找来一个技术人员,这个技术人员再依照短处去寻找需要的人才。
随着公司业务的发展,出于个人、家庭、团队因素,总有些人会离职(人总是有需求的,WiFi应该是最底层的吧),总需要迎进新人。
有序的团队
最初整个宇宙是混乱的、整个系统是混乱的、整个组织是混乱的。通过不断地分门别类,整个系统看上去似乎有序了。
在这样的团队里,A做着A应该去做的事,B做着B应该去做的事。
如果A和B很熟悉,可能产生出ab —— 可能是一个新的系统,也可能是一个新的生物。
如果A和B不熟悉,那么通过公司的各种各样活动会帮ta们产生ab。
如果A和B不得已熟悉,那么我想这个ab可能是API。
在最初的团队里,A和B可能只隔着10cm,后来他们越来越远。
职能分明的团队是一个解耦后的系统,他们间的沟通需要比原来花费更大的开销。在传统IT公司及大部分的互联网公司都有这样的"最后一公里"问题。引自之前的文章《知识论(一): 知识传递》 :
传统软件开发流程中,知识传递的方式主要在于文档,而我相信在网上已经有足够的证据可以表明,程序员既讨厌看文档,又讨厌写文档。
无论是在系统集成环节,又或者是在交接环节,人们所做的一件事只是知识传递。因为职责让你不可能接触太多的东西,就好比原来你可以每天吃一点的药,突然要你在短期内吃完。
理想团队
团队类似于人物文明,更多地在于文化与知识的传承。人们想要一个理想的团队,但是他们往往并不知道他们真正的问题不在于团队本身——而在于团队是如何协作的。
理想型A
在多数的公司里,团队的组成方式类似于下图:
如果有一天大牛出车祸了,中牛roll off了,团队就剩下一堆绿帽子了...
在这样的团队里,我们可能会用下面的方式来教授团队的成员:
即类似于传统的授课制:
你今天去把《Thinking Java》看一遍
你今天去把《设计模式》看一下
...
在这时候,那些领悟力比较好的就在NB的路上了,但是每次只会有那么一两个人。
理想型B
在另外一个理想型的团队里,人们想要的是这样的结构。
我想不到这样的团队还有怎样的知识可以传递。在这样的团队里,传递知识是相当于容易,因为大家很容易就懂得别人说的内容。
让团队中的每一个人都是全栈程序员的难度很大,然而这并不意味着这样的团队不可构建。
构建理想团队
在过去我们有师徒制,这样可以保证师徒间知识可以传递下来。而在多数的软件开发团队里,并不存在这样的制度,换句话说在这样的环境成长时,你只能依靠你自己。
在一个团队里,当来了一个新人时你们会怎么做?
如果你是一个新人,你来到这样的一个团队:
A 教你如何使用各种快捷键。
B 教你使用一些特定语言的技巧。
C 教你一些基本的DevOps技能。
D 教你怎么追妹子。
......
你会考虑加入这样的团队吗?
结对编程
或出于公司文化,或出于对自己的不明确认知,多数市场主导的公司并不会采用这样的方式来工作。这也导致了人们一直在追逐理想的开发团队时,一直找不到合适的时机。
这时,也许会有人提醒你,你多了个分号。我曾经在看别人的面试作业时因为多了分号,reject了一个人——因为语言是Python。
而这时候团队的组成,倾向于下图(图是盗的,上面的图也都是盗的 :) ):
在这样的团队里,并非每个人的技能都需要是一样的。会出现重叠,一个比一个强,可能有一个的技能点数是最强的。项目在不断开发地过程中,总会有人离职,有新人进来。
然而,在这个结对编程的过程中,知识都在不断地传递。
(ps: 上面只是提到了结对编程会构成理想团队,更多内容请期待下文《ReThink2: 如何照顾团队中的新人》(9月10号))
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。