首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java
 设计中的挑战

“软件设计”一词意味着去构思、创造或发明一套方案,把一份计算机软件的规格说明书要求转变为可实际运行的软件。设计就是把需求分析和编码调试连在一起的活动。好的高层次设计能提供一个可以稳妥容纳多个较低层次设计的结构。好的设计对于小型项目非常有用,对于大型项目就更是不可或缺。

设计也会面临大量的挑战,这正是本节将要概述的内容。

Design Is a Wicked Problem

设计是一个险恶的问题

根据Horst RittelMelvin Webber的定义,“险恶的(wicked)”问题就是那种只有通过解决或部分解决才能被明确的问题(1973)。这个看似矛盾的定义其实是在暗示说,你必须首先把这个问题“解决”一遍以便能够明确地定义它,然后再次解决该问题,从而形成一个可行的方案。这一过程已经如影随形地在软件开发中存在数十年了(Peters and Tripp 1976)。

在我所了解的世界中,最引人注目的一个关于这类险恶问题的例子,就是原来Tacoma Narrows大桥的设计问题了。在建这座大桥的那个时期,设计一座桥梁时考虑的主要问题就是它是否足够结实以承受设计负荷。然而对于Tacoma Narrows这座桥而言,大风给它带来了出乎意料的横向谐波。在1940年狂风大作的某一天,这种谐波越来越大且不可控制,从而让大桥最终坍塌,如图5-1所示。

这是一个险恶问题的好例子,因为直到这座桥坍塌,工程师们才知道应该充分地考虑空气动力学的因素。只有通过建造这座大桥(即解决这个问题),他们才能学会从这一问题中应该额外考虑的环节,从而才能建造出到现在依然矗立不倒的另一座桥梁。

5-1  Tacoma Narrows大桥——一个险恶问题的实例

你在学校中所开发的程序和你在职业生涯中所开发的程序的主要差异就在于,学校里的程序所解决的设计问题很少(如果有的话)是险恶的。学校里给你的编程作业都是为了让你能从头到尾直线前进而设计的。如果有位老师给你一份编程作业,你刚完成设计时他就把作业的要求改了,然后就在你将要提交完整的程序时,他又对作业的要求再次改动,这时你肯定会十分生气。然而这一过程正是在专业编程中每日可见的真实情形。

Design Is a Sloppy Process (Even If it Produces a Tidy Result)

设计是个了无章法的过程(即使它能得出清爽的成果)

软件设计的成果应该是组织良好、干净利落的,然而形成这个设计的过程却并非如此清爽。

说设计了无章法,是因为在此过程中你会采取很多错误的步骤,多次误入歧途——你会犯很多的错误。事实上,犯错正是设计的关键所在——在设计阶段犯错并加以改正,其代价要比在编码后才发现同样的错误并彻底修改低得多。说设计了无章法,还因为优、劣设计之间的差异往往非常微妙。


 

另外,说设计了无章法,还因为你很难判断设计何时算是“足够好”了。设计到什么细节才算够?有多少设计需要用形式化的设计符号完成,又有多少设计可以留到编码时再做?什么时候才算完成?因为设计永无止境,因此对上述问题最常见的回答是“到你没时间再做了为止”。

Design Is About Tradeoffs and Priorities

设计就是确定取舍和调整顺序的过程

在一个理想的世界中,每一套系统都能即刻完成运行,不消耗任何存储空间,不占用任何网络带宽,没有任何错误,也无须任何成本即可生成。而在现实世界里,设计者工作的一个关键内容便是去衡量彼此冲突的各项设计特性,并尽力在其中寻求平衡。如果快速的反应速度比缩减开发时间更重要,那么设计者会选取一套设计方案。而如果缩减开发时间更重要,那么好的设计者又要巧妙地形成另一套不同的设计方案。

Design Involves Restrictions

设计受到诸多限制

设计的要点,一部分是在创造可能发生的事情,而另一部分又是在限制可能发生的事情。如果人们在建造房屋时拥有无限的时间、资源和空间,那么你会看到房屋不可思议地随意蔓延,每幢楼都有上百间屋子,一只鞋子就可以占用一间屋子。如果毫无约束,软件最后也会是这样的结果。正是由于建造房屋时有限资源的限制,才会促使产生简单的方案,并最终改善这一解决方案。软件设计的目标也如此。

Design Is Nondeterministic

设计是不确定的

如果你让三个人去设计一套同样的程序,他们很可能会做出三套截然不同的设计,而每套设计都很不错。剥猫的皮可能有不止一种方法,但设计计算机程序却通常有数十种方法。

Design Is a Heuristic Process

设计是一个启发式过程

正因为设计过程充满了不确定性,因此设计技术也就趋于具有探索性——“经验法则”或者“试试没准能行的办法”——而不是保证能产生预期结果的可重复的过程。设计过程中总会有试验和犯错误。在一件工作或一件工作的某个方面十分奏效的设计工具或技术,不一定在下一个项目中适用。没有任何工具是用之四海而皆灵的。

Design Is Emergent

设计是自然而然形成的

把设计的这些特性综合归纳起来,我们可以说设计是“自然而然形成的”。设计不是在谁的头脑中直接跳出来的。它是在不断的设计评估、非正式讨论、写试验代码以及修改试验代码中演化和完善的。


 

几乎所有的系统都在其开发的起始阶段经历过某种程度的设计变更,而当它们进入后续版本后通常都会进行更大的改变。软件的性质决定了这些改变在多大程度上是有益且可被接受的。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论