2001年10月21日下午,第47期IT沙龙在翠宫饭店举行,这次论坛的话题是“现代软件工程”,以下是这次沙龙的实录:
主持人潘加宇:
大家好,欢迎大家光临第47期IT沙龙,我是umlchina。本期沙龙主题是“现代软件工
程”,由我为大家主持。现在我们请本次IT沙龙的组织者,书生公司董事长王东临先生给大家做一个开场白。
书生公司董事长王东临:
大家好。我们这期主题是“现代软件工程”,其中特别强调“现代”这两个字,是因为我们软件业虽然经过了几十年的发展,但主流舆论对软件工程的认识还停留在七八十年代传统软件工程的水平,把软件工程机械化成教科书上所写的生命周期法,甚至还有很多人把软件工程片面理解成写足够多的文档。这是由于中国软件业所存在的一个问题,即软件行业的话语权并不掌握在做软件的人手里所造成的。
应该说传统软件工程的原则基本还是正确的,但是从具体方法来说,90年代以来有已经不少发展和提高了。传统的教科书上的方法在已知条件充足、条件恒定不变时,给出一个静态的最优解应该说还是一个比较恰当的方法。但是应用在商业环境里面,条件还不是很充分,需求在不停变化,那就不太够了。
我今年31岁,我上学时就学的这套方法,而几乎所有的专家学者年龄都比我大,他们更是受到这种传统方法的教育。而咱们国家有一点跟美国不一样,软件等高科技行业受科研单位、大专院校的影响比较大,这些单位的专家学者对政府、媒体、用户等的影响是很大的。我大致分析了一下,我国由于历史原因,早期只有国家科研单位、大专院校才具备从事软件开发的人才,因此早期的IT企业大多出自这些单位,如北大、清华和中科院,这也是我国特有的高校办企业现象的根源。而美国大学和企业的界线是很分明的,前者只管研究,后者负责商品研发和市场运作。如果大学里研究出了一项好技术,就会拉出来作为一个企业来运作,如CISCO最早就是斯坦福的老师研究出来的,他们夫妻俩就自己出来办了公司,与斯坦福是不相干的。总之,个人可以流动,但不管怎样在大学就作研究,要做商业就出来到企业去,而不是以做教学和研究为职责的大学下面再办一个商业的公司,最后什么都不像。目前,中国那些高校和科研单位办的IT企业很多已开始明白这个道理了,并开始逐步脱钩了,但还不彻底,明明是工业界的事却偏偏要去听学术界的人的意见,如果遇到周老师这样明白的人还好,遇到一些从教科书到教科书的所谓专家学者,就往往会有偏差,这就造成了前面所说的软件业的话语权不在做软件的人手里的现象。
事实上,我本人在十多年从事软件行业的工作中,普遍感到无论是用户、媒体还是政府,都一直用七八十年代软件工程的标准来衡量我们。这样对行业造成一定的误导,而且这种误导现在还是有一定的作用,有一定的影响。
所以今天希望借这个机会,请真正做软件的,如Microsoft,摩托罗拉,包括国内比较优秀的像金山,也有相对比较符合中国国情的,规模比较小的,像做超级解霸的等等,大家谈谈真正的实际软件工程到底怎么回事。当然也包括周老师,周老师虽然也是在高校里面,但是周老师本身对现代软件工程方面也有比较好的研究。我们的主持人潘加宇有个人网站umlchina,在软件业专业圈里面影响也比较大,他本身对软件工程也有很多了解。
今天很荣幸请到这样几位主讲嘉宾和主持人,也希望今天大家都有很好的收获。
谢谢大家。
主持人潘加宇:
今天我们非常荣幸邀请到了五位主讲嘉宾,他们分别是微软研发中心服务系统平台部经理杨永生先生,金山公司金山词霸研发部技术总监邹涛先生,摩托罗拉全球电信解决方案部网络方案技术中心高级经理胡大庆先生,清华大学著名教授周之英老师,还有一位是豪杰公司的总裁梁肇新先生。
首先我们有请清华大学计算机系的周之英教授。周教授二十多年来一直从事软件工程方法的教学和研究工作,曾经和主持和参与多项软件工程有关的国家重大科技攻关项目和863项目,还有需要大型复杂网络的应用系统开发工程,连续十多年在清华讲授研究生课程“软件工程技术和设计”。可能大家对周教授最大的了解就是99年末的时候出过《现代软件工程》的书,当时涉及的内容是很新的。所以从当时很新的书里面,周老师对新知识的敏锐和软件工程推广的热情。
周老师今天发言的主题是《现代软件工程的观点——尊重事实、认识极端,解决思想》。下面有请周老师。清华大学计算机系教授周之英:
很高兴有机会跟大家一起探讨现代软件工程。我大概二十多年一直对软件工程很有兴趣。为什么呢?如果做软件是一个项目开发问题,那我们希望软件工程解决普通性的问题,超越一个项目。所以这个问题我认为很有挑战性,一直在搞这方面的工作。
大概两年前我在科学出版社出了叫做《现代软件工程》的书。为什么加“现代”两个字?主要想界分一下现代软件工程跟软件工程的一些差别。什么是软件工程?希望改变小作坊式的软件开发方式,转向工业化,就是希望学习工厂的经验,物质生产的过程。物质生产过程基于一些规律,物理学原理力学等等,和工程的一些方法。能够使生产工作达到大规模生产,效率高,不需要很多的技艺。比如手工加工一个零件需要很高的手艺,按工程规范做,就不需要长期学手艺,学工程规范比用手艺实现简单。这是软件工程追求的理想。把软件变成一个有规律的物化的观念。
但是90年代以后发现有很多矛盾,我参与了很多项目,觉得并不像那个样子。最大的矛盾是什么?软件不是纯物化的东西,这里面有人的因素,所以这就有很多变动的东西,不可能像理想的物质生产过程,基于物理学等的原理来做。人的(认识)规律,我们还没有认识得很清楚。现在有五花八门适应各种情况的东西出来,才能真正解决它的问题,适应变化的需求。所以我基于这样的观点:全球化形势下,变化多端;过去是很稳定的情况还可以;现在全世界这么大范围里面,任何一个地方发生变动,就可能影响到你这儿,所以变动显得是非常地迅速。这时,人的因素就更突出了,而且方法就更多种多样了。我就加上一个“现代”,强调仅用物的规律的不够,改变过去软件工程的想一成不变的用一个方法解决一切,出现多种多样的、丰富多彩的问题。
到现在为止,我这观点,跟各方面交流不够。这次有机会跟大家谈谈觉得很高兴。能跟参加实际工作的朋友交流,可以更好地展开这些思想。
我今天主要想提十个观点。主要是针对沙龙给我的参考文章里面提到的普遍问题。
一个观点,现在的项目各个都不一样,每一个项目都应该有自己的规范,规范都是不一样的。软件工程是超越项目。就是说每一个项目不一样,但是项目之间有共性的、有规律性的东西,我们要把这些东西研究出来。所以软件工程是基于项目和产品,不可能脱离项目和产品,但要超越产品,超越开发组织、开发的团队、个人。要超越,就要有客观性。软件工程环绕事实进行,这事实就是软件过程中一系列的东西,包括文档等等。所有工作要建立在客观性基础上。这是第一点,就是说要超越项目;共性跟个性的问题;不能凭主观想象,要有事实作为基础。
第二个观点,软件工程理论方面,经验实践,各式各样标准等等,跟物质世界相应的东西是有区别的,软件工程的这些理论、方法、标准、开发模式等等,是强烈依赖于具体环境和执行的人。就是说,这个人本身不像一个车间里一个机器,一种机器生产的东西可以是不变的,但是在软件过程中,人不可能一样的。人的能力,人的行为都不同。人的一些东西,比较难刻划,所以目前软件工程中所有理论是不充分的。因为人是在其中起很主要作用。虽然模型总是一种简化,但是人的简化往往是太简化了。我们应该看到这些理论到目前为止是不充分的。
不充分以后,要去推广就有一定难度。我们说,所有理论要使用的前提是什么?可重复性。像CMM,最基本的条件是可重复性。但你的边界条件都是不重复的,整个过程就不太好重复了。所以要认识哪些东西重复,哪些东西不重复了,推广就难度比较大,不是不需要推广,而是难度比较大。常常需要人在软件过程中调整。有时因为有“人”的参与而能推广,隐含了人在过程里对差异的的能动性调整。所以学习的时候要有这样的理解。第二个,理论的东西是一个抽象纯化的东西,我们要在实际运用,要把纯化变成实际的情况。我觉得很奇怪,大家都对软件工程说,实际开发怎么跟书本上不一样,我想物理学书本说动者恒动,静者恒静,小球会在绝对光滑的水平面上不停地滚动。物理教这些,你从来没有要求实际是这样,这球在地毯上滚,一会儿就停住了。所以说,在这个问题上,你学到的理论是理想情况,对实际情形来说第一个就是不完整的,很多边界条件没讲清楚,也讲不清楚;第二,实际工作时,不能要求照着书本上理想模式来作范本,这样要求是不合理的。需要体会你的环境,理解为什么,对你有什么帮助。而不能希望百分之百照抄,这样你什么也学不到;不能学到对你有共性的东西。
第三,对于文档。我们要客观性,这中间有一个很大的东西就是记录文档,通过文档记录一些东西。大家说文档里面的东西也有错,我要照着它做不是就错了。问题是文档你知道错,就可以改,如果没有文档你是不是就错更多。记录一些东西,便于大家交流。不要你想你的,我想我的,这是文档可起的一个方面的作用。第二个文档应该是记录了开发的历史,大家可以想人类社会的历史起了什么作用:了解过去,认识现在,展望将来。我更提高一些,说文档应该表示你把对问题的理解记录下来,工作进展应该记录下来,这是文档的作用;第二个从更深层次所起的历史作用:将来可以改进,记录下你的成就。所以对软件组织或者软件工程师个人来说,如果你有抱负,你希望能起历史作用你就得把你的工作记录下来。所以应该用更高、更深层次来思考这些东西,
那么历史有什么作用?我们只能够根据历史去预测未来,并不是我们为了躺在老祖宗身上,而是我们为了向前看,为了现在的工作,为了将来的工作。现在工作怎么来看,我们还没有做,将来工作更不知道。那只有什么?只有靠历史,靠历史去预测未来。但是我们不能靠历史去计划未来,我们未来一定是跟历史不一样的,中国还停在封建社会?这是不可能的。还是在文化大革命?这是不可能的。我们为了更好的未来,我们希望未来比过去历史更好。所以我们不能照过去怎么现在就怎么样,而是要吸取历史经验教训来指导我们,这就是历史的作用。
第五个,什么是历史,历史就是过去的事实,真实的事实。软件工程包含很好的项目的成功的经验的总结。我们软件工程有一些东西,分析得更多的是过去成功的经验。学习软件工程这些东西,是为了掌握历史的观点。一个人脱离了历史,就是没有文化的。有人问,学了有没有用?当然你要没有学历史,你也可以做事,但是往往是短期的。你要有更高要求的话,不仅是就事论事的话,就应该学习过去成功的经验,而不仅仅是为了当前这件事,对素养的提高很重要。
历史要尊重事实;尊重事实有两方面,一方面是历史,一方面是现状,现状也是一个事实,跟历史不一样的,所以你要正确认识自己和别人的情况。
第七点,在全球化的进程中,技术环境的变化非常多样,而且复杂,变化非常迅速。对一个具体个人或者一个企业来说,周围不确定因素太多了。针对这样情况,从软件工程本身来说,对它的要求实在太高了。为什么呢?现在使用软件工作已经不像四十年、五十年、七十年代是非常少的人群,现在有非常多的人群,各行各业,现在有很多不是学计算机的,学化学的、学机械的,有很多人甚至不是大学毕业的,也在搞软件,也搞工程。所以对软件工程希望的东西太多了。人群广泛以后,更希望简单好用,还要实用,还要有效。又要处理非常复杂的问题,各式各样的问题,所以给软件工程带来了很多的矛盾。根本的矛盾是什么呢?这是我的观点,我认为开发中所有能看到的东西,但运行时的情况发生了变化。现在面向对象技术出现以后,运行视图,运行时实际情况跟你开发时看到的东西不一样了。从前结构化的时候,还可以,差不多。因为结构化设计时的模块结构,在运行时是一样。设计是什么样的模式,运行也是差不多这样的模式。如果希望运行时效率提高,那就在什么地方去改一改。人可以看到的一些东西,就能够去做它。看不到的东西、在运行过程中,全放在脑袋里面,对人的要求太多了。处于这种状况下非常困难。
运行模式是由硬件确定的;是开发平台确定的。也就是说,现在这种本质的硬件已从四十年代五十年代一直延续到现在。某种意义上,真正要解决这样有很多的难点的开发问题,得从根子上来解决。所以现在还有很多人在研究更基础的问题。国内这方面考虑少一点。我们应该认识到,什么方法能解决那么困难的问题,看不见啊!即使有的话,是会有困难的。有根本矛盾的困难。
第八个,一般性的问题很难解决,但是具体问题并不难解决。一个一个成功具体的项目很多。项目为什么成功?因为把它主要问题、主要特征解决了。现在就有一些方法很极端,比方有人说XP,或者更极端一些,我什么方法也没有,就完全可以用黑客的方式、就可以去解决问题了等等。这种情况是强调某个片面,就是强调局部,针对具体问题可能是有效的;或者强调不是那么片面的,但也不是很全面,针对具体问题具体解决的有了各式各样的方法。各种情况的多样性。还有一种极端就是想全面,我也碰到,有时候审查论文,或项目,说想有一个知识库把所有知识都放进去等等。按这种东西照搬会超越你的控制能力,可以是一种想法,有道理。但是能用吗?得自己考虑。应该去理解和利用它的一些内涵的东西。比方说有一些方法很全面,把各种东西刻划了,也许对你全部做不合适,但是你可以当做一种参考模型,去理解所考虑的方方面面,帮助你找到自己需要的。但是找到自己需要的前提是什么?你得知道自己需要什么。首先得清楚自己的情况,然后还要清楚现在的技术提供一些什么。
不同环境下情况可能不一样,甚至观点不一样。现在软件工程中,客观存在就有冲突的观点,有不一样的东西。这是在不同背景下,适应不同情况。得理解问题的边界条件。得承认这是客观事实。现在最好的观点是你不要违反常识,常识告诉你的往往是最有效的东西。不要盲目追求一些很出名的东西。在面对复杂而有冲突的问题,想获得成功,需要的是积极思考,认识自己的问题,通过理性思考,包括认识极端的方法,全面方法的作用,通过一些合作和交流去解决一些冲突,得到一定的平衡。软件工程是通过平衡解决问题,也可说软件工程处理的很多问题是得到“满意解”。另一方面“满意解”也等于“不满意解”。为什么?它仅是一种平衡,它遗留了一些不够满意的东西。对不满意的东西,就应该想办法再提高、去解决。所以应该有发展的观点,不要觉得协商“满意解”就解决一切了。还要考虑进一步创新。
文章来源于领测软件测试网 https://www.ltesting.net/