软件设计师考试大纲 软件设计( 五 )


假设软件设计相对易于创作,并且在本质上构建起来也没有什么代价,一个不令人吃惊的发现是,软件设计往往是难以置信的庞大和复杂 。这看起来似乎很明显,但是问题的重要性却常常被忽视 。学校中的项目通常具有数千行的代码 。具有10 000行代码(设计)的软件产品被它们的设计者丢弃的情况也是有的 。我们早就不再关注于简单的软件 。典型的商业软件的设计都是由数十万行代码组成的 。许多软件设计达到了上百万行代码 。另外,软件设计几乎总是在不断地演化 。虽然当前的设计可能只有几千行代码,但是在产品的生命期中,实际上可能要编写许多倍的代码 。
尽管确实存在一些硬件设计,它们看起来似乎和软件设计一样复杂,但是请注意两个有关现代硬件的事实 。第一,复杂的硬件工程成果未必总是没有错误的,在这一点上,它不存在像软件那样让我们相信的评判标准 。多数的微处理器在发售时都具有一些逻辑错误:桥梁坍塌,大坝破裂,飞机失事以及数以千计的汽车和其他消费品被召回——所有的这些我们都记忆犹新,所有的这些都是设计错误的结果 。第二,复杂的硬件设计具有与之对应的复杂、昂贵的构建阶段 。结果,制造这种系统所需的能力限制了真正能够生产复杂硬件设计公司的数目 。对于软件来说,没有这种限制 。目前,已经有数以百计的软件机构和数以千计的非常复杂的软件系统存在,并且数量以及复杂性每天都在增长 。这意味着软件行业不可能通过仿效硬件开发者找到针对自身问题的解决办法 。倘若一定要说出有什么相同之处的话,那就是,当CAD和CAM可以做到帮助硬件设计者创建越来越复杂的设计时,硬件工程才会变得和软件开发越来越像 。
设计软件是一种管理复杂性的活动 。复杂性存在于软件设计本身之中,存在于公司的软件机构之中,也存在于整个软件行业之中 。软件设计和系统设计非常相似 。它可以跨越多种技术并且常常涉及多个学科分支 。软件的规格说明往往不固定、经常快速变化,这种变化常常在正进行软件设计时发生 。同样,软件开发团队也往往不固定,常常在设计过程的中间发生变化 。在许多方面,软件都要比硬件更像复杂的社会或者有机系统 。所有这些都使得软件设计成为了一个困难的并且易出错的过程 。虽然所有这些都不是创造性的想法,但是在软件工程革命开始将近30年后的今天,和其他工程行业相比,软件开发看起来仍然像是一种未受过训练(undisciplined)的技艺 。
一般的看法认为,当真正的工程师完成了一个设计,不管该设计有多么复杂,他们都非常确信该设计是可以工作的 。他们也非常确信该设计可以使用公认的技术建造出来 。为了做到这一点,硬件工程师花费了大量的时间去验证和改进他们的设计 。例如,请考虑一个桥梁设计 。在这样一个设计实际建造之前,工程师会进行结构分析——他们建立计算机模型并进行仿真,他们建立比例模型并在风洞中或者用其他一些方法进行测试 。简而言之,在建造前,设计者会使用他们能够想到的一切方法来证实设计是正确的 。对于一架新型客机的设计来说,情况甚至更加严重;必须要构建出和原物同尺寸的原型,并且必须要进行飞行测试来验证设计中的种种预计 。
对于大多数人来说,软件中明显不存在和硬件设计同样严格的工程 。然而,如果我们把源代码看做是设计,那么就会发现软件工程师实际上对他们的设计做了大量的验证和改进 。软件工程师不把这称为工程,而称它为测试和调试 。大多数人不把测试和调试看作是真正的“工程”——在软件行业中肯定没有被看作是 。造成这种看法的原因,更多的是因为软件行业拒绝把代码看作设计,而不是任何实际的工程差别 。事实上,试验模型、原型以及电路试验板已经成为其他工程学科公认的组成部分 。软件设计者之所以不具有或者没有使用更多的正规方法来验证他们的设计,是因为软件构建周期的简单经济规律 。
第一个启示:仅仅构建设计并测试它比做任何其他事情要廉价一些,也简单一些 。我们不关心做了多少次构建——这些构建在时间方面的代价几乎为零,并且如果我们丢弃了构建,那么它所使用的资源完全可以重新利用 。请注意,测试并非仅仅是让当前的设计正确,它也是改进设计的过程的一部分 。复杂系统的硬件工程师常常建立模型(或者,至少他们把设计用计算机图形直观地表现出来) 。这就使得他们获得了对于设计的一种“感觉”,而仅仅去检查设计是不可能获得这种感觉的 。对于软件来说,构建这样一个模型既不可能也无必要 。我们仅仅构建产品本身 。即使正规的软件验证可以和编译器一样自动进行,我们还是会去进行构建/测试循环 。因此,正规的验证对于软件行业来说从来没有太多的实际意义 。

秒懂生活扩展阅读