《需求设计:构建用户想要和需要的产品》——第2章 设 计 体 系2.1 为什么应该建立设计体系

第2章 设 计 体 系

第1章说过,要想做工程化的设计,就必须有一套设计体系。那么本章我们就来看看能不能为IT软件的开发工作构建出一套具有工程学水准的设计体系,并且看看我们是否值得去构建这样的体系。
本章分为三个部分。2.1节从下至上检视整个设计体系,以解释我们为什么应该建立该体系。接下来的2.2节~2.7节,用从上至下的方式来观察这套体系,使大家对设计之中的信息流动情况有所了解。把这套体系中的所有部件都展示出来之后,笔者会在2.8节之中回到本章开头所提出的那个问题上面。最后的2.9节是对本章所做的小结。

2.1 为什么应该建立设计体系

首先,我们从实现设计(implementation design)谈起,实现设计指的就是编程。
编程是一项设计活动。尽管并不是所有的人都同意这个说法,但从笔者自己的编程经历来看,确实如此。刚开始编程的时候,我们会提出一个设计猜想,这通常叫做程序模式。接下来,我们会编写代码来细化这个猜想,并且通过编译、代码检查及测试等手段来进行分析。然而,从第1章的图1-6中可以看出,程序本身并不能代表整个设计,至少对于业解决方案之中的程序来说,是这样的。

https://yqfile.alicdn.com/587baee04ce90231bc4e13e878dfe5f0d11b11d7.png" >

当今的大多数程序都搭建在框架之上。图2-1演示了框架这一概念。
框架的理念是:设定一套骨干代码(skeletal code),其中可以放置各种代码片段(code segment),这些片段用来实现用户所需的功能,而骨干代码,则会把多个代码片段整合起来,并提供一些常用的系统设施,如安全保护、消息传递以及系统管理等。
比如,有很多框架都支持MVC(模型—视图—控制器)模式。该模式的基本思路是将输入交给控制器(controller)去处理,而控制器则会通过模型(model)来访问数据,并且通过视图(view)把数据展示出来。我们为模型、视图及控制器分别编写代码,然后这些代码会插入MVC框架之中。
框架通常由软件厂商所提供。很多制作应用程序开发软件的大型厂商,都有自己的框架,而且通常不止一套,此外,我们还可以找到很多开源的框架。不过,应用程序的开发者需要根据自身的需求,来对厂商所提供的框架进行扩展。对于多层应用程序(multitier application),尤其需要这样做,因为大多数厂商所提供的框架,都位于一台计算机的范围之内。
开发框架的时候,我们可以把程序员必须要完成的工作分成三种:框架本身的开发、功能代码的开发以及常用工具的开发。此处的常用工具是指一些以编程手段实现出来的功能,例如,发送电子邮件、把一系列数据转化成一份PDF文件,以及回报错误等。图2-2演示了这三种编程工作。

https://yqfile.alicdn.com/ffc2ec5cb93644aecc0dcf4223d7699bcaba1c88.png" >

了解上述知识之后,我们现在假设自己是一名程序员,并且需要编写某个新的功能。那么,在开始写代码之前,应该先知道下列四个方面:
用户界面的设计(user interface design):用户界面的布局、用户输入的内容、程序需要对每项输入所做的处理,以及程序需要输出的显示内容。
数据库的设计(database design):数据库或者非数据库的文件所具备的结构。
集成设计(integration design):要发送给其他应用程序的信息(如果有),或是需要从其他应用程序那里接收的信息(如果有)。
技术设计(technical design):选定自己所要使用的框架和软件,并且设计一些公用的代码,使框架、管理机制和操作机制能够运作得更好。
就这四个方面来说,用户界面的设计、数据库的设计,以及技术设计,在整个设计体系里面的位置,处在实现设计之上。至于集成设计的位置,我们稍后再谈。
上述三种设计,需要由用户界面设计者、数据库设计者以及技术设计者来承担。必须指出的是,这三种设计者说的是三种角色,而未必是三个不同的人。对于小型的应用程序来说,这三种角色完全可以由程序员一个人来扮演。但是要注意,这些设计不应该交错地进行。比如,如果把用户界面交给编写代码的程序员来做,那么这位程序员不应该在每写完一小段代码之后,就去稍微设计一下用户界面,或者说,他不应该等到必须牵涉用户界面的时候,才去设计界面之中的某些内容。这一点是需要加以说明的。在用户界面的设计之中,字体大小、按钮位置以及颜色等外观方面的因素,调整起来较为容易,由于它们不会对代码产生太大影响,因此可以留到项目后期再做决定,然而像界面之间的切换、每个界面所显示的数据,以及每个按钮的功能等问题,则应该作为一个整体来进行设计。把这些内容视为一个整体,可以使我们分析出这套设计方案是否较为完备,并且使我们能够仔细地判断出该方案使用起来是否比较容易。这对于数据库设计和技术设计来说,也是类似的。
笔者这么说,可能有人不同意,因为我们毕竟也可以在编程的时候,发现设计之中的某些问题。没错,有的时候确实是如此。第1章曾经指出,这正是设计的本质特征,也就是说,细节设计总是有可能给宏观设计提供反馈。军事上有句话,叫做“一碰到敌人,计划就全乱了”,但这并不是说根本用不着做计划。相反,计划做得越好,修改起来也就越方便。设计也是这样,把宏观设计做出来之后,可以更好地看到修改该设计方案所引发的后果,于是当我们发现问题时,也就更有可能找到最佳的解决办法。
那么,用户界面、数据库以及技术方面的设计者要想完成其工作,必须知道哪些内容呢?他们需要知道的是:
该应用程序要为企业所做的事情。稍后我们将会详细讲解这一点。笔者把应用程序的功能分成多项任务(task),每项任务都表示某人于某时所做的某件事。因此,设计者需要知道有待实现的任务,以及每项任务所做的事情。
任务所使用的数据表。描述任务的时候如果不谈数据,那么这样的描述通常就没有太大意义。
与用户有关的情况。设计者需要根据用户所要做的事情,以及他们所要查看和更新的内容,对这些用户进行分组。
上面这三项信息是紧密联系在一起的,因此,它们应该放入同一个设计之中。笔者把这种设计叫做情境设计(context design)。
但是,在复杂的集成系统之中,情境设计可能会涵盖多个应用程序及服务,而用户界面的设计,却只会与某一个应用程序或服务相关联。此外,对某个数据库所做的设计,有可能同时要为多个应用程序或服务提供支持。因此,情境设计、用户界面设计以及数据库设计之间,并没有简单的一一对应关系。为此,我们需要用集成设计来展示各个部分之间的信息交换和资源共享情况,以便把应用程序、服务及数据库对情境设计的实现方式描绘出来。
最后,在做技术设计的时候,我们需要知道一些指标,如每小时或每秒钟所需完成的任务数量,以及程序所需达到的可用性目标。
图2-3画出了这6种设计之间的关系,笔者给它起了个很没有创意的名字,叫做六框设计模型(six-box model of design)。

https://yqfile.alicdn.com/ec342ce3d89468d2cdb5e3e14a465a07925edfae.png" >

你可能会问:我们有必要把设计分成这么多种吗?其实这样划分还是有些道理的。首先,数据库设计的输出结果,是数据库模式,而技术设计的主要成果,则是框架代码,换句话说,这两种设计所输出的成果,都是最终产品的一部分。其次,用户界面的设计,是一种轻量级的设计。所谓轻量级,是相对代码实现而言的,因为界面设计之中的某一句话,可以展开成很多行代码。第三,各种设计之间可以复用某些信息。情境设计之中的某些规范,可以不加修改地套用到集成设计上面,而且也可以在用户界面设计之中复用。这与经典的工程设计不同,工程设计是要把集成设计转化为用户界面或数据库的设计,而不是要将其分成用户界面设计与数据库设计这两个组件。
笔者将在接下来的几节之中,由上至下地描述这套模型,从情境设计一直讲到实现。这几节要强调的是各种设计所输出的结果,而不是我们应该如何开发并分析这些设计,那是以后的各章所要谈的话题。
笔者关注的主要是业务应用程序的开发,然而我想了一下之后发现,这个六框模型,其实对于其他类型的IT应用程序来说,也可以适用,只不过有的程序可能不需要进行数据库设计或集成设计。对于某些应用程序来说,六框模型之中的一些组件可能完全用不到,例如,在设计并实现一款文字处理程序的时候,就不需要用到这么多种设计。然而,对于其他一些非业务类的程序来说,尽管其情境设计的做法可能与刚才所说的有很大区别,但笔者仍然觉得这种设计是很有必要的。例如,在设计实时的火箭控制软件时,依然应该进行情境设计,我们需要把各种控制项目及其行为确定下来,同时还要确定改变这些控制项目时所需遵循的规则。对于这种软件来说,用户界面的设计所针对的并不是人类用户,而是一些电子测量设备。此外,实时应用程序的实现,与普通应用程序相比,也有很大差异,因为我们必须在某个精确的时间段内执行某种动作。甚至我们还需要做数据库设计,以确保数据之间的一致性,从而使得该软件能够把近期的状态记录下来。集成设计可能也是需要做的,因为处理操作可能会分布在多个处理单元上面。与实时程序类似,游戏编程之中也可以使用六框模型,只不过此处的情境设计,是指对游戏情节所做的概述,而集成设计,则只会用在多人游戏之中。
现在我们回到商业计算的领域,分别用6节篇幅来讲述早前所说的那6种设计。

时间: 2024-09-20 00:44:22

《需求设计:构建用户想要和需要的产品》——第2章 设 计 体 系2.1 为什么应该建立设计体系的相关文章

《需求设计:构建用户想要和需要的产品》——3.9 把现有的做法运用到情境驱动设计之中

3.9 把现有的做法运用到情境驱动设计之中 上面几节分别谈了迭代.品质以及测试和检验等,其实对于这些内容来说,有人比笔者谈得更为广博,也更为深入.我们可以用一句话来概括前几节的内容,那就是:"要采用最佳的做法."笔者首先拿实现阶段做例子,来讲述我们所应该采用的做法: 以用户界面的设计方案为指导,把工作分成多个单元,并计算每个单元含有多少个功能点.这些单元要尽量划分得小一些,使得每个单元能够在2-4周内完成. 程序员必须把能够运行的代码放在系统测试环境之中顺利演示出来,然后才算完成了这个

《需求设计:构建用户想要和需要的产品》——2.9 小结

2.9 小结 笔者以业务应用程序为重点,展示了IT应用程序的设计轮廓.本章概述了每一种设计所要做的事情,以及这些设计之间的信息流动情况,这为后续各章打下了知识基础.情境设计的输出物,显然是情境设计方案本身.用户界面设计的成果,是逻辑用户界面以及服务接口描述.数据库设计的成果是数据库的schema,而技术设计的成果,则是一份提供给程序员及利益相关者的简报,以及一个可以运作的系统测试应用程序,该应用程序能够接收由程序员所编写的实现代码.在这些设计制品(design artifact)之中,除了情境设

《需求设计:构建用户想要和需要的产品》——2.8 这样做真的是工程化的设计吗

2.8 这样做真的是工程化的设计吗 笔者提出的六框设计模型,与经典的工程组件分解图并不完全相同.因此,有人会问,这样做真的能像第1章所说的那样,实现工程化的设计吗?这个问题不能简单地用是或否来回答.在建筑学和机械工程学之中,宏观设计图与组件设计图的绘制方式是相同的,都需要确定一些形状及表面,而且所有的组件都有其尺寸及重量.此外,从顶层设计到底层设计之间的层数,是没有限制的,换句话说,可以把组件分成子组件,再把子组件分成更小的子组件,这种划分可以多次执行.然而,对IT软件开发所做的设计,却不是这样

《需求设计:构建用户想要和需要的产品》—— 导读

https://yqfile.alicdn.com/6ec696e3acab5ead903c7f9a25ac9ef090aeb814.png" > 前 言Designing the Requirements: Building Applications that the User Wants and Needs在对IT应用程序开发思考了大约15年之后,我终于写出了这本书.20世纪90年代后期,我开始做IT架构,当时写了一本名叫<IT Architecture and Middlewa

《需求设计:构建用户想要和需要的产品》——第1章 情境驱动设计入门1.1 对需求进行设计

第1章 情境驱动设计入门 本书讲的是如何设计IT应用程序.笔者写这本书,是想建议大家采用与原来不同的办法去做设计,尤其是想进行下列三项变革: 要使人意识到自己并不是在收集IT应用程序的需求,而是在设计它们.对应用程序所做的设计工作,正是建立在这样一种认知之上. 要把程序的设计做得像工程学一样,特别是要在实现之前先对设计进行分析,并寻找其中的缺陷. 要确保当前所开发的应用程序能够与现有的或同时开发的其他应用程序协同运作,以创建出一套连贯的IT架构. 本书要谈论如何思考应用程序的设计,以及如何对设计

《需求设计:构建用户想要和需要的产品》——1.2 什么是设计

1.2 什么是设计 设计是个很常见的说法,没有几个人会深挖它的含义,但如果仔细想一想IT应用程序的设计与一般的设计的区别,你就会发现,IT应用程序其实是很特殊的.这种特殊性促使我们思考一个问题:应用程序的设计真有这么特殊吗?或者说,我们是不是将它看得太过特殊,以致忽视了一些最为基本的共性? 首先,我们来定义设计这个词.设计,是对想要构建的事物或系统所做的概念化处理.设计(design)既是名词,又是动词.刚才定义的是名词,现在我们给出动词的定义:(作为动词的)设计,就是指创建设计方案. 笔者故意

《需求设计:构建用户想要和需要的产品》——3.2 逆向设计

3.2 逆向设计 总的来说,笔者不太喜欢敏捷方法,但是这种方法也是有好处的.在个别情况下,这种方法可以奏效. 例如,笔者有一次需要编写一款做业务评审的应用程序,该程序对报表提出了要求,其中某些报表很容易就能从用户需求之中确定出来,但还有一些报表则无法这样确定.特别是该应用程序需要对业务方面遇到的限制进行记录,也就是把阻碍员工达成其目标的那些外部因素记录下来.项目的主要利益相关者要求这款应用程序能够提供某种分析功能,以便从描述这些限制的全部文字之中,找到一些共同的主题,他对我说,他知道一位朋友的朋

《需求设计:构建用户想要和需要的产品》——2.2 情境设计

2.2 情境设计 情境设计需要解释IT开发所面对的业务需求.情境设计之中的元素是任务.用户组.数据表及任务之间的消息.本章用4个小节分别讲述这4种元素,然后再用3个小节来讲解任务之间的依赖关系.元素之间的综合以及对情境设计所做的分析.2.2.1 任务笔者在前面说过,业务需要分割成多项任务.那么,什么是任务?如果你在公司逛一圈,并且想象一下:当办公室里的人用IT应用程序收发信息时,有红色光环从头顶冒出来,那你就会发现,这些光环每次出现的时间很短.它们就好比任务.大多数任务的持续时间都很短,一般是几

《需求设计:构建用户想要和需要的产品》——第3章 复用现有的方法及做法 3.1 敏捷

第3章 复用现有的方法及做法 笔者在前言中说过,BDUF与敏捷设计是有些冲突的.那么情境驱动设计是不是BDUF设计的一个变种呢?或者说,它是不是也具备一点敏捷开发的气息呢?本章的一项目标,就是要摆正情境驱动设计与其他现有设计方法之间的相对位置.笔者并不打算详细描述敏捷方法及BDUF方法(假如要详细描述它们,那还得再写几本书),但是会讨论这些方法背后的概念.此外,本章还有一项目标,就是要解释现有的这些方法之中,有哪些地方可以吸收到情境驱动设计里面,但愿咱们都能找到很多个可供借鉴之处.笔者知道,看这