05-技术流
技术流:业务流每个步骤的「怎么做」链
业务流回答「做什么」——用户要完成的任务、程序要提供的能力;技术流回答「怎么做」——每个业务步骤在程序里如何实现。这一条线:把「怎么做」从一句笼统的话,展开成一条完整的决策链,并追踪它在五个演化阶段里的形态。
一、定义:做什么 vs 怎么做
同一个业务步骤,有两个视角:
1 | 业务流(做什么):解析参数 → 格式化 → 返回结果 |
- 业务流是用户视角:任务是「保存文件」,用户不关心用
fopen还是open。 - 技术流是实现视角:同一个「保存文件」,实现方式有无数种。
分层之前,二者常常被当成一回事——「保存文件」就是写那几行代码。分层之后,二者彻底分开:业务层写「做什么」,基础设施层写「怎么做」。
所以技术流的本质是:
每个业务步骤背后,都有一条「怎么做」的决策链。
二、技术流的展开:五个环节
「怎么做」不是一步到位的,它层层深入:
1 | 业务步骤(做什么) |
以「保存进度」为例:
1 | 业务步骤:保存进度 |
五个环节不是五个并列的选项,而是同一条链上的递进:先组织步骤(①),再确定每步怎么算(②)、怎么存(③),然后决定用什么现成的(④),最后落到选什么技术(⑤)。
三、技术流的五阶段演化
单函数:技术流 = 代码本身
1 | int main() { |
「怎么做」没有选择——就是那几行代码。技术流与代码重合,尚未独立。
单文件:技术流 = 函数的实现
1 | int parse_arg(const char* s) { // 业务:解析参数 |
怎么做开始有选择:用标准库 atoi 还是手写解析。技术流 = 函数内部怎么实现,但还散在代码里。
多文件:技术流 = 模块内的实现
怎么做有了位置:这个功能放哪个模块?用哪个模块的接口?
1 | 技术流(多文件): |
技术流开始与「模块划分」「接口」交织——怎么做 = 在正确的模块里调用正确的接口。
多层:技术流第一次独立(质变点)
分层后,业务流和技术流第一次成为两条分开的链:
1 | 业务流(业务层):解析参数 → 格式化 → 返回 |
这是技术流独立的质变点:业务层不再关心怎么做,只关心「调用 file_api 保存」;怎么保存(用哪个库、哪个系统调用)是基础设施层的事。修改技术实现(换库、换系统调用),业务层不用动。
注意此时的技术流有一个特征:基础设施层里没有自己写的系统——它装的是其他库的接口或框架,接口直接接口化,框架也被转成接口(原子化封装)。技术流的这一环,本质是「把别人的能力接进来」。
多系统:技术流 = 选型
怎么做从「用什么函数」升级为「用什么系统」:
1 | 技术流(多系统): |
技术流的第五环(技术方案)在此放大为系统选型。选型产生两个后果:
- 引入依赖:选了网络系统,业务系统就依赖它(依赖关系线)。
- 决定封装形态:选来的系统接口化(上层调用接口)还是框架化(入口启动),决定了它怎么被使用(封装与调用线)。
四、技术流与相关线的关系
| 线 | 回答 | 与技术流的关系 |
|---|---|---|
| 业务分析 01~03(做什么链) | 业务流程→功能点→功能流程+算法 | 技术流的上游:先有「做什么」,才谈「怎么做」;其产物(功能流程、算法)正是技术流的前两环 |
| 算法线 | 怎么算 | 技术流的第②环 |
| 数据结构线 | 怎么存 | 技术流的第③环 |
| 接口线 | 用什么形态暴露 | 技术流的第④环:库/接口选择之后,接口以什么形态存在(函数导出 / 类封装) |
| 依赖关系 | 谁依赖谁 | 技术流的第⑤环的后果:选型引入依赖 |
| 封装与调用(网络系统) | 系统怎么被使用 | 技术流选型后的落地:接口化还是框架化 |
关键区分:
1 | 业务分析线 = 产出「做什么」的完整链(流程→功能点→功能流程+算法) |
业务分析线停在「功能流程 + 算法」;技术流从这里继续,补上数据结构、库/接口选择、技术方案三个环节,一直走到「用什么技术」——两条线正好首尾相接。
五、技术流的产物
每个业务步骤的技术流,最终沉淀为:
1 | ① 功能流程图 程序内部执行步骤(与业务分析03的功能流程一致) |
技术流不是一条运行时才会出现的流,而是一条设计期就定下来的决策链——它在写代码之前就要走完;运行时的执行流、功能流,只是这条决策链落地后的影子。
收束:技术流是什么
1 | 业务流:做什么 —— 用户的视角 |
技术流与业务流互为镜像:业务流是「做什么」的主线,技术流是「怎么做」的主线。分层让技术流第一次独立(业务层 vs 基础设施层),多系统让技术流放大为选型——每一次质变,都是「怎么做」被从「做什么」里拆出来的过程,本质是拆解与组织原则在实现维度上的投影。
