2 零缺陷质量管理的观念
“零缺陷”质量管理的观念来源于一些国际上著名的硬件生产厂商。尽管软件的开发与硬件生产有极大的差别,但我们仍可以从“零缺陷”质量管理中得到启迪。“零缺陷”质量管理至少有两个核心内容:一是高目标,二是可执行的规范。
2.1 高目标
人在做一件事情时,由于存在很多不确定的因素,一般不可能100% 地达到目标。假设平常人做事能完成目标的80%。如果某个人的目标是100分,那么他最终成绩可达80分。如果某个人的目标只是60分,那么他最终成绩只有48分。我们在考场上身经百战,很清楚那些只想混及格的学生通常都不会及格,那些想得高分的学生也常为自己的失误而捶胸顿足。
做一个项目通常需要多个人的协作。假设项目的总质量(最高为1)是十个开发人员的工作质量之积。如果每个人的质量目标是0.95,那么十个人的累积质量不会超过0.19。如果每个人的质量目标是0.9分,那么十个人的累积质量不会超过0.03。只有每个人都做到1,项目总质量才会是1。
如果没有高目标,人的堕落就很快。如果没有“零缺陷”的质量目标,也许缺陷就会成堆。
2.2 可执行的规范
实现100分显然比实现80分要付出更多的努力。“零缺陷”质量目标不是随心所欲提出来的,做得到才有意义。实现高目标需要一套可执行的规范来保证。
50年代末,全国掀起了“浮夸风”。为了实现亩产数万斤推广各种方法,害得全国闹饥荒。想不到有数千年种粮经验的几亿中国农民就这么整齐地栽倒了。
好规范必须是本企业有能力执行的。一个普通企业照搬一流企业的规范未必行得通。软件工程的规范很容易从书籍中找到,但有了这些规范并不表明就能把软件做好。国内很多软件公司根本没有条件去执行业界推荐的软件工程规范。社会主义初级阶段的“草”与发达资本主义国家的“苗”的确有不同的培育方式。
软件是如此的灵活,如果没有规范来制约,就容易因无序的喜好而导致混沌;但规范如果太严密了,就会扼杀程序员生机勃勃的创造力。制定软件规范是进退两难的事。程序员必须深入了解软件多方面的质量因素,把那些能提高软件质量因素的各种规范植入脑中,才能在各个实践环节自然而然地把高质量设计到软件中。
3 软件的质量因素
“运行正确”的程序就是高质量的程序吗?
不贪污的官就是好官吗?
时下老百姓对一些腐败的地方政府深痛恶绝,对“官”不再有质量期望。只要当官的不贪污,哪怕毫无政绩,也算是“好官”。也有一些精明的老百姓打出旗号:宁要贪污犯,不要大笨蛋。相比之下,程序员是够幸福的了。因为我们能通过努力,由自己来把握软件的命运。那么就不要轻易放弃提高软件质量的权利了。
“运行正确”的程序不见得就是高质量的程序。这个程序也许运行速度很低并且浪费内存;也许代码写得一塌糊涂,除了开发者本人谁也看不懂也不会使用。正确性只是反映软件质量的一个因素而已。
软件的质量因素很多,如正确性、精确性、可靠性、容错性、性能、效率、易用性、可理解性、简洁性、可复用性、可扩充性、兼容性等等(还可以列出十几个)。这些质量因素之间“你中有我,我中有他”,非常缠绵。如果程序员每天要面对那么多质量因素咬文嚼字,不久就会迂腐得象孔乙已,并且有找不到女朋友的危险。
为了便于理解,可以参照武侠小说中的武学分类,将质量因素粗略地分成几大派。你想那武学源源流长,相互渗透,谁能数得清有多少江湖派别。但想在道上混,总得知道六大门派:“少林派”、“武当派”、“峨嵋派”、“华山派”、“昆仑派”和“崆峒派”。软件质量因素的分类如图3.2所示。其中“正确性与精确性”排在首位,地位如同“少林派”与“武当派”;而“性能与效率”,“易用性”,“可理解性与简洁性”和“可复用性与可扩充性”亦是举足轻重的质量因素,地位仿佛“峨嵋派”,“华山派”,“昆仑派”和“崆峒派”。其它的质量因素总可以在图3.2中找到合适的亲缘关系,本节不再一一细表。
3 软件质量因素分类和武学分类
3.1 正确性与精确性
正确性与精确性之所以排在质量因素的第一位,是因为如果软件运行不正确或者不精确,就会给用户造成不便甚至造成损失。机器不会主动欺骗人,软件运行不正确或者不精确一般都是人造成的。即使一个软件能100% 地按需求规格执行,但是如果需求分析错了,那么对客户而言这个软件也存在错误。即使需求分析完全符合客户的要求,但是如果软件没有100% 地按需求规格执行,那么这个软件也存在错误。开发一个大的软件项目,程序员要为“正确”、“精确”四个字竭尽精力。
与正确性、精确性相关的质量因素是容错性和可靠性。
容错性首先承认软件系统存在不正确与不精确的因素,为了防止潜在的不正确与不精确因素引发灾难,系统为此设计了安全措施。在一些高风险的软件系统,如航空航天、武器、金融等系统中,容错性设计非常重要。
可靠性是指在一定的环境下,在给定的时间内,系统不发生故障的概率。可靠性本来是硬件领域的术语。比如某个电子设备,一开始工作很正常,但由于工作中器件的物理性质会发生变化(如发热),慢慢地系统就会失常。所以一个设计完全正确的硬件系统,在工作中未必就是可靠的。软件在运行时不会发生物理性质的变化,人们常以为如果软件的某个功能是正确的,那么它一辈子都是正确的。可是我们无法对软件进行彻底地测试,无法根除软件中潜在的错误。平时软件运行得好好的,说不准哪一天就不正常了,如“2000年”问题。因此把可靠性引入软件领域是有意义的。我曾买了一本关于软件可靠性的著作,此书充满了数学公式。我发现以我目前的学历实在难以看懂书上讲了些什么。请宽恕我的愚昧,我把此书给“供”起来,没敢用笔画一处记号。
3.2 性能与效率
用户都希望软件的运行速度高些(高性能),并且占用资源少些(高效率)。旧社会地主就是这么对待长工的:干活要快点,吃得要少点。程序员可以通过优化算法、数据结构和代码组织来提高软件系统的性能与效率。优化的关键工作是找出限制性能与效率的“瓶颈”,不要在无关痛痒的地方瞎忙乎。如果你想职称升得快,光靠增加课时能顶屁用;你就该一年写它几十篇文章,争取破格升教授。