什么是软件设计?
什么是软件设计?软件设计是采用编程或脚本语言优雅地表达并解决现实需求的一门科学和艺术。“优雅地表达”想传递的意思是,所设计出来的软件应当能容易被人理解、方便扩展和维护。从这一定义可以看出软件设计首先是一门科学,是一门解决用户需求的软件科学。既然是科学,不可避免的要掌握相关的科学知识,比如数据结构、计算机组成原理、编程语言等等,而这些内容也正是大学计算机相关专业所传授的知识。科学知识或许更加容易被量化,拿数据结构为例,一种算法比另一种算法是否更优可以从算法的时间冗余度和空间冗余度进行衡量。
除了科学的部分,软件设计还涉及艺术的范畴。既然是一门艺术,那就一定存在欣赏的问题,也就意味并不是每个从业人员都能欣赏这种艺术,而只有达到了一定的层次且形成了自己的思想后才能欣赏它。由于设计中艺术的非直观性,造成其在现实中不容易被量化,因此难以形成相应的评估准则,进而造成在软件行业容易被忽视。试想想,大学课程有多少内容是在教我们将软件设计当作艺术进行欣赏并追求?
好的软件设计能相对方便(甚至是很方便)地实现新的需求问题。需求分析是告诉我们“做什么”,其显然非常的重要,而设计更多地涉及“怎么做更好”。既然对于设计的好坏不能完全通过量化的方式进行衡量,那如何去评价一个软件设计的好坏呢?或者在进行软件设计时,如何去思考以做出一个好的设计呢?这可以通过对一些软件设计原则的把握来做到。设计原则可能有很多,但并不是每一个项目都要同时满足所有的设计原则,另外,不同的项目其特性有可能使得有些设计原则并不适用。另外,设计原则也不是一成不变的,可能因项目的特点又可以抽取出另外的设计原则。笔者将在后续的文章中阐述日常工作中所遵守的软件设计原则。
软件设计是一个不断提炼和抽象的过程。说它是一个提炼的过程,是因为在设计之初会想到很多需要考虑的因素,这些因素在设计工作没有深入之前,并不能发现它们有些是重叠的,或者有些根本就不需要考虑。随着设计的深入,会从众多的因素中得到其中的关键因素并将这些因素付之于实践。设计也是一个抽象过程,需要从众多的表象中找到它们的共性,通过表达共性从而最终描述每个个性,而不应当局限于直接去描述每一个个性。设计的深入过程并不只是一味地思考,除非设计者以前有过类似的设计经验,否则设计过程通常需要进行一定的代码编写工作,以辅助思考,这一点对于开发软件架构师(系统架构师不包括在内)也应当是一样的。
软件设计是一个创造模型的过程。通过对需求的理解和抽象,好的设计将最终构造出一个模型,而且这个模型与现实世界的某样东西可能是相类似的。这个模型除了实现了用户的需求,还向他人展示了她自己是“什么模样”以及可能会如何行事。打个比方,如果有人发明了一种新的交通工具,他如何最为有效地表达这一新的交通工具到底是什么样的呢?是直接拿一张图纸给他人并说“你看看图纸就知道了”好呢?还是打一个大家都耳熟能详的比方好呢?显然,后者更好。如果他说“这个新的交通工具与现在的轿车很像,只不过…”,如此一来,听众马上就会想,这个新的交通工具有四个轮子、也有方向盘等等。显然,后者能很快地让听众利用其生活经验快速的接收信息,而好的软件设计也应当做到这一点。软件设计时的模型创造过程,其实就是赋予软件代码“生命”的过程,由此看来一个好的设计应当是
“有生命的”。
软件设计是一个做选择的过程。人有时没有选择反而轻松。一个刚毕业的大学生如果只拿到了一个offer,他可能没有选择单位的烦恼,不论单位好坏都去报道就是了。但是,如果他拿了两个offer,选择的烦恼也就有了
——
是去A单位好呢?还是B单位好?不幸的是,软件的设计过程往往存在大量的选择。是用空间换时间好呢?还是用时间换空间好?是现在考虑可扩展性呢?还是将来?等等。因此,毫不夸张地说,设计是“痛苦”的,除非设计主题很简单或直接了当。有苦当然也就有乐,在设计没有最终定下来时,需要痛苦地思考和选择,往往是一个觉得这个也不行、那个也不好的过程。但是,一旦设计最终定稿,会发现“这就是我想要的设计”,随之而来的是三百六十度的大转变,觉得这个也应当就是这样,那个也应当是这样,其结果是设计者能从中体会到一种美,并从中收获乐趣。
软件设计是一个在有限理性范围内追求完美的过程。有限理性非常重要,设计者需要在各种条件允许的情况下做出合理的设计选择。另外,促使设计者用心并“痛苦地”进行设计的动力是设计者追求完美的品德。可以说,如果没有这种追求,就很难获得一个好的软件设计。
软件设计是一系列创造活动,是借助编程语言以简单和优雅的方式表达并解决现实需求的一门科学和艺术。
- 软件设计是一门技术
数据结构,组成原理,操作系统,编程语言…
科学的特点是有规律可循,因此软件设计者需要掌握相关的专业知识。而这些科学知识通常容易被量化和评估。
- 软件设计是一门艺术
并不是技术知识的简单堆砌,而是分析,抽象,取舍…
一个好的设计必然给人带来没敢,也让人值得欣赏。
软件设计的意义(架构的意义)
如下图所示,现代软件设计包含了功能实现、部署、代码扩展性、代码维护性、代码复用性、用户交互。那么为什么需要考虑那么多呢?
关于软件设计的问题
1.是不是开发前一定需要进行软件设计?不能马上编写代码吗?
当软件结构复杂的时候,如果直接编写代码的话,会造成后期一系列的问题,而这个时候软件产品的维护和扩展举步维艰、难以测试和差错,从而直接影响项目的开发效率和产品的最终指令,以及工程师的生活质量。
2.用户需求,需要实现什么功能?使用什么用户交互方式?
软件开发时根据用户所需的功能进行设计开发的。我们需要以用户为中心来思考设计功能的实现。
3.如何部署到用户的设备上去呢?
我们需要考虑软件的部署是因为我们开发使用的设备与最终用户使用的设备可能不一样。所以我们需要考虑软件部署的问题。不能出现开发和测试过程时候软件可以正常运行,到了用户设备时不能正常运行的现象。
4.为什么要考虑扩展性、维护性、复用性?
a)我们需要考虑代码的扩展性是因为,到产品需要升级或者功能增加的时候,我们是否可以很快的吧功能添加上去?
b)当开发人员离职时,后面接手工作的人员是否可以很快的熟悉这份代码并且容易进行维护?
c)当有新项目需要开发时,我们是否可以重复使用这个项目的代码呢?
这些都需要在软件设计的时候考虑的要点。
软件设计的特点
软件设计是一个塑造模型(概念)的过程
软件设计是一个取舍的过程
软件设计是一个分而治之的过程
软件设计是一个在理性范围内追求完美的过程
基本内容详细设计详细设计的主要任务是设计每个模块的实现算法、所需的局部数据结构。详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描述要简明易懂。
传统软件开发方法的详细设计主要是用结构化程序设计法。详细设计的表示工具有图形工具和语言工具。图形工具有程序流程图、PAD(Problem Analysis Diagram)图、NS(由 Nassi和 Shneidermen开发,简称 NS)图。语言工具有伪码和 PDL(Program Design Language)等。
主要任务:
1.为每个模块确定采用的算法,选择某种适当的工具表达算法的过程,写出模块的详细过程性描述;
2.确定每一模块使用的数据结构;
3.确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部模块的接口,以及模块输入数据、输出数据及局部数据的全部细节。
在详细设计结束时,应该把上述结果写入详细设计说明书,并且通过复审形成正式文档。交付给下一阶段(编码阶段)的工作依据。
4.要为每一个模块设计出一组测试用例,以便在编码阶段对模块代码(即程序)进行预定的测试,模块的测试用例是软件测试计划的重要组成部分,通常应包括输入数据,期望输出等内容。
详细设计的工具:
1.图形工具
利用图形工具可以把过程的细节用图形描述出来。
2.表格工具
可以用一张表来描述过程的细节,在这张表中列出了各种可能的操作和相应的条件。
3.语言工具
用某种高级语言(称之为伪码)来描述过程的细节。
而开发,说的白点就是代码工,就是日常开发的。
就这么理解吧。