再谈软件开发的合作
差不多4年前,我在我的博客上发表了一篇文章——《五年多一线开发经历告诉我:软件开发——几乎不可能cooperate的工作》,地址:http://www.cppblog.com/guogangj/archive/2009/05/14/82909.html
我的观点是:软件开发工作是高度依赖脑力运动的工作,而高智商的程序员却“一山难容二虎”,无法合作。当然了,断章取义地把这话单独写在这里必定会遭到很多人的反对意见,但如果谁仔细阅读了我这篇文章之后,估计持反对意见的概率就小很多。直到去年(2012)我读了《软件随想录》之后,在里面发现了一个观点,正是我想表达的意思:
世界上只有一件事比你自己设计软件更苦难,那就是一个团队一起设计软件。
这正是我想说的!
这几年来我的遭遇正好也印证了这个观点,大约就是三年前,我还在以前公司的时候,有一个新项目,要设计一种新的产品,涉及面很广,并且没有明确具体的产品定义,只有大概的,大老板给出了很紧迫的时间,要求马上弄出一种方案出来,开会我们也开了若干次,可进展极慢,尤其是我,我感觉我在这个项目中就是一个外人,根本融入不进去,因为在那个团队中,我最年轻,在公司的资历也最浅,自我认为“哪里轮得到自己发言”?于是我有些怠工,而其他人也积极不去哪里,可能大家都有这种感觉,反正一个人拍不了板,自己设计出来的东西也许最后也不被采纳,于是积极性很低,直到我离开那公司,那个项目究竟用什么方案,都没有最后拍板,这是一个典型的用团队去做设计的失败案例。
在之后的日子里,我有单干过一些项目,也有团队的合作,我渐渐总结出了一些规律,也渐渐明白如何去运作一个软件开发团队。
我不得不说,一个人的战斗还是颇有成效的,如果项目不大,一个人能应付得来,那让一个人做,那样效率还是最高的,因为不需要那么多的沟通,相当于节省了沟通成本。
这个人从一开始就负责方案的设计,这个设计出来的方案由他一个人拍板即可,而领导只需要确认功能点即可,不能干预设计,因为如果干预,就会降低这个负责人的积极性,使他产生一定的“挫折感”,渐渐觉得这个项目不是他的项目,于是开始怠工。
也许你会说:要是这个负责人能力不足,写出来的东西完全不符合要求怎么办?必须还是得领导大量的参与才行啊。——我说不行,项目成功的最关键,还是先选对人,如果选了一个能力不足的人,后面领导再怎么给他“指点江山”,都无济于事,只会越指越乱,领导就是要学会放开,让能力胜任的人去负责一个项目,这个负责人应该要负责整个项目的设计工作,在这一点上,一个人单干和团队并没有什么分别,那就是:设计工作始终一个人来做,这个人,就是项目的负责人。
软件开发更类似于“艺术创作”类的工作,而不是科研,软件行业从业多年的人一定清楚这点,程序员是“艺术家”,而不是“科学家”,我个人的职业能力偏向测试也正好是艺术型+工程型(职业能力偏向有6大类,艺术、科研、工程、社交、企业和事务),而且还是艺术型为主要能力偏向。如果把一个软件项目看作是拍一部电影,那这个项目的负责人就是电影的导演,至今我没见过由一个团队充当一部电影导演的例子,而领导则是电影的投资人,投资人找导演,准备要拍一部怎样怎样的电影,然后由导演去执行,具体电影怎么拍,如何编剧,如何设计场景和人物刻画,这些都是导演的工作,你认为投资人应该干预吗?投资人要做的事情,就是选对导演,然后就就把脚翘到办公桌上,再一手拿张报纸,一手端起茶杯,等着这部影片带来的收益。
正如一部电影光凭导演一人之力,是无法完成的,很多稍微大一点的软件项目,也没办法一个人单干,这就涉及到了合作,我几年前的博客所说的“无法合作”,其实指的是设计工作无法合作,其它方面则是很需要合作的。
项目负责人,首先要做的事情,就是将一个项目的框架描绘出来,这是总体设计,(或称“概要设计”),如确定使用什么平台,什么数据库,什么技术框架,划分为多少模块……
根据项目的规模以及团队的成熟度,接下来的工作可能就有些不太一样,如果这是一个新的团队,且只有两三个人,那么这位负责人恐怕就要做更多更细的工作,他得编写项目的基础代码,规范编码,可能还要负责给项目成员培训业务及技术,培训看起来是低效的事情,可如果真正把团队建设好了,你会发觉培训的开销是值得的,当然我并不是说一定要到培训教室,打开投影仪,播放ppt这种方式,培训可以发生在任何时候,在工作中一对一的指导,可能更为有效,这就需要这位“导演”有着扎实的基本功,精通技术,掌握业务,上能应付领导,下能建设团队,还能根据实际情况适当调整项目开展的策略,随时解决项目中所遇到的各种问题,这样的人确实比较难找,但这是一个项目成功的关键。
那是不是说,需要一个“超人”来负责项目?这个“超人”凡事亲躬,大大小小事情都要处处到位?当然不是,就如一个导演再怎么厉害,也不可能掌握电影制作的全部细节,即使掌握,也不可能有那么多的时间,导演必须清楚他是这部电影是设计者,他需要把一些工作交给更专业的人士去做,所以有了服饰设计、灯光效果、音响配乐、演员化妆、武术指导、电脑特效……等等专业人士的参与,导演对这些领域应该都有所了解,不可能完全陌生,否则就无法安排工作去实现自己的设计,但他一定需要这些专业人员的协助,这就是合作。
项目大到一定程度,就需要细分,把一个大的项目划分为若干个小的项目,不变的是:同一个设计,只能交给一个人来做。
随着团队的发展,其中的一些组员可能也渐渐地显露出了自己在“设计”上的才能,这个时候项目负责人就可以拆分出一些小的项目交给他去设计,一来可以减少自己的工作量,让自己有更多的时间去思考大局,另一方面也很能激发组员的积极性,使得项目朝着良性的方向发展。
这就是软件开发的合作方式。