2013年已经过去了, 各位在过去的一年里有着什么样的收获, 对新年有什么样的规划? 希望大家在新年里, 有更多的机会成长, 积累到更多的经验, 更上一层楼. 总结2013, 发现去年从事了一定的架构工作, 虽然显得粗浅, 但是也有了一套方法. 来吧, 总结, 分享.
今年主要在公司负责了一个客户端CAD工具产品的开发和实现, 从无到有, 走过了一个完整的里程. 虽然软件的规模不大, 但效果不错, 后来在自己的一些开发项目中, 也时常使用, 感觉有收获. 学习对象是 温昱 的⟪一线架构师实践指南⟫ 一书. 读完此书后又读了 温昱 的⟪软件架构设计⟫, 发现内容差不多, 这次把自己消化的东西总结在这里:
1) 架构方法 分为三阶段 和贯穿始终的一考虑. 其为: 前架构->概念架构->详细架构, 考虑是考虑非功能需求.
2) 前架构关键是建立二维需求观, 是需求结构化的过程. 分析约束影响, 确定关键质量, 确定关键功能. 具体的工具有ADMEMS矩阵.
3) 概念架构关键在于发现关键或核心功能的职责, 用一句话讲清楚要解决的问题, 厘清高层组件的职责和交互.具体的工具有鲁棒图(Robustness diagram).
4) 细化架构关键在于用多视图的方法细化和设计架构, 到这个阶段, 应该完成软件的规格. 多个视图包括 逻辑/数据/开发/物理/控制 视图, 视需要进行分析研究.
5) 在每个阶段, 都考虑和重视非功能需求(性能, 可重用性, 可持续使用性, 安全性.
每个阶段的目的, 可以用下图来表示: (PA - pre architect/ CA - concept architect/RA - refined architect)
图1 架构阶段
架构开始: 有明确的业务需求, 有典型的行为需求, 有全面的用户需求就可以开始了. 无需等待产品设计人员的spec, 相反, 有架构的预案可以帮助产品设计修正spec.
讲到这里, 用范例来开始. 先说明一下典型的行为需求:
图2. CAD软件外观
软件的框架分三个部分.左下部分的DXF, 表示Autodesk 草图数据的各个层(Z方向), X, Y平面可在右边的视图中查看或编辑. 左上部分Template, 表示Z方向各层的电路设计, X, Y平面可以在右边的视图中查看或编辑, 对范例产品的分析和介绍点到为止, 不会特别细的深入讲.
到现在, 架构已经开始了, 前架构的关键是全面理解需求, 把握需求的特点, 驱动架构设计.以往常见的下一步做法是, 保留一个Check list, 上面有分拆的需求清单, 对着这个清单, 逐点分析->讨论->评审->补充新要点->确保每个要点被覆盖这样一个循环. 这样的方法存在以下问题:
(1) 比较难于确定关键的质量属性, 容易遗漏关键的质量属性.
(2) 各个要点(质量属性)往往互相约束, 外延扩展考虑总是不够.
简而言之, 需求不是一个List, 是二维数组, 需要结构化.需求有三层次: 业务需求(组织要达到的目标, 是客户上司高层或组织要达到的需求)/客户需求(客户在日常使用中达到的要求) 开发者需求(对客户透明, 但对开发者来说必须实现的需求). 需求分三种类:功能需求, 质量需求, 约束需求. 那么可以表达为需求结构化的ADMEMS(Architecture Design Method has been Extended to Method System) 矩阵:
功能 | 质量 | 约束 | |
---|---|---|---|
业务需求 | 业务功能集 | 快, 好, 省, 达成目标 | 技术,法规约束 技术趋势 竞争和竞争对手 遗留系统集成 分批实施 |
客户需求 | 用户运行时需求 | 运行期质量 | 用户特点 用户水平 多国语言 |
开发者需求 | 软件行为需求 | 开发期质量 | 开发团队技术水平 开发团队磨合程度 开发团队分布情况 开发团队业务水平 保密要求 产品规划 维护&安装 |
对于例子, 用已知的信息去填写这张需求表:
功能 | 质量 | 约束 | |
业务需求 | 1) Template的Z方向层堆叠设置. 2) 允许拷贝图元到Template预设好的各个图层里. 3) 根据算法组装各个层的各个图元为电路设计. ... | 1) 堆叠设置的GUI尽量简洁, 自动化. 2 )堆叠设置完毕后,可以让用户直接在视图上编辑修改,减少对话框/报表交互. 3) 拷贝图元体验操作流畅, 性能好. 4) 组装算法性能好, 错误信息完备友好. ... | 1)在Windows和Linux上同时构建和发布. 2)考虑与现有产品的集成和派生. 3)发布时间. 4) 输出的目标文件格式. ... |
客户需求 | 1) 根据层的打开和关闭查看Dxf图元. 2) 编辑Dxf的某个图元. 3) 复制选中的图元. 4) 单位制设置. 5) 画多段线 6) 插入文字标注 ... | 1) 编辑须支持一定程度的Undo/Redo. 2) 编辑支持拖放点的自动粘合. 3) 查看时有便利的缩放/导航工具. 4) 选择图元点选/框选便利,最好不需要选择模式等多余操作. 5) 编辑时的拖拉操作响应快, 可用性好,支持Overlay预览. ... | 1) 电路设计大小基本在一个数值范围内, 可考虑固定单位. 2) 层数过多,同屏显示数量过多会影响编辑的帧数. ... |
开发者需求 | 1) 根据闭合的多段线和弧生成多边形. 2) 持续集成 ... | 1) 开发时容易扩展支持不同种类的Template 2) 如果用户需要输入位置,长度, 要做测距工具 3) 可测试, Log模块 ... | 1) 开发者资源少 ... |
不确定的需求或质量因素可以用红色标出, 再进行分析和讨论.可以看出, 这张表的作用:
1) 层次化结构化需求, 列出的点可以反复验证, 后续展开设计和讨论.
2) 可以看出关键的列是"质量"列, 对于这个产品, 个人认为关键质量是"编辑"功能的可用性, 设置必须简洁, 编辑必须流畅,符合用户使用cad软件的习惯.
3) 这张表能厘清一些不在计划内的工作任务, 就是"必做需求", 估算工时的时候要注意了. 比如说测距工具, 比如undo/redo, 重点在编辑的话, 不支持undo/redo那结果就是没法用.
有了这张二维需求表, 一些关键的质量因素渐渐显现, 众多的点也可以铺开进行设计和讨论, 下一步就可以进入架构的概念架构阶段. 且听下回分解:)