当前位置:网站首页>如何写一份高可读性的软件工程设计文档
如何写一份高可读性的软件工程设计文档
2022-07-30 14:27:00 【InfoQ】
1、设计文档是什么?
- 在可以低成本迭代的时候,尽早发现设计中的问题 - 设计左移,代价左移,快速失败(fail fast)
- 在团队中对设计达成一致 - 设计的本质是取舍(tradeoff)。几乎所有的架构设计决策都会被挑战,原因之一是:读者并非对所有的取舍都知晓,且与作者达成共识。在设计文档中清晰地列出取舍,有利于帮助读者了解(并认可)你的决策思路,减少被挑战的可能。
- 将资深工程师的经验和思想扩展到整个团队,帮助团队成长 - 作为作者,可以供资浅工程师学习 - 作为读者,可以审核资浅工程师的设计并提供建议
- 形成团队软件设计的一致方式,沉淀团队/公司技术积累 - 企业的生命力在于知识价值的积累
2、什么时候需要设计文档?
- 软件的规模是否较大,值得付出额外的编写评审设计文档的时间来降低失败的风险?
- 高级工程师无法确保 CR 每一份代码,让他们参与设计评审是否回报更高?
- 软件设计决策是模糊的,甚至有争议。有必要围绕设计文档在组织上达成共识?
- 是否需要通过设计文档强调项目交叉问题,如隐私性(Privacy)、安全性(Security)、日志记录?
- 是否有必要写一份文档来对有关遗留系统的设计问题提供高层次的分析?
3、设计文档要怎么写?
3.1 撰写设计文档的三个前提
写作风格的三要素
- 清晰
- 简洁
- 优雅
设计文档的五个要点
1. 任何架构问题都是取舍。
2. “为什么” 比 “怎么做” 更重要。
3. 考虑时间维度
- 可维护性与可扩展性
- 考虑实现路径
- 考虑未来计划
4. 避免过度设计
【文章福利】另外小编还整理了一些C/C++后台开发教学视频,相关面试题,后台学习路线图免费分享,需要的可以自行添加:
Q群:720209036 点击加入~
群文件共享
小编强力推荐C++后台开发免费学习地址:
C/C++Linux服务器开发高级架构师/C++后台开发架构师

5. 总结
3.2 设计文档的核心原则
前提一:设计文档的读写比最高
前提二:设计文档不是文学写作
前提三:设计文档为谁而写
- 更加详细的背景介绍
- 更少使用内部术语或缩写
- 更多阐述设计思路、取舍,更少解释具体实现细节
- Opening:开场,背景介绍
- Challenge:挑战,所要解决的问题
- Action:行动,执行的实验/设计/...
- Resolution:结果
- 文档着重强调的内容应该是并非显而易见的事项:
- 没有绝对的正确答案:没有完美的代码,也没有完美的设计文档。- 不同的读者对可读性的理解有细微的不同。可读性是主观的。- 在实践中,我们追求让更多(而非所有)读者更顺畅地阅读设计文档。- 不要为完美主义付出过重代码。平衡可读性与时间成本。
- 我们的目标是有意识地提高文档写作/代码水平。高质量的写作是一种习惯。提高水平的方法有:- 多读他人优秀的设计文档。- 评审(Design doc review/Code review)有益。- 设计文档评审往往主要关注系统设计合理性,但是可读性方面的评审也有必要。
- 多写作、多修改、多重写。
3.3 设计文档的最佳实践
遣词
- 正确使用专业术语。- 合理地使用常见术语可以降低沟通成本。- 不要过多使用过于小众或自创的术语。如果有必要,需要在文中 - 必要时提供对照的英文术语以方便理解。- 避免无上下文的缩略词。
- 省略程度副词
- 不管作者意图为何, “非常重要” 和 “重要” 在读者看来大同小异。
- 使用数据 - 与其说明“该系统的性能提升明显”,不如“该系统的性能提升了 42%”更为可信,也更方便读者做出自己的判断。
- 忌佶屈聱牙
- 例如上文,应改为“不要使用过于生僻的词汇,不要过度使用书面语”
- 千万不要写文言文
造句
- 使用短句,不要使用多从句的复杂句式。- 读者不是来考 GRE 的。- 写文档也不是为了炫耀自己可以驾驭长难句。
- 简单表达,去掉无意义的修饰,去掉试图缓和语气的从句。- 反例:“我们可以看到, TencentDB 在一定程度上可以满足我们对事务支持的需求。” - 修改后:“TencentDB 支持事务”。- 反例:“MR 提交信息作为读者查阅修改历史时第一时间看到的信息,其重要性不言而喻。” - 修改后:“读者查阅修改历史时会首先关注 MR 提交信息。” -本段讨论另一个问题,即……
- 语气要冷静。避免过于口语化。- 不要加顺口溜 - 不要使用语气词 - 不要使用叹号!如果希望强调,使用粗体或者斜体!也可以使用分级标题!
- 准确。描述客观事实,避免加入主观情绪。
段落
使用列表
结构
- 使用模板:使用模板可以作为思考辅助,同时也提供了相对较完整且规范的结构。文末提供了一份设计文档模板以供参考。
- 使用图表:一图胜千言。合理地使用图表可以极大地降低用户的理解成本。
- 使用标题:标题要分级、要简短清晰
篇幅
排版
附录:设计文档模板
目标
- 可扩展性
- 多版本
- 全球分布
- 同步复制
- 高可用性
- 高可靠性 如果可能,解释是基于哪些方面的考虑将之作为非目标。如:
- 可维护性:本服务只是过渡方案,预计寿命三个月,待 XX 上线运行后即可下线
背景
- 需求动机以及可能的例子。如,“(tRPC) 微服务模式正在公司内变得流行,但是缺少一个通用的、封装了常用内部工具及服务接口的微服务框架”。- 这是放置需求文档的链接的好地方。
- 此前的版本以及它们的问题。如,“(tRPC) Taf 是之前的应用框架, 有以下特点,…………, 但是有以下局限性及历史遗留问题”。
- 其它已有方案, 如公司内其它方案或开源方案, "tRPC v.s. gRPC v.s. Arvo"
- 相关的项目,如 "tRPC 框架中可能会对接的其它 PCG 系统"
总体设计



详细设计
- API 的所有细节
- 存储系统的 Data Schema
- 具体代码或伪代码
- 该系统各模块代码的存放位置、各模块代码的布局
- 该系统使用的编译器版本
- 开发规范
各子模块的设计
API 接口
存储
- 该系统对数据/存储有哪些要求?- 该系统会如何使用数据?- 数据是什么类型的?- 数据规模有多大?- 读写比是多少?读写频率有多高?- 对可扩展性是否有要求?- 对原子性要求是什么?- 对一致性要求是什么?是否需要支持事务?- 对可用性要求是什么?- 对性能的要求是什么?- …………
- 基于上面的事实,数据库应该如何选型?- 选用关系型数据库还是非关系型数据库?是否有合适的中间件可以使用?- 如何分片?是否需要分库分表?是否需要副本?- 是否需要异地容灾?- 是否需要冷热分离?- …………
其他方案
交叉关注点
基础设施
可扩展性
安全 & 隐私
- 系统如何授权、鉴权和审计(Authorization, Authentication and Auditing, AAA)?
- 是否需要破窗(break-glass)机制?
- 有哪些已知漏洞和潜在的不安全依赖关系?
- 是否应该与专业安全团队讨论安全性设计评审?
- ……
数据完整性
延迟
冗余 & 可靠性
稳定性
外部依赖
实现计划
未来计划
参考资料

边栏推荐
- v-model组件化编程应用
- canal抓取数据
- 3 years of software testing experience, the interview requires a monthly salary of 22K, obviously he has memorized a lot of interview questions...
- localhost与127.0.0.1
- 智能合约安全——私有数据访问
- A simple change for problem, knapsack problem sets of shell
- Hello,World
- [深入研究4G/5G/6G专题-46]: 5G Link Adaption链路自适应-2-常见缩略语
- Ts是什么?
- 关于华为应用市场审核App无法启动的问题
猜你喜欢

吃透Chisel语言.28.Chisel进阶之有限状态机(二)——Mealy状态机及与Moore状态机的对比

ToDesk版本更新,引入RTC传输技术,是否早以替代向日葵远程控制?

时序数据库在船舶风险管理领域的应用

MongoDB starts an error Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)

惊艳!京东T8纯手码的Redis核心原理手册,基础与源码齐下

算力顶天地,存力纳乾坤:国家超级计算济南中心的一体两面

国内数字藏品的乱象与未来

这个编辑器居然号称快如闪电!

MongoDB启动报错 Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)

Interface automation framework, lm-easytest beta version released, use it quickly~
随机推荐
新时代背景下智慧城市的建设与5G技术有何关联
关于String的一些思考
手把手教你写让人眼前一亮的软件测试简历,收不到面试邀请算我输
What is the relationship between the construction of smart cities and 5G technology in the new era
Meta首份元宇宙白皮书9大看点,瞄准80万亿美元市场
获取Google Advertising ID作为唯一识别码
【回归预测-CNN预测】基于卷积神经网络CNN实现数据回归预测附matlab代码
canal抓取数据
一文读懂网络效应对Web3的重要意义
那些破釜沉舟入局Web3.0的互联网精英都怎么样了?
ECCV 2022 | 通往数据高效的Transformer目标检测器
什么是缺陷分析?一篇文章带你了解,测试工程师必备技能
跳槽前,把自己弄成卷王
JSON common annotations
5. DOM
Digital signal processing course lab report (what foundation is needed for digital signal processing)
redis6.0 源码学习(五)ziplist
MongoDB启动报错 Process: 29784 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)
Flink optimization
Still saying software testing doesn't have a midlife crisis?9 years of test engineers were eliminated