设计做到什么程度?

简介: 在TXX的设计Review会议上,WQX问我,我们的设计可以做到什么程度?我说,钱多就设计的详细,钱少就设计的粗略。他说,也许我们可以稳定到某一个程度,不论项目大小,钱多少。我想,大家都体验到了UML为设计带来的许多好处,比如交流便捷,规范开发,还有就是强迫思考,强迫我们考虑“谁是谁”和“谁做什么”。
在TXX的设计Review会议上,WQX问我,我们的设计可以做到什么程度?
我说,钱多就设计的详细,钱少就设计的粗略。
他说,也许我们可以稳定到某一个程度,不论项目大小,钱多少。

我想,大家都体验到了UML为设计带来的许多好处,比如交流便捷,规范开发,还有就是强迫思考,强迫我们考虑“谁是谁”和“谁做什么”。

如何使用UML,Martin Fowler在《UML Distilled Third Edition》中做了很精辟的总结,我理理自己的思路,以飨大家。


在设计精细程度上,一般有三种用法:草图,蓝图和程序。


将UML视为草图,着重于沟通交流,在纸上或者白板上与一群人讨论,并不一定拘泥于UML的格式。我们不会讨论所有要写的程序,着眼点只在系统的部分或者某个层面。我们可以在几个小时的开发工作前,用10分钟交流下设计;或者用1天的时间,整理整理接下来为期两周的迭代。

 


这样的设计可能是非正式的,我们可以把白板上的照下来,把纸上的扫描下来,再加进设计文档。使用草图,也往往意味着我们会讨论一些可能的替代性做法。所以,Martin说草图的本质是“选择性”。


我觉着在YXXXX项目中,用的是这样的方式。我要求大家把接口定义出来,把主要的时序画出来,不论是在纸上还是在Visio上,已经画好还是现场画。我关心的接口有两部分,Java程序接口,主要是业务层接口,需要知道业务层暴露出哪些方法供别人调用;还有前后的数据接口,即DTO,我需要知道业务层的方法需要什么数据,会返回什么数据。我关心开发人员是否理解了调用顺序,以及开发人员的工作分配,即谁做哪个类哪个方法。


将UML视为蓝图,更倾向于“完整性”。我们关注于系统的整体结构,框架层次,必须完成大的设计决策。如系统是由哪些子系统/模块构成的,其间的联系是什么,层次如何分布,怎样限定层与层的通信,关键类的识别和关键方法的分配等等。


这时我们需要借助工具来完成,并遵循一些标准,比如命名方式,注释规则,画图约束等等。这样的设计一般比较正式,也可能是大多数项目所使用的。接下来,可能会继续细化,增加类的契约,方法的契约等等;也可能直接用来开发,更进一步的设计会在写代码前完成。

在TXX项目中,我们便用的是这种方式。我们识别定义了主要的类方法,但并未描述业务规则和异常,并未满足80/20法则(80%的方法和20%的类),对类和方法的描述也不是十分充分。而在实际开发过程中,蓝图更多的起指导作用,约束力比较小。

蓝图与草图的主要区别在于:草图强调信息通讯,而蓝图强调无所不包;草图具有探索性质,而蓝图是定稿。


如果在蓝图的基础上继续设计,那么写代码的工作也就将越“无趣”;甚至,如果工具支持的话,我们可以在UML中完成代码。MDA(模型驱动架构)就是基于这样的思路。将UML视为程序语言,就需要可以把设计人员画的图直接生成为代码,将写的说明性文字生成为注释。

目前这种方式我只是听说过,还从没有见过。


对于持有第一种视角的人来说,UML中最重要的是图;而对于后两种观点,UML最重要的是本质(分析方法、设计方法)。

 

而对于概念(概念是OO的核心)理解来说,也会有两种观点:软件观点(software perspective)和概念观点(conceptual perspective)。

持有软件观点的人的设计,任何UML元素(包、类、关系等等)都可以对应到软件的实体中;而持有概念观点的人,UML元素则对应到业务领域中的概念。

从程序员成长的设计师可能更容易具有软件观点;而概念观点更容易为业务领域专家所有。

回到我们的问题上,需要将设计做到什么程度。程度必然与衡量有关,而衡量就必须有标准。通过项目的积累,我们会逐步完善这个衡量标准。

排除设计观点的差异,忽略成本因素,与设计相关最直接的因素是:时间,作者(设计人员)和读者(开发人员)。

毋庸置疑,时间决定了设计的程度。不同的项目有不同的时间限制,而资源也是有限的,或许我们可以根据不同的项目类型,制定不同的设计标准。

设计人员的能力决定了设计的质量,也许会因经验不足,导致开发阶段风险与成本上升。提高设计能力是我们持久的目标。

不同的开发人员,对设计的要求应该是不同的。如果是成员之间比较熟悉的团队,草图的方式是最便捷和有效的;如果开发人员水平参差不齐,使用蓝图不失为一个好办法;而开发人员仅仅是传说中的“蓝领”,那么我们不得不将设计视为程序。

除此,还有很多重要的因素,如软件开发的生命周期,需求稳定程度等等。

最后的结论是,设计可能无法稳定到一个程度,也许WQX的意思是我们可以稳定到某一种质量。

 

欢迎讨论!

相关文章
|
7月前
|
前端开发 算法 芯片
后道设计
后道设计
41 1
|
数据可视化 数据处理
结构化分析与设计
一、结构化分析与设计 结构化分析与设计(Structured Analysis and Design,简称SAD)是一种软件开发方法论,旨在通过分析和设计来构建高质量的软件系统。 结构化分析与设计的主要特点包括以下几点: 1. 结构化分析:结构化分析是通过对系统需求进行分析,将系统分解为若干个功能模块,并定义它们之间的关系和交互。在结构化分析中,常用的工具和技术包括数据流图(Data Flow Diagram,简称DFD)、数据字典(Data Dictionary)和实体关系图(Entity-Relationship Diagram,简称ERD)等。 2. 结构化设计:结构化设计是在结构化分析
675 2
|
XML 存储 安全
深入理解HttpSecurity的设计
介绍了基于配置文件的使用方式以及实现细节,如下:
104 0
|
7月前
|
存储 SQL 前端开发
分类目录功能模型设计
分类目录功能模型设计
调查表设计
调查表设计
88 0
|
设计模式 架构师 Java
聊聊简单设计
聊聊简单设计
134 0
|
Java Scala
深入理解简单设计
深入理解简单设计
深入理解简单设计
|
算法 BI
贪心策略设计并解决会场安排问题
贪心策略设计并解决会场安排问题
331 3
贪心策略设计并解决会场安排问题
|
安全 NoSQL JavaScript
C/C++为什么要专门设计个do…while?
最初do ... while的出现,更多的是作为循环控制流的一种语法糖。因为不论是while 还是 for循环,都是要先判断是否满足进入循环体的条件的。满足条件之后才能进入循环去执行循环体内的操作。
188 0
C/C++为什么要专门设计个do…while?