写好设计文档,能省下数年开发时间
How to Write an Effective Software Design Document
我在 Google、Microsoft 以及自己的公司都有编写设计文档的经验。一份优秀的设计文档不仅能让你在动手编码前理清关键决策,避免在错误的实现上浪费时间,更是协调团队成员与合作方设计思路的最佳途径。本文将分享我撰写高效设计文档的方法,包括何时需要写、投入多少精力合适,以及文档中应包含的核心要素。我会通过实际案例,解释如何界定文档范围,区分哪些决策值得深入讨论,哪些细节可以留待后续调整,帮助你打造一份真正能推动项目前进的设计文档。
一份优秀的设计文档能为你节省数年的开发时间。
HN 评论区
139- bob1029
我从未遇到过软件设计文档能真正改善整体流程的情况。充其量,它只能在牺牲更长的交付周期的前提下,让业务方保持同步。即使是高层级的软件交付合同,似乎也很难长期按既定轨道运行。
很多时候,直接动手把该死的东西造出来,看看结果如何,反而更快。软件不像核电站或海上石油平台。你不需要在动工前证明一大堆东西。没人真的需要给你许可才能做事。只要你觉得合适,随时可以给业务方发一个垂直切片原型的链接。那就可以当作“设计文档”。
- mtlynch
作者在此。欢迎对本帖提出任何反馈。
我在 Microsoft 和 Google 学会了写设计文档,我认为这两家公司在文档文化方面做得很好,只是这种文化没有像其他工程实践那样广泛传播出去。我没见过关于如何写设计文档的详尽解释,所以这是我尝试将我所学到的内容外部化。
- wpollock
基于我的经验,提出两点建议:
1) 增加一个名为“潜在变更”的章节。这比“缺失功能”的范围更广,还可以包含其他项目,例如可能可用的新硬件、你可能预见的客户需求变更、可能的新技术(例如可能有用的新数据库或云服务)、多语言支持等。列出其中一些内容往往能促使评审者想到更多。
确保设计围绕此类变更保持模块化,意味着实现其中任何一项都将比在整个代码库中硬编码假设要容易得多。
2) 安全和隐私是更广泛的“合规保障”类别中的两个方面。这两者值得拥有自己的类别,但你应该有一个章节涵盖任何其他法律、监管或公司要求。审计这些合规性的计划也应列出。
当然,通常情况下,除了安全和隐私之外,没有其他要求。
- gwbas1c
顺便一提,Lynch(作者)出售一门关于如何让文章登上 Hacker News 首页的课程:https://hitthefrontpage.com/
我过去很喜欢阅读(或浏览)Lynch 的文章,但看到他利用操纵系统来获利,这让我觉得他玷污了这件事。
- cowthulhu
我最初是通过 Joel Spolsky 的文章 [https://www.joelonsoftware.com/2000/10/02/painless-functiona...] 开始对使用规格说明书(specs)产生兴趣的。
我认为它们很有价值,一方面是因为它们迫使你深入思考软件的实际功能(以及底层实现),另一方面是确保你和[你为之开发的人]大致在同一个频道上。此外,你在编写规格说明书时发现的每一个边缘情况或设计问题,都能为你节省大量时间。
话虽如此,我认为规格说明书的一个主要弱点是,根本不可能写出一份没有盲点、涵盖你在实际开发中遇到的所有边缘情况和问题的完美规格说明书。这使得让客户对规格说明书负责变得更加困难,因为除非你想交付一个过于字面化、实际上毫无帮助的产品,否则你(设计者和开发者)也无法真正对规格说明书负责。
- randusername
我曾参与过 DO-178C(航空航天)和 IEC 62304(医疗设备)的软件设计文档工作,它们的范围要狭窄得多。
OP 的设计文档足够全面,足以覆盖受监管软件提交所需完整文档套件的大部分领域。基本上剩下的工作就是将需求追踪到设计,再追踪到验证方法,最后追踪到验证结果。
- zumtrotz
抱歉有点吹毛求疵。
这读起来更像是一个 CONOPS(概念操作)或软件架构文档,但从高层视角来看不够详细,从低层视角来看又过于详细(即在一些你意想不到的高层设计文档中包含了实现细节)。
鉴于此,我不确定在企业环境中受众是谁。是给架构师看的,给其他开发者看的,还是给你自己看的?
- Tsarp
其中很多内容已经过时了。包括过去很有道理的内容,比如 diataxis 和 Google 的指导方针。
我开始将文档构建为一种“技能”(skill)。因为如今每个模型/框架都经过训练以很好地处理技能。整个项目的文档都被建模为一种技能。
我还在 md 文件中添加了额外的 frontmatter。具体是两个键 -> 何时应该阅读,何时不应该阅读此文档。配合一个简单的 CLI 工具来解析这些内容,让文档体验变得更快、更友好。
如果你真的卡在某处,现在也可以即时生成 svg、mermaids 等图表。