第五章系统设计 系统设计是把需求转化为软件系统的最重要的环节。系统设计的优劣在根本上决定 了软件系统的质量。就象“一切帝国主义都是纸老虎”那样可以断定“差的系统设计必 定产生差的软件系统。”所以我们要努力保证系统设计“根正苗红”,把一切左倾、右倾 的设计思潮消灭在萌芽状态。 Windows NT的一位系统设计师拥有8辆法拉利跑车,让Microsoft公司的一些程序 员十分眼红。但你只能羡慕而不能愤恨,因为并不是每个程序员都有本事成为复杂软件 系统的设计师。系统设计要比纯粹的编程困难得多。即便你清楚客户的需求,却未必知 道应该设计什么样的软件系统一一既能挣最多的钱又能让客户满意。“天下西湖三十六, 最美是杭州”,千年前苏东坡大学士对西湖精采绝伦的系统设计,使杭州荣升为“天堂”, 让后人只剩下赞叹和破坏的份了。 本章讲述系统设计的四方面内容:体系结构设计、模块设计、数据结构与算法设计 用户界面设计。如果将软件系统比喻为人体,那么: (1)体系结构就如同人的骨架。如果某个家伙的骨架是猴子,那么无论怎样喂养和美容, 这家伙始终都是猴子,不会成为人。 (2)模块就如同人的器官,具有特定的功能。人体中最出色的模块设计之一是手,手只 有几种动作,却能做无限多的事情。人体中最糟糕的模块设计之一是嘴巴,嘴巴将最有 价值但毫无相干的几种功能如吃饭、说话、亲吻混为一体,使之无法并行处理,真乃人 类之不幸。 (3)数据结构与算法就如同人的血脉和神经,它让器官具有生命并能发挥功能。数据结 构与算法分布在体系结构和模块中,它将协调系统的各个功能。人的耳朵和嘴巴虽然是 相对独立的器官,但如果耳朵失聪了,嘴巴就只能发出“啊”“鸣”的声音,等于丧失了 说话的功能(所以聋子天生就是哑巴),可人们却又能用手势代替说话。人体的数据结构 与算法设计真是十分神奇并且十分可笑。 (4)用户界面就如同人的外表,最容易让人一见钟情或一见恶心。象人类追求心灵美和 外表美那样,软件系统也追求(内在的)功能强大和(外表的)界面友好。但随着生活 节奏的加快,人们已少有兴趣去品味深藏不露的内在美。如果把U系统比作是健壮的 汉子和妇人,那么Windows系统就象妩媚的小白脸和狐狸精。想不到Windows系统竟 然能兴风作浪,占去大半市场。有鉴于此,我们应该鼓励女士多买化妆品(男士付钱) 以获得更好的界面。 在进行系统设计时,我们要深情地关注软件的质量因素,如正确性与精确性、性能 与效率、易用性、可理解性与简法性、可复用性与可扩充性等等。即使把系统设计做好 了,也并不意味着就能产生好的软件系统。在程序设计、测试、维护等环节还要做大量 的工作,无论哪个环节出了差错,都会把好事搞砸了。据说上帝把所有的女士都设计成 天使,可是天使们在下凡时有些双脚先着地,有些脸先着地。上帝的这一疏忽让很多女 孩伤透了心。我们在开发软件时,一定要吸取这个教训
1 第五章 系 统 设 计 系统设计是把需求转化为软件系统的最重要的环节。系统设计的优劣在根本上决定 了软件系统的质量。就象“一切帝国主义都是纸老虎”那样可以断定“差的系统设计必 定产生差的软件系统。”所以我们要努力保证系统设计“根正苗红”,把一切左倾、右倾 的设计思潮消灭在萌芽状态。 Windows NT 的一位系统设计师拥有 8 辆法拉利跑车,让 Microsoft 公司的一些程序 员十分眼红。但你只能羡慕而不能愤恨,因为并不是每个程序员都有本事成为复杂软件 系统的设计师。系统设计要比纯粹的编程困难得多。即便你清楚客户的需求,却未必知 道应该设计什么样的软件系统——既能挣最多的钱又能让客户满意。“天下西湖三十六, 最美是杭州”,千年前苏东坡大学士对西湖精采绝伦的系统设计,使杭州荣升为“天堂”, 让后人只剩下赞叹和破坏的份了。 本章讲述系统设计的四方面内容:体系结构设计、模块设计、数据结构与算法设计、 用户界面设计。如果将软件系统比喻为人体,那么: (1)体系结构就如同人的骨架。如果某个家伙的骨架是猴子,那么无论怎样喂养和美容, 这家伙始终都是猴子,不会成为人。 (2)模块就如同人的器官,具有特定的功能。人体中最出色的模块设计之一是手,手只 有几种动作,却能做无限多的事情。人体中最糟糕的模块设计之一是嘴巴,嘴巴将最有 价值但毫无相干的几种功能如吃饭、说话、亲吻混为一体,使之无法并行处理,真乃人 类之不幸。 (3)数据结构与算法就如同人的血脉和神经,它让器官具有生命并能发挥功能。数据结 构与算法分布在体系结构和模块中,它将协调系统的各个功能。人的耳朵和嘴巴虽然是 相对独立的器官,但如果耳朵失聪了,嘴巴就只能发出“啊”“呜”的声音,等于丧失了 说话的功能(所以聋子天生就是哑巴),可人们却又能用手势代替说话。人体的数据结构 与算法设计真是十分神奇并且十分可笑。 (4)用户界面就如同人的外表,最容易让人一见钟情或一见恶心。象人类追求心灵美和 外表美那样,软件系统也追求(内在的)功能强大和(外表的)界面友好。但随着生活 节奏的加快,人们已少有兴趣去品味深藏不露的内在美。如果把 Unix 系统比作是健壮的 汉子和妇人,那么 Windows 系统就象妩媚的小白脸和狐狸精。想不到 Windows 系统竟 然能兴风作浪,占去大半市场。有鉴于此,我们应该鼓励女士多买化妆品(男士付钱) 以获得更好的界面。 在进行系统设计时,我们要深情地关注软件的质量因素,如正确性与精确性、性能 与效率、易用性、可理解性与简法性、可复用性与可扩充性等等。即使把系统设计做好 了,也并不意味着就能产生好的软件系统。在程序设计、测试、维护等环节还要做大量 的工作,无论哪个环节出了差错,都会把好事搞砸了。据说上帝把所有的女士都设计成 天使,可是天使们在下凡时有些双脚先着地,有些脸先着地。上帝的这一疏忽让很多女 孩伤透了心。我们在开发软件时,一定要吸取这个教训
5.1体系结构设计 杨叔子院子曾这样指点其弟子: 文学中有科学,音乐中有数学,漫画中有现代数学的拓扑学。漫画家可以“几笔 就把一个人画出来,不管怎么美化或丑化,就是活像。为什么?因为那“几笔”不是别 的,而是拓扑学中的特征不变量,这是事物最本质的东西! 体系结构是软件系统中最本质的东西: (1)体系结构是对复杂事物的一种抽象。良好的体系结构是普遍适用的,它可以高效地 处理多种多样的个体需求。一提起“房子”,我们的脑中马上就会出现房子的印象(而不 是地洞的印象)。“房子”是人们对住宿或办公环境的一种抽象。不论是办公楼还是民房, 同一类建筑物(甚至不同类的建筑物)之间都具有非常相似的体系结构和构造方式。如 果13亿中国人民每个人都要用特别的方式构造奇异的房子,那么960万平方公里的土地 将会变得千疮百孔,终日不得安宁。 (2)体系结构在一定的时间内保持稳定。只有在稳定的环境下,人们才能干点事情,社 会才能发展。科学告诉我们,字宙间万物无时无刻不在运动、飞行。由于我们的生活环 境在地球上保持相对稳定,以致于我们可以无忧无虑地吃饭和睡觉,压根就意识不到自 己是活生生的导弹。软件开发最怕的就是需求变化,但“需求会发生变化”是个无法逃 避的现实。人们希望在需求发生变化时,最好只对软件做些皮皮毛毛的修改,可千万别 改动软件的体系结构。就如人们对住宿的需求也会变动,你可以经常改变房间的装璜和 良好的体系结构意味若普适、高效和稳定。本节将论述两种非常通用的软件体系结 构:层次结构和客户机V服务器(Client//Server)结构 5.11层次结构 层次结构表达了这么一种常识:有些事情比较复杂,我们没法一口气干完,就把事 情分为好几层,一层一层地去做。高层的工作总是建立在低层的工作之上。层次关系主 要有两种:上下级关系和顺序相邻关系。 一、上下级关系的层次结构 我们从小学一直读到博士研究生毕业,要读20多年,可以分为五个层次。而范进的 知识结构只有两层:“私塾”和“秀才”,但读了五十多年,如图5.1所示。 般地处于 较高层次的学生应该懂得所有低层次的知识,而处于低层次学生无法懂得所有高层次的 知识。图5.1的层次结构存在上下级关系,如同在军队中,上级可以命令下级,而下级 不能命令上级。如果把图5.1的层次结构当成是一个软件系统的结构,那么上层子系统 可以使用下层子系统的功能,而下层子系统不能够使用上层子系统的功能
2 5.1 体系结构设计 杨叔子院子曾这样指点其弟子: 文学中有科学,音乐中有数学,漫画中有现代数学的拓扑学。漫画家可以“几笔” 就把一个人画出来,不管怎么美化或丑化,就是活像。为什么?因为那“几笔”不是别 的,而是拓扑学中的特征不变量,这是事物最本质的东西。 体系结构是软件系统中最本质的东西: (1)体系结构是对复杂事物的一种抽象。良好的体系结构是普遍适用的,它可以高效地 处理多种多样的个体需求。一提起“房子”,我们的脑中马上就会出现房子的印象(而不 是地洞的印象)。“房子”是人们对住宿或办公环境的一种抽象。不论是办公楼还是民房, 同一类建筑物(甚至不同类的建筑物)之间都具有非常相似的体系结构和构造方式。如 果 13 亿中国人民每个人都要用特别的方式构造奇异的房子,那么 960 万平方公里的土地 将会变得千疮百孔,终日不得安宁。 (2)体系结构在一定的时间内保持稳定。只有在稳定的环境下,人们才能干点事情,社 会才能发展。科学告诉我们,宇宙间万物无时无刻不在运动、飞行。由于我们的生活环 境在地球上保持相对稳定,以致于我们可以无忧无虑地吃饭和睡觉,压根就意识不到自 己是活生生的导弹。软件开发最怕的就是需求变化,但“需求会发生变化”是个无法逃 避的现实。人们希望在需求发生变化时,最好只对软件做些皮皮毛毛的修改,可千万别 改动软件的体系结构。就如人们对住宿的需求也会变动,你可以经常改变房间的装璜和 摆设,但不会在每次变动时都要去折墙、拆柱、挖地基。如果当需求发生变化时,程序 员不得不去修改软件的体系结构,那么这个软件的系统设计是失败的。 良好的体系结构意味着普适、高效和稳定。本节将论述两种非常通用的软件体系结 构:层次结构和客户机/服务器(Client/Server)结构。 5.1.1 层次结构 层次结构表达了这么一种常识:有些事情比较复杂,我们没法一口气干完,就把事 情分为好几层,一层一层地去做。高层的工作总是建立在低层的工作之上。层次关系主 要有两种:上下级关系和顺序相邻关系。 一、上下级关系的层次结构 我们从小学一直读到博士研究生毕业,要读 20 多年,可以分为五个层次。而范进的 知识结构只有两层:“私塾”和“秀才”,但读了五十多年,如图 5.1 所示。一般地处于 较高层次的学生应该懂得所有低层次的知识,而处于低层次学生无法懂得所有高层次的 知识。图 5.1 的层次结构存在上下级关系,如同在军队中,上级可以命令下级,而下级 不能命令上级。如果把图 5.1 的层次结构当成是一个软件系统的结构,那么上层子系统 可以使用下层子系统的功能,而下层子系统不能够使用上层子系统的功能
二、顺序相邻关系的层次结构 顺序相邻关系的层次结构表明通讯只能在相邻两层之间发生,信息只能被一层一层 地顺序传递。这种层次结构的经典之作是计算机网络的OS1参考模型,如图5.2所示。 为了减少设计的复杂性,大多数网络都按层(Layer)或级(Level)的方式组织。每 层的目的都是向它的上一层提供一定的服务,而把如何实现这一服务的细节对上一层加 以屏蔽。一台机器上的第n层与另一台机器上的第n层进行对话。通话的规则就是第n 层的协议。数据不是从一台机器的第n层直接传送到另一台机器的第n层。发送方把数 据和控制信息逐层向下传递。最低层是物理介质,它进行实际的通讯。接收方则将数据 和培制信息溪层向上传递。 每一对相邻层之间都有接口。接口定义了下层提供的原语操作和服务。当网络设计 者在决定一个网络应包含多少层,每一层应当做什么的时候,其中很重要的工作是在相 邻层之间定义清晰的接口。接口可以使得同一层能轻易地用某一种实现(Implementation) 来替换另一种完全不同的实现(如用卫星信道来代替所有的电话线),只要新的实现能向 上层提供同一组服务就可以了。【Tanenbaum1998 博士(34年) 硕士(23年) 考上“举人”时已五十多岁了 举人 本科(4年) 复习报考“举人”用了几十年 中学(6年) 秀才 私 小学(5-6年) 图5.1(a)从小学读到博士存在的五个学习阶段 图5.1(b)范进的知识结构 应用层 拉用层
3 二、顺序相邻关系的层次结构 顺序相邻关系的层次结构表明通讯只能在相邻两层之间发生,信息只能被一层一层 地顺序传递。这种层次结构的经典之作是计算机网络的 OSI 参考模型,如图 5.2 所示。 为了减少设计的复杂性,大多数网络都按层(Layer)或级(Level)的方式组织。每一 层的目的都是向它的上一层提供一定的服务,而把如何实现这一服务的细节对上一层加 以屏蔽。一台机器上的第 n 层与另一台机器上的第 n 层进行对话。通话的规则就是第 n 层的协议。数据不是从一台机器的第 n 层直接传送到另一台机器的第 n 层。发送方把数 据和控制信息逐层向下传递。最低层是物理介质,它进行实际的通讯。接收方则将数据 和控制信息逐层向上传递。 每一对相邻层之间都有接口。接口定义了下层提供的原语操作和服务。当网络设计 者在决定一个网络应包含多少层,每一层应当做什么的时候,其中很重要的工作是在相 邻层之间定义清晰的接口。接口可以使得同一层能轻易地用某一种实现(Implementation) 来替换另一种完全不同的实现(如用卫星信道来代替所有的电话线),只要新的实现能向 上层提供同一组服务就可以了。[Tanenbaum 1998] 考上“举人”时已五十多岁了 复习报考“举人”用了几十年 图 5.1(a)从小学读到博士存在的五个学习阶段 图 5.1(b)范进的知识结构 数据链路层 网络层 传输层 会话层 表示层 应用层 主 机 A 主 机 B 小 学 (5-6 年) 中 学(6 年) 本 科(4 年) 硕 士(2-3 年) 博 士(3-4 年) 数据链路层 网络层 传输层 会话层 表示层 应用层 私 塾 秀 才 举人
物理层 物理层 图52计算机网络的OS1参考模型 三、其它的层次结构 目前在大型商业应用软件系统中还流行一种包含中间件(Middleware)的层次结构, 如图5.3所示Jacobson1997]。中间件支持与平台无关的分布式计算,可以用DCOM和 CORBA对象来实现 Application Systems Business-specific Components Middleware System Software 图5.3包含中间件的层次结构 5.1.2客户机/服务器结构 让我们先回顾一下早期的电话系统。贝尔(Alexander Graham Bell)于l876年申请 了电话专利。那时期的电话必须一对一对地卖,用户自己在两个电话之间拉一根线。如 果一个电话用户想和其它几个电话用户通话,他必须拉根单独的线到每个人的房子里。 于是在很短的时间内,城市里到处都是穿过房屋和树木的混乱的电话线。很明显,企图 把所有的电话完全互联(如图5.4(a)所示)是行不通的。 贝尔电话公司在1878年开办了第一个交换局。公司为每个客户架设一条线。打电话 时,客户摇动电话的曲柄使电话公司办公室的铃响起来,操作员听到铃声以后根据要求 将呼叫方和被呼叫方用跳线手工连接起来。这种集中交换式的模型如图54(b)所示。 很快地,贝尔系统的交换局就出现在各地。人们又要求能打城市间的长途电话,就出现 了二级交换局,以后进一步发展为多个二级交换局。【Tancnbaum1998)
4 图 5.2 计算机网络的 OSI 参考模型 三、其它的层次结构 目前在大型商业应用软件系统中还流行一种包含中间件(Middleware)的层次结构, 如图 5.3 所示[Jacobson 1997]。中间件支持与平台无关的分布式计算,可以用 DCOM 和 CORBA 对象来实现。 图 5.3 包含中间件的层次结构 5.1.2 客户机/服务器结构 让我们先回顾一下早期的电话系统。贝尔(Alexander Graham Bell)于 1876 年申请 了电话专利。那时期的电话必须一对一对地卖,用户自己在两个电话之间拉一根线。如 果一个电话用户想和其它几个电话用户通话,他必须拉 n 根单独的线到每个人的房子里。 于是在很短的时间内,城市里到处都是穿过房屋和树木的混乱的电话线。很明显,企图 把所有的电话完全互联(如图 5.4(a)所示)是行不通的。 贝尔电话公司在 1878 年开办了第一个交换局。公司为每个客户架设一条线。打电话 时,客户摇动电话的曲柄使电话公司办公室的铃响起来,操作员听到铃声以后根据要求 将呼叫方和被呼叫方用跳线手工连接起来。这种集中交换式的模型如图 5.4(b)所示。 很快地,贝尔系统的交换局就出现在各地。人们又要求能打城市间的长途电话,就出现 了二级交换局,以后进一步发展为多个二级交换局。[Tanenbaum 1998] 物理层 System Software Middleware Business-specific Components Application Systems 交换局 物理层
5.4(a)完全互联的电话系统 5.4(b)集中交换式的电话系统 如果将图5.4(b)中的电话看成是客户程序,将中心的交换局看成是服务程序,那 么图5.4(b)就是典型的客户机/假务器结构。注意这里客户机和服务器都是指软件而不 是指硬件(一台计算机可以放多个客户机和服务器软件)。 客户机V服务器结构存在两个显然的优点: (1)以集中的方式高效率地管理通讯。前面讲电话系统的故事就是要说明这一点。 (2)可以共享资源。比如在信息管理系统中,服务器将信息集中起来,任何客户机都可 以通过访问服务器而获得所需的信息。 客户机和服务器之间的通讯以“请求一一响应”的方式进行。客户机先向服务器发 起“请求”(Request),服务器再响应(Response)这个请求,如图5.5所示。 请求 客户机 服务器 响应 图5.5 Client和Server之间的通讯以“请求一一响应”的方式进行 采用“请求一一响应”这种通讯方式的基本动机是为了解决“聚集”(Rendezvous) 问题。为了理解这一个问题,设想一个人试图在分离的机器上启动两个程序并让它们进 行通讯。还需记住,计算机的运行速度要比人的操作速度高出许多数量级。在他启动第 一个程序后,该程序开始执行并向对等程序发送消息。在几个微秒内,它便发现对等程 序还不存在,于是就发出一条错误消息,然后退出。此后,他启动了第二个程序。不幸 的是,当第二个程序开始执行时,它也找不到第一个程序(早已退出)。即使这两个程序 连续地重新试者通讯,但由于它们的执行速度那么高,以致于它们在同一瞬间联系上的 概率非常低。在客户机/服务器结构中,服务器在启动后必须(无限期地)等待客户机的 “请求”,因此就形成了“请求一 一响应”的通讯方式。 在Internet/Intranet领域,目前“浏览器一Web服务器一数据库服务器”结构是 种非常流行的客户机U服务器结构,如图5.6所示。这种结构最大的优点是:客户机统 采用浏览器,这不仅让用户使用方便,而且使得客户机端不存在维护的问题。当然,软 件开发布和维护的工作不是自动消失了,而是转移到了Wb服务器端。在Web服务器 端,程序员要用脚本语言编写响应页面。例如用Microsoft的ASP语言查询数据库服务 器,将结果保存在Wb页面中,再由浏览器显示出来。 客户机 eb服务器 HTP请求 数据库 查询 浏览器 ASP Engine 服务器 HTP响应
5 5.4(a)完全互联的电话系统 5.4(b)集中交换式的电话系统 如果将图 5.4(b)中的电话看成是客户程序,将中心的交换局看成是服务程序,那 么图 5.4(b)就是典型的客户机/服务器结构。注意这里客户机和服务器都是指软件而不 是指硬件(一台计算机可以放多个客户机和服务器软件)。 客户机/服务器结构存在两个显然的优点: (1)以集中的方式高效率地管理通讯。前面讲电话系统的故事就是要说明这一点。 (2)可以共享资源。比如在信息管理系统中,服务器将信息集中起来,任何客户机都可 以通过访问服务器而获得所需的信息。 客户机和服务器之间的通讯以“请求——响应”的方式进行。客户机先向服务器发 起“请求”(Request),服务器再响应(Response)这个请求,如图 5.5 所示。 请求 响应 图 5.5 Client 和 Server 之间的通讯以“请求——响应”的方式进行 采用“请求——响应”这种通讯方式的基本动机是为了解决“聚集”(Rendezvous) 问题。为了理解这一个问题,设想一个人试图在分离的机器上启动两个程序并让它们进 行通讯。还需记住,计算机的运行速度要比人的操作速度高出许多数量级。在他启动第 一个程序后,该程序开始执行并向对等程序发送消息。在几个微秒内,它便发现对等程 序还不存在,于是就发出一条错误消息,然后退出。此后,他启动了第二个程序。不幸 的是,当第二个程序开始执行时,它也找不到第一个程序(早已退出)。即使这两个程序 连续地重新试着通讯,但由于它们的执行速度那么高,以致于它们在同一瞬间联系上的 概率非常低。在客户机/服务器结构中,服务器在启动后必须(无限期地)等待客户机的 “请求”,因此就形成了“请求——响应”的通讯方式。 在 Internet/Intranet 领域,目前“浏览器—Web 服务器—数据库服务器” 结构是一 种非常流行的客户机/服务器结构,如图 5.6 所示。这种结构最大的优点是:客户机统一 采用浏览器,这不仅让用户使用方便,而且使得客户机端不存在维护的问题。当然,软 件开发布和维护的工作不是自动消失了,而是转移到了 Web 服务器端。在 Web 服务器 端,程序员要用脚本语言编写响应页面。例如用 Microsoft 的 ASP 语言查询数据库服务 器,将结果保存在 Web 页面中,再由浏览器显示出来。 HTTP 请求 查询 HTTP 响应 客户机 服务器 客户机 浏览器 Web 服务器 ASP Engine 数据库 服务器