如何写好技术文档——来自Google十多年的文档经验

2023-05-16

已剪辑自: https://zhuanlan.zhihu.com/p/393553478

本文大部分内容翻译总结自《Software Engineering at Google》 第10章节 Documentation。 另外,该书电子版近日已经可以免费下载了 https://abseil.io/resources/swe_at_google.2.pdf,有兴趣的同学可以下载翻阅下。 首先声明,本问所说的文档不仅限于纯文本文档,还包含代码注释(注释也是一种特殊形式的文档)

img

很多技术人自己非常轻视技术文档的书写,然而又时常抱怨文档不完善、质量差、更新不及时…… 这种在程序猿间普遍存在的矛盾甚至已经演变成了一个段子。

img

文档的重要性

高质量的文档对于一个组织或团队来说有非常多的益处,比如让代码和API更容易理解、错误更少;让团队成员更专注于目标;也可以让一些手工操作更容易;另外如果有新成员加入的话有文档也会让他们更快融入……

写文档有比较严重的收益滞后性,不像测试,你跑一个测试case,它能立即告诉你是对还是错,它的价值马上就体现出来了。而写一份文档,随着时间的推移,它的价值才会逐渐体现出来。 你可能只写一次文档,将来它会被阅读上百次、上千次,因为一份好的文档可以在未来替你向别人回答类似下面这些问题。

  1. 为什么当时是这么决策的?
  2. 为什么代码是这样实现的?
  3. 这个项目里都有哪些概念?
  4. ……

写文档同样对于写作者也有非常大的收益:

  • 帮你构思规范化API: 写文档的过程也是你审视你API的过程,写文档时会让你思考你API设计是否合理,考虑是否周全。如果你没法用语言将API描述出来,那么说明你当前的API设计是不合理的。

  • 文档也是代码的另一种展现: 比如你两年后回过头来看你写过的代码,如果有注释和文档,你可以很快速理解代码。

  • 让你的代码看起来更专业: 我们都有个感觉,只要文档齐全的API都是设计良好的API,虽然这个感觉并不完全正确,但这两者确实是强相关的,所以在很多人眼里,文档的完善度也成为衡量一个产品专业度的指标。

  • 避免被重复的问题打扰: 有些问题你只需要写在文档里,这样有人来问你的时候你就可以让他直接去看文档了,而不是又给他解释一遍。

    为什么大多数人都不喜欢写文档?

    关于文档的重要性,每个技术人或多或少都知道一些,但很多人还是没有写文档的习惯,为什么? 除了上文中提到的文档的收益滞后性外,还有以下几点原因:

  • 很多工程师习惯将写代码和写作割裂开,不仅仅是在工作上,而且在思想上就认为它们是完全不相关的两项工作,这就导致好多人重代码不重文档。

  • 也有很多工程师认为自己不善写作,索性就不写了。 这实际是个偷懒的借口,写文档不需要华丽的辞藻、生动的语言,你只需要将问题讲清楚即可。

  • 有时候工具不好用也会影响的文档写作。如果没有一个很好的写作工具将写文档嵌入到开发工作流程中的话,写作确实会增加工作的负担。

  • 大多数人将写文档看做是工作的额外负担。 我代码都没时间写,哪有时间写文档!,这其实是错误的观念,文档虽然前期有投入,但能让你代码的后期维护成本大幅降低,磨刀不误砍柴工这个道理相信大家都还是能理解的。

如何产出高质量文档

既然理解了好文档的重要性,我们如何保证在时间的长河中维护好一份文档,这里有些相关的方法论,大家可以参考下。

像管理代码一样管理文档

对于如何写出好代码,整个技术圈已经有好多经验的总结了,比如书籍《重构》《代码简洁之道》…… 针对各种编程语言,也有相关的规范,比如国外的Google C++规范,国内的阿里Java开发规范等…… 但对于文档 似乎相关的资料却很少。但实际上,不应该把文档和代码割裂开来,你可以简单粗暴地认为文档其实就是用一种特殊语言书写的代码,这种语言就是人类的语言。这么想的话,实际上我们很多在代码和工程中总结出来的经验,也可以直接用在文档中,比如:

  • 有统一的规范
  • 有版本控制
  • 有明确的责任人维护
  • 有变更Review机制
  • 有问题的反馈和更新机制
  • 定期更新
  • 有衡量的指标(比如准确性,时效性)

明确你的读者是谁

写文档有一个很常见的错误,那就是很多人文档都是写给自己看的,这种情况下就会导致你的文档只有自己或者和你有相似知识背景的人才能看懂,团队较小时这种问题还好,你们都做着类似的工作,所以也都能看懂文档。但当团队逐渐壮大后,问题就会凸显出来,新人有时候有着和你不同的工作背景,甚至现在都做着不同的工作内容,这时候你之前写的文档他们就很难读懂了。

所以在写文档之前请明确你文档可能的读者会是哪些人,然后针对他们的特点着重关注如何才能让他们理解。当然,文档也不一定要非常严肃和完美,只要能向你潜在的读者说明问题即可。 记住文档是写给别人看的,不是给自己看的。

根据专业水平可以大致将读者分为三种 新手、老手和专家,针对不同水平的人写作需要有侧重点。比如针对新手,你需要重点介绍下里面涉及到的术语和概念,然后详细讲解具体的的实现。相反,针对专家 你可以省去这些额外的信息。注意,这里没有严格的标准,因为有些文章新手会看,专家也会看, 这里还是需要具体情况具体分析。

另外一种对读者分类的方式就是根据读者阅读文档的目的来分类,比如有人知道自己遇到了什么问题,就是来找解决方案的。还有一批人只有一个简单的想法,但不知道具体的问题。举个例子,以读数据库慢为例,前者已经知道数据库慢可能是因为数据量巨大且没有加索引,解决方案很简单 加索引,这时候他可能需要知道的是如何正确地加索引。而后者可能着重关注的是为什么读数据库会慢,这时候你可能需要额外重点介绍下数据库相关的原理。

清晰的分类

文档大致可以分为以下几种类型,每种类型也有自己不同的特点和写作侧重点。

参考文档

参考文档也是大部分开发人员日常会使用和书写的文档,比如我们使用某个框架或者工具,都会有API说明文档,这就属于参考类文档。 它并没有太多的要求,只要能向读者展示清楚如何使用即可,但无需向读者讲明具体的实现。

注:参考文档并不仅限于API文档,还包括文件注释、类注释、方法注释,要求都是能准确说明其用法。

设计文档

很多公司或者团队在项目开始前都要求有设计文档,设计是项目实施的第一步,所以在设计文档书写的过程中要求尽可能考虑周全,例如该项目的存储、交互、隐私……

好的设计文档应该包含以下几个部分:

  1. 设计目标
  2. 实现的策略
  3. 各种利弊权衡和具体决策
  4. 替代方案
  5. 各种方案的优缺点

写设计文档的过程也你对整个项目做规划、思考可能出现问题的过程,设计的越详细、思考的越多,未来遇到问题的可能性就会越小。

引导类文档

引导类文档也很常见,一般都是Step by Step的形式。比如我们在使用某个框架或者工具的时候,一般都会有个引导类的文档一步一步帮助你快速上手。 大家写引导类文章大家非常容易犯的一个错误就是预设了很多背景知识。 一般使用文档都是有开发者写的,他们都非常了解这个工具的相关的知识,所以习惯性的会认为,啊 这个知识点很简单 用户也肯定会吧,实际上用户不一定会。这本质上就是一种认知偏差,这种现象在跨团队协作 尤其是多端协作的时候也非常明显。

这类型的文档写作中,要求写作者尽可能站在用户的视角上思考,极力避免出现和用户的认知偏差,力争每个步骤做到明确无歧义,每两个步骤之间做到紧密衔接。

概念性文档

当参考文档无法解释清楚某些东西的时候,就需要概念性文档了,比如某个API的具体实现原理。其主要是为了扩充参考文档,而不是替代参考文档。有时候这和参考文档会有些内容重复,但主要还是为了更深层次的说明某些问题、解释清楚某个概念。

概念性文档也是所有文档中写作最难的,也是被阅读最少的,所以很多情况下工程师最容易忽视。而且还有另外一个问题,没合适的地方放,参考文档可以写代码里,落地页可以写项目主页里,概念性文档似乎也只能在项目文档里找个不起眼的角落存放了。

这类文档的受众会比较广,专家和新手都会去看。另外,它需要强调概念清晰明了,因此可能会牺牲完整性(可以由参考文档补齐),也有可能会牺牲准确性,这不是说一定要牺牲准确性,只是应当分清主次,不重要的就没必要说了。

Landing pages(落地页)

Landing pages就先简单翻译成落地页了,没想到啥恰当的翻译词。比如一个团队或者项目的导航页,虽然没啥具体的内容,但应该包含其他页面的链接。 比如你新入职一个团队,比较成熟的团队都会扔给你一个文档,这个文档里包含常用的工具、文档链接,这就是这个团队的落地页。 落地页的问题就是随着时间的推移,页面可能会变的越来越乱,而且有些内容会失效,不过这些问题都好解决,做好定期的维护和整理就行。 落地页的技术难度不高,但要求内容的有效性、完整性和分类清晰。

文档Review

在一个组织内,光靠个人去维护文档是不行的,必须得借助群体的智慧。在一个组织内部,文档的变更也应该像代码的变更一样,需要被其他人Review,以提前发现其中的问题并提升文档的质量。

如何Review文档:

  • 专业的视角来保证准确性: 一般由团队里比较资深的人负责,他们关注的核心点是文档写的对不对,专不专业。如果Code Review做的好的话,文档的Review也属于Code Review的一部分。
  • 读者视角保证简洁性: 一般由不熟悉这个领域的人来Review,比如团队的新人,或者文档的使用者。这部分主要是关注文档是否容易被看懂。
  • 写作者视角保证一致性: 由写作经验丰富或者相关领域比较资深的人承担,主要是为了保证文档前后是否一致,比如对同一个专业术语的使用和理解是否有歧义。

写文档的哲学

上面部分站在组织和团队的视角来看如何提高文档质量,我们接下来看看站在个人写作者的视角上如何写出高质量的文档。

5W法则

5W法则相信大家已经听的多了,分别是Who What When Where Why,这是一个广泛被用在各行各业的法则,写文档当然也能用(5W法则堪称万金油,啥地方都能用)。

  • WHO: 前面已经说过了,文档是写给谁看的,读者是谁。
  • WHAT: 明确这篇文档的用途,有时候,仅仅说明文档的用途和目的就能帮你搭建起整个文档的框架。
  • WHEN: 明确文档的创建、Review和更新日期。因为文档也有时效性,明确相关日期可以避免阅读者踩坑。
  • WHERE: 文档应该放在哪! 建议一个组织或者团队有统一的永久文档存放地址,并且有版本控制。最好是方便查找、使用和分享。
  • WHY: 为什么要写这篇文档, 你期望读者读完后从文档中获得什么!

三段式写作

写文章一般都会有三个部分,专业写作者也讲究凤头、猪肚、豹尾,这三个词概括出了好文章三部分应有的特点。技术文档也算是文章的一种,所以一般也都会有这三部分,每个部分有其自己的作用,比如第一部分阐述问题,中间部分介绍具体的解决方案,第三部分总结要点。 但这也并不以为着文档应该有三个部分,如果文档内容比较多,可以将其做更细致的拆解,可以适当增加一些冗余的信息帮助读者理解文档内容。虽然很多工程师都讨厌冗余 极力追求简洁,但写文档和写代码不同,适当的冗余反而可以帮助读者理解,很简单,举个例子,比如写作中经常举例子,举的例子本质上就是冗余信息,生动的例子肯定是能帮助读者理解抽象内容的(我想这就是自举 吧)。

结语

目前看到比较好的一个现象就是大家越来越重视文档了,但和测试相比 重视的程度还不够。测试已经是工作流程中不可或缺的一部分了,而文档依旧还不是。当然这可能和文档本身的特性相关,测试很容易被自动化,也有非常多的客观指标来评估。文档却做不到,首先文档的书写需要人手动介入,而文档的质量也没有太多客观的指标评估,提升文档的数量和质量只能从文化和工作流程上去逐渐改变。

最后总结下本文几个关键点:

  • 随着时间的推移和组织规模的壮大,文档会越来越重要。
  • 文档也应该是开发流程的一部分。
  • 一篇文档只专注在一件事上。
  • 文档是写给读者看的,而不是给你自己看的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何写好技术文档——来自Google十多年的文档经验 的相关文章

  • 英文学术论文写作有哪些经验心得?

    文章目录 博士第四年结束 xff0c 还没发表论文 xff0c 心态出了问题 xff0c 怎么办 xff1f 1 博一阶段2 博二阶段3 博三阶段4 博四阶段5 博五阶段6 总结 SCI写作方法总述 一 学术论文的基本组成部分二 学术论文写
  • 一个博士生接受怎样的训练是完整、全面的科研训练?

    我粗算了一下对机器学习 xff08 偏理论和方法论 不偏工程 xff09 大概30个技能点吧 xff08 可能增加 xff09 每个点我分成 高中初 三个级别 即总共90分 为了方便理解 默认本科毕业送基础分10分 凑到100分 解题力 x
  • 科研大牛们怎么读文献?

    我是练习时长一年多一年的博士萌新一个 xff0c 看到很多大佬分享了如何找文献读文献的精彩分享 xff0c 不过很多并没有提到如何针对某一篇论文进行阅读 xff0c 正好我最近看了一个相关的PPT xff0c 觉得对我启发很大 xff0c
  • 作为审稿人,你什么情况下会选择拒稿?

    刚好前不久NIPS给我发了top reviewer award 就来分享一下我的心得 最主要的判断必须是基于文章本身 我认为几个类型 颠覆了我的认知 让人有种脱口而出 卧槽 的冲动 我是肯定给8分起跳 至少strong accept 而且我
  • B端项目整体设计流程

    一 B端产品的能力图谱 1 逻辑思维与抽象能力 2 技术知识储备 3 复杂项目管理能力 xff1a 沟通能力 执行能力 团队协助能力 组织协调能力 4 业务与经营管理知识 二 B端产品设计流程 1 业务调研 a 明确调研目标 战略层 xff
  • 哪些思维方式是你刻意训练过的?

    1 管理记忆 2 贴好标签 3 放大苦难 4 绝对理性 5 自以为是 6 调整尺度 7 等价交换 8 断舍离 脑子只要醒着就不停转 18岁左右开始刻意培养自己的各种思维方式 至今6年了 1 管理自己的脑海 有效的记忆容量是有限的 所以需要管
  • 你的编程能力从什么时候开始突飞猛进?

    在啃掉一本本计算机经典书籍和写下大量代码以后 疫情原因回不去学校 xff0c 作为一个马上毕业 xff0c 即将入职腾讯的大四生 xff0c 分享一下自己的学习历程吧 本人在大学之前从未接触过编程 xff0c 最开始的编程学习还是在高考完后
  • 好用的专利检索推荐

    下面推荐几个我觉得不错的专利检索 谷歌专利 xff08 Google Patent xff09 就像谷歌学术一样 xff0c 谷歌专利也是非常好用 xff0c 无限搜索 xff0c 免费下载 谷歌专利地址 xff1a https paten
  • 软件定义一切?

    梅宏教授的主题报告是 软件定义一切 xff1a 挑战和机遇 主要内容分为三部分 xff0c 无处不在的软件 xff0c 软件定义的时代 xff0c 新时代的机遇和挑战 他从软件从业者的视角 xff0c 将计算机软件发展历程分为三个阶段 xf
  • 首次申上青年基金的一些感悟(综合多位基金评审专家意见)【投稿作品展】

    已剪辑自 https zhuanlan zhihu com p 409740011 各位奋斗在科研一线的朋友们大家好 xff0c 非常荣幸能在此分享一下自己国家自然科学青年基金的申请经历和感悟 本人于2021年1月份毕业 xff0c 耗时2
  • 怎么才能心无旁骛地学习?

    已剪辑自 https www bilibili com read cv7504938 看到这里不要划走 xff01 这个回答一定会颠覆你的学习现状 xff01 靠着这套方法 xff0c 我从一个学习 5分钟 xff0c 走神2小时 的废柴学
  • 示波器串口波形分析

    已剪辑自 https www cnblogs com dongxiaodong p 14163409 html 串口是最常用的外设了 xff0c 串口基本都是单片机的标配 串口通信只需要3条线组成 xff0c 分别为RX TX GND 下面
  • 什么是软件架构?常用的软件架构

    文章目录 软件架构软件介绍种类表现形式具体作用常用的软件架构一 分层架构二 事件驱动架构三 微核架构四 微服务架构五 云架构 软件架构 软件架构 xff08 software architecture xff09 是一系列相关的抽象模式 x
  • 软件工程总结

    文章目录 名称由来与定义软件危机由来定义 软件工程的核心知识 xff08 SWEBOK xff09 软件工程与计算机科学软件工程的现况没有银弹与人月神话软件工程与计算机程序设计软件开发过程方法学软件工程的发展方向 软件工程的最大难题一 引言
  • jupyter notebook打开其他盘

    转载于 xff1a https blog csdn net qq 41238579 article details 101016253 1 juter notebook 默认打开系统盘 2 更换显示盘 1 xff09 打开cmd 2 xff
  • 网监后台管理系统设计思路

    本次做的是网监系统saas服务平台的后台管理系统 xff0c 不涉及复杂功能逻辑 就是从菜单 模板 系 统 组织架构 角色 用户的设计思路 产品需求 xff1a 在各个省市网监系统的数量不断增长 xff0c 且系统逻辑和功能模块大致相同 x
  • 基于模型的系统工程(MBSE)

    文章目录 了解MBSE xff0c 这一篇文章就够了MBSE是什么 有什么用 怎么学习 xff1f 1 MBSE是什么 xff1f 2 MBSE有什么用 xff1f 3 MBSE的方法有哪些 xff1f 4 MBSE怎么学习 xff1f 要
  • 基于模型设计和机载软件

    采用基于模型设计应对机载软件设计中的挑战 已剪辑自 https www jianshu com p a8fb02ce366d 采用基于模型设计应对机载软件设计中的挑战 Model Based Design for Airborne Soft
  • MBSE与MBD的融合

    已剪辑自 https www jianshu com p 9efae90ca0f7 基于模型的设计 xff0c 是美国迈斯沃克公司 xff08 MathWorks xff0c MATLAB软件的开发商 xff09 提出并推广的复杂系统设计方
  • 基于模型的系统工程(MBSE)与设计(MBD)的关系思考

    已剪辑自 http www clii com cn lhrh hyxx 201905 t20190522 3934609 html 导读 xff1a 如何将关于功能知识表达的建议与任何系统工程建模语言的任何部分结合起来 xff0c 确定地

随机推荐

  • 从MBD到MBE的战略转型路径

    已剪辑自 https zhuanlan zhihu com p 58927567 导读 xff1a 企业的不断成功 xff0c 源于在每个关键机遇期做出正确的抉择 对于在国民经济中发挥重要作用的中国制造业企业来说 xff0c 如何面向未来
  • SysML教程

    已剪辑自 https www jianshu com p 6ba96913abcc SysML是一种支持复杂系统分析 规范 设计 验证和确认的通用图形化建模语言 这些系统可能包括硬件设备 软件数据 人员 规程 设施 xff0c 以及其他人造
  • 程序运行原理:程序是如何运行又是如何崩溃的?

    已剪辑自 https time geekbang org column article 166581 软件的核心载体是程序代码 xff0c 软件开发的主要工作产出也是代码 xff0c 但是代码被存储在磁盘上本身没有任何价值 xff0c 软件
  • 分布式系统

    简介 在一个分布式系统中 xff0c 一组独立的计算机展现给用户的是一个统一的整体 xff0c 就好像是一个系统似的 系统拥有多种通用的物理和逻辑资源 xff0c 可以动态的分配任务 xff0c 分散的物理和逻辑资源通过计算机网络实现信息交
  • #如何写好技术文档——来自Google十多年的文档经验

    文章目录 文档的重要性为什么大多数人都不喜欢写文档 xff1f 如何产出高质量文档像管理代码一样管理文档明确你的读者是谁清晰的分类参考文档设计文档引导类文档概念性文档Landing pages 落地页 文档Review 写文档的哲学5W法则
  • 如何写好技术文档?

    文章目录 01为什么需要写文档 xff1f 02写文档的重要性03像管理代码一样管理文档04文档类型05文档Review06文档写作的哲学07结论 已剪辑自 https cloud tencent com developer article
  • 数据库系统原理1

    第一章 数据库管理技术发展的不同阶段形成不同的特点 数据描述经历了三个阶段对应于三个数据模型 第二章 数据库系统的生命周期 xff0c 书中可能和我们学习软工的时候有些出入 xff0c 其实就是不同时间有不同的理解 xff0c 横看成岭侧成
  • ssh 登录时常出现的几种错误以及解决方法(Linux)

    ssh 登录时常出现的几种错误以及解决方法 xff08 Linux xff09 参考网址 xff1a https blog csdn net GX 1 11 real article details 80423409 前言 ssh是Linu
  • 程序员既要写好代码,又要写好文档

    转载于 xff1a https developer aliyun com article 196898 作为一个长期混迹于CSDN社区的人 xff0c 我对很多拥有高访问量的博主钦佩不已 xff0c 特别是在参加了CSDN在举办 2014
  • 一步一步教你如何写开发文档

    已剪辑自 https icocos github io 2017 01 02 E4 B8 80 E6 AD A5 E4 B8 80 E6 AD A5 E6 95 99 E4 BD A0 E5 A6 82 E4 BD 95 E5 86 99
  • 如何写好项目文档

    已剪辑自 https blog csdn net houzhizhen article details 105622282 引子 有太多的程序员 xff08 包括很多资深的程序员 xff09 不会写文档有太多的项目没有 xff08 完整的
  • 怎样才能写好项目文档?

    已剪辑自 http learn lianglianglee com E4 B8 93 E6 A0 8F E8 BD AF E4 BB B6 E5 B7 A5 E7 A8 8B E4 B9 8B E7 BE 8E 16 20 E6 80 8E
  • 技术文档写作基础-写作新手必看

    文章目录 1 搞清楚主谓宾2 不滥用代词 过渡词和标点符号2 1 不滥用代词和过渡词2 2 不滥用标点符号 3 多用强势动词 xff0c 少用形容词和副词3 1 强势动词和主动语句3 2 少用形容词和副词 4 正确使用术语5 正确使用段落5
  • 软件工程及其文档汇总

    文章目录 软件文档作用和分类作用分类 管理和维护软件工程的文档有哪些 xff1f 软件工程各类开发文档的作用软件工程各文档模板系统定义文档需求规格说明书概要设计说明书用例文档详细设计说明书测试计划测试分析报告 xff1a 软件文档 软件文档
  • 中断和异常,C/C++语言异常,实时操作系统对中断和异常的处理

    文章目录 一 中断和异常是什么1 中断和异常的定义2 中断处理的过程3 常见中断和异常 二 C C 43 43 软件异常的常见原因分析与总结1 概述2 引发软件异常的常见原因2 1 变量未初始化2 2 死循环2 3 内存越界2 4 内存泄漏
  • 编程中什么情况下需要加 volatile?

    文章目录 一 CPU访问变量 1 给变量赋值 2 读变量的值 二 编译器优化 1 上面程序执行过程有什么缺点 xff1f 2 为什么要优化 xff1f 三 volatile到底有什么用 xff1f 用在什么场合 xff1f 1 在执行b 6
  • ImageJ实用教程汇总

    https zhuanlan zhihu com p 60999196
  • 第一性原理详解

    文章目录 百度百科其他解释补充解释 智库百科什么是第一性原理如何运用第一性原理第一性原理思考举例 什么是第一性原理 xff0c 它有什么重要意义 xff1f 详解马斯克的 第一性原理 01什么是 第一性原理 思维 xff1f 其实是一种演绎
  • Win8.1电脑声音可以外放但是插入耳机没有声音

    今天早上正准备学习英语 xff0c 发现耳机插入电脑没有声音 xff0c 于是开始找百度 xff0c 一步一步剥茧抽丝去查找问题来源 问题 xff1a 点击喇叭出现如下图片 xff1a 平常只有右半个图现在却有两个图标了 步骤 xff1a
  • 如何写好技术文档——来自Google十多年的文档经验

    已剪辑自 https zhuanlan zhihu com p 393553478 本文大部分内容翻译总结自 Software Engineering at Google 第10章节 Documentation 另外 xff0c 该书电子版