现代软件工程讨论实录

发表于:2007-05-26来源:作者:点击数: 标签:
第47期IT沙龙 现代 软件工程 讨论实录 -------------------------------------------------------------------------------- 主办单位:北京中关村IT专业人士协会 承办单位:书生公司 协办单位:新浪网 时 间:2001年10月21日下午14:00-

第47期IT沙龙 现代软件工程讨论实录

--------------------------------------------------------------------------------

主办单位:北京中关村IT专业人士协会
承办单位:书生公司
协办单位:新浪网
时 间:2001年10月21日下午14:00-17:30
地 点:翠宫饭店三层休息厅

http://www.sina.com.cn 新浪科技 

  2001年10月21日下午,第47期IT沙龙在翠宫饭店举行,这次论坛的话题是“现代软件工程”,以下是这次沙龙的实录: 

  主持人潘加宇: 

  大家好,欢迎大家光临第47期IT沙龙,我是umlchina。本期沙龙主题是“现代软件工 
程”,由我为大家主持。现在我们请本次IT沙龙的组织者,书生公司董事长王东临先生给大家做一个开场白。 

  书生公司董事长王东临: 

  大家好。我们这期主题是“现代软件工程”,其中特别强调“现代”这两个字,是因为我们软件业虽然经过了几十年的发展,但主流舆论对软件工程的认识还停留在七八十年代传统软件工程的水平,把软件工程机械化成教科书上所写的生命周期法,甚至还有很多人把软件工程片面理解成写足够多的文档。这是由于中国软件业所存在的一个问题,即软件行业的话语权并不掌握在做软件的人手里所造成的。 

  应该说传统软件工程的原则基本还是正确的,但是从具体方法来说,90年代以来有已经不少发展和提高了。传统的教科书上的方法在已知条件充足、条件恒定不变时,给出一个静态的最优解应该说还是一个比较恰当的方法。但是应用在商业环境里面,条件还不是很充分,需求在不停变化,那就不太够了。 

  我今年31岁,我上学时就学的这套方法,而几乎所有的专家学者年龄都比我大,他们更是受到这种传统方法的教育。而咱们国家有一点跟美国不一样,软件等高科技行业受科研单位、大专院校的影响比较大,这些单位的专家学者对政府、媒体、用户等的影响是很大的。我大致分析了一下,我国由于历史原因,早期只有国家科研单位、大专院校才具备从事软件开发的人才,因此早期的IT企业大多出自这些单位,如北大、清华和中科院,这也是我国特有的高校办企业现象的根源。而美国大学和企业的界线是很分明的,前者只管研究,后者负责商品研发和市场运作。如果大学里研究出了一项好技术,就会拉出来作为一个企业来运作,如CISCO最早就是斯坦福的老师研究出来的,他们夫妻俩就自己出来办了公司,与斯坦福是不相干的。总之,个人可以流动,但不管怎样在大学就作研究,要做商业就出来到企业去,而不是以做教学和研究为职责的大学下面再办一个商业的公司,最后什么都不像。目前,中国那些高校和科研单位办的IT企业很多已开始明白这个道理了,并开始逐步脱钩了,但还不彻底,明明是工业界的事却偏偏要去听学术界的人的意见,如果遇到周老师这样明白的人还好,遇到一些从教科书到教科书的所谓专家学者,就往往会有偏差,这就造成了前面所说的软件业的话语权不在做软件的人手里的现象。 

  事实上,我本人在十多年从事软件行业的工作中,普遍感到无论是用户、媒体还是政府,都一直用七八十年代软件工程的标准来衡量我们。这样对行业造成一定的误导,而且这种误导现在还是有一定的作用,有一定的影响。 

  所以今天希望借这个机会,请真正做软件的,如Microsoft,摩托罗拉,包括国内比较优秀的像金山,也有相对比较符合中国国情的,规模比较小的,像做超级解霸的等等,大家谈谈真正的实际软件工程到底怎么回事。当然也包括周老师,周老师虽然也是在高校里面,但是周老师本身对现代软件工程方面也有比较好的研究。我们的主持人潘加宇有个人网站umlchina,在软件业专业圈里面影响也比较大,他本身对软件工程也有很多了解。 

  今天很荣幸请到这样几位主讲嘉宾和主持人,也希望今天大家都有很好的收获。 

  谢谢大家。 

  主持人潘加宇: 

  今天我们非常荣幸邀请到了五位主讲嘉宾,他们分别是微软研发中心服务系统平台部经理杨永生先生,金山公司金山词霸研发部技术总监邹涛先生,摩托罗拉全球电信解决方案网络方案技术中心高级经理胡大庆先生,清华大学著名教授周之英老师,还有一位是豪杰公司的总裁梁肇新先生。 

  首先我们有请清华大学计算机系的周之英教授。周教授二十多年来一直从事软件工程方法的教学和研究工作,曾经和主持和参与多项软件工程有关的国家重大科技攻关项目和863项目,还有需要大型复杂网络的应用系统开发工程,连续十多年在清华讲授研究生课程“软件工程技术和设计”。可能大家对周教授最大的了解就是99年末的时候出过《现代软件工程》的书,当时涉及的内容是很新的。所以从当时很新的书里面,周老师对新知识的敏锐和软件工程推广的热情。 

  周老师今天发言的主题是《现代软件工程的观点——尊重事实、认识极端,解决思想》。下面有请周老师。清华大学计算机系教授周之英: 

  很高兴有机会跟大家一起探讨现代软件工程。我大概二十多年一直对软件工程很有兴趣。为什么呢?如果做软件是一个项目开发问题,那我们希望软件工程解决普通性的问题,超越一个项目。所以这个问题我认为很有挑战性,一直在搞这方面的工作。 

  大概两年前我在科学出版社出了叫做《现代软件工程》的书。为什么加“现代”两个字?主要想界分一下现代软件工程跟软件工程的一些差别。什么是软件工程?希望改变小作坊式的软件开发方式,转向工业化,就是希望学习工厂的经验,物质生产的过程。物质生产过程基于一些规律,物理学原理力学等等,和工程的一些方法。能够使生产工作达到大规模生产,效率高,不需要很多的技艺。比如手工加工一个零件需要很高的手艺,按工程规范做,就不需要长期学手艺,学工程规范比用手艺实现简单。这是软件工程追求的理想。把软件变成一个有规律的物化的观念。 

  但是90年代以后发现有很多矛盾,我参与了很多项目,觉得并不像那个样子。最大的矛盾是什么?软件不是纯物化的东西,这里面有人的因素,所以这就有很多变动的东西,不可能像理想的物质生产过程,基于物理学等的原理来做。人的(认识)规律,我们还没有认识得很清楚。现在有五花八门适应各种情况的东西出来,才能真正解决它的问题,适应变化的需求。所以我基于这样的观点:全球化形势下,变化多端;过去是很稳定的情况还可以;现在全世界这么大范围里面,任何一个地方发生变动,就可能影响到你这儿,所以变动显得是非常地迅速。这时,人的因素就更突出了,而且方法就更多种多样了。我就加上一个“现代”,强调仅用物的规律的不够,改变过去软件工程的想一成不变的用一个方法解决一切,出现多种多样的、丰富多彩的问题。 

  到现在为止,我这观点,跟各方面交流不够。这次有机会跟大家谈谈觉得很高兴。能跟参加实际工作的朋友交流,可以更好地展开这些思想。 

  我今天主要想提十个观点。主要是针对沙龙给我的参考文章里面提到的普遍问题。 

  一个观点,现在的项目各个都不一样,每一个项目都应该有自己的规范,规范都是不一样的。软件工程是超越项目。就是说每一个项目不一样,但是项目之间有共性的、有规律性的东西,我们要把这些东西研究出来。所以软件工程是基于项目和产品,不可能脱离项目和产品,但要超越产品,超越开发组织、开发的团队、个人。要超越,就要有客观性。软件工程环绕事实进行,这事实就是软件过程中一系列的东西,包括文档等等。所有工作要建立在客观性基础上。这是第一点,就是说要超越项目;共性跟个性的问题;不能凭主观想象,要有事实作为基础。 

  第二个观点,软件工程理论方面,经验实践,各式各样标准等等,跟物质世界相应的东西是有区别的,软件工程的这些理论、方法、标准、开发模式等等,是强烈依赖于具体环境和执行的人。就是说,这个人本身不像一个车间里一个机器,一种机器生产的东西可以是不变的,但是在软件过程中,人不可能一样的。人的能力,人的行为都不同。人的一些东西,比较难刻划,所以目前软件工程中所有理论是不充分的。因为人是在其中起很主要作用。虽然模型总是一种简化,但是人的简化往往是太简化了。我们应该看到这些理论到目前为止是不充分的。 

  不充分以后,要去推广就有一定难度。我们说,所有理论要使用的前提是什么?可重复性。像CMM,最基本的条件是可重复性。但你的边界条件都是不重复的,整个过程就不太好重复了。所以要认识哪些东西重复,哪些东西不重复了,推广就难度比较大,不是不需要推广,而是难度比较大。常常需要人在软件过程中调整。有时因为有“人”的参与而能推广,隐含了人在过程里对差异的的能动性调整。所以学习的时候要有这样的理解。第二个,理论的东西是一个抽象纯化的东西,我们要在实际运用,要把纯化变成实际的情况。我觉得很奇怪,大家都对软件工程说,实际开发怎么跟书本上不一样,我想物理学书本说动者恒动,静者恒静,小球会在绝对光滑的水平面上不停地滚动。物理教这些,你从来没有要求实际是这样,这球在地毯上滚,一会儿就停住了。所以说,在这个问题上,你学到的理论是理想情况,对实际情形来说第一个就是不完整的,很多边界条件没讲清楚,也讲不清楚;第二,实际工作时,不能要求照着书本上理想模式来作范本,这样要求是不合理的。需要体会你的环境,理解为什么,对你有什么帮助。而不能希望百分之百照抄,这样你什么也学不到;不能学到对你有共性的东西。 

  第三,对于文档。我们要客观性,这中间有一个很大的东西就是记录文档,通过文档记录一些东西。大家说文档里面的东西也有错,我要照着它做不是就错了。问题是文档你知道错,就可以改,如果没有文档你是不是就错更多。记录一些东西,便于大家交流。不要你想你的,我想我的,这是文档可起的一个方面的作用。第二个文档应该是记录了开发的历史,大家可以想人类社会的历史起了什么作用:了解过去,认识现在,展望将来。我更提高一些,说文档应该表示你把对问题的理解记录下来,工作进展应该记录下来,这是文档的作用;第二个从更深层次所起的历史作用:将来可以改进,记录下你的成就。所以对软件组织或者软件工程师个人来说,如果你有抱负,你希望能起历史作用你就得把你的工作记录下来。所以应该用更高、更深层次来思考这些东西, 

  那么历史有什么作用?我们只能够根据历史去预测未来,并不是我们为了躺在老祖宗身上,而是我们为了向前看,为了现在的工作,为了将来的工作。现在工作怎么来看,我们还没有做,将来工作更不知道。那只有什么?只有靠历史,靠历史去预测未来。但是我们不能靠历史去计划未来,我们未来一定是跟历史不一样的,中国还停在封建社会?这是不可能的。还是在文化大革命?这是不可能的。我们为了更好的未来,我们希望未来比过去历史更好。所以我们不能照过去怎么现在就怎么样,而是要吸取历史经验教训来指导我们,这就是历史的作用。 

  第五个,什么是历史,历史就是过去的事实,真实的事实。软件工程包含很好的项目的成功的经验的总结。我们软件工程有一些东西,分析得更多的是过去成功的经验。学习软件工程这些东西,是为了掌握历史的观点。一个人脱离了历史,就是没有文化的。有人问,学了有没有用?当然你要没有学历史,你也可以做事,但是往往是短期的。你要有更高要求的话,不仅是就事论事的话,就应该学习过去成功的经验,而不仅仅是为了当前这件事,对素养的提高很重要。 

  历史要尊重事实;尊重事实有两方面,一方面是历史,一方面是现状,现状也是一个事实,跟历史不一样的,所以你要正确认识自己和别人的情况。 

  第七点,在全球化的进程中,技术环境的变化非常多样,而且复杂,变化非常迅速。对一个具体个人或者一个企业来说,周围不确定因素太多了。针对这样情况,从软件工程本身来说,对它的要求实在太高了。为什么呢?现在使用软件工作已经不像四十年、五十年、七十年代是非常少的人群,现在有非常多的人群,各行各业,现在有很多不是学计算机的,学化学的、学机械的,有很多人甚至不是大学毕业的,也在搞软件,也搞工程。所以对软件工程希望的东西太多了。人群广泛以后,更希望简单好用,还要实用,还要有效。又要处理非常复杂的问题,各式各样的问题,所以给软件工程带来了很多的矛盾。根本的矛盾是什么呢?这是我的观点,我认为开发中所有能看到的东西,但运行时的情况发生了变化。现在面向对象技术出现以后,运行视图,运行时实际情况跟你开发时看到的东西不一样了。从前结构化的时候,还可以,差不多。因为结构化设计时的模块结构,在运行时是一样。设计是什么样的模式,运行也是差不多这样的模式。如果希望运行时效率提高,那就在什么地方去改一改。人可以看到的一些东西,就能够去做它。看不到的东西、在运行过程中,全放在脑袋里面,对人的要求太多了。处于这种状况下非常困难。 

  运行模式是由硬件确定的;是开发平台确定的。也就是说,现在这种本质的硬件已从四十年代五十年代一直延续到现在。某种意义上,真正要解决这样有很多的难点的开发问题,得从根子上来解决。所以现在还有很多人在研究更基础的问题。国内这方面考虑少一点。我们应该认识到,什么方法能解决那么困难的问题,看不见啊!即使有的话,是会有困难的。有根本矛盾的困难。 

  第八个,一般性的问题很难解决,但是具体问题并不难解决。一个一个成功具体的项目很多。项目为什么成功?因为把它主要问题、主要特征解决了。现在就有一些方法很极端,比方有人说XP,或者更极端一些,我什么方法也没有,就完全可以用黑客的方式、就可以去解决问题了等等。这种情况是强调某个片面,就是强调局部,针对具体问题可能是有效的;或者强调不是那么片面的,但也不是很全面,针对具体问题具体解决的有了各式各样的方法。各种情况的多样性。还有一种极端就是想全面,我也碰到,有时候审查论文,或项目,说想有一个知识库把所有知识都放进去等等。按这种东西照搬会超越你的控制能力,可以是一种想法,有道理。但是能用吗?得自己考虑。应该去理解和利用它的一些内涵的东西。比方说有一些方法很全面,把各种东西刻划了,也许对你全部做不合适,但是你可以当做一种参考模型,去理解所考虑的方方面面,帮助你找到自己需要的。但是找到自己需要的前提是什么?你得知道自己需要什么。首先得清楚自己的情况,然后还要清楚现在的技术提供一些什么。 

  不同环境下情况可能不一样,甚至观点不一样。现在软件工程中,客观存在就有冲突的观点,有不一样的东西。这是在不同背景下,适应不同情况。得理解问题的边界条件。得承认这是客观事实。现在最好的观点是你不要违反常识,常识告诉你的往往是最有效的东西。不要盲目追求一些很出名的东西。在面对复杂而有冲突的问题,想获得成功,需要的是积极思考,认识自己的问题,通过理性思考,包括认识极端的方法,全面方法的作用,通过一些合作和交流去解决一些冲突,得到一定的平衡。软件工程是通过平衡解决问题,也可说软件工程处理的很多问题是得到“满意解”。另一方面“满意解”也等于“不满意解”。为什么?它仅是一种平衡,它遗留了一些不够满意的东西。对不满意的东西,就应该想办法再提高、去解决。所以应该有发展的观点,不要觉得协商“满意解”就解决一切了。还要考虑进一步创新。 

  总的说起来,对每一个软件工程师来说,我们面对一个新问题以后,就要了解这些东西,有这样的过程:从(一些技术)不知道,到知道,知道以后要真正理解,理解后要去实践,开始不一定能正确地实践,正确地实践后,可能又能发现技术对你有不足的地方,可以得到一些创新的东西。开始,你不知道做事规律的话,可能一点约束也没有,就是没有规律的无序的工作,等到认识一点,有一些规律,可以防止你的一些错误,可以使你的道路走的更正确一些。起初,这样的规律可能只是一些限制,进一步认识,可以规范成一个过程,就等于规定一条道路,工作就更具体了。下一步,通过不足处,希望进一步提高认识,有一些突破性的工作,就能够在新条件下得到新的规律。这是一个循环的、不断的过程。 

  通过学习软件工程,我对咱们中国老祖宗还觉得挺有价值,我画了这个中国最古老的太极图,看太极图我觉得很有新意。从整个现代软件工程观点里,反映了一个人跟机械(物)的关系。每一个人的一些工作里包含已经认识的一些机械的、可重复的,机械性的东西,可以做成一些机械。当你把你的工作中能够认识到的:那些东西是可重复的、可以机械化的东西做出来。假如太极图中人代表黑的一半,机械代表白的一半。那么代表人的黑的一半核心里面包含了白的、机械性的东西,逐步在旋转,人的具有机械性的东西慢慢转换成白的。当把人的主要工作都通过机械解决成自动化,则已经转到另外一半了。但是另外一半里面肯定包含需要人做的东西,你对自动化(机械)所不满意的东西:黑的小圆点。不满意的东西就是需要人去创意的东西。所以白的、自动的里面还包含黑的,不能够一片全部雪白的。还有黑的就需要人解决的。这部分成主导时,转为代表人的另一半了。而人解决后,对新的问题的认识就循环性提高,创造新自动工具。所以人跟机器关系,人和自动的过程是在不同的层次上逐步演化。 

  更进一步可以讨论,很多人都感觉到的统一方法、不统一方法问题。看太极图,现在两半分别代表统一和不统一。咱们老祖宗也解释得很好:统一里包含不统一。总有一些不太满意的东西。有了统一方法后,随着环境条件的变化,统一方法不能代表的东西会越来越多,就是说会有各种各样的方法、平台、机器,越来越多。但不统一中,有共性部分,通过这个共性部分,如果能够慢慢超越不统一的根源问题后,又会变化成统一方法,所以这又是一个循环的过程。 

  这是人跟机器关系的太极图。这是技术方法、体系结构、平台、软硬件划分、硬件、体系结构、计算原则,的统一和不统一关系也是符合太极图这样的规律。举个例子,看这个太极图,分析体系结构的统一性问题。原来都是用结构图这个体系结构。六、七十年代大家日子过得很好,体系结构都是基本一样:都画结构图;虽然也包含很多问题,但当时不突出。现在不行了,要层次结构、“Client/Server”结构、还有白板等等,各种各样体系结构。已经有很多很多不同的体系结构,但在某些场合还不够,还不满意。在因特网刚起来时,只有B/S模式,大家都觉得B/S模式好,一窝蜂都用B/S模式,就统一了。过了几年,B/S模式不满足了,黑的一半又转过来了。过一阵子可能又会有优势方法形成统一了。所以统一不统一也永远是循环,不要认为今天用统一的体系结构就是一辈子这样。今天不同的开发方法就一辈子用不同开发方法。更进一步可以画这样一个图,白的一半里面黑的核心也可用太极图表示。比方,外面看成软件工程方法,里面看成软件平台,或者硬件,硬件也在变化。我觉得老祖宗的这个东西很有生命力。可以通过太极图看软件工程的过去和未来。这是我对现代软件工程的看法:早期的软件开发仅考虑人的因素,传统的软件工程强调物性的规律,现代软件工程最根本的就是人跟物的关系,就是人和机器(工具、自动化)在不同层次的不断循环发展的关系。关键是观念改变。就讲到这儿。 

  主持人潘加宇: 

  非常感谢周老师的精采见解,从深层次上从思想给我们大家一个启发和提示。 

  提问: 

  刚才您提到很多公司可能不太清楚自己需要什么,这可能是很多目前国内公司的现状,周老师有什么方法解决这个问题呢? 

  周之英: 

  实际也是分层次的,不是说我有什么方法。我觉得所有的管理学都有这样思考模式。比方说,公司首先得要确定你商务目标是什么,要做什么事情,这就不是我能回答的。但办公司的人自己要明白,要确定市场对路的产品,或服务,你都要确定。然后怎么做,就是企业目标确定后怎么来实施;然后看实施中有什么问题,针对问题去解决。现在讨论软件过程改进,我最近也看见一些美国的资料、包括CMM,反复强调:首先从你目前状态做起,然后分析你的问题,拿CMM作为对比来分析。现在有很多方法可以做。但是首先自己总要做事,你什么都不做,然后说你告诉我,那是不可能的。比方说已经成立了公司,肯定知道要做什么,做出什么以后,你有没有提高的欲望?有没有改进欲望?如果你觉得很好,那你就继续好吧,也不用看别人了,你就很高兴了。如果你觉得这地方不够、那地方不够,你就针对自己的问题;再有一个,可以把自己的问题排排次序,逐步地进行解决,这都是软件工程最基本的思想。 


  提问: 

  现在一般的不是软件企业有很多所谓的管理咨询公司,专门帮助他们发现问题,解决问题,你觉得以后是不是存在专门的咨询软件公司,我帮你发现,我帮你解决? 

  周之英: 


  我想是会有的,但对中国会有一个过程,会有一段路,会有一段时间。这些公司会非常有用。因为我们国家就是在这方面真正的、深入研究工作做的非常少,可以说没有。怎么在中国环境下能够达到这些东西,可能研究比较少。国外有很多可以借鉴的东西。但是我们要正确借鉴,你别搞歪门邪道。那也是没用的。比方说学CMM,它是强调给你作为改进的一种测量,测量你改进到什么程度,并不是要求你追求多少级的指标。如果仅为了指标,就会弄虚作假,最后什么也得不到,白花时间和力气。第二问到底有用没有用?这些东西都是国外的经验,但是国外的经验你要消化,包括CMM也是强调了这点。最近有叫做CMMI就是集成的CMM,特别强调要理解你本身的环境,不是照搬条文,照搬条文必然走到死胡同。要理解自己的工作,建立在这个基础上。所以在这时候,比方说有一个咨询公司到你这里帮助你,是可以的。但是你得要提供情况,你要配合,你要跟他一起商量。在咱们国家会有一段时间,重视以后,会有一批人从事这样的工作,跟企业结合起来做这方面的工作,我觉得还是很需要的。 

  提问: 

  你觉得软件工程会不会限制一些软件公司的创新? 

  周之英: 

  规则是帮助你的,但是要正确地认识。就像文档是让你交流、让你总结经验。如果把文档变成死的,变成压在头上的紧箍咒,那可能就限制你创新,要正确理解。因为对于每一个软件公司说,规则这些东西不是外加的,是你自己建立的,你不要建立规则去束缚自己,建立规则要帮助你。如果发现这个规则不合适了,影响创新了,或者创新需要新规则,就要调整规则。软件工程本身是处在发展中,不是死的。也有人来问我,说这东西影响了我们,文档没用。我说:你既然说文档没有用,你现在做的事情是没有意义的;你就别做。等你认识到你能做出有用的东西时,你再做。去做有用的东西,干吗做没用的东西。所以这是一种常识,你不要做违反常识的东西。 

  主持人潘加宇: 

  我们再次感谢周老师的精采见解。第二位发言的嘉宾是微软研发中心服务系统平台的杨永生经理。微软是世界上最大的微软公司,但是微软产品开发流程,还有内部规范一直是很多软件开发者都想知道的,这就是所谓的微软的秘密了。微软内部一定有一套自己的方法,但是他没有公开出来,告诉你第几级应该是这样应该是那样,没有告诉大家。假如微软这套东西虽然说没有像CMM,但是它可能不是CMM胜似CMM。今天我们请到了杨永生先生给大家来展示一下微软的秘密,杨先生目前在微软负责的MSN相关产品的开发。他今天发言的主题是《微软产品开发过程》。有请杨先生。 

  微软研发中心杨永生: 

  大家好,很高兴今天有这样的机会能跟大家交流。 

  微软公司一直希望帮助中国发展软件产业。斯蒂夫.鲍默尔、比尔.盖茨都在不同场合提到过这一点。我们微软中国研发中心走得更前一步,在今年5月份的时候,我们和信息产业部签订了为期两年的合同,就是与国内的一些软件企业介绍微软的软件产品研发实践。目前我们已经办了两期,第一期在北京办的,第二期在上海。我不知道在座的有没有参加过的。我自己参与了一些课程的讲解,所以我也很高兴今天有这个机会,和大家交流一下,看看大家关心一些什么问题,以后再办这样的活动更加有的放矢。 

  今天的题目写的是微软产品的开发过程,这个题目很大,我们跟信息产业部办的“共享新世纪”活动总共是四到五天,我不可能在这么短时间全讲完,我主要从开发实践,从过程方面做一些介绍。 

  我看到王东临发的电子邮件里面提到了关于软件产业,以及作坊式生产方式的一些讨论。什么叫作坊式生产?或者说到什么时候我们软件产业成熟了?我个人观点是,作为工业化首先要分工细化,就是更专业化,所有事情向专家方式发展。另外生产过程、质量控制要标准化、产业化。这两方面标志着一个产业的形成。另外当然还要看市场,产业的规模,以及行业自己的成熟程度。 

  刚才周老师说,软件产业某种程度上类似一些产业或者工业生产。我个人觉得很像电影工业。首先二者都是头脑的产物,然后全是由人完成,都需要复杂的过程。电影分工非常细,有导演,各种制片什么的。投入产出比都很大,但是高风险,拍一部电影或者开发一个软件,有可能很成功,有可能有人用,但也有可能彻底失败。二者都有盗版。电影有影评人,软件业也有许多专业评论家。所以二者还是很相似的。看一下中国电影,给我们启发是,我们有很好的演员。比方上次我去美国碰到一个德国人,他说最喜欢的演员是章子怡。这说明我们的演员是很好的,但是为什么我们电影没有好莱坞,不能到国际上竞争?我觉得是各种人才的分布不够平衡,在发行,推向市场方面,可能还是要差一些。软件也是如此,我们有很好的程序员,在其他方面有很优秀的人才,但是整体上各种人员的发展,分配是不平衡的,在产品工业化的管理、推向市场,以及产品质量控制方面还是不够的。此外我觉得生产方式和生产过程不够标准化。 

  所以这里我主要介绍微软内部产品组各种角色是怎么划分的,他们具体做什么,这些人是怎么组织起来参与产品的开发的。另一部分我想介绍一下微软产品开发过程,也就是有了各种角色,有了团队之后,怎么协同工作,把一个项目从始到终完成,推向市场。 

  其中有一些谈不上是微软独有的,而是行业流行通用的,但也有一些与微软的具体情况、企业文化会有一些相关。以前我在上海讲课,他们说你这个东西我们拿回去我们也用不着。其实我觉得最基本一点,是要清楚我们这里谈的是微软怎么做面向最终用户的产品。对于做解决方案,微软另有一套东西,叫“Microsoft Solution Framework”就是解决方案框架。还有一种误解,就是微软那么大,你们可以这样做,我们一共几十个人,我们是不是没法做这个事情?这个其实也不见得,听了微软组织结构你会发现,虽然微软是很大的公司,但是实际上,在某种程度上是以好多小公司方式在运作,具体到一个团队人员规模也并不是很大的。 

  微软产品组现在基本上有十一类人,各有各的专长,在产品开发过程中有自己各自不同的任务。 

  第一种是产品规划人员。产品规划人员主要任务是调查,包括调查你的竞争对手,客户,以及其他市场需求。产品规划的过程是定义产品的过程。他们通常会做很多研究,通过跟踪市场用户,做市场调查,看行业的报告,从而确定产品三到五年的发展规划。其实作为产品规划人员最重要的一点,就是要有前瞻性。不仅仅是能看到现在市场是什么样的,而更要能看到三到五年以后会是什么样的。我们可以看到微软好多产品,都有一种说法叫”version 3.0”,可能在1.0, 2.0时不是很好,有可能是功能的问题,也有可能是超前于市场的缘故,像Windows,做出来时候,无论从硬件或者软件应用程序来看,都没有市场,但是通过不断的改进,到3.0时就取得了很大的成功。从这一点看,产品规划人员是非常重要的。 

  第二类人是产品管理人员。某种程度上有点类似于做传统的市场人员,但是也不是完全相同。他们主要任务是把产品推向市场。包括决定产品的定位、包装。最重要一点是向用户传达一个什么信息。也就是用户为什么买你的产品,或者升级到你的产品。很多人说微软的产品除了质量好外,市场也做得好。象IE就是一个很好市场运作的例子。比如,IE最初的用户定位,不是试图让Netscape已有的用户转到IE上,从来没有这么做过.而是面向新的Inte.net用户。这就是用户定位很清楚。此外,对IE不同版本,开发侧重点不一样,就需要用一条简单的信息告诉用户,这个版本比其他版本有什么好处。这些都是产品管理人员要做的。 

  下一个角色是程序管理,我们以前叫项目管理,但是上次我在上海讲的时候,学员说,他们说国内项目经理做的事情很不一样,所以这里我就叫程序管理。有时候我可能会交换着用。 

  在微软,程序管理主要是做产品,在适当的时候推出适当的产品。他碰到的最主要困难就是如何保持控制。适当时候意味着你必须控制好产品的发布日程,不能有延误。大家知道产品过程中不确定的就是人为因素,这个发布日期控制好,这是很困难的。还有要做出正确的取舍。有些时候你会在发布日期和新的特性之间需要做出取舍,或者是不是采取新的技术,用新的工具、算法什么是不是必要,我们是不是需要去做,做什么和不做什么之间,做出取舍,从而控制产品的特性并使其能满足市场需求。程序管理人员需要衡量做这些事情的危险性,需要衡量得特别清楚。 

  这三类人员把整个产品的策划,推向市场,以及产品开发过程控制基本上定下来了,可以是说最关键的。 

  剩下的有产品设计,主要是做产品的用户界面或者可视化方面的设计。这些人一般人都有设计方面的背景。象微软的产品,以前对用户界面设计或者用户交互方面侧重不是很多,因为传统PC,早期只是专业人员的工具。但现在越来越向消费者、初用者方向发展,那么对于界面设计要求越来越高。公司在这方面投入了很大的人力。我不知道大家都看到新的Windows XP、或者像“MSN explorer”没有,这些产品和传统的产品相比,外观,包括用户使用方式。都是完全不一样的,更注重的是一种整体的体验,经历。 

  产品设计还有一个重要的工作,就是保证产品所有可视部分保持一致。不同的模块或者不同的特性可能由不同的人员开发,如何保证可视部分看起来一样,使用户不至于在一个产品使用时突然觉得不是同一个公司的产品,这就取决于产品设计人员。 

  第五种人员是产品可用性评估工程师,他们主要做的是保证产品可用,易用,而且能够容易被用户接受。一般在产品开发的过程中或者初期,都有一些不同的原型,就是针对一些特性怎么做,用户怎么交互,设计一些不同的原型,然后交由可用性评估工程师做可用性测试。从而决定最终的方案。这方面微软一直是非常重视的。你可能注意到在IE早期版本里,地址栏里面并没有“Go“按钮,只是有一个地址栏。但是后来通过可用性测试,发现一些用户把地址敲进去后,就在那儿等着,也不知道按回车。确实就有这样的人。所以从5.0开始在地址兰后加了个按钮。用户敲完地址以后,可以试着按一下按钮,来连到他所需要的网页。 

  下一类就是开发人员。开发人员在微软应该是很重要的,但是我感觉相比之下,没有象在我们国内一些企业那么重要。开发人员主要工作,一部分是设计一些算法,对PM做出的文档或者特性说明要提出自己的反馈。还有更重要的一块,就是帮助PM推出产品日程,从什么时候可以做到“beta”1、2,什么时候可以发布。这些跟开发人员密切相关,所以又开发人员决定它的进度。除此之外,就是通常的写代码,编程与调试,以及后期的缺陷修复。 

  下一部分是测试人员。微软对测试非常重视。测试人员在产品开发过程中要独立完成。就是不受其他人员的影响,独立完成测试。另外某些情况下,要作为用户的代言人,把用户的利益放在首位。如果你认为这个产品这样发出去不行,就一定要坚持。当然这样往往就引起有一些激烈的争论,决定问题到底是要不要解决。但最终的结果是使用户受益。 

  再下一类就是微软特有的本地化人员。这一点我想对大家目前可能不是很适用。但我们将来怎么把我们的产品推向世界,有一个全球化的过程,也有通过本地化来满足其它中国以外其它市场的要求的过程,所以将来肯定会有这方面的需求。还有一类人员是文档发布,这里面包括网站方面的文档,软件里边的文档,这些文档主要是帮助用户怎么使用产品。还有面向开发人员的,做一些代码示例,这是文档发布主要的工作。我们传统谈到的开发文档在微软是PM来完成的,就是所有的程序经理在项目开始针对每个特性写非常详尽特性说明。 

  还有一类人是产品支持人员。这在微软也是非常重要的,一方面微软跟最终用户打交道最常见的一个途径,往往有很多用户打电话提出这个问题,将来在下一个版本会把它解决掉。还有最重要的在微软来说,用户每打进一个电话都是要花钱的,实际上产品支持直接影响到公司的营业额。提供更快速更有效的用户支持,是最重要的一个环节。 

  最后一个角色是运营管理,实际就是网站运营管理。大家也知道,微软产品目前越来越多和Internet紧密集成,象我们现在做的“Hotmail”、”MSN Calendar”等产品,本身就是一个网站。运营管理角色原来是没有的,这只是近两三年来新发展出来的角色,在将来会越来越重要。因为你跟传统的做所谓包装的产品不一样。以前你可以说我把CD做完了,产品发布了,就没事了。因为用户买了产品,你已经赚钱了。实际在做连机在线服务的时候,你软件发布仅仅是一个开始,用户只要使用一天你都需要花钱,都会影响你整个的赢利。实际上在线管理是非常复杂的,比如“Hotmail”,现在有一亿一千多万用户。在前端大概有五千多个服务器运行着Windows 2000,来满足用户登录。后台还有许多服务器负责邮件的收发,存储,是很复杂的一个系统,因为有底层的网络,有硬件,还有操作系统,还有上面的你的应用程序,再加上Internet本身又是不确定的环境。怎么把这复杂的系统管理好,是很具有挑战性的。因为跟传统的应用程序是不一样,用户随时可以走开。而且还有很多不确定性,象我们传统的产品,用户买得越多,我赚的钱越多。但是在连机的时候,用户多有时候也可能是一个问题,就是你可能支持不了那么多用户。比如一下有很多人来访问,你的网站是不是能满足这么多用户访问的需求。网站运行还往往需要提前对流量,或者对用户数满意做出比较精确的预测。运营管理在微软会越来越重要,而同时产品的很多设计会影响到你到底能不能好好运行。所以这对其他人员也提出了新的要求。 

  目前基本上来说,运行管理、产品规划、产品管理和程序管理这四类人实际上在主要推动产品的进程。其他人扮演的是一个被动的,或者专注于做具体事情的角色。但是每一个角色,都是不可或缺的。 

  前面我们讲了微软现在基本上有十一个工种。怎么把这些人组织起来,能够更有效地去投入到开发过程中呢?微软目前基本上是一种所谓的条块结构。在公司内部最基本的组织是一个产品单元,比如像IE就是一个产品单元组。产品单元组的管理者会有预算,有人有钱。在每个产品单元内,在行政上按你的工作类型来划分,像项目经理,他上面会有一个总的项目经理组长,如开发人员有一个开发组长,测试人员也同样。这是在行政上的组织。行政组织结构主要是为了对你的业绩做出一些考核,包括将来会不会给你加工资。在做产品的时候,在每个产品单元组内,又按不同的特性划分为各个不同的项目组,划分的基本原则是希望由一个很精干很小型的团队来进行开发。因为我说了要按产品的不同特性来划分组织,这样就要求你在产品设计时,大的产品能分成小的模块和小的特性,然后相互之间又没有很大的依从关系。因为跨组的交互或者跨组的依从关系是最难管理的。每一个团队内基本上由项目经理,或者程序经理来领导,来负责一个特性,下面会有开发人员,也会有测试人员,基本上开发人员和测试人员的比例一般都是一比一,这样一个组差不多十个人,是最基本的开发单元。一些跟技术有关的决定基本上是项目经理做出来的,不会有上面的人左右你的决定。这种组织结构能够使在一些商务和技术方面很快做一些决定,同时因为每个组人少,就能使大的团队能像小的团队这样很快向前移动,效率不会受到影响。 

  举一下IE产品组为例。它在不同时期有不同的人员,人数也是不同的。最早IE1.0是几个人,IE2.0可能是三四十个人,到IE4的时候基本上就到了300人的项目组。在300人的项目组里面是这样的组成,一个是产品单元经理,这因为是以产品单元为最基本单位,所以产品单元经理是大老板。下面有五个产品规划人员,产品经理有二十个,项目经理五十个,开发人员一百个,测试人员也有一百个,还有文档发布,因为IE也有一些SDK,也有一些联机的网页和帮助文件。文档人员有十个人。这种人员结构也是根据产品的特性,或者你在这个版本中间你的侧重点来决定的。同样在IE产品组。在IE5.5的时候,也有300多个人,但这时候项目经理就只有15个人,比IE4五十个人要少好多,开发人员也只有40个人,因为到IE5.5的时候,基本上大的特性已稳定的,IE5.5面向最终用户方面做的工作要少一些,主要在稳定性和性能方面做提高,另外对一些公司大企业的用户做一些支持,所以开发人员和项目经理数目减少了,但是测试人员很多,测试人员有200人,这主要是在IE4的时候觉得少,所以在IE5的时候就组织独立的测试队伍进行测试。 

  IE产业组分为十个项目组,每个组大概有十到五十个人,基本上负责一个产品模块,像浏览,或者HTML的编辑、打印。但是有一些时间一个项目经理会负责不止一个特性,甚至有一些开发人员可能他在某些方面有专长,他也需要在不同组织之间流动,所以这种组织实际上是一个动态的。 

  下面我们谈一下微软产品开发过程。开发过程划分的基本原则是,希望把大的项目分为若干个里程碑式的开发周期,并在各个周期都要考虑一些冗余,使你的开发周期变得更实际一些。通过目标描述来保证所有的人是沿着同一个方向发展。利用产品特性描述来指导开发过程。同时利用用户的数据来决定一些特性的取舍,或者优先级的排定。加不加这个特性,不是开发人员觉得好,我就做这个东西,往往还是从用户角度来考虑,用户从中间有多大收益来决定。 

  还有更重要一点就是统一的术语。在微软内部刚进去时也会做类似这样的培训,会请的各种角色做一个讲座,大概需要六七个小时。其中有对很多术语、缩写,还有对这套开发模式的介绍。从而保证所有人理解的都是统一的。这样你才能保证无论在做事或者讨论的时候,大家的理解是一样的。 

  还有一点是在开发产品过程中不间断地测试,而不是做完了到某一个阶段才开始测试,因为往往那个那时候往往已经太晚了。 

  微软产品开发过程分为四个阶段,第一个阶段是规划阶段,这个阶段基本上是由产品规划人员以及项目经理来驱动的,这个阶段主要是要完成这样一些事情:一个是目标描述。基于这个产品目标,我们已经知道了,我们需要做哪些事,做哪些特性来达到这个目标,这样就决定了产品提供哪些的功能。然后PM就要根据这个功能来写出相应的规范说明。一般产品规格说明,就是传统上说得技术文档,基本会写两次,第一次写一个简单的,里面列出了你这个功能或者你的特性希望达到什么要求,跟我们整个产品的目标有哪些相关的,产品之间依从性,为什么要做这个特性。写完这一页的特性描述之后,大家会坐在一起看一看,排定一个优先级别,哪些事我们先做,哪些有可能做,或者哪些是下一版本在做。把这个事情做完了,程序经理会写一个更详尽的特性说明,这是指导开发、测试整个过程的技术文档。基本上一般都有一些模板。 

  在规划阶段,当所有的特性规格说明完了以后,还要制定日程进度表。这个日程进度表往往需要由开发人员的参与。看到了这些产品规范,根据你的经验估计做这个需要多长时间,还需要打入一些冗余,把这个做完之后,产品规划阶段就已经完成了。 

  产品阶段完成的标志,就是目标描述,所有特性规格说明,以及日程进度表的完成。这样就进入第二个阶段,即开发阶段。因为我们自己有特性描述,已经知道做什么。所以根据这些特性,会把这一阶段,分为三到四个小的阶段。基本的划分原则是重要的或者相互依从的特性开始做,剩下的一些次重要的。会在第二或三间段做。这一间段是由开发人员去推动。所有的开发人员开始写代码,对于每一个开发人员都有相应的测试人员,会把开发人员写的代码拿去测试。这个阶段完成的标志是所谓的特性完成,或者叫代码完成,也就是所有的这种特性都已经开发完毕。这时就进入了下一个阶段,测试阶段。测试阶段主要由测试人员推动。在开发阶段也有测试在进行,但在测试阶段进行的主要是集成的测试,象安装,兼容性测试,性能,或者其他方面的测试。此外通常还要发放一些“beta”版本,让用户去实际使用并发回反馈。这一阶段会有更多的“bug”进来,但是这一阶段基本上不会增加一些新的特性。这一阶段结束的标志是所谓的“零缺陷”。微软有一些来跟踪缺陷或者叫“bug”的工具,如果从这些工具看到针对这个发布周期已经没有任何活动的bug,这就标志着稳定化阶段已经结束。现在有一个趋势,就是稳定化阶段做得越来越长,从而更好的保证产品的质量。 

  到了零缺陷后,就进入了下一步的发布阶段。在这一阶段大家会继续跟踪bug的状态,直到确认这可以发布了。一般会做一个CD,或者把它发到网上。最后发布阶段会由产品经理、项目经理,以及做运营管理的人来共同执行。 

  总结一下,微软产品组有明确的分工及不同的角色,产品开发由四个阶段组成,即规划阶段,开发阶段,测试和稳定化阶段以及最后的发布阶段。总的原则在微软一个是有详细的分工和职责的划分,通过各个人人的角色控制产品开发过程。我刚才谈的四个过程,十一个角色,但是每个角色实际上并不是同步的。比如像产品规划人员,在第一个阶段和第二个阶段产品规划人员会有一些工作,到第三个阶段因为特性已经完成了,不会有新的特性,产品规划人员已经开始做下个版本。但是产品经理会继续做这个产品保证这个产品继续进行。还有是客户需求决定产品的方向和目标,往往在做一些决定时考虑的是客户和市场,很少纯粹为了技术和其他原因。最重要的是把大的项目分成若干个子项目,是渐进的,不是一次性把很大的问题解决。还有目标描述和产品特性说明,就是我们传统文档,这是为整个项目起到了指导作用,必须定义得很清晰,使所有人都能看到它。最后一点,从项目一开始开始让所有人都去介入。因为好的产品是设计出来的,不是最后开发出来的,因为前期基本上定下来以后,开发的后期是完成的阶段。如果设计有缺陷,比如没有考虑到技术支持方面的问题,后期很难做。假使再加进去对产品质量或者发布日期都有很大的影响。还有就是通过不间断的测试来保证产品的质量。 

  我就讲这些,谢谢大家。 

  提问: 

  微软产品开发过程的每个阶段,包括每个工种,你说有十一个工种,他们之间怎么良好沟通?第二个问题,微软这个过程有缺陷吗? 

  杨永生: 

  第一怎么保证他们良好的沟通,在这个过程中,项目经理起到很大的作用。他基本上是交流通信的中心。做一些决定,负责跟各个地方的沟通,主要是PM做的。各个角色之间会有直接的沟通,但大部分是通过项目经理协调的。 

  微软的各种角色设置并不是一开始就这样的。象PM,是在89年做了一个项目后,发现这样效果很好,才开始在全公司推广。象网站运营,以前也是没有的。所以是一个不断发展的过程。缺陷可能有,但我现在确实看不出来。另外这种过程目前来说最适合微软的发展。作为微软基本上做完任何一个项目都会有一个事后分析,大家可能对过程中的一些控制,通讯、沟通方面来做一些反省体会。但对于大的模式,因为原则就是把大的项目分为小的阶段,在各个阶段有专人控制,有不同的侧重点,这个大原则大家还是认同的。 

  提问: 

  目前管理或者各大单位都成立了相对独立的软件测试机构,您认为软件测试机构对软件质量会不会起到非常重要的作用?就是目前的大的单位可能下属好多独立的小单位,其中并行单位有一个是测试机构。 

  杨永生: 

  微软小的时候是全公司只有一个测试队伍,从行政上来说是这样的。后来公司发展大了以后发现这样有问题,才把全公司一个测试部门发展到现在每个产品单元有一个。国内的情况我不好说,应该各个公司的实际情况吧。就微软来说这种方式更有助于测试人员和开发人员之间的沟通。 

  主持人潘加宇: 

  下一位嘉宾金山词霸研发部技术总监邹涛先生。金山公司是我们国家最大的通用软件公司,像家用软件,金山词霸,金山影霸,还有游戏软件等等,杀毒软件像金山毒霸,虽然面对世界上很多超级公司竞争,比如微软的竞争,但是金山公司一贯给人印象是豪情万丈。我们现在来听听金山背后是什么样的开发团队。因为今天邹先生忙于开发也没有做好主题发言的准备,他的意思是让大家有问题就问他,有关金山产品方面,比如什么样开发模式,比如对CMM怎么看,还有产品可用性这方面,大家都可以提问题。 

  金山词霸研发部技术总监邹涛: 

  大家如果对金山研发感兴趣的一些问题可以提一下。 

  提问: 

  金山我认为在国内是做得最好的通用公司,现在产品战线已经拉得挺长的,可以说做的都算精品,而且按照中国程序员思路都是习惯于单打独斗,金山在这方面组织程序员集合开发相对比较大的软件产品是比较成功的,希望你谈一下这方面的经验。另外一个问题我想请问一下微软给金山公司造成的压力和你们的对策? 

  邹涛: 

  就我自己感觉国内微软开发规模相对国外来说基本上还是处于最多是一种中型规模,所以你刚才谈到人的作用,我觉得在金山还是很大程度上依赖于某些技术上比较强项的个人,虽然他也是一个团队在开发,但是个人的作用还是非常非常大的。 

  对于第二个问题,微软比我们大很多倍,他给我们造成多大的压力呢?因为大家知道金山现在目前是四条产品线:办公产品、杀毒、娱乐和工具。微软给我们造成的压力是办公产品,至于压力多大?看看微软和金山大小比较一下估计就是那么大了。 

  提问: 

  刚才微软说了一下他的开发秘密,比如有十一个人,比如各式各样的东西,金山有没有这样的一些概念? 

  邹涛: 

  我简单介绍一下。作为金山开发的特征性跟微软很像,它主要是产品化的方向,基本上我们从产品做计划,规划,然后软件先写一个计划,编写代码,最后测试,发布维护,流程和人员也是这样的,但是规模和人员没有微软那么大,我们到现在也没有一个开发组有一百个人程序员做一个产品,是没有的,我现在在金山词霸工具产品组,目前也仅仅是三十个人员,包括文档,包括程序人员,程序代码。 

  提问: 

  您现在单独有一个测试部还是每一个产品组都有一个测试? 

  邹涛: 

  我们每一个产品组都有测试。因为这四条线特征不一样,最主要是便于测试员和技术人员之间的沟通。 

  提问: 

  国内的企业内能保证测试和开发一比一的比例呢? 

  回答: 

  金山公司保证不了。我们产品“红色正版风暴”卖到28,现在30几,40几,这个利润很低的,所以很难按微软标准维持开发,我觉得在中国如果按微软的开发模式开发软件它肯定要赔钱的。但是微软可能从全球统一战略出发,所以它就可以容易做到这一点。 

  周之英: 

  为什么现在国内软件公司线铺得很开,为什么不集中搞好一样,比如你铺了四个生产线,每一个生产线的力量都不是特别足,这四个生产线差距都非常远的东西,不是差不多的生产线,这样的企业策略你觉得给你们带来更多的机会还是限制了你的发展? 

  现在软件工程要特别强调针对你的目标。 

  王东临: 

  这个问题应该是金山公司董事会来回答这个问题。作为开发部的任务就是贯彻董事会的决议,把董事会要求的决议把产品开发好。 

  邹涛: 

  我最多的经验只是在产品开发过程中的开发,谈到更高的策略我就不能回答这个问题。 

  王东临: 

  我问一个大家都很关心的问题,国内软件开发管理体系很多都是软件作坊式的,也有很多人想建成软件工厂式的,但刚才周老师说那是理想状态,实际操作并不现实。金山公司管理模式是什么样的模式,能描述一下吗? 

  邹涛: 

  按现在来看,我们公司开发模式更有点像CMM的模式,而且我们目前公司正在通过CMM认证,我们这样做的目的不是说我们准备做项目或者做什么,像刚才有个嘉宾问我,说能不能出现一种咨询公司帮软件公司提供整体解决方案之类的,我们出CMM目的也是规范一下软件开发者的管理水平。所以基本上目前也是套用这套管理模式。我们现在从CMM2开始做。可重复性的,因为它是成熟模式。

原文转自:http://www.ltesting.net