ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

软件概要设计说明书写作指南:架构、接口与数据流要点

软件概要设计说明书写作指南:架构、接口与数据流要点 简介这是一份软件工程领域典型的《软件概要设计说明书》文档面向计算机相关专业学生、课程设计团队及初入行的软件开发者可作为编写概要设计文档的模板与参考。压缩包内共1个doc文件大小约350KB内容结构完整包含引言、范围、软件系统结构设计、功能需求追溯、数据设计及系统维护设计等核心章节并给出了学生、教师、管理员三类角色的模块划分与数据表定义示例。文档从需求分析出发逐步过渡到体系结构设计和数据存储方案能帮助读者理解概要设计在软件开发流程中的承上启下作用尤其适合正在完成课程设计或项目文档编写的人群对照学习。目前该资源已有116人浏览学习是快速掌握软件概要设计文档写作思路的实用资料。1. 软件概要设计说明书这份文档卡住了多少项目的脖子我见过太多团队把《软件概要设计说明书(1).doc》当成“评审凑页数的附件”从旧项目复制一份全局替换项目名改个日期就提交。评审会上主审一句“这版和上一版差异在哪”满屋子沉默。概要设计说明书不是给流程走的过场它是需求到代码之间的承重墙——墙没砌正后期详细设计、编码、测试全是返工。这份文档回答的从来不是“代码怎么写”而是“系统怎么拆、模块之间怎么协作、关键数据往哪流”。适合三类人读接手新项目得亲手写概设的研发、被评审逼着补文档的项目经理、想用文档降低人员流动损失的技术负责人。把这份文档写明白你的项目至少能少一半“设计时没人说话、开发时天天吵架”的破事。2. 动笔前先把边界盘清楚概设文档的输入、输出和分工2.1 概要设计说明书和详细设计说明书的边界到底划在哪很多团队把两份文档写成一个文件章节混在一起原因往往是公司模板里两类章节都有写的人顺着就往下写了。概要设计说明书回答“系统由哪些模块组成、模块之间如何通信、关键数据走向如何”详细设计说明书回答“模块内部的类怎么设计、函数签名是什么、SQL 怎么写”。两者的读者完全不同概要设计给架构评审组和项目经理看详细设计给同模块的开发看。维度概要设计说明书详细设计说明书输入资料需求规格说明书、业务流程图概要设计说明书核心问题系统怎么拆、模块怎么协作模块内部怎么实现读者对象架构评审、项目经理、测试负责人模块开发、模块测试评审时机编码开始前编码过程中或随代码评审典型越界标志出现函数签名、SQL 语句、字段级 DDL不适用判断有没有越界有个笨办法你写的每一段拿去问一个没看过需求文档的开发他能不查资料照着开始编码那这一段已经属于详细设计了。概要设计里的描述应当让人“知道模块在哪、负责什么、和谁说话”但不透露“模块内部怎么说话”。2.2 动笔前先提取需求里的六类约束写概设最忌讳一上来就画架构图。架构图画得漂亮但需求里的硬约束一个没接住评审会上照样被问倒。我写概设前会先做一次“需求约束提取”把需求规格说明书里所有带“必须、应、须、不得”的句子摘出来逐条归类确认每条后续都有设计去承接。约束类别提取来源影响概设的哪个部分功能清单需求文档的功能列表模块划分每个功能项至少落在一个模块性能指标响应时间、TPS、并发数架构选型、是否引入缓存或异步削峰接口约束与外部系统的对接要求外部接口设计、报文格式定义部署环境客户指定的系统/中间件/数据库技术栈选型、运行设计安全要求等保要求、加密传输、权限分级安全设计、模块隔离方式数据规模存量数据量、日均增长量存储设计、分库分表判断依据提取完的表格放在概设文档的“总体设计”前面作为设计约束一节。它最大的价值不是记录而是让评审者一眼看出“需求里的每一项都有设计响应”。曾见过一份订单系统的概设需求里写着“单日峰值订单量十万”文档里却完全没提存储和削峰策略——这种文档不可能过评审。2.3 概设的三大核心交付物架构、接口、数据流概设文档可以章节很多但真正承担设计含量的是三样东西系统架构模块划分、接口清单模块间关系、关键数据流业务数据走向。架构回答“系统由什么组成”接口回答“组成之间怎么配合”数据流回答“一笔业务从进到出经过哪些节点”。三者一一对应架构图里每一条连线在接口清单里应当有一条记录关键业务场景里每一次模块跳转在数据流描述里应当有明确起点和终点。写文档的过程中我会反复对着这三样查漏发现接口清单里有记录但在架构图找不到连线或者架构图有连线但接口清单里没有记录说明设计还没闭合不能往下走。3. 拆解文档结构每个章节写什么、写到多细才算数3.1 一份概设文档的标准骨架和篇幅分配常见的概设文档结构可以复用但内容粒度必须按本项目的规模重新定。以下骨架是从软件文档编制规范里沉淀下来的常见章节安排我一般会按这个框架填内容并根据系统复杂度调整重点。1 引言 1.1 编写目的 1.2 项目背景 1.3 术语与缩略语 1.4 参考资料 2 总体设计 2.1 需求约束 2.2 系统架构 2.3 模块划分与职责 2.4 关键设计决策 3 接口设计 3.1 用户界面接口 3.2 外部系统接口 3.3 内部模块接口 4 数据结构设计 4.1 逻辑数据结构 4.2 数据存储设计概念级 4.3 数据迁移与初始化 5 运行设计 5.1 运行环境 5.2 启动与初始化 5.3 恢复与重启 6 出错处理设计 6.1 错误码设计 6.2 降级与重试策略 6.3 日志与告警 7 性能与安全设计 7.1 性能预算 7.2 安全设计这个骨架里最容易写跑偏的是第 2 章和第 4 章。第 2 章“总体设计”容易写成产品介绍整段描述业务背景没有任何模块划分第 4 章“数据结构设计”容易直接写成建表脚本把字段名、类型、索引都列出来。控制篇幅的经验是引言控制在 2-3 页总体设计 6-10 页接口设计 5-8 页数据结构 3-5 页其余章节每章 2-3 页。总体设计花多少篇幅取决于架构复杂度而不是项目规模——一个只有三个模块的小系统总体设计写十页反而是注水。3.2 总体设计架构图和模块职责表是主角总体设计这一章包含两层内容一是画出系统的架构图二是用模块职责表把每个模块说清楚。模块职责表每个模块至少写清四件事模块名称、模块职责、依赖哪些模块、对外提供哪些接口。模块职责要用一句话能说完的粒度比如“订单服务负责订单生命周期管理”而不是“处理订单创建、取消、修改、查询、导出、打印等各种操作”。粒度对照关系我常用下面这张表来约束自己文档章节写到这个粒度算合格再往下写就属于详细设计总体设计模块名称、职责、依赖关系类名、方法名、数据结构字段数据结构设计实体、关系、关键属性建表 SQL、索引定义、分表路由接口设计接口名、输入输出、调用场景报文逐字段校验规则、错误码明细关键设计决策是评审最喜欢追问的章节。我一般会把这次架构选型里有争议的 3-5 个决策写在这里每个决策写清楚“备选方案是什么、为什么选当前方案、放弃了什么”。比如消息队列选型写清楚为什么用 RocketMQ 而不用 Kafka 和 RabbitMQ比单纯列一个选型结论可靠得多。3.3 接口设计三种接口和三种描述粒度接口设计章节要区分三类接口用户界面接口、外部系统接口、内部模块接口。用户界面接口写清楚页面和服务的对应关系外部系统接口写清楚对接方、通信协议、报文格式内部模块接口写清楚服务间调用关系。很多概设文档只写了外部接口把内部接口留到详细设计阶段补这是本末倒置——模块划分完模块之间的调用关系不明确开发阶段必然会出现“A 等 B 的接口、B 等 A 的接口”的情况。内部模块接口的描述粒度我一般用一张接口清单表格来收敛字段内容接口编号IF-001接口名称扣减库存调用方订单服务提供方库存服务输入参数库存编号、扣减数量、幂等键输出结果成功、失败原因码触发方式同步 RPC这张表格的价值在于把每个人脑子里的口头约定变成白纸黑字。写接口清单时有个技巧先从架构图出发把每条连线摘出来每条连线落一条接口记录确保没有漏网之鱼。接口清单写完后找每个模块的开发负责人对一遍确认接口名称、输入输出双方理解一致再进入后续设计。3.4 数据结构设计与运行设计控制在概念层数据结构设计这一章最常翻车因为做惯了详细设计的人一写到数据就手痒忍不住把字段、索引、分表策略全写出来。概要设计说明书里的数据结构设计写的是逻辑结构不是物理实现。我一般写四类内容核心实体清单实体间关系每个实体上承载哪些关键操作数据量的初步估算。具体字段定义留给详细设计。运行设计章节写运行环境、启动初始化流程、异常恢复和重启策略。这块经常被忽略但它决定系统上线后的运维成本。比如一个 Java 服务启动时要不要做预热、数据库连接池初始化多少连接、异常退出后是自动拉起还是人工介入这些都应该在概设阶段定下来。出错处理设计则要定义错误码的编码规则和降级重试策略比如“业务错误码以模块号为前缀”“下游扣减接口超时后查询重试而非直接重放”。4. 从零落笔写作顺序、模块拆分判断和三遍自查4.1 先画架构图模块切分靠需求靠数据流不靠办公室政治写文档的顺序和读文档的顺序往往是反的。读的人先看引言但写的人不应从引言开始。我写概设文档的顺序固定是先画架构图再列接口清单再写关键数据流然后回头补引言和术语最后写运行设计和出错设计。原因是架构图是整份文档的锚点架构图不定后面写什么都可能是白写。画架构图时先不要想技术栈从需求的功能清单出发按业务域划分模块。一个订单系统初版可以分成用户、商品、订单、库存、支付五个模块再根据依赖关系画出连线。架构图不必画得太细画到每个模块是一个带名字的方框、模块间是带方向的箭头即可。表现层 客户端 / 管理后台 / 开放接口 业务服务层 用户中心、订单中心、库存中心、支付网关 基础层 MySQL、Redis、消息队列、对象存储这个分层示意图说明的是模块间的依赖方向表现层向下调用业务服务层业务服务层向下依赖基础层。同一层的模块之间如果需要调用要在接口清单里单独说明避免出现“同一层互相乱调、分层失去意义”的情况。架构图完成后拿给它给没参与讨论的同事看如果对方能照着图把模块职责复述清楚这张图就算及格。4.2 模块拆分用三个问题验证高内聚低耦合高内聚低耦合是模块划分的通用原则但真正落地要靠具体问题来检验。我拆分完模块后会拿三个问题逐个模块过一遍改一个模块的业务逻辑其他模块是否需要跟着改一个模块能否单独进行单元测试如果把这个模块替换成第三方实现接口边界是否足够清晰。三个问题都回答“是”的情况下模块划分基本成立。模块粒度的控制也有经验值一个系统的一级模块控制在 5-9 个过多说明划分过细过少说明职责混杂。每个模块职责用一句话说不清的先不要急着拆重新审视这个模块是否承担了多个业务域。文档写作中最容易出现的反例是“公共工具模块”什么都往里塞——日志工具、文件解析、日期处理、加密解密全扔在一起这样的模块高内聚是假的它只有位置上的内聚没有职责上的内聚。4.3 接口清单导出和关键数据流描述接口清单的导出方法前面已经提过从架构图的连线出发把每条连线变成一条接口记录。更稳的做法是先导出再核对——把所有模块摆在一起逐个模块列出“我要调用谁、谁要调用我”两份记录合并跟架构图逐条对比。对比时经常发现三类问题架构图有连线但接口清单漏了接口清单有记录但架构图没有对应连线两个模块都想当调用方没人愿意当提供方。前两类是记录问题第三类是设计职责问题必须在概设阶段拍板不然编码阶段就是一场持久战。关键数据流描述推荐用固定格式写每个场景四条信息就能讲清楚【数据流名称】订单创建主链路 【起点】用户在前端提交订单 【模块1】订单中心接收请求校验参数并写入订单主表 【模块2】订单中心调用库存中心扣减库存同步 RPC 【模块3】扣减成功后订单中心发送 MQ 消息触发超时未支付关单 【终点】订单状态置为“待支付”前端轮询订单状态这个模板写数据流有几个好处每条数据流都有明确起点和终点每个参与模块的职责一览无余接口清单里的记录能和数据流一一对应。写数据流时要注意区分同步和异步——同步调用要写清楚超时时间异步消息要写清楚投递方式和消费失败的处理这直接牵涉到出错处理设计的重试策略。4.4 写完后的三遍自查一致性、覆盖率、粒度文档初稿写完后不要马上提交评审按三个维度自查一遍。第一遍查一致性架构图、模块职责表、接口清单、数据流描述四处对同一个模块的称呼是否统一有没有出现“订单服务”和“订单中心”混用的情况。第二遍查覆盖率把需求文档里的功能清单拿出来逐一打勾确认每个功能项都至少能在概设文档中找到对应模块承接查完发现功能无归属要么补设计要么回需求方确认遗漏。第三遍查粒度逐页翻文档发现出现类名、方法签名、SQL 语句、字段级定义的内容全部删除或移到详细设计文档。粒度检查最容易手软因为是自己写的内容舍不得删但带病上会的代价更高——评审会上被当面指出越界比自查时删掉难受得多。5. 概设文档的五个经典翻车现场从评审被问到文档返工5.1 翻车一文档名是“设计说明”内容却在写代码教学现象评审会上有开发举手说“这个接口的实现方案我有点不同意见”主审翻到对应章节发现文档里已经写好了伪代码连异常处理分支都列出来了。整份文档变成一份“带注释的代码大纲”模块划分反而没写清楚。原因写文档的人怕被说“设计不落地”所以把实现细节堆进去充深度结果丢了设计本质。解决把详细设计内容全部剥离只保留模块边界和接口契约。跟写文档的人明确一条线详细设计阶段有充足时间写实现细节概设阶段的核心任务是让所有人对“系统长什么样”达成一致而不是让某个人展示“我打算怎么写代码”。5.2 翻车二架构图画得漂亮正文却是另一套系统现象架构图上是“订单中心、库存中心、支付中心”正文模块描述里却是“订单模块、库存模块、支付模块”评审追问“中心和模块是什么关系”写文档的人答不上来。原因架构图是网上找的参考图改的正文是复制旧项目的两部分的模板来源不同没有人做一致性核对。解决架构图、模块职责表、接口清单三处使用同一份模块名词表写完交人工审一遍。这种翻车看起来低级但在跨团队项目里出现频率极高因为每个人对同一个模块的称呼习惯不同某个模块被几个人喊出三四个名字我一般会在术语表里固定每个模块的标准名称并标注“不得使用其他别名”。5.3 翻车三需求模板没删干净旧项目痕迹满篇都是现象文档里出现“本系统面向 XX 老客户群体”上一版项目的业务术语分布在各个章节甚至有一整段描述的需求在需求文档里根本不存在。原因从旧文档复制后只做了全局替换没有逐段读一遍。全局替换只能处理完全匹配的词替换不掉的句子和段落就残留下来。解决写完后从头到尾通读一遍重点留意“本项目、该系统、客户要求、领导指示”这类描述性语句。更稳的做法是让一个不参与本项目的同事帮忙读一遍只问一个问题“这份文档有没有哪部分看起来不符合这个项目的背景”外人更容易看出残留。5.4 翻车四接口清单和开发实现的代码两张皮现象概设评审通过了开发到一半发现接口清单里定义的接口和实际代码里的接口对不上有的接口名变了有的参数多了两个有人按旧清单写调用方有人按新代码提供方两边联调时炸了。原因概设文档完成后没有建立变更管理机制。接口清单一旦评审通过应作为基线后续任何变更都要同步更新文档而不是只在代码里改。解决把接口清单表格纳入代码评审的检查项代码评审时对照清单逐条核对发现不一致当场改文档或改代码二选一不能既改代码又不留痕。接口清单的变更历史单独维护至少记录变更日期、变更人、变更内容避免出现“谁知道这个接口为什么跟概设不一样”的悬案。5.5 翻车五评审专家一问“模块为什么这样拆”答不上来现象评审会进行到一半主审指着架构图问“订单和支付为什么拆成两个模块而不是合成一个交易模块”写文档的人支支吾吾说“当时觉得分开比较清楚”然后就没有然后了。原因模块划分凭直觉没有形成设计决策记录。直觉不一定错但拿不出理由的设计经不起评审。解决对于每个值得讨论的模块划分决策在“关键设计决策”章节里写清楚背景和取舍。比如“订单与支付分离是为了让支付失败不影响订单主流程同时允许未来接入多个支付渠道而不改造订单核心逻辑”。写决策理由不需要长篇大论三五句话说清楚备选方案和选择原因即可但这一段坚决不能省。6. 写完怎么验证重绘测试和十问自检概设文档写完最有效的验证方法不是自己再读一遍而是找一个没参与设计讨论的开发给他文档让他完成三件事照着文档画一份架构图列出全部模块清单列出模块间的接口清单。然后拿他画的东西和你的原始设计逐条核对。这个动作我叫它重绘测试——如果对方画出来的架构图和你的不一致说明文档的表述有歧义如果对方列不出接口清单说明接口章节有缺失如果对方画的和你的完全一致这份文档基本具备指导后续开发的资格。自检时可以对照这张表逐项过检查项要回答的问题合格标准功能覆盖需求里的每个功能项是否有模块承接功能项都能在文档里找到对应模块接口完整架构图里的每条连线是否都有接口记录无线头、无幽灵接口粒度控制是否出现类名、方法签名、SQL 语句未越界到详细设计一致性多处描述间模块名称是否统一同一模块只有一种叫法非功能设计性能、安全、可靠性是否可验证有具体指标而非口号可执行性拿到文档的开发能否做概要级估算工作量估算误差在百分之二十以内我自己带项目时养成了一个习惯概要设计说明书评审前至少做一次重绘测试而且把这个测试当成评审的必要环节而不是可选项。早期写概设也走过从网上下模板改标题就交差的弯路后来在评审会上被问住才明白文档的水准不会超过主笔人对系统理解的深度模板能给你章节框架给不了你对这个系统的思考。现在我会要求写文档的人先读两遍需求文档先把架构图画给自己看一遍讲得清楚再落笔。概设文档不是写给评审看的装饰品它是项目里所有人对系统达成共识的唯一载体花在这份文档上的时间都会在编码和联调阶段省回来。希望帮到你。本文还有配套的精品资源点击获取
返回列表