mirror of
https://github.com/tradecatlabs/vibe-coding-cn.git
synced 2026-07-28 03:07:56 +00:00
153 lines
6.8 KiB
Markdown
153 lines
6.8 KiB
Markdown
|
|
<a id="concept-system-building"></a>
|
||
|
|
|
||
|
|
# 系统构建方法
|
||
|
|
|
||
|
|
> 自顶向下、自底向上与分而治之的组合使用。
|
||
|
|
|
||
|
|
软件工程中的自顶向下、自底向上和分而治之,是三种经典的问题分析与系统构建方法。
|
||
|
|
|
||
|
|
<a id="concept-system-building-一自顶向下先看整体再拆细节"></a>
|
||
|
|
### 一、自顶向下:先看整体,再拆细节
|
||
|
|
|
||
|
|
**自顶向下**的核心思路是:先明确系统整体要做什么,再逐层拆分成子系统、模块、类、函数,最后落实到具体代码实现。
|
||
|
|
|
||
|
|
比如要开发一个在线购物系统,采用自顶向下的方法时,通常会先问:
|
||
|
|
|
||
|
|
这个系统的总体目标是什么?
|
||
|
|
它需要支持哪些核心业务?
|
||
|
|
整体架构应该如何划分?
|
||
|
|
|
||
|
|
然后再逐步拆解:
|
||
|
|
|
||
|
|
在线购物系统
|
||
|
|
→ 用户模块、商品模块、购物车模块、订单模块、支付模块、物流模块
|
||
|
|
→ 订单模块
|
||
|
|
→ 创建订单、取消订单、查询订单、订单状态流转
|
||
|
|
→ 创建订单函数
|
||
|
|
→ 参数校验、库存检查、价格计算、订单保存、消息通知
|
||
|
|
|
||
|
|
这种方法的优势是**全局结构清晰**。系统从一开始就有比较明确的架构边界,模块之间的关系也更容易统一规划。对于需求比较明确、规模较大的系统,例如银行核心系统、企业 ERP 系统、政务平台、基础设施平台等,自顶向下非常常见。
|
||
|
|
|
||
|
|
它的缺点是,如果一开始对需求理解不准确,高层设计可能会出现偏差,后续细节实现时就会频繁返工。因此,自顶向下适合需求相对清楚、业务边界比较稳定的场景。
|
||
|
|
|
||
|
|
<a id="concept-system-building-二自底向上先做组件再组系统"></a>
|
||
|
|
### 二、自底向上:先做组件,再组系统
|
||
|
|
|
||
|
|
**自底向上**的核心思路是:先从基础能力、底层组件、工具模块开始建设,再逐步组合成更大的功能和完整系统。
|
||
|
|
|
||
|
|
比如还是开发在线购物系统,采用自底向上的方法时,可能会先实现:
|
||
|
|
|
||
|
|
日志组件
|
||
|
|
配置管理组件
|
||
|
|
数据库访问组件
|
||
|
|
缓存组件
|
||
|
|
权限校验组件
|
||
|
|
消息队列封装
|
||
|
|
通用异常处理模块
|
||
|
|
支付 SDK 封装
|
||
|
|
|
||
|
|
当这些基础组件逐渐稳定后,再用它们组合出商品服务、订单服务、支付服务等业务模块,最终形成完整系统。
|
||
|
|
|
||
|
|
这种方法的优势是**复用性强、基础能力扎实**。团队可以不断沉淀通用模块,后续开发新功能时就不需要重复造轮子。对于已有技术平台、组件库、框架体系的团队来说,自底向上很自然。
|
||
|
|
|
||
|
|
它也适合需求还在演化的项目。因为业务目标可能一开始并不完全清楚,但团队可以先建设确定性较高的底层能力,等需求逐渐明确后再组合成业务系统。
|
||
|
|
|
||
|
|
它的风险是,如果只关注底层组件而缺乏整体目标,可能会出现“组件很多,但系统拼不起来”的问题。也就是说,自底向上容易造成局部能力很强,但整体架构不够统一。
|
||
|
|
|
||
|
|
<a id="concept-system-building-三分而治之把复杂问题拆成小问题"></a>
|
||
|
|
### 三、分而治之:把复杂问题拆成小问题
|
||
|
|
|
||
|
|
**分而治之**的核心思想是:面对复杂问题时,不直接一次性解决整体,而是把它拆成若干相对独立、规模更小的问题,分别解决后再组合起来。
|
||
|
|
|
||
|
|
它更像是一种通用的问题处理原则,不只是软件工程中的系统构建方法,也广泛存在于算法设计、项目管理、组织协作中。
|
||
|
|
|
||
|
|
比如开发一个推荐系统,可以把问题拆成:
|
||
|
|
|
||
|
|
数据采集
|
||
|
|
用户画像
|
||
|
|
商品画像
|
||
|
|
召回算法
|
||
|
|
排序算法
|
||
|
|
特征工程
|
||
|
|
模型训练
|
||
|
|
在线推理
|
||
|
|
效果评估
|
||
|
|
|
||
|
|
每个部分都可以由不同团队或不同模块独立推进,最后再集成为完整的推荐系统。
|
||
|
|
|
||
|
|
分而治之的优点是**降低复杂度**。一个大问题往往难以直接理解和实现,但拆成多个小问题后,每个小问题的目标更清晰、测试更容易、维护成本也更低。
|
||
|
|
|
||
|
|
不过,分而治之的关键在于“如何拆”。如果拆分边界不合理,就会导致模块之间耦合严重、接口混乱、集成困难。好的拆分应该尽量做到高内聚、低耦合:每个模块内部职责集中,模块之间通过清晰接口协作。
|
||
|
|
|
||
|
|
<a id="concept-system-building-四三者之间的关系"></a>
|
||
|
|
### 四、三者之间的关系
|
||
|
|
|
||
|
|
这三种方法并不是完全独立的。
|
||
|
|
|
||
|
|
**自顶向下**强调从整体到局部,通常会用到分而治之。因为从系统目标拆到模块、从模块拆到函数,本质上就是在分解问题。
|
||
|
|
|
||
|
|
**自底向上**强调从局部到整体,也可以结合分而治之。先分别解决多个基础能力或局部问题,再逐步组合成更复杂的系统。
|
||
|
|
|
||
|
|
**分而治之**则更像是底层思想,它既可以服务于自顶向下,也可以服务于自底向上。
|
||
|
|
|
||
|
|
可以简单理解为:
|
||
|
|
|
||
|
|
自顶向下回答的是:**从哪里开始设计?**
|
||
|
|
自底向上回答的是:**从哪里开始实现?**
|
||
|
|
分而治之回答的是:**如何降低复杂度?**
|
||
|
|
|
||
|
|
<a id="concept-system-building-五举一个综合例子"></a>
|
||
|
|
### 五、举一个综合例子
|
||
|
|
|
||
|
|
假设要开发一个企业内部审批系统。
|
||
|
|
|
||
|
|
采用自顶向下时,团队会先定义系统整体架构:
|
||
|
|
|
||
|
|
审批系统
|
||
|
|
→ 表单管理
|
||
|
|
→ 流程管理
|
||
|
|
→ 权限管理
|
||
|
|
→ 通知管理
|
||
|
|
→ 审批记录
|
||
|
|
→ 数据报表
|
||
|
|
|
||
|
|
然后继续拆解流程管理:
|
||
|
|
|
||
|
|
流程定义
|
||
|
|
流程发起
|
||
|
|
节点审批
|
||
|
|
流程转交
|
||
|
|
流程撤回
|
||
|
|
流程归档
|
||
|
|
|
||
|
|
采用自底向上时,团队可能会先建设一些基础能力:
|
||
|
|
|
||
|
|
用户身份认证
|
||
|
|
角色权限模型
|
||
|
|
表单渲染引擎
|
||
|
|
消息通知组件
|
||
|
|
流程状态机
|
||
|
|
审计日志组件
|
||
|
|
数据库访问层
|
||
|
|
|
||
|
|
这些组件稳定后,再组合成完整的审批业务。
|
||
|
|
|
||
|
|
而分而治之贯穿整个过程:无论是把审批系统拆成表单、流程、权限、通知,还是把流程引擎拆成状态流转、节点规则、审批人计算、超时处理,都是在通过拆分降低复杂度。
|
||
|
|
|
||
|
|
<a id="concept-system-building-六实际项目中如何选择"></a>
|
||
|
|
### 六、实际项目中如何选择
|
||
|
|
|
||
|
|
如果项目目标清晰、业务边界稳定、系统规模较大,可以优先采用**自顶向下**,先做好架构设计和模块划分。
|
||
|
|
|
||
|
|
如果团队已有大量基础组件,或者项目需求还在逐步演化,可以更多采用**自底向上**,先沉淀稳定的底层能力,再支撑业务扩展。
|
||
|
|
|
||
|
|
如果问题本身很复杂,无论采用哪种方向,都应该使用**分而治之**,把复杂系统拆成更容易理解、开发、测试和维护的部分。
|
||
|
|
|
||
|
|
在真实软件工程中,最常见的做法是:
|
||
|
|
先用**自顶向下**明确系统目标和架构边界;
|
||
|
|
再用**分而治之**拆分模块和任务;
|
||
|
|
同时用**自底向上**建设可复用组件和基础能力;
|
||
|
|
最后通过迭代开发不断调整设计。
|
||
|
|
|
||
|
|
所以,这三种方法不是“选一个、排斥另外两个”,而是从不同角度帮助我们管理复杂度、组织代码和构建系统。
|