早期的软件开发,是所谓作坊式的开发,程序员并没有严格区分的角色,而是什么都做,什么都学.后来随着软件越来越负责,系统越来越庞大,程序员开始有了分工.有的负责项目总体,是项目经理;有的负责用户需求,是系统分析员;有的负责系统设计,是系统设计师;有的负责编码实现,是编码工程师;有的负责测试,是测试工程师;有的负责客户支持,是技术支持工程师.软件开发中的分工,是软件发展的必然结果,但也给软件开发本身带来了很多问题.我个人认为,之所以产生软件危机,其根本原因就是分工.
许多人都认为软件中的分工会提高生产效率,会提高开发人员的专业化水平.表面上看是这个样子,可是事情还有另外一方面,分工同样也有它的副作用,而如果意识不到这些副作用的话,这些副作用会在软件开发的过程中逐步进行积累,最后导致系统的错误和失败.
一.分工导致了程序员视野的狭隘,导致了开发队伍中的互不了解,导致了开发中的矛盾.在没有明确的分工之前,每个程序员都是软件开发的多面手,既要做需求分析,系统设计,又要做程序编码,测试调试,包括最后的用户培训,技术支持.这样培养出来的程序员,虽然可能在某个方面不是特别专长,可是却具有良好的大局观和全局概念,考虑问题时会立足在整个系统的着眼点来进行,由于了解系统开发的各个步骤,因而也很容易与相关的人员进行讨论与交流.然而,当系统开发采用详细的分工以后,情况变化了.分工使得每个程序员只关注于自己的工作领域,没有时间也没有精力去关心系统的其他部分,这样就带来了系统开发中的本位主义,更严重的是,系统中存在的错误被详细的分工掩盖了起来,最后往往等到系统测试时才发现错误,这时修改系统已经太晚了,只好在上面进行修补,最后整个系统变得如同泥潭一般,让项目组不能自拔,究其原因,往往是因为分工导致了互不了解,最后大家彼此的工作被相互抵消了,工作的越努力,给其他部分带来的麻烦和缺点越多,这就是软件开发中非常具有讽刺意味的现实.这又往往被理解成为需要更多的沟通,其实不然,因为只有充分了解对方的工作,才能够做到有效的沟通,而分工带来的隔阂使得充分的沟通成为不可能的事情.<<人月神话>>中所谈到的沟通问题,其根本原因就出在分工上面,而作者寄希望于加强沟通来解决问题,我认为也是不现实的.
二.分工导致了对于效率的盲目追求.
由于大家都说:"分工提高了工作效率",于是管理者在此论断的指导下,往往会迫于市场,客户的压力,而盲目要求提高开发的效率.而正是由于分工的存在,每个不同岗位上的程序员都不能意识到这样做的错误性,而反抗这样的决定往往又会背上怠工的罪名,最后大家都听从了.最后,在系统没有明确认识之前,就开始了系统分析,设计,编码,测试.这样做的结果就是"欲速则不达",最后得到的结果往往是,在系统开始时,进行时,似乎都一切正常,等到系统快结束时,问题开始出现,而造成项目一拖再拖.
<<人月神话>>中有这样一句话"好的烹饪需要时间."其实软件开发也一样,在对系统充分了解之前开始工作,盲目推进工作,结果就是工作的越多,其中的错误也越多.表面上看提高了效率,实际上是以牺牲软件的质量为代价来追求的速度,而最后当矛盾爆发时,已经太晚了,这就造成了软件危机.究其原因,就是"分工提高了效率"这个似是而非的前提所造成的,正确的说法应该是:"在一定的情况下,分工可以提高开发效率,但在一定的情况下,也有可能降低开发效率."表面上的开发效率提高,并不是真正的开发效率提高,这种表面上的提高往往隐藏了对于系统的不了解,埋下了系统失败的祸根.
三.分工导致了软件开发中的等级制度,造成了工作中的不平等关系.
在作坊式的开发中,各个程序员之间的差别是其水平的差别,而不是职业分工的差别;而分工出现以后,为了维持工作的秩序,就制定了一整套的工作制度和任职制度,这样各个不同的角色之间的差距出现了,程序员之间的平等消失了,代之而起的是一套等级制度,项目经理高于系统分析员,系统分析员高于系统设计师,系统设计师又高于编程人员和测试人员.正是有了这套等级制度,所以才能保证项目各阶段的正常运行,可是另一方面,问题往往被压在最后的编程人员头上,而他们的意见又被自以为高明的项目经理和系统分析员所忽略,工作中在技术上产生了不平等的关系,而这种不平等的关系又伤害了工作强度最大的编程人员的自尊心.这就是分工形成的金字塔,如今所提到的所谓"软件金领"之类的东西,也是分工造成的对于软件开发的畸形认识所产生的畸形产物,那里有脱离具体工作,闭门造车可以真正掌握软件开发的道理!工作中的不平等关系,伤害了基层软件开发人员的自尊心,满足了所谓金领的虚荣心,最后损害了软件本身,造成了越来越多的问题.
四.分工导致了人员培养上的误区,无法培养出真正精通软件的管理人员和开发人员.
盲目强调分工的另外一个副作用,就是造成了软件开发人员培养上的误区,俗话说"养兵千日,用在一时".可现在对于软件行业来说,似乎只想吃口现成饭,平时不想烧香,临急方报佛脚.而分工正好迎合了这些急功近利,鼠目寸光的想法,于是乎才有各种"软件蓝领","程序员速成"之类的伪新闻,假报道大行其道.素不知,世界上任何事情,都是需要时间的积累才能够成功,为什么程序员就这么容易,以至于可以速成呢.这是对于软件公司的误导.
而对于广大的程序员来说,分工使得程序员不得不固定在某一个具体的岗位上,既限制了自己的眼光和眼界,在技术上则划地为牢,潜心钻研某一个产品的无穷无尽的API,SDK,素不知,学习这些知识的目的,是为了在实际工作中正确地使用他们,而现在则陷入了无穷无尽的追逐之中,人的生命是有限的,而知识是不断出现,永远没有止境的,这样下去,那里是个头呢?而分工一方面阻止了程序员的思考,另一方面强迫他们不断进行追逐,最后很多人被迫放弃了这个职业.盲目强调分工,根本无法培养出真正精通软件开发的管理人员和开发人员,只是培养出一些满口理论,实则无物的空头理论家,纸上谈兵,夸夸其谈而已,用这样的人来管理软件的开发,那里能够成功呢?软件的失败不是偶然的,而几乎是必然的了.而对于程序员,眼界也往往被局限在某种语言的某个功能上面,不再考虑如何应用他们,而是无穷无尽的进行研究,最后变成了新时代的孔乙己,编程语言的八股文,这样子,难道不可悲吗?他们学到的东西,与回字的四种写法又有什么两样!
五.分工导致了对于开发人员的过度要求.求全责备,随意解雇.
由于有一大批盲目追逐技术的编程人员存在,从而使得忙足追逐变成了正常现象而受到表彰,不正常的事情变成了正常的事情,错误的行为变成了正确的行为,在这种舆论之下,管理者就高标准,严要求来对待开发人员,求全责备,还自以为得计.遇到不满的程序员,就以不服从管理,滥竽 充数为借口进行解雇,在强大的压力下,剩下的程序员不再敬业,他们学会了保留自己的真实意见,也人云亦云,这样下去,最后受到伤害的,还是软件行业本身.
那么怎么办呢?分工就象是一个硬币一样,有它的好处,也必然有它的弊端,只有充分发挥其优点,避开其缺点,对它可能引起的问题提高警惕,尽早处理,才是对待分工的正确态度.毕竟,分工的目的是发挥每个人的长处,把软件做得更好,而不是把人变成一颗一颗没有思想的螺丝钉,最后把事情搞砸.而作为程序员来讲,也应该认识到分工的局限性,不要让分工变成自己的枷锁和牢狱,不要固步自封,自己设计自己的道路,才是正确的工作态度.