文档工程:从README到完整文档体系
大多数开源项目的文档之路是这样的:一开始只有 README,功能多了以后在 README 里堆内容,堆到读不下去了就不管了,最后用户只能去读源码。这不是因为作者懒,而是因为没有把文档当作一个工程问题来对待。文档工程和软件工程一样,需要架构设计、内容分层、维护流程和质量控制。
README:第一印象的工程设计
README 是大多数用户与一个项目的第一次接触。它的核心目标是:让用户在一分钟内判断这个项目是否值得深入。
一个好的 README 应该包含以下模块,且顺序很重要:
- 项目名称 + 一句话描述(最顶部):用一句话说清楚这个项目解决什么问题。不要说"一个XXX框架",要说"解决XXX问题的YYY工具"。
- 快速安装命令:通常是一行代码,放在描述下面。用户如果对这个项目感兴趣,第一件事就是安装试试。
- 最小可用示例:3-5行代码,展示核心功能。这个示例应该能在一分钟内跑起来。
- 链接到详细文档:README 不是详细文档的替代品,它是指引。在合适的位置放一个"完整文档 → 链接"。
- Badge 行(可选但推荐):CI 状态、版本号、License、覆盖率。这些 badge 能在不读文字的情况下传递项目健康度信息。
README 里不应该有什么:详细的API文档、完整的配置说明、长篇的设计理念。这些内容有价值,但不应该放在 README 里,因为 README 的核心是"快速决策",而不是"完整学习"。
文档的分层架构
当项目从单文件工具成长为一个有一定复杂度的系统时,文档需要分层。每一层服务于不同的用户目标和阅读场景。
层一:快速入门(Getting Started)。目标是让新用户在10-30分钟内跑通一个完整的使用流程。这一层的内容应该是步骤化的、可复制粘贴的。不应该有抽象的概念解释,先让用户"跑起来",再解释"为什么"。
层二:概念指南(Concepts)。解释项目的核心概念、设计哲学、关键抽象。这一层的目标是让用户建立正确的心智模型。如果用户的心理模型与工具的设计模型不一致,后续的使用体验会非常痛苦。概念指南应该回答"为什么这样设计"而不是"怎么用"。
层三:操作指南(How-to Guides)。面向目标的、步骤化的内容。"我想实现XXX功能,怎么做?"这类问题应该在这一层找到答案。操作指南和快速入门的区别是:快速入门是固定的、标准的流程;操作指南是多样的、面向具体目标的流程。
层四:API 参考(Reference)。完整、准确、可搜索的接口文档。这一层的内容通常是自动生成的(从代码注释或者类型定义生成),但也需要人工审核确保清晰度。API 参考的目标是"查",而不是"学"。
层五:解释性文章(Explanations/Discussions)。深入探讨某个设计决策、对比不同方案、讨论最佳实践。这一层的内容通常是长篇的、有观点的。它帮助用户理解"为什么选A不选B",建立对项目的深度信任。
这五层文档模型(快速入门、概念指南、操作指南、API参考、解释性文章)来自 Divio 的文档框架,是目前最被广泛采用的文档架构之一。
文档即代码:维护流程的工程化
文档和代码一样,需要版本控制、代码审查、持续集成、自动发布。这就是"文档即代码"(Docs as Code)的核心理念。
版本控制。文档应该和代码在同一个仓库里(或者至少在同一个版本控制系统中)。每一次文档修改都应该有 commit message,重要的修改应该走 PR 流程,经过 review 才合并。这样能避免文档被随意修改,也保留了修改历史。
自动生成。API 参考文档应该从代码中的类型定义或者注释自动生成。手写 API 文档的问题是两个:容易过时,维护成本高。用工具(如 TypeDoc、Sphinx、Docusaurus)从代码生成文档,能保证文档与代码同步。
链接检查。文档中的链接很容易过时——引用的外部页面移动了、内部锚点改了、示例代码的仓库删除了。在 CI 中加入链接检查(用 lychee 或类似工具),能自动发现失效链接。
拼写和语法检查。英文文档可以用 vale 或者 write-good 做风格检查;中文文档目前还没有特别成熟的工具,但可以检查明显的错别字和格式问题。
多语言同步。如果项目有非英文文档,最大的挑战是"不同语言的文档版本不同步"。解决思路有两种:一是只维护一个语言的权威版本,其他语言明显标注"可能过时";二是用 Crowdin 这类平台做协同翻译,有专人审核同步状态。
文档质量的技术指标
和代码一样,文档质量也可以(在一定程度上)量化。
覆盖率。API 文档的覆盖率是容易量的:有多少个导出函数/类/方法,其中有多少个有文档字符串?用工具可以自动生成覆盖率报告。
新鲜度。文档最后一次更新是什么时候?如果代码已经更新了,但文档还是三年前的,那就是过期文档。用工具的 CI 集成,可以在文档过时时自动提 issue 提醒维护者。
可搜索性。用户能不能通过搜索找到想要的内容?这涉及到文档的站点结构、URL 设计、站内搜索质量。一个常见的错误是:文档内容很好,但 URL 是一堆随机字符,或者标题没有包含关键词,导致搜索引擎和站内搜索都找不到。
用户反馈。在每篇文档下面加一个"这页是否有帮助?"的反馈按钮,收集用户的直接反馈。比量化指标更重要的是:用户在哪篇文档上点了"没有帮助"——这直接指出了需要改进的文档。
常见文档问题及其根因
问题一:文档很全,但用户还是说"看不懂"。根因通常是:文档是按"功能"组织的,而不是按"用户目标"组织的。用户想知道"怎么实现登录",但文档里只有"Auth模块的函数列表"。解决方向是增加更多操作指南,用用户的语言描述问题。
问题二:文档过时,和代码不一致。根因是文档是手工维护的,没有和代码变更联动。解决方向是尽量用自动生成,或者在 CI 里检查文档和代码的版本一致性。
问题三:文档太多,不知道从哪开始。根因是文档没有清晰的学习路径,用户需要在几十篇文档中自己找顺序。解决方向是设计一个"学习路径"(Tutorial → How-to → Reference → Explanation),在文档首页清晰地展示这个路径。
问题四:只有英文文档,非英语用户用不起来。这不是技术问题,是资源分配问题。但如果项目的用户群本身包含大量非英语用户,文档语言就是一个实际问题。解决方向可以是:优先保证英文文档质量,同时接受社区贡献的翻译。
文档写作的实用原则
用主动语态,不用被动语态。"配置文件应该被放置在..." 不如 "将配置文件放置在..."。主动语态更直接、更有行动感。
用具体的例子,不用抽象的描写。"支持多种配置方式"不如"你可以用环境变量配置,也可以在 config.yaml 里配置,以下是两个等价的配置"。
每个代码例子都应该是可运行的。如果用户复制了文档里的代码,却发现跑不起来(因为少了 import、因为版本不对、因为有个隐式依赖),这对信任的打击是巨大的。所有的代码示例都应该在实际环境中测试过。
用第二人称("你"),不用第一人称("我们")。对用户说话,而不是对自己说话。"我们可以这样做" 不如 "你可以这样做"。这能让文档更有代入感。
先给结论,再给理由。大多数用户读文档是为了解决问题,不是来上课的。先告诉用户"怎么做",如果用户感兴趣,再解释"为什么"。把"为什么"放在折叠块里或者单独的文章里。
总结
文档工程的核心认知是:文档不是产品的附属品,而是产品体验的一部分。一个功能很强但文档很烂的工具,实际使用价值远低于一个功能中等但文档很好的工具。
把文档当作工程问题来对待,意味着:它有架构(分层模型)、有流程(Docs as Code)、有质量指标(覆盖率、新鲜度、用户反馈)、有持续改进机制。这不是"多写一些文字"的问题,而是"如何系统性地传递知识"的问题。
好的文档让工具的价值被充分利用;坏的文档让好工具被埋没。这不是夸张,这是现实。