友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
八万小说网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

软件工程思想-第23部分

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



  性能与效率测试中很重要的一项是极限测试,因为很多软件系统会在极限测试中崩溃。例如,连续不停地向服务器发请求,测试服务器是否会陷入死锁状态不能自拔;给程序输入特别大的数据,看看它是否吃得消。
   
7。3。4 易用性测试
  易用性测试没有一个量化的指标,主观性较强。调查表明,当用户不理解软件中的某个特性时,大多数人首先会向同事、朋友请教。要是再不起作用,就向产品支持部门打电话。只有30%的用户会查阅用户手册。'Cusumano 1995'
  一般认为,如果用户不翻阅手册就能使用软件,那么表明这个软件具有较好的易用性。

7。3。5 文档测试
  文档测试主要检查文档的正确性、完备性和可理解性。好多人甚至不知道文档是软件的一个组成部分。
  正确性是指不要把软件的功能和操作写错,也不允许文档内容前后矛盾。
  完备性是指文档不可以“虎头蛇尾”,更不许漏掉关键内容。有些学生在证明数学题时,喜欢用“显然”两字蒙混过关。文档中很多内容对开发者可能是“显然”的,但对用户而言不见得都是“显然”的。
  文档不可以写成散文、诗歌或者侦探、言情小说,要让大众用户看得懂,能理解。
  很多程序员能编写出好程序,却写不出清晰的文档。不要说自己以前语文学得差,现在已没救了,找借口不是办法。没有人天生就能写出好程序,都是练出来的。同理,若第一次写不好文档,就多写几次文档,慢慢地就会写出好文档来。我上大学前不会说普通话,不会写作文,现在我极能说会写,当个秘书或书记已绰绰有余。

 7。4 改 错

  在软件测试时如果发现了错误,必须请程序员改错,否则测试工作就白干了。
  改错是个大悲大喜的过程,一天之内可以让人在悲伤的低谷和喜悦的颠峰之间跌荡起伏。如果改过上万个程序错误,那么少男少女们不必经历失恋的挫折也能变得成熟起来。
  我从大三开始真正接受改错的磨练,已记不清楚多少次汗流浃背、湿透板凳。改不了错误时,恨不得撞墙。改了错误时,比女孩子朝我笑笑还开心。
  在做本科毕业设计时,一天夜里,一哥们流窜到我的实验室,哈不拢嘴地对我嚷嚷:“你知道什么叫茅塞顿开吗?”
   我象白痴似的摇摇头。
  他说:“今天我化了十几个小时没能干掉一个错误,刚才我去了厕所五分钟,一切都解决了。”
  他还用那没洗过的手拉我,一定要请我吃“肉夹馍”。那得意劲儿仿佛同时谈了两个女朋友。
在本节,我要替程序员们总结关于改错的几点思想方法:
(1)要有勇气。东北有个林场工人,工作勤奋,一人能干几个人的活。前三十年是伐树劳模,受到周总理的接见。忽有一天醒悟过来,觉得自己太对不起森林,决心补救错误。后三十年成了植树劳模,受到朱总理的接见。此大勇也。
   程序中的错误只有开发者自己才能找出并改掉。如果因畏惧而拖延,会让你终日心情不定,食无味,睡不香。所以长痛不如短痛,要集中精力对付错误。
(2)不可蛮干。都说急中生智,我不信。我认为大多数人着急了就会蛮干,早把“智”丢到脑后。不仅人如此,动物也如此。
    我们经常看到,蜜蜂或者苍蝇想从玻璃窗中飞出,它们会顶着玻璃折腾几个小时,却不晓得从旁边轻轻松松地飞走。我原以为蜜蜂和苍蝇长得太小,视野有限,以致看不见近在咫尺的逃生之窗,所以只好蛮干。可是有一天夜里,有只麻雀飞进我的房间,它的逃生方式竟然与蜜蜂一模一样。我用灯光照着那扇打开的窗户为其引路,并向它打手势,对它说话,均无济于事。它是到天亮后才飞走的,这一宿我俩都没息好。
(3)找出错误的根源。有人问阿凡提:“我肚子痛,应该用什么药?”阿凡提说:“应该用眼药水,因为你眼睛不好,吃了脏东西才肚子痛。”
  我们应该运用归纳、推理等方法尽早确定错误的根源。
(4)在改错之后一定要马上进行重新测试,以免引入新的错误。有人在马路上捡到钱包后得意忘形,不料自己却被汽车撞倒。改了一个程序错误固然是喜事,但要防止乐极生悲。更加严格的要求是:不论原有程序是否绝对正确,只要对此程序作过改动(哪怕是微不足道的),都要进行重新测试。

7。5 小 结

优秀的程序员敢于声称自己的代码没有错误,这种自信让人羡慕不已。一个错误自身也许很微小,但是程序存在错误这件事很严重。能否做好测试与改错工作,思想认识和办事态度是最关键的。
程序员应该把测试当成份内之事,不要依赖于外界的“黑盒测试”。“黑盒测试”就象通过提问题来判断一个人是否是个疯子,但无法知道他为什么成了疯子。让程序员对所有的代码执行单步跟踪测试听起来很费时间,但习惯了你就感觉不到有什么不方便。单步跟踪测试将使你以后的日子更轻松。
程序出了错误一定要改错,但是“编写优质无错”的程序才是根本的解决之道。在此,我竭力建议大家阅读Steve Maguire著的《Writing Clean Code : Microsoft Techniques for Developing Bug…free C Programs》(有中文译本,'Maguire 1993')。我深受此书的教诲,获益非浅。

第八章  维护与再生工程

  编程大师曾说:“哪怕程序只有三行长,总有一天你也不得不对它维护。”
  很多软件产品不是一次性的买卖。比如在电信、金融等领域,有些软件系统要用十几年,对软件进行维护是必不可少的。8。1节将介绍“软件维护的常识”,对维护活动进行分类,并解释为什么维护比较困难。
  软件公司的经理们没有哪一个喜欢被维护的费用吓一跳,但软件维护的代价通常是高昂的。7。2节将说明影响维护代价的一些主要技术因素与非技术因素。
  如果希望提高已有软件的质量并且提高商业竞争力,却又无法靠维护来实现,只好对已有软件进行全部或者部分的改造,这种活动叫再生工程(Reengineering)。7。3节将解释什么是再生工程,并论述再生工程的三种类型:重构(Restructure)、逆向工程(Reverse Engineering)和前向工程(Forward Engineering)。

8。1 软件维护的常识

  对软件而言,“维护”是个不太直观的术语,因为软件产品在重复使用时不会被磨损,并不需要进行像对车辆或电器那样的维护。软件维护是人们对既丰富多彩又会令人心酸的活动的统称。其中丰富多彩的活动是指那些反映客观世界变化、能使软件系统更加完善的修改和扩充工作。令人心酸的活动是指那些永无修止、并且改了旧错却引起新错让人欲哭无泪的工作。
  一些学者将软件维护划分为主要的三类:纠错性维护(Corrective maintenance)、适应性维护(Adaptive maintenance)和完善性维护(Perfective maintenance):
(1)纠错性维护。由于前期的测试不可能揭露软件系统中所有替在的错误,用户在使用软件时仍将会遇到错误,诊断和改正这些错误的过程称为纠错性维护。
(2)适应性维护。由于新的硬件设备不断推出,操作系统和编译系统也不断地升级,为了使软件能适应新的环境而引起的程序修改和扩充活动称为适应性维护。
(3)完善性维护。在软件的正常使用过程中,用户还会不断提出新的需求。为了满足用户新的需求而增加软件功能的活动称为完善性维护。
  Lientz 和Swanson调查发现(1980年),完善性维护约占65%,适应性维护约占18%,纠错性维护约占17%'Sommerville 1992'。上述调查已是20年前的事了,我们不必太关心具体的比例,心里有数即可。
  以下一些因素将导致维护工作变得困难:
(1)软件人员经常流动,当需要对某些程序进行维护时,可能已找不到原来的开发人员。只好让新手去“攻读”那些程序。
(2)人们一般难以读懂他人的程序。在勉强接受这类任务时,心里不免嘀咕:“我又不是他肚子里的虫子,怎么知道他如何编程。”
(3)当没有文档或者文档很差时,你简直不知道如何下手。
(4)很多程序在设计时没有考虑到将来要改动,程序之间相互交织,触一而牵百。即使有很好的文档,你也不敢轻举妄动,否则你有可能陷进错误堆里。
(5)如果软件发行了多个版本,要追踪软件的演化非常困难。
(6)维护将会产生不良的副作用,不论是修改代码、数据或文档,都有可能产生新的错误。
(7)维护工作毫无吸引力。高水平的程序员自然不愿主动去做,而公司也舍不得让高水平的程序员去做。带着低沉情绪的低水平的程序员只会把维护工作搞得一塌糊涂。

8。2 维护的代价及其主要因素

  软件维护是既破财又费神的工作。看得见的代价是那些为了维护而投入的人力与财力。而看不见的维护代价则更加高昂,我们称之为“机会成本”,即为了得到某种东西所必须放弃的东西'Mankiw 1999'。把很多程序员和其它资源用于维护工作,必然会耽误新产品的开发甚至会丧失机遇,这种代价是无法估量的。
  影响维护代价的非技术因素主要有:
(1)应用域的复杂性。如果应用域问题已被很好地理解,需求分析工作比较完善,那么维护代价就较低。反之维护代价就较高。
(2)开发人员的稳定性。如果某些程序的开发者还在,让他们对自己的程序进行维护,那么代价就较低。如果原来的开发者已经不在,只好让新手来维护陌生的程序,那么代价就较高。
(3)软件的生命期。越是早期的程序越难维护,你很难想像十年前的程序是多么的落后(设计思想与开发工具都落后)。一般地,软件的生命期越长,维护代价就越高。生命期越短,维护代价就越低。
(4)商业操作模式变化对软件的影响。比如财务软件,对财务制度的变化很敏感。财务制度一变动,财务软件就必须修改。一般地,商业操作模式变化越频繁,相应软件的维护代价就越高。
影响维护代价的技术因素主要有:
(1)软件对运行环境的依赖性。由于硬件以及操作系统更新很快,使得对运行环境依赖性很强的应用软件也要不停地更新,维护代价就高。
(2)编程语言。虽然低级语言比高级语言具有更好的运行速度,但是低级语言比高级语言难以理解。用高级语言编写的程序比用低级语言编写的程序的维护代价要低得多(并且生产率高得多)。一般地,商业应用软件大多采用高级语言。比如,开发一套Windows环境下的信息管理系统,用户大多采用Visual Basic、Delphi或Power Builder来编程,用Visual C++的就少些,没有人会采用汇编语言。
(3)编程风格。良好的编程风格意味着良好的可理解性,可以降低维护的代价。
(4)测试与改错工作。如果测试与改错工作做得好,后期的维护代价就能降低。反之维护代价就升高。
(5)文档的质量。清晰、正确和完备的文档能降低维护的代价。低质量的文档将增加维护的代价(错误百出的文档还不如没有文档)。

8。3 再生工程

  再生工程主要出于如下愿望:(1)在商业上要提高产品的竞争力;(2)在技术上要提高产品的质量。但这种愿望无法靠软件的维护来实现,因为:(1)软件的可维护性可能极差,实在不值得去做;(2)即使软件的可维护性比较好,但也只是治表不治本。再生工程干脆对已有软件进行全部或部分的改造,赋予软件新的活力。
在对待一个不良之徒时,可以进行思想教育并给予他关心和帮助,这种方式类似于“软件维护”;也可以把他关进监狱,送去劳改,这种方式相当于软件的“再生工程”;如果此人坏透顶了,就毙掉算了。
  再生工程与维护的共同之处是没有抛弃原有的软件。如果把维护比作“修修补补”,那么再生工程就算是“痛改前非”。再生工程并不见得一定比维护的代价要高,但再生工程在将来获取的利益却要比通过维护得到的多。
  再生工程主要有三种类型:重构、逆向工程和前向工程。

8。3。1 重构
  重构一般是指通过修改代码或数据以使软件符合新的要求。重构通常并不推翻原有软件的体系结构,主要是改造一些模块和数据结构。重构的一些好处如下:
(1)使软件的质量更高,或使软件顺应新的潮流(标准)。
(2)使软件的后续(升级)版本的生产率更高。
(3)降低后期的维护代价。
 要注意的是,在代码重构和数据重构之后,一定要重构相应的文档。

8。3。2 逆向工程
  逆向工程来源于硬件世界。硬件厂商总想弄到竞争对手产品的设计和制造“奥秘”。但是又得不到现成的档案,只好拆卸对手的产品并进行分析,企图从中获取有价值的东西。我的很多同学从事集成电路设计工作,他们经常解剖国外的集成电路,甚至不作分析就原封不动地复制该电路的版图,然后投入生产,并美其名曰“反向设计”(Reverse Design)。
  软件的逆向工程在道理上与硬件的相似。但在很多时候,软件的逆向工程并不是针对竞争对手的,而是针对自己公司多年前的产品。期望从老产品中提取系统设计、需求说明等有价值的信息。

8。3。3 前向工程
  前向工程也称预防性维护,由Miller倡导。他把这个术语解释成“为了明天的需要,把今天的方法应用到昨天的系统上”。'Pressman 1999'
  乍看起来,主动去改造一个目前运行得正常的软件系统简直就是“惹事生非”。但是软件技术发展如此迅速,与其等待一个有价值的产品逐渐老死,还不如主动去更新,以获取更大的收益。其道理就同打预防性针一样。所以,预防性维护是“吃小亏占大便宜”的事。

8。4  小 结

  大学科研机构里的软件维护工作恐怕是做得最差的了。几乎每一批新的研究生都会把毕业生留下的软件臭骂一通,然后全部推到重做。到他毕业该走时,就轮到别人骂他的工作了。如此轮回,最终没有什么成果留下。
  如果希望软件系统能活下,必须要对它进行维护。如果希望软件系统有效益,则必须设法降低维护的代价。

大 学 十 年
林锐,1999年岁末

  写此文使我很为难,一是担心读者误以为我轻浮得现在就开始写自传,二是担心朋友们误以为我得了绝症而早早留下遗作。
  不论是落俗套还是不落俗套地评价,我在大学十年里都是出类拔萃的好学生。并且一直以来我对朋友们和一些低年级的学生们都有很大的正面影响。这十年是一个从幼稚到成熟的过程,交织着聪明与蠢笨、勤奋与懒散、狂热与怯懦、成功与失败。做对了的事可树立为榜样,做错的事可挂作为警钟。我写下经历与感受,期望以此引导和勉励无数比我年轻的学生们。我资历尚浅,既没有哲学家的深遂,也没有诗人的风华,不足以堂皇地育人,只能讲一些故事以表心愿。

  我出生在1973年的春节,属牛,是“牛头”。父母为我起了很好听的名字叫“林锐”。这一切暗示着上天对我别有用心,将降大任于我,可是这时候上帝去了一趟厕所。天堂与人间的时差如此之大,就在上帝大小便的几分钟内,我混混沌沌地度过了童年和少年,天才因此成为凡人。
  我小时候生长在浙江黄岩的偏僻山区。父母都是中学教师,由于山区师资缺乏,父母经常要从一个山头调到另一个山头教学。我换读过的小学的数目比我的年龄还大,没有伙伴,也没有家的概念。我就象活在货郎担里的小鸡,缩成一团,在高兴或恐惧时至多“啾”“啾”地叫几声。我在读小学与初中的8年里,既不聪明活泼,也不调皮捣蛋,确切地说象块木头,简直是我名字的反义词。在学习上我没有受过一次表扬,也没有任何值得留念的人或事。无论我现在多么努力都已无法追回失去的8年金色年华,好心痛!
  我草草地并且稀里糊涂地在13岁时从初中毕业,无处可去。这下我发慌了,开始渴望学习。我灰溜溜地离开山区,可怜巴巴地到一个比较好的乡下中学重读初三。我勤快得早晨4:30就起来读英语,脑袋似乎也被吓开窍了,“数理化”学得很好,并且生平第一次在物理考试中得了满分。当我再一次从初中毕业时,我以全校第一的成绩考入了黄岩中学读高中。
  黄岩中学分农村班与城市班,我当然是农民阶级。“阶级区别与歧视”对我是相当有促进作用的。我连任了几年的卫生委员,星期六和星期天同学们习惯地把活留给我
返回目录 上一页 下一页 回到顶部 0 2
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!