如何编写技术文档?

news2024/11/19 8:22:24

软件开发中,为你的软件系统编写文档并不是一件新鲜的事情。几乎所有人都明白这样的道理:

你的软件产品如何优秀对用户来说并不是最重要的,因为你的文档如果不够优秀,用户不会使用它!即便用户在某些情况下不得不使用你的产品,没有好的文档,用户无法高效使用或者以错误的方式使用你的产品。

不幸的是,鲜少能见到关于如何正确组织技术文档的实践及方法论。团队工作中,编写文档仍面临挑战。

仓促地开始和结束

编写技术文档这个任务看起来总是:优先级不够高,特别花时间并且没有立竿见影的正反馈!于是文档编写被一推再推,直至在某些时刻不得不做,比如新人要上项目了,我的开源产品要发布了,才震惊地发现我竟没有文档。文档最后被随意编写,以至于完成后就被彻底忽视。随着系统的演进,这些文档慢慢脱节,变成谎言!这个论断乍一看如此地荒谬,可是却在我身边常常发生。

混乱的结构

如同代码编写一样,混乱的结构是相当致命的。我们能使用类似于technical-writing-template这样,基于模板约定的方式使得单篇文章的质量达到一定的水准。然而在复杂的软件系统中,高质量的单篇显然是杯水车薪的。事实上,众多优秀的软件产品它们基本都具备恰到好处的文档,清晰的结构使得初学者和长期用户读起来都毫不费力。我以为,未能使文档免于混乱的原因有以下几点:

  1. 文档是由多个人编写的。《解析极限编程》中描述一个XP团队中会有“文档撰写员”的角色。即便敏捷实践大行其道的今天,敏捷团队中,不论是成熟的“角色是帽子”,还是传统的“角色是岗位”,都大概很少会见到“文档撰写员”这一角色。文档是由不同的人编写不同的部分,再组合而成的,混乱是自然而然的结果。
  2. 缺少对抗混乱的模式。不同于软件编写,我们有架构风格这样深入人心的默认约定。甚至有C4 model来可视化软件架构,帮助团队保持一致的认知,并使架构有序地演进。文档的编写除了本文将要介绍的文档象限之外,并未发现任何一种有较大影响力的编写模式。

两种组织方式

结构化文档

通过观察优秀技术文档的组织形式,诸如unix manual、Spring boot或者React,你会发现它们都是结构化的。主要使用方式是按照索引查阅感兴趣的内容。

通常,所谓编写技术文档,基本意味着编写类似的结构化文档。结构化文档不仅仅是当前最为主流的文档组织方式,在可预见的未来也会如此。

保持清晰的结构绝非易事,笔者深感幸运能够看到一种确保正确生成结构化文档的模式:文档象限。

在一个坐标系下,划分象限的两条轴描述了文档所具有的属性,横轴描述文档的使用场景是偏于工作的还是偏于学习的,纵轴描述文档是偏于理论的还是偏于实践的。这四个象限分别是tutorialshow-to guidesreferenceexplanation

Tutorials How-to guides Reference Explanation
面向 学习 特定目标 信息 理解
必须 能够让新手从0开始 演示如何解决一个特定的问题 描述你的作品 解释原理
形如 一个课程 一系列步骤 枯燥地描述 描述性的解释说明
类似于 教一个小孩子如何做饭 一本烹饪书籍上的一条食谱 百科全书的参考文章 一篇关于烹饪社会史的文章

文档象限将其内容呈现方式划定了明确的边界,让文档看起来简单明了,更适合对外输出,帮助用户快速上手。

图谱化文档

结构化文档之外似乎还存在另一种文档组织方式:图谱化,并且初具影响力。 很多时候,为了保持文章的简洁和内聚,我喜欢使用链接文字将一个相关概念指向别处。一旦顺着链接深入几层,就会发现文档所承载的知识很快组成一张大网。知识图谱一词简直恰如其分。自2012年谷歌知识图谱发布以来,知识图谱的主要用武之地仍在搜索引擎,文献检索领域。有诸如logseq这样的产品另辟蹊径,强化知识之间的链接,以图谱化的方式组织文档。其主要使用方式是关键字检索加上相关内容(linked reference)的跳转。

在使用logseq的过程中,我发现这种方式更契合人类在大脑中构建的知识模型,有利于深刻又全面地理解问题。这与卢曼的《卡片笔记写作法》有异曲同工之妙。

笔者以为,图谱化的文档组织方式在团队中更适合知识的生产和管理,即作为团队的知识库。原因与其主要使用方式有关。尽管我认为关键字检索不失为一种高效的方式,但是给新用户的检索能力提出了挑战。

选型参考

当你开始着手构建文档的时候,即便不作任何考量,也要借助一些文档工具甚至协作平台来保存你编写的文档。笔者了解到一些常用的文档工具:

文档生成工具:

  • sphinx
  • docusaurus

文档托管与协同:

  • google doc
  • confluence

图谱化文档工具:

  • logseq

了解到这些文档构建方式和工具有什么用呢?这个世界大概不存在一个完美的软件工具或者系统使得所有的个性化需求都被满足。当你为了协同编辑选择了google doc,将不得不面对大量的样式调整工作。当你使用logseq作为团队内部的知识库,其特有的文档标记格式使其难以迁移到其他的工具里。这真让人沮丧!于是乎,构建文档也要进行类似技术选型的工作,确定一个合适的方案。这意味着要在艰难的权衡之下,选择能满足需求的方案,其优点仍令人振奋,其缺点还可以忍受。

值得注意的是,具备能写文档这样的功能并非唯一的需求,选择方案时我们似乎更看重功能以外的重要特性。没错,文档构建也该满足可预见的非功能性需求:

  1. 可移植性:在可预见的未来,是否需要将文档迁移到另一个环境?
  2. 可用性:用户体验与易用性,协作能力,国际化
  3. 合规性
  4. 可访问性:仅内部网络有效?完全公开还是要通过授权鉴权?
  5. 存档:文档如何被变更,保存,备份?

令人激动的文档构建方案

sphinx + 文档象限 + Git

利用文档象限组织内容,利用Github等托管平台保存,sphinx将其生成为电子书发布,或者生成HTML进行私有化部署。

  • 优点
    • 良好的国际化支持
    • 极高的灵活性
    • sphinx高度可配置,拥有成熟的生态
    • 文档托管及私有化部署具有众多的代替选项
    • 只依赖Python运行环境,具有极高的可移植性,可以随软件版本迭代一起更新,维护,部署,纳入迭代管理
  • 缺点
    • 要求文档的贡献者熟悉两种技术:Gitmarkdown

📝 Note: 这里有一个How-to guide: 于sphinx上实践文档象限

logseq

使用loqseq作为知识库,利用Github等托管平台保存文档

  • 优点
    • 能够以极低的成本构建知识图谱,作为知识库
    • 使用方式是关键字检索和关联内容跳转,这是一种让人更容易聚焦于思考的交互方式
  • 缺点
    • 使用方式是关键字检索和关联内容跳转,并不适合新手快速上手
    • 需要每一个用户安装logseq的客户端
    • 要求文档的贡献者熟悉两种技术:Gitmarkdown
    • 难以对外发布内容

google doc/confluence + 文档象限

  • 优点
    • 多人协同
    • 内建的鉴权授权,支持单点登录(sso)
    • 大众化的产品,易用性好
  • 缺点
    • 需要手动管理存档备份,容易造成混乱
    • 可移植性差

总结

慎重地审视这些方案各自的优缺点后,我发现采用结构化的文档组织方式时,文档象限总是有用武之地,似乎能够保证我们生成“不太坏”的文档。同时,笔者建议慎重选择图谱化文档,你可能并没有做好因文档改变自己工作习惯的准备,你可能还需要同时维护一份结构化文档。


文/Thoughtworks 蔡正锋
原文链接:如何编写技术文档?-Thoughtworks洞见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp app 实现右上角回首页;点homeButton返回上一页;onNavigationBarButtonTap不生效问题

场景: app,Android移动端 实现点击右上角图标,回首页。 问题:用了官网的 homeButton,图标正常展示了,也可点击,但每次点击后是会返回上一页而非首页。 后来查到说,要结合onNavigatio…

SciencePub学术 | 计算机重点SCIE征稿中

SciencePub学术 刊源推荐: 计算机重点SCIE征稿中!信息如下,录满为止: 一、期刊概况: 计算机语音类重点SCIE 【期刊简介】IF:4.0-4.5,JCR2区,中科院3区; 【出版社】世界排名前三出…

Mysql之explain详解

1. explain作用 使用explain可以展示出sql语句的执行计划,再根据sql的执行计划去判断这条sql有哪些点可以进行优化,从而让sql的效率达到最大化。 2. 执行计划各列含义 (1)id:id列是select的序列号,这个…

Docker基础入门:从0开始学习容器化技术

Docker基础入门:从零开始学习容器化技术 一、Docker基础1.1、Docker起源1.2、Docker概念1.3、Docker优势1.4、Docker 的组成 二、Docker安装2.1、卸载旧版Docker2.2、需要的安装包依赖2.3、设置镜像仓库2.4、更新yum软件包索引2.5、安装Docker--社区版2.6、配置镜像…

十、接口(2)

本章概要 抽象类和接口完全解耦多接口结合使用继承扩展接口 结合接口时的命名冲突 抽象类和接口 尤其是在 Java 8 引入 default 方法之后,选择用抽象类还是用接口变得更加令人困惑。下表做了明确的区分: 特性接口抽象类组合新类可以组合多个接口只能…

Java基础知识实际应用(学生信息管理系统、猜拳小游戏、打印日历)

一、Java学生信息管理系统 这个系统包含了添加、修改、删除、查询和显示所有学生信息等功能。您可以在此基础上进行修改和完善,以适应您的需求。 import java.util.Scanner;public class StudentManagementSystem {private static Scanner scanner new Scanner(S…

C++——oo的魅力之多态

文章目录 多态的概念多态的定义和实现多态的构成条件虚函数重写的两个例外协变(基类和派生类虚函数返回值类型不同)析构函数的重写(基类和派生类析构函数名字不同) c11 override 和 final关键字 重载,重写(覆盖), 隐藏(重定义)对比抽象类(纯虚函数)多态的…

Vivado使用入门之二:网表物理约束

目录 一、背景 二、物理约束 2.1 概念 2.2 网表约束 2.2.1 CLOCK_DEDICATED_ROUTE 2.2.2 MARK_DEBUG 2.2.3 DONT_TOUCH 2.2.4 LOCK_PINS 三、位置约束 四、布线约束 4.1 route 4.2 assign routing mode 五、参考 一、背景 在工程设计中为了保证上板后功能正常&…

【BI看板】Docker-compose安装Superset,安装最新版本2.1.0

软件及环境准备 docker, docker-compose docker-compose安装 字节码安装 #wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 #mv docker-compose-linux-x86_64 docker-compose #chmod x /usr/local/bin/docker-com…

一、计算机网络体系结构

Content 1. 计算机网络的组成2. 计算机网络的功能3. 计算机网络的分类4. 计算机网络的性能指标5. 计算机网络分层结构OSI模型TCP/IP模型互联网五层模型共同点: 6. 计算机网络提供的服务按三种方式分类面向连接服务和无连接服务可靠服务和不可靠服务有连接服务和无连…

5G+AI数字化智能工厂建设解决方案PPT

导读:原文《5GAI数字化智能工厂建设解决方案》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。数字化智能工厂定义 智能基础架构协同框架 - 端、边、云、网…

Java课题笔记~ SpringMVC拦截器

SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器&#xff0c…

2023华为产品测评官-开发者之声 + 华为云ModelArts试用体验心得

2023华为产品测评官-开发者之声 华为云ModelArts试用体验心得 文章目录 2023华为产品测评官-开发者之声 华为云ModelArts试用体验心得一、活动介绍二、华为云ModelArts简介三、AI Gallery简介步骤1:订阅模型步骤2:使用订阅模型部…

Reids 的整合使用

大家好 , 我是苏麟 , 今天带来强大的Redis . REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选…

冯·诺依曼计算机

一、定义 冯诺依曼机(von Neumann machine),又称冯诺依曼计算机,根据冯诺依曼提出的存储程序概念设计的计算机。主要特征是:指令与数据都以二进制形式储存在存储器里;指令根据其储存的顺序执行。 冯…

SpringBoot常用注解 - @Controller

Controller : Controller是加在类上面的注解,使得类里面的每个方法都返回一个视图页面 实际开发中,有时候只是让后端的结果返回到前端,而不作为新的视图页面,此时需要结合 ResponseBody,让这个方法返回给前端的不是一个…

三星霸主地位“无可撼动“,DRAM内存市场份额创近 9 年新低仍第一

三星电子在DRAM市场的竞争地位一直备受关注。据报告显示,除了市场份额下降外,三星电子在上半年的销售额也出现了下滑。这主要是由于全球消费电子产品需求下滑,导致三星电子的芯片需求减少。 存储芯片业务所在的设备解决方案部门的营收和利润也…

快速提高写作生产力——使用PicGo+Github搭建免费图床,并结合Typora

文章目录 简述PicGo下载PicGo获取Token配置PicGo结合Typora总结 简述PicGo PicGo: 一个用于快速上传图片并获取图片 URL 链接的工具 PicGo 本体支持如下图床: 七牛图床 v1.0腾讯云 COS v4\v5 版本 v1.1 & v1.5.0又拍云 v1.2.0GitHub v1.5.0SM.MS V2 v2.3.0-b…

Python_数据容器详解

Python数据容器 1. 列表基础语法和操作练习题 2. 列表的循环练习题 3. 元组 tuple4. 元组的循环练习题 5. 字符串6. 切片练习总结 7. set 集合8. 字典 dict字典的嵌套总结 字典常用操作练习 9. 对比总结以及通用操作对比总结通用操作 1. 列表基础语法和操作 """…

蓝桥杯嵌入式省一教程:(二)LCD显示

在嵌入式开发中,屏幕显示是一个非常重要的功能。同时,其移植对于初学者来说较为复杂,需要较好地掌握I2C或SPI等通讯协议。然而,在蓝桥杯中,比赛方已经为我们提供了与LCD有关的库,这让我们能够简单方便地使用…