如何写出一份优秀的软件设计文档

作为一名软件工程师,我花了很多时间阅读和编写设计文档。在完成了数百篇这些文档之后,我亲眼目睹了优秀设计文档与项目最终成功之间的强烈关联。

本文试图描述什么使设计文档变得更好。

本文分为4个部分:

· 为什么要写一份设计文档

· 要包含在设计文档中的内容

· 怎么写

· 相关过程

为什么要写一个设计文档?
设计文档 - 也称为技术规范 - 描述了您计划如何解决问题。

设计文档是确保正确完成工作的最有用工具。

设计文档的主要目标是通过强迫您思考设计并收集其他人的反馈来提高您的效率。人们通常认为设计文档的目的是教会其他人关于某个系统或稍后作为文档。虽然这些可能是一部分作用,但它们并不是最根本的目的。

作为一般经验法则,如果您正在处理可能需要1个工程师月或更长时间的项目,那么您应该编写设计文档。但不要止步于此 - 许多小型项目也可以从迷你设计文档中受益。

如果您还在阅读,您会相信设计文档的重要性。但是,不同的研发团队,甚至同一团队的工程师,经常以非常不同的方式编写设计文档。让我们来谈谈优秀设计文档的内容,风格和写作流程吧。

设计文档中应该包含哪些内容?
设计文档描述了问题的解决方案。由于每个问题的性质不同,您自然希望以不同的方式构建您的设计文档。

首先,以下是您应该至少考虑在下一个设计文档中包含的部分列表:

标题和参与者
您的设计文档的标题,作者(应该与计划参与此项目的人员列表相同),检查者(我们将在“处理”部分中详细讨论),以及最后更新日期。

概览
高度概括的,公司的每位工程师都应该理解并能够通过阅读概览来决定是否有必要阅读其余的文档。最多3段。

背景
对手头问题的描述,为什么这个项目是必要的,人们需要知道什么来评估这个项目,以及它如何适应技术战略,产品战略或团队的季度目标。

目标和非目标
目标部分应包括:

描述项目的用户驱动影响 - 您的用户可能是另一个工程团队甚至是另一个技术系统
指定如何使用指标衡量成功 - 如果您可以链接到跟踪这些指标的仪表板,则可以获得奖励
非目标同样重要,它描述了您不会修复哪些问题,因此它也和目标在同一页面上。

里程碑
一个可衡量的检查点列表,因此您的PM和您的经理的经理可以浏览它并大致了解项目的不同部分何时完成。如果项目超过1个月,我建议您将项目分解为面向用户的主要里程碑。

使用日历日期,以便考虑无关的延迟,假期,会议等。它应该看起来像这样:

开始日期:2018年6月7日
里程碑1 - 以暗模式运行的新系统MVP:2018年6月28日
里程碑2 - 下掉旧系统:2018年7月4日
结束日期:将功能X,Y,Z添加到新系统:2018年7月14日

如果其中一些里程碑的ETA发生变化,请在此处添加[更新]子部分,以便相关方可以轻松查看最新的情况。

当前解决方案
除了描述当前的实现之外,您还应该通过一个高级示例流来说明用户如何与此系统交互和/或数据如何通过它。

用户故事是构建此框架的绝佳方式。请记住,您的系统可能包含具有不同用例的不同类型的用户。

推荐解决方案
有人称之为技术架构部分。再次,尝试通过用户故事来具体化这一点。可以包含许多子部分和图表。

先提供一张大图,然后填写大量细节,确保即使你出去度假了,团队中的另一位工程师也可以阅读它并按照你的描述实施解决方案。

替代方案
在提出上述解决方案时,您还考虑了什么?替代品的优点和缺点是什么?您是否考虑购买第三方解决方案 - 或使用开源解决方案 - 解决此问题而不是构建自己的问题?

监控和警报
我喜欢包括这一部分,因为人们经常事后才去考虑它们或者干脆忽略它们,当事情出了岔子,他们一筹莫展。

跨团队配合方面
是否会增加外呼和开发团队的负担?
它会花多少钱?
它是否会导致系统延迟?
它是否暴露了安全漏洞?
有什么负面后果和副作用?
支持团队如何与客户沟通?

讨论
任何你不确定的公开问题,你想让读者权衡的有争议的决定,建议未来的工作,等等。

详细的范围和时间表
本节主要是由参与该项目的工程师,他们的技术主管和他们的经理阅读。因此,本节在文档的最后。

从本质上讲,这是您计划执行项目每个部分的方式和时间的细分。有很多内容可以准确地确定范围,因此您可以阅读这篇文章以了解有关范围的更多信息。

我倾向于将设计文档的这一部分视为正在进行的项目任务跟踪器,因此每当我的范围估计发生变化时,我都会更新它。但这更多的是个人偏好。

怎么写?
下面让我们来谈谈写作风格。我保证这与你的高中英语课不同。

写得尽可能简单
不要试着写你读过的学术论文。它们是为了给期刊评论家留下深刻印象。您的文档是为了描述您的解决方案并从您的队友那里获得反馈而编写的。多运用类似这些:

· 简单的话

· 短句

· 项目符号列表和/或编号列表

· 具体的例子,如“用户爱丽丝连接她的银行账户,然后…”

添加大量表格和图示
表格通常可用于比较几个可能的选项,图表通常比文本更容易解读。我已经用Google Drawing创建图表了。

专业提示:请记住在屏幕截图下添加指向图表的可编辑版本的链接,以便以后在事情不可避免地发生变化时轻松更新。

包括数字
问题严重程度通常决定了解决方案。为了帮助审阅者了解实际状况,请包括实际数字,如数据库行数,用户错误数,延迟 - 以及这些数据如何随着使用情况而扩展(请记住您的Big-O表示法?)。

试着变得有趣
规范不是学术论文。此外,人们喜欢阅读有趣的东西,所以这是让读者保持参与的好方法。尽管如此,不要喧宾夺主。

进行测试
在将设计文档发送给其他人进行审核之前,请自己作为审核人员过一遍。您对此设计有什么疑问?然后先发制人地解决它们。

做假期测试
如果您现在无法访问互联网,那么您团队中的某个人是否可以阅读该文档并按照您的意图实施该文档?

设计文档的主要目标不是知识共享,但这是一种评估清晰度的好方法,以便其他人可以实际为您提供有用的反馈。

处理
设计文档可帮助您在浪费大量时间实施错误解决方案或解决错误问题之前获得反馈。获得良好反馈有很多艺术,但这是以后的事。现在,让我们专门讨论如何编写设计文档并获取反馈。

首先,参与项目的每个人都应该参与设计过程。如果技术主管最终推动了很多决定,那也没关系,但是每个人都应该参与讨论并参与设计。因此,本文中的“你”是一个真正的复数“你”,包括项目中的所有人。

其次,设计过程并不意味着你盯着白板写些理论化的想法,随意制作潜在的解决方案原型。这与在编写设计文档之前开始为项目编写生产代码不同,不要那样做。但你绝对应该随意写一些一次性代码来验证想法。

之后,当您开始了解如何进行项目时,请执行以下操作:

1、请您团队中经验丰富的工程师或技术负责人成为您的评审员。理想情况下,这将是一个受到尊重和/或熟悉问题细节的人。

2、进入带白板的会议室。

3、向这位工程师描述你正在解决的问题(这是非常重要的一步,不要跳过它!)。

4、然后解释你想到的实现,并说服他们这是正确的构建。

在开始编写设计文档之前完成所有这些操作可以让您在投入更多时间并接受任何特定解决方案之前尽快获得反馈。通常情况下,即使实施保持不变,您的审核员也可以指出您需要覆盖的极端案例,指出任何潜在的混淆区域,并预测您以后可能遇到的困难。

然后,在您撰写了设计文档的粗略草稿之后,让相同的审阅者再次阅读它,并通过在设计文档的“标题和人物”部分中添加他们的名称作为审阅者来标记它。这为审阅者创造了额外的激励和责任。

在这方面,考虑为设计的特定方面添加专门的审阅者(例如SRE和安全工程师)。

一旦您和审核人员确定了,请随时将设计文档发送给您的团队,以获得额外的反馈和知识共享。我建议将反馈收集过程的时间限制在1周左右,以避免延误。致力于解决人们在该周内留下的所有问题和评论。

最后,如果您的审阅者和其他阅读该文档的工程师之间存在很多争议,我强烈建议您在文档的“讨论”部分中合并所有争议点。然后,与各方召开会议,当面谈论这些分歧。

每当讨论主题长度超过5条评论时,转向当面讨论往往效率更高。请记住,即使每个人都无法达成共识,您仍然有责任进行最后的沟通。

在最近与Shrey Banga谈论此事时,我了解到Quip有一个类似的过程,除了在您的团队中拥有经验丰富的工程师或技术负责人作为审阅者之外,他们还建议让不同团队的工程师审核该文档。我没有尝试过这个,但我当然可以看到这有助于从不同角度的人那里获得反馈,并提高文档的一般可读性。

完成上述所有操作后,即可开始实施!对于额外的布朗尼点,在实施设计时将此设计文档视为活文档。每次您更改原始解决方案或更新范围的内容时,请更新文档。这样你就不必向所有利益相关者反复解释事情,你会感谢我的。

最后,让我们真正了解一下:我们如何评估设计文档的成功?

我的同事Kent Rakip对此有一个很好的答案:如果完成正确的投资回报率,设计文档就会成功。这意味着成功的设计文档实际上可能导致这样的结果:

1、您花了5天时间编写设计文档,这迫使您通过技术架构的不同部分进行思考

2、您可以从审阅者那里获得反馈,即X是建议架构中最具风险的部分

3、您决定首先实施X以降低项目风险

4、3天后,你发现X要么不可能,要么比你原先想要的要困难得多

5、您决定停止处理此项目并优先处理其他工作

在本文开头,我们说设计文档的目标是确保正确的工作完成。在上面的示例中,由于这个设计文档,您可能只花了8天时间而不是浪费几个月才能中止此项目。对我来说似乎是一个非常成功的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件项目开发过程中,应该按软件开发要求撰写十三类文档文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性! 1、可行性分析报告 说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。 2、项目开发计划 为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的预算、所需的硬件及软件资源等。 3、软件需求说明书(软件规格说明书) 对所开发软件的功能、性能、用户界面及运行环境等作出详细的说明。它是在用户与开发人员双方对软件需求取得共同理解并达成协议的条件下编写的,也是实施开发工作的基础。该说明书应给出数据逻辑和数据采集的各项要求,为生成和维护系统数据文件做好准备。 4、概要设计说明书 该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。 5、详细设计说明书 着重描述每一模块是怎样实现的,包括实现算法、逻辑流程等。 6、用户操作手册 本手册详细描述软件的功能、性能和用户界面,使用户对如何使用该软件得到具体的了解,为操作人员提供该软件各种运行情况的有关知识,特别是操作方法的具体细节。 7、测试计划 为做好集成测试和验收测试,需为如何组织测试制订实施计划。计划应包括测试的内容、进度、条件、人员、测试用例的选取原则、测试结果允许的偏差范围等。 8、测试分析报告 测试工作完成以后,应提交测试计划执行情况的说明,对测试结果加以分析,并提出测试的结论意见。 9、开发进度月报 该月报系软件人员按月向管理部门提交的项目进展情况报告,报告应包括进度计划与实际执行情况的比较、阶段成果、遇到的问题和解决的办法以及下个月的打算等。 10、项目开发总结报告 软件项目开发完成以后,应与项目实施计划对照,总结实际执行的情况,如进度、成果、资源利用、成本和投入的人力,此外,还需对开发工作做出评价,总结出经验和教训。 11、软件维护手册 主要包括软件系统说明、程序模块说明、操作环境、支持软件的说明、维护过程的说明,便于软件的维护。 12、软件问题报告 指出软件问题的登记情况,如日期、发现人、状态、问题所属模块等,为软件修改提供准备文档。 13、软件修改报告 软件产品投入运行以后,发现了需对其进行修正、更改等问题,应将存在的问题、修改的考虑以及修改的影响作出详细的描述,提交审批。
"(内部文件,注意保管( " "文档编号 " "版 本 " " " " " " " "XXXXXX项目 " " " " " "系统数据库设计文档 " " " " " "编 写 " "校 对 " "审 核 " "批 准 " " " "中心 " "2017年4月 " 版本信息记录 "日期 "版本 "说明 "作者 "审核 "批准 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 目录 1 引言 3 1.1 编写目的 3 1.2 背景 3 1.3 定义 3 1.4 参考资料 3 2 概述 4 2.1 数据库环境 4 2.2 命名规则 4 2.3 使用它的程序 4 3 物理设计 4 3.1 标识符 4 3.2 物理文件 5 3.3 表空间设计 5 3.3.1 表空间1 5 3.3.2 表空间2 5 4 结构设计 5 4.1 实体关系 5 4.2 实体说明 6 4.3 实体设计 6 4.3.1 数据表1 6 4.3.2 数据表2 7 4.4 序列实体 7 4.4.1 序列1 7 4.4.2 序列2 8 4.5 视图实体 8 4.5.1 视图1 8 4.5.2 视图2 8 4.6 存储过程实体 8 4.6.1 存储过程1 8 4.6.2 存储过程2 8 5 安全设计 8 6 备注 9 引言 编写目的 [说明编写这份系统数据库设计文档的目的,指出预期的读者。] 注:正文字体为宋体小四号,全文统一。 背景 a.[待开发数据库的名称和使用此数据库的软件系统的名称;] b.[列出本项目的任务提出者、开发者、用户。] 定义 [列出本文件中用到的专门术语的定义和外文首字母组词的原词组。] 表1.1 术语定义表 "术语 "缩略表示 "英文全称 "解释说明 " " " " " " " " " " " 参考资料 [列出有关的参考资料。] A. 本项目经核准的计划任务书或合同或相关批文; B. 属于本项目的其他已发表的文件; C. 本文件中各处引用的文件资料,包括所要用到的软件开发标准; 列出这些文件的标题、文件编号、发表日期和出版单位,说明能够取得这些文件的来 源。 表1.2 参考资料表 "标题 "文件号 "发布日期 "出版单位 "来源(存放地" " " " " ") " " " " " " " " " " " " " 概述 数据库环境 描述数据库运行的硬件环境和软件环境,例如: 1.数据库系统: 2.主机环境: 3.操作系统: 命名规则 参见公司相关《代码编写规范》的"命名规范"部分。 使用它的程序 [列出将要使用或访问此数据库的所有应用程序,对于这些应用程序的每一个,给出 它的名称和版本号。] 物理设计 标识符 [用于唯一地标识该数据库的代码、名称或标识符,附加的描述性信息亦要给出。如 果该数据库属于尚在实验中、尚在测试中或是暂时使用的,则要说明这一特点及其有效 时间范围。] 物理文件 [说明数据库物理文件的存放位置、初始大小和网络布局] 表空间设计 [说明数据库使用的表空间、以及表空间的配置情况] 表空间1 表3.1 表空间 "Space name "Data file size " " " " 表空间2 ……… 结构设计 实体关系 [数据库ER关系图] 注:正文插图要求图像分辨率为300像素,图号编码用章序号。如"图2.1"表示第2章 第1图。图号与图题文字间置一字空格,置于图的正下方,图题用5号字,字体用宋体, 须全文统一。 实体说明 [使用一个表格说明数据库实体目录] 表4.1 实体说明表 "序号 "实体名称 "说明 "类型 " " " " "表、视图、序列" " " " "、存储过程 " 实体设计 [对数据库设计中涉及到的各种项目一般要建立起数据字典,以说明它们的标识符、 同义名及有关信息。] 数据表1 1.表描述 "表名 "中文表名 " " " " " " " " " " 2.外键 "主键表名 "主键列 "外键列 " " " " " " " " " " " " " 3.列描述 "列名 "主键"空值 "类型 "描述 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 4.索引 "索引名 "索引类型 "序列 "列名 " " " " " " " " " " " 5.触发器 [以sql语句的形式来说明数据库表的触发器定义] 6.初始数据 [说明并给出数据表的初始数据] 数据表2 …… 序列实体 [以sql语句的形式来说明数据库序列实体的定义] 序列1 [sql语句]
软件开发的内容是:需求、设计、编程和测试,其中需求设计要求大家编写软件概要设计和详细设计说明书,数据库或数据结构设计说明书,组装测试计划等等,为方便软件开发文档写作,特发此模板供大家参考。 软件需求分析就是回答做什么的问题。它是一个对用户的需求进行去粗取精、去伪存真、正确理解,然后把它用软件工程开发语言(形式功能规约,即需求规格说明书)表达出来的过程。本阶段的基本任务是和用户一起确定要解决的问题,建立软件的逻辑模型,编写需求规格说明书文档并最终得到用户的认可。需求分析的主要方法有结构化分析方法、数据流程图和数据字典等方法。本阶段的工作是根据需求说明书的要求,设计建立相应的软件系统的体系结构,并将整个系统分解成若干个子系统或模块,定义子系统或模块间的接口关系,对各子系统进行具体设计定义,编写软件概要设计和详细设计说明书,数据库或数据结构设计说明书,组装测试计划。软件设计可以分为概要设计和详细设计两个阶段。实际上软件设计的主要任务就是将软件分解成模块是指能实现某个功能的数据和程序说明、可执行程序的程序单元。可以是一个函数、过程、子程序、一段带有程序说明的独立的程序和数据,也可以是可组合、可分解和可更换的功能单元。模块,然后进行模块设计。概要设计就是结构设计,其主要目标就是给出软件的模块结构,用软件结构图表示。详细设计的首要任务就是设计模块的程序流程、算法和数据结构,次要任务就是设计数据库,常用方法还是结构化程序设计方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值