Day03-系统设计总览
0、开篇:系统设计到底设计了什么?
上一节我们提到了需求工程,它回答了"要做什么",本篇我们聊一聊系统设计,系统设计回答的其实是"怎么把它做出来"。
很多同学一听到"系统设计"四个字,脑子里蹦出的第一个画面就是 UML 类图、数据库表结构。没错,这些确实属于系统设计,但它们也只是冰山一角。
那么系统都包括哪些呢?
1、系统设计的九大类别
完整的系统设计方案,一般是由以下九个部分构成的:
设计类别 | 核心内容 | 它在解决什么问题? |
网络设计 | 选择网络结构,安排设备分布、布线部署,划定节点权限 | 系统跑在什么样的"物理底座"上? |
代码设计 | 包括面向对象设计和结构化设计,实现代码的唯一化、规范化、系统化 | 代码怎么写才规范、可维护? |
输入设计 | 确保输入数据的完整性、正确性、一致性 | 怎么堵住不合规数据源头? |
输出设计 | 确保输出数据的完整性、正确性、一致性 | 系统产出的结果怎么呈现? |
处理流程设计 | 确定各系统模块的内部结构——局部数据组织、控制流、加工过程与细节 | 数据进来之后经过怎样的流水线才变成结果? |
数据存储设计 | 选择存储方式、介质、组织方式,估算容量 | 数据存在哪里、怎么存? |
数据库设计 | 概念设计 → 逻辑设计 → 物理设计 | 结构化数据怎么建模和落地? |
用户界面设计 | 优化交互体验,黄金三原则:置于用户控制之下、减轻记忆负担、保持界面一致 | 用户怎么和系统对话? |
安全性和可靠性设计 | 确保系统安全有效运行,对运行环境和数据处理进行控制 | 系统会不会崩?会不会被攻击? |
本篇我们聚焦其中最关键、也是选择题考查最多的三块:处理流程设计、输入输出设计、用户界面设计。其余部分将在后续篇幅展开。
好,既然要深入,我们先问第一个问题。
2:什么是"流程"?——六个要素一个都不能少
处理流程设计是所有系统设计的骨架。没有流程,代码只是一堆散落的砖块,不知道往哪搬呐。
那到底什么是"流程"?
流程是一组将输入转化为输出的相互关联或相互作用的活动。
一句简单的话,但拆开来看,它包含了6 个基本要素:分别是输入资源、活动、活动的相互作用(结构)、输出结果、用户和价值。
用一个常见的例子——电商平台的"退货退款"流程——来把这六个要素具象化:
要素名称 | 要素含义 | 退货退款场景中的体现 |
输入资源 | 触发流程的初始材料 | 用户提交的退货申请(含订单号、退货商品信息、原因、凭证图片) |
活动 | 流程中的具体操作步骤 | 退货申请审核 → 商品状态校验 → 库存更新 → 退款金额计算 → 执行原路退款 → 通知财务/物流 |
活动的相互作用 | 流程之间的依赖与协作 | 与"订单状态管理""库存系统""财务对账""用户信用评分"等流程的交互 |
输出结果 | 流程产生的最终交付物 | 退款到账通知(App/短信)、退货进度状态更新、退货完成确认邮件 |
用户 | 流程的服务对象 | 已购买商品且符合退货政策(如7天无理由、质量问题)的注册用户 |
价值 | 流程存在的根本意义 | 保障用户售后权益,提升购物信任度,完成逆向物流闭环 |
你会发现:六个要素中,真正"看得见"的只有"活动"那几个步骤。但决定一个流程好不好的,恰恰是那些"看不见"的要素——输入对不对、用户是谁、最终创造什么价值。
这就引出了下一个问题:有了流程的定义,用什么工具把它画出来、让所有人都能看懂?
3:流程设计工具三剑客 —— 图形、表格、语言
处理流程设计需要精确表达过程规则。
业界积累了三类工具:图形工具、表格工具、语言工具。
三类工具各有适用场景,挨个看一下。
3.1 第一剑:图形工具 — 让流程"可视化"
图形工具一共五种,可以按表达能力的演进顺序来理解:
① 程序流程图(PFD) — 最原始的"通行语言"
PFD 用图框表示各种操作,独立于任何程序设计语言,是每个程序员入门的"第一张图"。
优点:直观、易上手。
问题:符号不规范,箭头可以随意乱飞,导致控制流"跳来跳去"——这正是结构化编程要解决的问题。
② N-S图(盒图) — 强制结构化,不许"乱飞"
N-S 图就解决了PFD"随意转移控制"的问题。
它用方框代替传统的流向线,包含五种标准控制结构:顺序型、选择型、WHILE 循环型、UNTIL 循环型、多分支选择型。
核心思想一句话:把箭头锁死,只能按结构化规则流转。
③ IPO图 — 从模块视角看流程
IPO 图描述模块的输入(Input)→ 处理(Process)→ 输出(Output),结构清晰,常用于系统设计文档。
和 N-S 图的区别在于:N-S 图关注的是"这个模块内部的控制逻辑怎样",IPO 图关注的是"这个模块对外的接口长什么样"。
④ 问题分析图(PAD)
PAD 由日立公司提出,支持结构化程序设计,包含五种基本控制结构,执行顺序明确,特别适合嵌套和层次关系的表示。
什么时候选 PAD 而不是 N-S 图?当你的逻辑有很深的嵌套(if 里套 if 里套 while),PAD 的树形展开比 N-S 图的层层缩进更直观。
⑤ 判定树
当业务规则复杂到"if A 且 B 则 X,if A 且 非B 则 Y,if 非A 则 Z"。
判定树用树形结构来表达这种多级条件判断,条件和处理流程一目了然。
3.2 第二剑:表格工具 — 判定表
判定树适合"读",但如果条件之间有多重组合关系——比如 3 个条件各 2 种取值的 2³=8 种组合——判定树的枝叶就会极其茂密。
这种场景下,判定表是更好的选择:用表格形式呈现条件和行动,结构清晰、简明扼要,不会漏掉任何一种条件组合。
3.3 第三剑:语言工具 — 过程设计语言(PDL / 伪代码)
当你需要表达非常精细的处理逻辑——比如一个排序算法的实现细节——图形工具就不够用了。
PDL(伪代码)混合了自然语言的表达力和结构化程序设计语言的语法,灵活且支持逐步求精,是详细设计阶段的主力工具。
3.4 速查表
分类 | 工具名称 | 总结 |
图形工具 | 程序流程图 PFD | 最通用的流程图,但箭头可乱飞 |
图形工具 | N-S 图(盒图) | 强制结构化,消除乱跳 |
图形工具 | IPO 图 | 从 I→P→O 视角看模块 |
图形工具 | 问题分析图 PAD | 适合嵌套和层次关系 |
图形工具 | 判定树 | 树形表达复杂条件判断 |
表格工具 | 判定表 | 多条件多组合不遗漏 |
语言工具 | 过程设计语言 PDL | 伪代码,灵活且可逐步求精 |
讲到这里,我们应该已经掌握了"设计单个流程"的工具箱。但一个真实系统往往有几十上百个流程——谁来管理这些流程之间的协调?
4、当流程变多——工作流管理系统(WFMS)
工作流管理系统(WFMS)就是为了解决"流程多、流程乱"而生的。
它的定义:
WFMS 通过软件定义、创建工作流并管理其执行。它运行在一个或多个工作流引擎上,这些引擎解释过程定义、与工作流参与者相互作用,并根据需要调用其他 IT 工具或应用。
三个核心功能:
工作流建模→ 定义活动和规则,把现实业务过程映射为可执行的模型。
工作流执行→ 创建和运行实际的工作流实例。
业务过程管理与分析→ 监控、管理、优化执行中的业务流程。
举个栗子:如果"流程设计工具"是画图纸的,那么 WFMS 就是拿着图纸去建造和运营整条生产线的。
5、数据怎么进、怎么出?输入输出设计
流程设计解决了"数据怎么被加工",现在要解决的是:数据从哪进来、加工完送到哪去。
5.1 输入设计:控制"数据入口"
输入是系统与外部世界交互的第一道防线。输入设计遵循7 大原则:
原则 | 核心关注点 |
确定输入数据的类型和格式 | 文本/数字/图像?整数/浮点/JPEG? |
确定输入数据的来源 | 用户手工输入?传感器采集?外部系统推送? |
设计良好的输入界面 | 布局、控件选择、输入提示、错误提示 |
设计系统输入验证机制 | 验证规则、错误提示、安全性校验 |
设计输入处理流程 | 数据清洗、格式转换、去重去噪 |
设计输入存储方案 | 存储方式、存储结构、存储安全 |
设计输入安全机制 | 访问控制、数据加密、防 SQL 注入 |
这 7 条原则构成了一条防线:从"识别输入"到"验证输入"到"处理输入"到"安全存储输入"。
5.2 输出设计:让结果"可读、可用、可靠"
输出设计的逻辑更简洁,共三步:
第一步:确定输出内容(用户要什么?)。
第二步:选择输出设备与介质(显示终端?打印机?PDF?API?)。
第三步:确定输出格式(报表?图形?JSON?)。
同时,输出设计也有7 项原则,可以直接对照输入原则来理解:
原则名称 | 核心要求 |
简洁性原则 | 避免冗余信息与复杂设计,风格简洁明了 |
一致性原则 | 保持设计风格与交互方式一致 |
可用性原则 | 关注用户体验,让系统便捷、易用、可靠 |
可访问性原则 | 考虑不同用户的需求与能力 |
可维护性原则 | 易于系统维护与升级 |
安全性原则 | 重视系统安全性与保密性 |
可扩展性原则 | 灵活适应不同需求的扩展 |
6、人与系统的对话——人机交互设计
有个最直观的问题:用户怎么用这个系统?
人机交互设计的终极目标就三条:
- 切实满足用户需求— 功能有用、内容齐全,对用户有帮助
- 产品易上手使用— 操作、理解、学习难度低
- 降低错误率与学习成本— 让用户轻松掌握系统
设计良好人机交互有十个方法要点:
步骤/要点 | 具体内容 |
1. 了解用户 | 用户群体划分、需求调研、使用场景分析、竞品分析 |
2. 设计交互界面 | 采用简单、自然、统一的操作方式,降低学习与操作成本 |
3. 即时反馈机制 | 用户操作后系统需及时反馈,增强交互感与确定性 |
4. 辅助功能 | 为视、听、肢体障碍用户提供适配功能,保障无障碍使用 |
5. 用户测试 | 通过实际用户使用验证,发现交互设计问题 |
6. 迭代优化 | 基于测试结果持续改进,逐步提升体验 |
7. 多语言支持 | 覆盖不同语言用户,拓展使用范围 |
8. 结合实际场景 | 让交互设计贴合真实使用环境,提升实用性 |
9. 适度动画效果 | 合理动画增强交互趣味性与引导性,不过度冗余 |
10. 引入新理念技术 | 应用创新理念(如极简交互)和新技术(如手势/语音交互) |