高质量软件开发之道

更新时间:2023-03-08 07:44:15 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第1章 高质量软件开发之道 .............................................. 0

1.1软件质量基本概念 ........................................................................... 错误!未定义书签。 1.1.1 如何理解软件的质量 ............................................................... 错误!未定义书签。 1.2.2 提高软件质量的基本方法 ....................................................... 错误!未定义书签。 1.2.3 “零缺陷”理念 ......................................................................................................... 1 1.2 细说软件质量属性 .......................................................................... 错误!未定义书签。 1.2.1 正确性 ...................................................................................... 错误!未定义书签。 1.2.2 健壮性 ...................................................................................... 错误!未定义书签。 1.2.3 可靠性 ...................................................................................... 错误!未定义书签。 1.2.4 性能 .......................................................................................... 错误!未定义书签。 1.2.5 易用性 ...................................................................................... 错误!未定义书签。 1.2.6 清晰性 ...................................................................................... 错误!未定义书签。 1.2.7 安全性 ...................................................................................... 错误!未定义书签。 1.2.8 可扩展性 .................................................................................. 错误!未定义书签。 1.2.9 兼容性 ...................................................................................... 错误!未定义书签。 1.2.10 可移植性 ................................................................................ 错误!未定义书签。 1.3 人们关注的不仅是质量 ................................................................................................... 1 1.3.1 质量、生产率和成本之间的关系 ............................................................................. 2 1.3.2 软件过程改进基本概念 ........................................................... 错误!未定义书签。 1.4 高质量软件开发的基本方法 ........................................................................................... 3 1.4.1 建立软件过程规范 ..................................................................................................... 3 1.4.2 复用 ............................................................................................................................ 6 1.4.3 分而治之 .................................................................................................................... 7 1.4.4 优化与折衷 .............................................................................. 错误!未定义书签。 1.4.5 技术评审 .................................................................................. 错误!未定义书签。 1.4.6 测试 .......................................................................................... 错误!未定义书签。 1.4.7 质量保证 .................................................................................................................... 8 1.4.8 改错 ............................................................................................................................ 9 1.6 关于软件开发的一些常识和思考.................................................................................. 11 1.6.1 有最好的编程语言吗 ............................................................................................... 11 1.6.2 编程是一门艺术吗 ................................................................................................... 11 1.6.3 编程时应该多使用技巧吗 ....................................................................................... 11 1.6.4 换更快的计算机还是换更快的算法........................................................................ 12 1.6.5 错误是否应该分等级 ............................................................................................... 12 1.6.6 一些错误的观念 ....................................................................................................... 12

0

第1章 高质量软件开发之道

本章讲述高质量软件开发的道理。

为了深入理解软件质量的概念,本章阐述了十个重要的软件质量因素,即正确性、

健壮性、可靠性、性能、易用性、清晰性、安全性、可扩展性、兼容性和可移植性。并介绍了消除软件缺陷的基本方法。

人们开发软件产品的目的是赚钱。为了获得更多的利润,人们希望软件开发工作“做得好、做得快并且少花钱”,所以软件质量并不是人们唯一关心的东西。本章论述了“质量、生产率、成本”之间的关系,并给出了能够“提高质量、提高生产率并且降低成本”的软件开发方法。

1.2.3 “零缺陷”理念

质量的最高境界是什么?是尽善尽美,即“零缺陷”。

“零缺陷”理念来源于国际上一些著名的硬件厂商。尽管软件的开发与硬件生产有人在做一件事情时,由于存在很多不确定的因素,一般不可能100% 地达到目标。

很大的区别,但我们仍可以借鉴,从中得到启迪。

假设平常人做事能完成目标的80%。如果某个人的目标是100分,那么他最终成绩可达80分;如果某个人的目标只是60分,那么他最终成绩只有48分。我们在考场上身经百战,很清楚那些只想混及格的学生通常都不会及格。即使学习好的学生也常有失误,因而捶胸顿足。

做一个项目通常需要多个人的协作。假设某系统的总质量是十个开发人员的工作质量之积,记最高值为1.0,最低值为0。如果每个人的质量目标是0.95,那么十个人的累积质量不会超过0.598。如果每个人的质量目标是0.9,那么十个人的累积质量不会超过0.35。只有每个人都做到1.0,系统总质量才会是1.0。只要其中一人的工作质量是0,那么系统总质量也成了0。因系统之中的一个缺陷而导致机毁人亡的事件已不罕见。

上述比喻虽然严厉了一些,但从严要求只有好处没有坏处。如果不严以律已,人的堕落就很快。如果没有“零缺陷”的质量理念,也许缺陷就会成堆。

从理念到行动还是有一定距离的,企业在开发产品时应当根据自身实力和用户的期望值来设定可以实现的质量目标。过低的质量目标会毁坏企业的声誉,而过高的质量目标也有可能导致成本过高而拖累企业(请参见本章1.3节)。

1.3 人们关注的不仅是质量

企业开发产品的目的是赚钱,为了使利润极大化,人们希望软件开发工作“做得好、做得快并且少花钱”。用软件工程的术语来讲,即“提高质量、提高生产率并且降低成本”。古代哲学家曾为“鱼和熊掌不可得兼”的问题费尽心思,我们现在却梦想鱼、熊掌、美

1

酒三者兼得,现代人的欲望真是无止境啊。

让我们先谈谈质量、生产率和成本之间的关系。

1.3.1 质量、生产率和成本之间的关系

质量无疑是客户最关心的问题。客户即使不图物美价廉,也要求货真价实。软件开

发商必须满足客户对质量的要求(不论是写在合同上的还是约定俗成的),否则做不成买卖。现在就连做盗版光盘生意的人也讲究质量,如果盘片不好,是可以退货的。高质量既是软件开发人员的技术追求,又是职业道德的要求。

在关注质量的同时,软件开发商又期望生产率能高些并且成本能低些。老板和员工们谁不想用更少的时间赚更多的钱!

质量与生产率之间存在相辅相成的关系。高生产率必须以质量合格为前提。如果质量不合格,软件产品要么卖不出去,要么卖出去了再赔偿客户的损失。这种情况下“高生产率”变得毫无意义。别看开发商和客户双方的代表能在餐桌上谈笑风生,一旦出了质量问题,那就不会很亲热了。从短期效益看,追求高质量可能会延长软件开发时间,一定程度上降低了生产率。从长期效益看,追求高质量将使软件开发过程更加成熟和规范化。日积月累,当开发过程成熟到一定地步后,必将大大降低软件的测试和改错的代价,缩短产品的开发周期,实质上是提高了生产率,同时又获得了很好的信誉。所以质量与生产率之间不存在根本的对立。

提高质量与生产率需要一个过程,企业不可操之过切。一般地,软件过程能力比较低的企业(例如低于CMM 2级),应该将质量放在第一位,生产率放在第二位。只有这样才可能持久地提高质量与生产率。(“能力成熟度模型CMM”将在后面解释)

如果一个企业的软件过程能力低于CMM 2级,表明其开发能力与管理能力还很薄弱。就其目前的实力而言,无论下多大的决心去做,都不可能一开始就把质量与生产率改善得一样好。并不是我们刻意贬低生产率的“地位”,是公司的现实情况要求在质量与生产率之间分个“轻重缓急”。由于人们天生就有“急功近利”的倾向,如果公司领导人认可“生产率第一、质量第二”,那么员工们做着做着必定会回到混乱的局面。这样的教训实在是太多了!老话说得好:磨刀不误砍柴功。用它类比上述理念最合适不过了。

俗话说“一分价钱一分货”,人们买东西的时候大多认可“质量越好价格就越高”。除了垄断性的产品外,一般来说成本是影响价格的主要因素。

对于软件开发而言,质量与成本之间有什么关系?高质量必然会导致高成本吗? 经验表明,如果软件的“高质量”是“修补”出来的,毫无疑问会导致低生产率和高成本。如果能研制出某些好方法,将高质量与高生产率内建于开发过程之中,那么就能自然地能降低开发成本,这是软件过程改进的目标。

要提醒大家的是,大公司与小公司对成本的关注程度是不尽相似的。

首先谈一下“市场价”(Marketing Price)与“成本价”(Cost Price)的概念。在某

2

个领域,当市场上只出现尚未形成竞争格局的一个或几个产品时,产品价格基本上是由厂商自己制定,称为“市场价”。由于缺乏竞争,无论成本多高,总能获得高额利润。电影《大腕》里那个搞房地产的精神病人说“不求最好,但求最贵”,真是实话实说。

当产品之间形成竞争时,就会出现“杀价”现象。由于各家产品的功能、质量旗鼓相当,竞争实质上是在拼成本。谁的成本低,谁就有利可图。这时的产品价格叫做“成本价”。

中国的彩电业是一个活生生的例子。若干年前彩电价格极高,彩电远离百姓人家,一部分人即使买得起也买不到。如今连超市里都充斥着各种品牌的彩电,价格战打得呜呼哀哉,把厂商逼到“微利”的地步。现在工薪阶层人士很少有买不起彩电的。商场里TOTO品牌的马桶价格为2000~3000元,比同体积的国产纯平彩电还贵,并且利润高得多。唉,我们坐在这样的马桶上真的要为民族工业忧心忡忡哪。

由于“市场价”与“成本价”的差价十分悬殊,IT行业的大公司都想吃“市场价”这块肥肉。大公司的资金雄厚,销售力量强,只要能抢先推出产品,就不愁卖不出去。怎样才能达到目的呢?通常有两种方式。

一种方式是从别处购买快要成形的产品,改头换面,贴上大公司的标签就可以上市销售。所以IT行业的“公司收购”特别盛行。如果Cisco公司的网络产品全部让原班人马来开发,它很难能够那么快就发展成为网络业的霸主!

另一种方式是自行开发新产品,让公司的研发队伍加班加点地干活。这么辛苦是值得的,产品成功会让员工们有很大的成就感。

无论通过哪种方式抢先推出产品,前提条件都要求产品的质量合格。如果产品因质量不合格而被市场拒绝,那么损失的不仅仅是成本,更惨重的是失去机会和信誉。象Intel这样了不起的公司也会吃败仗。每当Intel公司的CPU芯片出现缺陷时,就会骂声一片。Intel公司不得不大量回收芯片并向用户道歉,此时竞争对手如AMD公司就会乘虚而入,抢走象IBM、Compaq这些大客户的部分定单。

在信息高度发达的社会里,你能想得到的产品别人也能想得到。只有少数大公司能够享受到“市场价”的利益,但是好景不会太长。大多数公司在大部分时间里开发的是“成本价”的产品。所以树立“降低开发成本”的理念仍然十分重要。

1.4 高质量软件开发的基本方法

1.4.1 建立软件过程规范

人们意识到,若想顺利开发出高质量的软件产品,必须有条理地组织技术开发活动和项目管理活动。我们把这些活动的组织形式称为过程模型。软件企业应当根据产品的特征,建立一整套在企业范围内通用的软件过程模型及规范,并形成制度。这样开发人员与管理人员就可以依照过程规范有条不紊地开展工作。

我们曾与国内很多研发人员和各级经理交流过,大家都对软件开发的混乱局面表示了不满和无奈。尽管“土匪游击队”的开发模式到处可见,但是没有人真的喜欢混乱。“规范化”是区别“正规军”和“土匪游击队”的根本标志。大家无不渴望以规范化的

3

方式开发产品。这是现状、是需求、也是希望。

对软件开发模型的研究兴起于60年代末70年代初,典型成果是1970年提出的瀑布模型。人们研制了很多的软件开发模型,常见的有“瀑布模型”、“喷泉模型”、“增量模型”,“快速原型模型”、“螺旋模型”、“迭代模型”等。

这么多软件开发模型,企业应该如何选择并应用呢?

企业在选择软件开发模型时,不要太在乎学术上的“先进”与“落后”,正如有才华的人并不一定要出自名牌大学或拥有高学历那样。关键是看该模型能否有效地帮助企业顺利地开发出软件产品,并且要考虑员工们使用起来是否方便。简而言之,就是考察模型是否“实用、好用”。

最早出现的软件开发模型是瀑布模型。它太理想化、太单纯,看起来已经落后于现代的软件开发模式。如今瀑布模型几乎被学术界抛弃,偶而被人提起,都属于被贬对象,未被留一丝惋惜。说它如何如何地差,为的是说明新模型是怎样怎样地好。

然而企业界不同于学术界,我认为瀑布模型对企业太有价值了,我要为它声辩,恢复它应有的名誉。瀑布模型的精髓是“线性顺序”地开发软件。我们应该认识到“线性化”是人们最容易掌握并能熟练应用的思想方法。当人们碰到一个复杂的“非线性”问题时,总是千方百计地将其分解或转化为一系列简单的线性问题,然后逐个解决。一个软件系统的整体可能是复杂的,而细分后的子程序总是简单的,可以用“线性化”的方式来实现,否则干活就太累了。

让我们引用Albert Einstein的话作为信条——“任何事物都应该尽可能地简洁”。“线性”是一种简洁,简洁就是美。当我们领会了“线性”的精神,就不要再呆板地套用“线性”的外表,而应该用活它。例如增量模型实质就是分段的线性模型。螺旋模型则是迭代的弯曲了的线性模型。在其它模型中大都能够找到“线性”的影子。

软件开发模型只关注技术开发活动,并不考虑项目管理,这对开发产品而言是不够的,所以开发模型只是软件过程模型的一部分。奇怪的是,我迄今为止尚未找到论述软件过程模型的软件工程书籍。我就自己创作了一个基于CMMI 3级的软件过程模型,称为“精简并行过程”(Simplified Parallel Process, SPP)。

SPP模型如图1-2所示。“精简并行过程”的含义是:

(1)对CMMI 3级以内的关键过程域以及关键实践作了“精简”处理; (2)项目管理过程、技术开发过程和支撑过程“并行”开展。

瀑布模型是如此的简洁,所有的软件开发人员天生就能学会(如果学不会,那他就别干软件这一行了)。所以瀑布模型特别适合于企业,请大家别轻易贬低它。

4

产品生命周期 PH0 产品概念 PH1 产品定义 PH2 产品开发 PH3 产品验证 PH4 用户验收 PH5 产品维护 项目管理过程 ......立项管理 项目计划 项目监控 风险管理 需求管理 外包管理 管 理 所 有 的 技 术 开 发 活 动 结项管理 需求开发 技术预研 技术评审 迭代 系统设计 实现与测试 技术开发过程 ......根据产品特征确定最合适的开发模型, 如瀑布模型、迭代模型等。 系统测试 用户验收 软件维护 支 撑 所 有 的 技 术 开 发 活 动 支撑过程 ....配置管理 质量保证 采购管理 培训管理 图1-2 精简并行过程(SPP)模型

SPP模型把产品生命周期划分为6个阶段: ? 产品概念阶段,记为PH0。 ? 产品定义阶段,记为PH1。 ? 产品开发阶段,记为PH2。 ? 产品验证阶段,记为PH3。 ? 用户验收阶段,记为PH4。 ? 产品维护阶段,记为PH5。

在SPP模型中,一个项目从PH0到PH5共经历19个关键过程域(Key Process Area, KPA),它们被划分为三大类过程,如表1-2所示。其中项目管理过程含7个关键过程域,技术开发过程含8个过程域,支撑过程含4个过程域。

过程类别 ? 项目管理过程 ? 立项管理 ? 技术开发过程 ? 需求开发 ? 支撑过程 ? 配置管理 5

关键过程域 ? ? ? ? ? ? 结项管理 项目计划 项目监控 风险管理 外包管理 需求管理 ? ? ? ? ? ? ? 技术预研 系统设计 实现与测试 系统测试 用户验收 软件维护 技术评审 ? ? ? 质量保证 采购管理 培训管理 表1-2 SPP过程域分类

SPP模型的主要优点有:

(1)模型直观。SPP模型是三层结构,上层是项目管理过程的集合,中层是技术开发过程的集合,下层是支撑过程的集合。这种模型很直观,高级经理、项目经理、开发人员、质量保证员等人根据SPP模型很容易知道自己“应该在什么时候做什么事情,以及按照什么规范去做事情”。SPP模型有助于使各个过程的活动有条不紊地开展。

(2)方便于用户裁剪SPP模型。项目管理过程和支撑过程对绝大多数软件产品开发而言都是适用的。需求开发、技术预研、系统设计、编程、测试、技术评审、维护都是技术开发过程中必不可少的环节,用户可以根据产品的特征确定最合适的开发模型(例如瀑布模型、快速原型模型、迭代模型等)。

(3)方便于用户扩充SPP模型。如果产品同时涉及软件硬件开发的话,可将产品生命周期、软件开发过程和硬件开发过程集成一起。

1.4.2 复用

复用就是指“利用现成的东西”,文人称之为“拿来主义”。被复用的对象可以是有形的物体,也可以是无形的知识成果。复用不是人类懒惰的表现而是智慧的表现。因为人类总是在继承了前人的成果,不断加以利用、改进或创新后才会进步。所以每当我们欢度国庆时,要清楚祖国远不止50来岁,我们今天享用到的财富还有历史上几千年中国人民的贡献。进步只是应该的,没有进步则就可耻了。

复用的有利于提高质量、提高生产率和降低成本。由经验可知,通常在一个新系统中,大部分的内容是成熟的,只有小部分内容是创新的。一般地可以相信成熟的东西总是比较可靠的(即具有高质量),而大量成熟的工作可以通过复用来快速实现(即具有高生产率)。勤劳并且聪明的人们应该把大部分的时间用在小比例的创新工作上,而把小部分的时间用在大比例的成熟工作中,这样才能把工作做得又快又好。

把复用的思想用于软件开发,称为软件复用。技术开发活动与管理活动中的任何成果都可以被复用,如思想方法、经验、程序、文档等等。据统计,世上已有1000亿多行程序,无数功能被重写了成千上万次,真是浪费哪。面向对象(Object Oriented)学者的口头禅就是“请不要再发明相同的车轮子了” 。

将具有一定集成度并可以重复使用的软件组成单元称为软构件(Software Component)。软件复用可以表述为:构造新的软件系统可以不必每次从零做起,直接使

6

用已有的软构件,即可组装或加以合理修改后成为新的系统。

复用方法合理化并简化了软件开发过程,减少了总的开发工作量与维护代价,既降低了软件的成本又提高了生产率。另一方面,由于软构件是经过反复使用验证的,自身具有较高的质量。因此由软构件组成的新系统也具有较高的质量。

软件复用不仅要使自己拿来方便,还要让别人拿去方便,是“拿来拿去主义”。这想法挺好,但现实中执行得并不如意。企业的业务各色各样,谁也不能坐等着天上掉下可以被大规模复用的东西,一般要靠“日积月累”才能建设可以被复用的软件库。从理论上讲这项工作没有不可逾越的技术障碍。真正的障碍是它“耗时费钱”,前期投入较多,缺乏近期效益。大部分的公司都注重近期效益,不是它天生目光短浅,而是为了生存必须这么做。有些处境艰难的公司下一顿饭还不知道在何处着落,更别提软件复用这样的“长久之计”了。所以软件复用对大多数公司来说不是“最高优先级”。

我到公司工作的最初安排是从事电信领域“可复用软件工厂”的开发。领导在招聘时跟我讲,这个想法已经有数年了,一直没有落实,希望我能做好。待我正式上班时,马上就改成做其它短期的研发项目了。要知道我所在的公司人力与财力相当充足,非国内普通中小型IT企业所能比。即便我们有如此好的条件,软件复用也只是挂在嘴上,没有实际行动。

所以我建议:随时随地尽可能地复用你所能复用的东西,不要等待公司下达复用的行政命令,因为你很难等到那一天,即使等到了也没有多少意义。

1.4.3 分而治之

分而治之是指把一个复杂的问题分解成若干个简单的问题,然后逐个解决。这种朴素的思想来源于人们生活与工作的经验,完全适合于技术领域。

分而治之说起来容易,做好却难,最糟糕的现象是“分是分了”却“治不了”。 软件的分而治之不可以“硬分硬治”。不像为了吃一个西瓜或是一只鸡,挥刀斩成n块,再把每块塞进嘴里粉碎搅拌,然后交由胃肠来消化吸收,象征复杂问题的西瓜或是鸡也就此消失了。

软件的“分而治之”应该着重考虑:复杂问题分解后,每个问题能否用程序实现?所有程序最终能否集成为一个软件系统并有效解决原始的复杂问题?图1-3表示了软件的“分而治之”策略。软件的模块化设计就是分而治之的具体表现。

7

复杂 问题 解决原始问题 软件 系统 子问题1 程序1 子问题2 程序2 子问题n 程序n 图1-3 软件的分而治之策略

1.4.7 质量保证

质量保证(Quality Assurance, QA)的目的是提供一种有效的人员组织形式和管理方法,通过客观地检查和监控“过程质量”与“产品质量”,从而实现持续地改进质量。质量保证是一种有计划的、贯穿于整个产品生命周期的质量管理方法。

过程质量与产品质量存在某种因果关系,通常“好的过程”产生“好的产品”而“差的过程”将产生“差的产品”。人们销售的是产品而不是过程,用户关心的是最终产品的质量,而软件开发团队既要关心过程质量又要关心产品质量。

质量保证的基本方法是通过有计划地检查“工作过程以及工作成果”是否符合既定的规范,来监控和改进“过程质量”与“产品质量”。如果“工作过程以及工作成果”不符合既定的规范,那么产品的质量肯定有问题。基于这样的推理,质量保证人员即使不是技术专家,他也能够客观地检查和监控产品的质量。这是质量保证方法富有成效的一面。但是“工作过程以及工作成果”符合既定的规范却并不意味着产品的质量一定合格,因为仅靠规范无法识别出产品中可能存在的大量缺陷。这是质量保证方法的不足之处。所以单独的“质量保证”其实并不能“保证质量”。

技术评审与测试关注的是产品质量而不是过程质量,两者的技术强度比质量保证要高得多。技术评审和测试能弥补质量保证的不足,三者是相辅相成的质量管理方法。我们在实践中不能将质量保证、技术评审和测试混为一谈,也不能把三者孤立起来执行。建议让质量保证人员参加并监督重要的技术评审和测试工作,把三者有机地结合起来,可提高工作效率,降低成本。

质量保证小组(Quality Assurance Group, QAG)有如下特点:

? 质量保证小组在行政上独立于任何项目。这种独立性有助于质量保证小组客观

地检查和监控产品的质量。

? 质量保证小组有一定的权利,可以对质量不合格的工作成果做出处理。这种权

利使得质量保证小组的工作不会被轻视,并有助于加强全员的质量意识。需要强调的是,提高产品质量是全员的职责,并非只是质量保证小组的职责。

8

质量保证过程域的主要活动如图1-5所示。

周期性地开展 制定质量保证计划 过程与产品质量检查 问题跟踪与质量改进 参加技术评审 --------- 表示质量保证与 技术评审、测试有机结合 参加测试 图1 质量保证过程域示意图

1.4.8 改错

改错是个大悲大喜的过程,一天之内可以让人在悲伤的低谷和喜悦的颠峰之间跌荡起伏。如果改过了成千上万个程序错误,那么少男少女们不必经历失恋的挫折也能变得成熟起来。

我从大三开始真正接受改错的磨练,已记不清楚多少次汗流浃背、湿透板凳。改不了错误时,恨不得撞墙。改了错误时,比女孩子朝我笑笑还开心。

在做本科毕业设计时,一天夜里,一哥们流窜到我的实验室,哈不拢嘴地对我嚷嚷:“你知道什么叫茅塞顿开吗?” 我象文盲似地摇摇头。

他说:“今天我化了十几个小时没能干掉一个错误,刚才我去了厕所五分钟,一切都解决了。”

他还用那没洗过的手拉我,一定要请我吃“肉夹馍”。那得意劲儿仿佛同时谈了两个女朋友。

软件中的错误通常只有开发者自己才能找出并改掉。如果因畏惧而拖延,会让你终日心情不定,食无味,睡不香。所以长痛不如短痛,要集中精力对付错误。

东北有个林场工人,工作勤奋,一人能干几个人的活。前三十年是伐树劳模,受到周总理的接见。忽有一天醒悟过来,觉得自己太对不起森林,决心补救错误。后三十年成了植树劳模,受到朱总理的接见。若能以此大勇来改错,正是无往而不胜也。我们软件开发人员应当向这位可敬的林场工人学习。

改错过程很像侦破案件,有些坏事发生了,而仅有的信息就是它的确发生了。我们必须从结果出发,逆向思考。改错的第一步是找出错误的根源,如同医生治病,必须先找出病因才能“对症下药”。

有人问阿凡提:“我肚子痛,应该用什么药?”

阿凡提说:“应该用眼药水,因为你眼睛不好,吃了脏东西才肚子痛。” 根据软件错误的症状推断出根源并不是件容易的事,因为:

9

(1)症状和根源可能相隔很远。也就是说,症状可能在某一个程序单元中出现,而根源实际上在很远的另一个地方。高度耦合的程序结构加剧了这种情况。 (2)症状可能在另一个错误被纠正后暂时性消失。

(3)症状可能并不是由某个程序错误直接引发的,如误差累积。 (4)症状可能是由不太容易跟踪的人工错误引起的。 (5)症状可能时隐时现,如内存泄漏。

(6)很难重新产生完全一样的输入条件,难以恢复“错误的现场”。 (7)症状可能分布在许多不同的任务中,难以跟踪。

改错的最大忌讳是“急躁蛮干”。人们常说“急中生智”,我不信。我认为大多数人着急了就会蛮干,早把“智”丢到脑后。不仅人如此,动物也如此。

我们经常看到,蜜蜂或者苍蝇想从玻璃窗中飞出,它们会顶着玻璃折腾几个小时,却不晓得从旁边轻轻松松地飞走。我原以为蜜蜂和苍蝇长得太小,视野有限,以致看不见近在咫尺的逃生之窗,所以只好蛮干。可是有一天夜里,有只麻雀飞进我的房间,它的逃生方式竟然与蜜蜂一模一样。我用灯光照着那扇打开的窗户为其引路,并向它打手势,对它说话,均无济于事。它是到天亮后才飞走的,这一宿我和它都没有休息好。

我们把寻找错误根源的过程称为调试(Debugging)。调试的基本方法是“粗分细找”。对于隐藏得很深的Bug,我们应该运用归纳、推理、“二分”等方法先“快速、粗略”地确定错误根源的范围,然后再用调试工具仔细地跟踪此范围的源代码。如果没有调试工具,那么只好用“土办法”:在程序中插入打印语句如printf(…),观看屏幕的输出。

有些时候,世界上最好的调试工具恐怕是那些有经验的人。我们经常会长时间地追踪某个Bug,苦恼万分。恰好有高手路过,被他一语“道破天机”。顿时沮丧的阴云就被驱散,你不得不说“I服了You”。

修改代码错误时的注意事项:

? 找到错误时,不要急于修改,先思考一下:修改此代码会不会引发其它问题?

如果没有问题,则可以放心修改。如果有问题,那么可能要改动程序结构,而不止一行代码。

? 有些时候,软件中可能潜伏同一类型的许多错误(例如由不良的编程习惯引起

的)。好不容易逮住一个,应当乘胜追击,全部歼灭。

? 在改错之后一定要马上进行回归测试,以免引入新的错误。有人在马路上捡到

钱包后得意忘形,不料自己却被汽车撞倒。改了一个程序错误固然是喜事,但要防止乐极生悲。更加严格的要求是:不论原有程序是否绝对正确,只要对此程序作过改动(哪怕是微不足道的),都要进行回归测试。

? 上述事情做完后,应当好好反思:我为什么会犯这样的错误?怎么能够防止下

次不犯相似的错误?最好能写下心得体会,与他人共享经验教训。

10

1.6 关于软件开发的一些常识和思考

1.6.1 有最好的编程语言吗

作者的观点:程序员在最初学习Basic、Fortran、 Pascal、C、C++等语言时会感觉一个比一个好,不免有喜新厌旧之举。而如今的Visual Basic、Delphi、Visual C++、Java等语言各有所长,真的难分优劣。能很好地解决问题的编程语言就是好语言。开发人员应该根据实际情况,选择业界推荐的并且是自己擅长的编程语言来开发软件,才能保证有较好的质量与生产率。

编程是件自由与快乐的事情,不要发誓忠于某某语言而自寻烦恼。

1.6.2 编程是一门艺术吗

作者的观点:水平高到一定程度后,干啥事都能感受到“艺术”,编程也不例外。但

在技术行业,人们通常认为“艺术”是随心所欲、不可把握的东西。如果程序员都把编程当成“艺术”来看待,准会把公司老板吓昏过去。

大部分人开发软件是为了满足客户的需求,而不是为了自己享受。本书提倡规范化编程。规范化能够提高质量与生产率,最具实用价值,尽管它在一定程度上压抑了“艺术”。编程艺术是人们对高水平程序创作的一种感受,但只可意会,不可言传,不能成为软件公司的一个指导方针。

1.6.3 编程时应该多使用技巧吗

作者的观点:就软件开发而言,技巧的优点在于能另辟蹊径地解决一些问题,缺点是技巧并不为人熟知。若在程序中使用太多的技巧,可能会留下错误隐患,别人也难以理解程序。鉴于一个局部的优点对整个系统而言是微小的,而一个错误则可能对整个系统是致命的。我建议用自然的方式编程,不要滥用技巧。我们有时的确不知道自己的得意之举究竟是锦上添花,还是画蛇添足。就象蒸出一笼馒头,在上面插一朵鲜花,本想弄点诗情画意,却让人误以为那是一堆热气腾腾的牛粪。

小时候读的《狼三则》故事启示我们,失败的技巧被讽刺为“技俩”。当我们在编程时无法判断是用了技巧还是用了技俩,那就少用。《卖油翁》的故事又告诉我们“熟能生巧”,表明技巧是自然而然产生的,而不是卖弄出来的。卖油翁的绝技是可到中央电视台表演的,而他老人家却谦虚地说:“没啥没啥,用熟了而已”。

11

1.6.4 换更快的计算机还是换更快的算法

如果软件运行较慢,是换一台更快的计算机,还是设计一种更快的算法? 作者的观点:如果开发软件的目的是为了学习或是研究,那么应该设计一种更快的算法。如果该软件已经用于商业,则需谨慎考虑。若换一台更快的计算机能解决问题,则是最快的解决方案。改进算法虽然可以从根本上提高软件的运行速度,但可能引入错误以及延误进度。

技术狂毫无疑问会选择后者,因为他们觉得放弃任何可以优化的机会就等于犯罪。类似的争议还有:是买现成的程序,还是彻底由自己开发?技术人员和商业人士常常会有不同的决策。

1.6.5 错误是否应该分等级

微软的一些开发小组将错误分成四个等级[Cusumano, 1995, p354-p355]: ? 一级严重:错误导致软件崩溃。

? 二级严重:错误导致一个特性不能运行并且没有替代方案。 ? 三级严重:错误导致一个特性不能运行但有替代方案。 ? 四级严重:错误是表面化的或是微小的。

作者的观点:将错误分等级的好处是便于统计分析。但上述分类带有较重的技术倾向,并不是普适的。假设某个财务软件有两个错误:错误A使该软件死掉,错误B导致工资计算错误。按上述分类,错误A属一级严重,错误B属二级严重。但事实上B要比A严重。工资算多了或者算少了,将会使老板或员工遭受经济损失。而错误A只是使操作员感到厌烦,并没有造成经济损失。再例如操作手册写错了,按上述分类则属四级严重,但这种错误可能导致机毁人亡,难道还算微小吗?

开发人员应该意识到:所有的错误都是严重的,不存在微不足道的错误。只有这样才能少犯错误。

1.6.6 一些错误的观念

错误观念之一:我们拥有一套讲述如何开发软件的书籍,书中充满了标准与示例,可以帮助我们解决软件开发中遇到的任何问题。

作者的观点:好的参考书无疑能指导我们的工作。充分利用书籍中的方法、技术和技巧,可以有效地解决软件开发中大量常见的问题。但实践者并不能因此依赖于书籍,这是因为:

(1) 在现实中,由于工作条件千差万别,即使是相当成熟的软件工程规范,也常

常无法套用。

(2) 软件技术日新月异,没有哪一种标准能长盛不衰。祖传秘方在某些领域很吃

香,而在软件领域可能意味着落后。

12

错误观念之二:我们拥有充足的资源和经费,可以买最好的设备,一定能做出优秀的软件产品。

作者的观点:大公司经常有这样夜郎自大的心态。良好的开发环境只是产出成果的必要条件,而不是充分条件。如果拥有好环境的是一群庸人或者是一群勾心斗角的聪明人,难保他们不干出南辕北辙的事情。

错误观念之三:如果我们落后于计划,可以增加更多的程序员来解决问题。 作者的观点:软件开发不同于传统的农业生产,人多不见得力量大。如果给落后于计划的项目增添新手,可能会更加延误项目。因为:

(1) 新手会产生很多新的错误,给项目添麻烦。

(2) 老手向新手解释工作以及交流思想都要花费时间,使实际开发时间更少。 所以精确地制定项目计划很重要,不在乎计划中的进度看起来有多么快,计划要恰如其分。如果用“大跃进”的方式干活,只会产生倒退的后果。

错误观念之一:只要干活小心点,就能提高软件的质量。

作者的观点:软件开发是一种智力创作活动,世上最小心翼翼、最老实巴脚的程序员未必就能开发出高质量的软件来。程序员必须了解软件质量的方方面面(称为质量属性素),一定要先搞清楚怎样才能提高质量,才可以在进行需求开发、系统设计、编程、测试时将高质量内建其中。

13

本文来源:https://www.bwwdw.com/article/8rp3.html

Top