软件工程思想 1.2 软件开发的基本策略 林锐

软件的质量因素很多,如正确性,性能、可靠性、容错性、易用性、灵活性、可扩充性、 可理解性、可维护性等等。有些因素相互重叠,有些则相抵触,真要提高质量可不容易啊!

软件工程的主要环节有:人员管理、项目管理、可行性与需求分析、系统设计、程序设 计、测试、维护等。 

人们都有自己的世界观和方法论,能自然而然地运用于生活和工作中。同样,程序员脑 子里的软件工程观念会无形地支配其怎么去做事情。软件工程三十年的发展,已经积累了相 当多的方法,但这些方法不是严密的理论。实践人员不应该教条地套用方法,更重要的是学 会“选择合适的方法”和“产生新方法”。有谋略才会有好的战术。几千年前,我们的祖先 就在打闹之际写下了很多心得体会,被现代人很好地运用于工业和商业。本节讲述软件开发 中的三种基本策略:“复用”、“分而治之”、“优化——折衷”。

1.2.1 复用 复用就是指“利用现成的东西”,文人称之为“拿来主义”。被复用的对象可以是有形的

物体,也可以是无形的成果。复用不是人类懒惰的表现而是智慧的表现。因为人类总是在继 承了前人的成果,不断加以利用、改进或创新后才会进步。所以当我们欢度国庆时,要搞清 楚祖国远不止 50 岁,我们今天享用到的财富还有上下五千年人民的贡献。进步只是应该的, 不进步则就可耻了。

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

把复用的思想用于软件开发,称为软件复用。据统计,世上已有 1000 亿多行程序,无 数功能被重写了成千上万次,真是浪费哪。面向对象(Object Oriented)学者的口头禅就是 “请不要再发明相同的车轮子了” 。

将具有一定集成度并可以重复使用的软件组成单元称为软构件(Software Component)。 软件复用可以表述为:构造新的软件系统可以不必每次从零做起,直接使用已有的软构件, 即可组装(或加以合理修改)成新的系统。复用方法合理化并简化了软件开发过程,减少了 总的开发工作量与维护代价,既降低了软件的成本又提高了生产率。另一方面,由于软构件 是经过反复使用验证的,自身具有较高的质量。因此由软构件组成的新系统也具有较高的质 量。利用软构件生产应用软件的过程如图 1.5 所示。

软件复用不仅要使自己拿来方便,还要让别人拿去方便,是“拿来拿去主义”。面向对 象方法,Microsoft 公司的 COM 规范 [Rogerson 1999],都能很好地用于实现大规模的软件复 用。


图 1.5

查询软构 存在 件库

构件不存在

利用软构件生产应用软件的过程

1.2.2 分而治之 分而治之是指把一个复杂的问题分解成若干个简单的问题,然后逐个解决。这种朴素的

思想来源于人们生活与工作的经验,完全适合于技术领域。软件人员在执行分而治之的时候, 应该着重考虑:复杂问题分解后,每个问题能否用程序实现?所有程序最终能否集成为一个 软件系统并有效解决原始的复杂问题?


图 1.6 软件领域的分而治之策略

图 1.6 表示了软件领域的分而治之策略。诸如软件的体系结构设计、模块化设计都是分 而治之的具体表现。软件的分而治之不可以“硬分硬治”。不像为了吃一个西瓜或是一只鸡, 挥刀斩成 n 块,再把每块塞进嘴里粉碎搅拌,然后交由胃肠来消化吸收,象征复杂问题的西 瓜或是鸡也就此消失了。

1.2.3 优化——折衷 软件的优化是指优化软件的各个质量因素,如提高运行速度,提高对内存资源的利用率,

使用户界面更加友好,使三维图形的真实感更强等等。想做好优化工作,首先要让开发人员 都有正确的认识:优化工作不是可有可无的事情,而是必须要做的事情。当优化工作成为一 种责任时,程序员才会不断改进软件中的算法,数据结构和程序组织,从而提高软件质量。

著名的 3D 游戏软件 Quake,能够在 PC 机上实时地绘制高度真实感的复杂场景。Quake 的开发者能把很多成熟的图形技术发挥到极致,例如把 Bresenham 画线、多边形裁剪、树遍 历等算法的速度提高近一个数量级。我第一次看到 Quake 时不仅感到震动,而且深受打击。 这个 PC 游戏软件的技术水平已经远胜于我所见识到的国内领先的图形学相关科研成果。这 对我们日益盛行的点到完止的研发工作真是莫大的讽刺。所以当我们开发的软件表现出很多 不可救药的病症时,不要怨机器差。真的是我们自己没有把工作做好,写不好字却嫌笔钝。

就假设我们经过思想教育后,精神抖擞,随时准备为优化工作干上六天七夜。但愿意做 并不意味着就能把事情做好。优化工作的复杂之处是很多目标存在千丝万缕的关系,可谓数 不清理还乱。当不能够使所有的目标都得到优化时,就需要“折衷”策略。

软件中的折衷策略是指通过协调各个质量因素,实现整体质量的最优。就象党支部副书 记扮演和事佬的角色:“...为了使整个组织具有最好的战斗力,我们要重用几个人,照顾一 些人,在万不得已的情况下委屈一批人”。

软件折衷的重要原则是不能使某一方损失关键的职能,更不可以象“舍鱼而取熊掌”那 样抛弃一方。例如 3D 动画软件的瓶颈通常是速度,但如果为了提高速度而在程序中取消光 照明计算,那么场景就会丧失真实感,3D 动画也就不再有意义了(如果人类全是色盲,计 算机图形学将变得异常简单)。

人都有惰性,如果允许滥用折衷的话,那么一当碰到困难,人们就会用拆东墙补西墙的

软件 系统

方式去折衷,不再下苦功去做有意义的优化。所以我们有必要为折衷制定严正的立场:在保 证其它因素不差的前提下,使某些因素变得更好。

  下面让我们用“优化——折衷”的策略解决“鱼和熊掌不可得兼”的难题。

问题提出:假设鱼每千克 10 元,熊掌每千克一万元。有个倔脾气的人只有 20 元钱,非 得要吃上一公斤美妙的“熊掌烧鱼”,怎么办?

解决方案:化 9 元 9 角 9 分钱买 999 克鱼肉,化 10 元钱买 1 克熊掌肉,可做一道“熊 掌戏鱼”菜。剩下的那一分钱还可建立奖励基金。

1.3 一些不正确的观念 本节例举并分析一些不正确的软件工程观念,可帮助初学者少犯相似的错误。

观念之一:我们拥有一套讲述如何开发软件的书籍,书中充满了标准与示例,可以帮助我们 解决软件开发中遇到的任何问题。 客观情况:好的参考书无疑能指导我们的工作。充分利用书籍中的方法、技术和技巧,可以 有效地解决软件开发中大量常见的问题。但实践者并不能因此依赖于书籍,这是因为:(1) 现实的工作中,由于条件千差万别,即使是相当成熟的软件工程规范,常常也无法套用。(2) 软件技术日新月异,没有哪一种软件标准能长盛不衰。祖传秘方在某些领域很吃香,而在软 件领域则意味着落后。

观念之二:我们拥有最好的开发工具、最好的计算机,一定能做出优秀的软件。 客观情况:良好的开发环境只是产出成果的必要条件,而不是充分条件。如果拥有好环境的 是一群庸人,难保他们不干出南辕北辙的事情。

观念之三:如果我们落后于计划,可以增加更多的程序员来解决。 客观情况:软件开发不同于传统的农业生产,人多不见得力量大。如果给落后于计划的项目 增添新手,可能会更加延误项目。因为:(1)新手会产生很多新的错误,使项目混乱。(2) 老手向新手解释工作以及交流思想都要花费时间,使实际开发时间更少。所以科学的项目计 划很重要,不在乎计划能提前多少,重在恰如其分。如果用“大跃进”的方式奔向共产主义, 只会产生倒退的后果。

观念之四:既然需求分析很困难,不管三七二十一先把软件做了再说,反正软件是灵活的, 随时可以修改。 客观情况:对需求把握得越准确,软件的修修补补就越少。有些需求在一开始时很难确定, 在开发过程中要不断地加以改正。软件修改越早代价越少,修改越晚代价越大,就跟治病一 样道理。 

原文地址:https://www.cnblogs.com/feng9exe/p/6775387.html