题图 | © Yunshan Xia

几年前在 O'Reilly 看到一本叫 Living Documentation 的书,可惜当时没读完。

最近图灵出版了该书的中文翻译版《活文档:与代码共同演进》,才想起来有这么回事......正好有时间,把这个坑了几年的东西给填上了。

简单来说,这本书基本可以叫 Living Java Doc (误。我们可以先看看日常开发中会涉及哪些文档:

  • 需求文档

  • 接口文档

  • 业务词汇表文档

  • 模块业务流程文档

  • 系统间交互文档

  • 系统架构文档

  • 系统依赖文档

  • 发布文档

  • 示例文档(tutorial)

  • 项目进度文档

  • 案例文档

  • 汇报文档

要写的类型文档还是不少的,无论哪种文档,都与项目的代码是脱节的。所以软件行业以往的文档编写方式有很多缺点:

  • 文档易过时,因为与代码是分开的,改了代码忘改文档是很正常的,代码是新版本,而文档是历史版本

  • 文档误导人,因为前一条,功能上的修改没有反映到文档上,读文档的人会被错误信息所误导

  • 多余的工作量,工程师在写完代码之后还要再去写一遍文档(也可能是先写文档后写代码),基本是双倍工作量

  • 文档的编写工具无统一的规范,大家喜欢不停地尝试新工具,从 Word 到 Markdown 到 Asciidoc 到 Notion

  • 文档与真实的代码内容是脱节的,比如在 DDD 中常讲的业务词汇表,在文档与代码中可能用的不是同一个词,编码和看文档的时候需要脑内额外做映射

为了克服这些缺点,《活文档》提出了一些让代码变 living 的方法。既然代码和文档分开使得两者不易统一,那么我们就去追求把代码与文档写在一起,并通过技术手段把文档从代码中生成出来。

live_doc

上面提到的几种文档,挨个来看看。

需求文档

因为需求最终会变成 BDD 测试,所以可以直接用 BDD 测试来生成这些需求文档。

词汇表

用 DDD 来做业务的话,一般可以用一些一眼就能看出含义的词对类型和接口做注解:@DomainService,@DomainEvent,@BusinessPolicy,@AbastractFactory,@Adapter,@BoundedContext,@ValueObject。

同时为了强调一些业务概念,也可以用一些自定义的词汇,比如:@CoreConcept,@CoreBehavior,@StateMachine。

然后通过扫描代码,就可以直接把项目中的上述概念抽出,每次代码有更新,能够自动生成业务的词汇表。

自动接口文档

这个应该很多人也见过了,就是类似 swagger 的项目。框架做得好的企业基本也都会有基于类似 swagger 的手段来做自己的接口平台(其实做得好的没几个)。下面是在 beego 中使用 swagger 的例子:

swagger

因为 Go 语言不支持 annotation,所以这些在注释里写的注解没有语法层面的检查和约束,这点上可能比那些支持的语言算是个弱势。

业务流程文档

在代码中编写相应的流程节点和前后关联节点:

business_process

通过扫描代码生成文档:

business_process2

跨系统的交互流程:

business_process3

扫描生成相应的文档,其实和前面的差不多:

business_process4

除了上面这些风格的注解,以前就已经存在从文本生成文档的手段,比如 plantuml、graphviz:

plantuml

上图这样的 plantuml 的文本,本身就可以和代码一起在同一个代码仓库中进行管理。

在一些业务逻辑中,涉及难懂的逻辑,可以用 @Policy 或者 @BusinessConvention 来说明相应的业务决策原因。

发布文档

现在 GitHub 上的很多开源项目,已经可以根据 commit message 自动生成 release note 了,这归功于其 commit message 本身就有一定的规范:

commit_msg

只要用简单的 bash 脚本就可以将两个版本之间的 commit message 进行汇总,并写出完整规范的 release note。

国内不少开源项目现在还是人肉写 release note 的。

tutorial

新人入职需要看一些代码范例,如果项目内有写的规范的代码,可以专门挑出来作为例子:@Exemplar(“这个订单流程是一个很好的 CQRS 学习示例”)。扫描代码找到所有的 @Exemplar 注解就可以成为 tutorial 文档了。

稳定文档

稳定文档指的是那些基本不怎么变动的文档,这种文档和代码分开是可以接受的,为了使我们的文档稳定,应该遵循一些基本的编写原则,比如:

  • 不要带公司的那些容易变化的信息:公司名、子公司、品牌、商标等

  • 如果在文档中附带有链接,应该从非稳定文档指向稳定文档,比如你可以从自己的 blog 贴一个 wikipedia 的链接,但是如果你去编辑 wiki 并粘贴了个人独立 blog 的链接,那么可能就不太合适

  • 不要复制粘贴,尽量用链接引用原有内容

汇报文档

如果是项目进度相关的内容,可以用 @wip 或 @pending 之类的注解。

如果是给老板展示的案例,老板忙得没时间,所以可以用 @keyexample 把这些需要单独展示的案例摘出来。

如果是给新人学习的,除了前面说到的 tutorial,还可以有 @normalcase、@specs 等。

架构文档

一种是单模块架构,常见的是 DDD 中的六边形架构,可以引入 DDD 中的关键词,并生成最终的文档,比如 @HexagonalArchitecture.DomainModel、@Adapter,最终生成的文档是下面这样的:

hex

如果是跨系统的文档,比如 CQRS 之类的,本身也是 Given(event)、When(cmd)、Then(output event) 的形式,所以用 BDD 可以生成这样的文档,前文有提到。

运行时文档

作者认为 zipkin 和 dapper 这种 tracing 系统也是一种形式的文档。服务发现系统中绘制出的服务依赖也是一种文档。

声明式配置

声明系统配置、资源需求、依赖的,也可以生成文档。

从这个意义上讲 K8s 的 yaml 既是文档,也是代码。

架构全景图

当我们可以将所有文档都通过扫描代码生成之后,最好能够将这些文档管理在统一的架构全景图中,相应的全景图可能也可以用一些注解的辅助手段来生成,比如 @Layer(LayerType.INFRASTRUCTURE)、@Repository(aggregateRoot = Customer.class)。

| 图书推荐

作者:西里尔·马特雷尔

译者:黄晓丹

| 图书特色

  • 写文档也可以像写代码一样有趣、省力

  • 应用领域驱动设计,让代码与文档相辅相成

  • 领域驱动设计布道师张逸作序推荐

  • QECon 大会发起人朱少民、格蠹科技创始人张银奎、ThoughtWorks 首席测试与质量咨询师刘冉联合推荐

《活文档:与代码共同演进》系统地阐述了计算机软件开发各个阶段文档写作的步骤、内容、方法、工具、特点和要求,详尽指导软件开发人员和文档开发工程师如何写出规范的文档,包括软件文档的概念和内容、软件文档编写的原则和步骤、软件文档的管理和维护,对可行性研究报告、软件需求报告、软件测试计划等文档的写作方法和写作技巧。

Amazon 读者给这本书打出了 4.4 星的好评,本书一上市就受到了国内读者的欢迎。文档问题是令每个程序员头痛的问题,希望大家通过这本书解决尽可能多的问题。

京东传送门(7.3 折)

图 灵 社 群

点个「在看」

书评 | 如何让开发中的各种文档变活?《活文档》阅读总结相关推荐

  1. 动态头像 Android 实现,Android开发中实现一个头像滑动变大变小功能

    Android开发中实现一个头像滑动变大变小功能 发布时间:2020-11-21 16:36:20 来源:亿速云 阅读:74 作者:Leah 这篇文章给大家介绍Android开发中实现一个头像滑动变大 ...

  2. 本周4天4场直播,解决你对Oracle的种种疑惑,还有第2期大咖讲坛讨论敏捷开发中的性能质量管控...

    1. Oracle 10046 Trace的取得和解析方法 -04.13 本课程以专业 Oracle 数据库技术支持工程师的角度讲解 10046 Trace 的取得和解析方法. 分享大纲: 10046 ...

  3. lisp陡坎程序_(终稿)毕业论文设计_Autolisp在CAD二次开发中的应用.doc(最终版)最新版...

    <毕业论文:Autolisp在CAD二次开发中的应用.doc>由会员分享,可免费在线阅读全文,更多与<(终稿)毕业论文设计_Autolisp在CAD二次开发中的应用.doc(最终版) ...

  4. java web框架struts_Struts框架在Web开发中的应用

    <Struts框架在Web开发中的应用>由会员分享,可在线阅读,更多相关<Struts框架在Web开发中的应用(29页珍藏版)>请在人人文库网上搜索. 1.Struts,框架在 ...

  5. 好程序员技术文档HTML5开发中的javascript闭包

    好程序员技术文档HTML5开发中的javascript闭包,事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格;更优雅,更简洁的表达出代码;在某些方面提升代码的执行效率,同时避免对命 ...

  6. 项目开发中发布更新文档备注

    项目开发中 经常会遇到 某一个团队成员更新了,配置文件但是没有及时沟通导致项目发布后出现异常的情况. 这时就需要一个项目更新发布的规范说明文件,比如每次更新更改了哪些,进行文档备注. 更新的脚本文件也 ...

  7. 反思:项目开发中的语言沟通与文档沟通

    反思:项目开发中的语言沟通与文档沟通 问题引出:刚进入公司试用期,有导师安排开发实现一些功能模块或者小的应用.毕竟需要在整个产品的框架下添加代码,看了下整个产品近1G的源代码,相当浩瀚.虽然是不需要我 ...

  8. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构...

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  9. 开发中不可轻视的接口文档

    接口文档是描述如何与软件系统中的特定接口进行交互的文档,通常包含接口的名称.描述.请求和响应的格式.参数.返回值.错误码.调用示例等信息.它是开发人员在设计和开发软件系统时必不可少的参考资料. 日常工 ...

最新文章

  1. java f反射_java反射机制[基础学习]
  2. Android Studio Debug
  3. C语言梳排序Comb sort算法(附完整源码)
  4. java jfreechar鱼刺图_java使用jfreechar绘制饼型统计图
  5. Shadow Brokers 公布 2.1 万美元的 0day 订阅服务
  6. 关闭linux系统中读写页缓存,Linux文件系统FAQ
  7. hash 值重复_面试题:HashSet是如何保证元素不重复的
  8. 读《编程之美》读后感3
  9. 《数据结构》双链循环线性表
  10. Centos挂载新硬盘开机自动挂载
  11. Doris 之Frontend(FE)和Backend(BE)配置
  12. 从程序员到CTO也可以走捷径
  13. Ubuntu中安装ns3
  14. Linux常用快捷键及命令
  15. 西工大机考《 ERP原理及应用》大作业网考
  16. 集成显卡和独立显卡的区别
  17. 初学者计算机电脑怎样学,初学者怎样学习电脑能够快速入门(免费科普电脑基础知识)...
  18. 没做过项目经理可以考pmp证书吗?普通人考PMP®有用吗?
  19. 2022-2028全球与中国紫外线点固化系统市场现状及未来发展趋势
  20. 在高德地图中获取鼠标点击的经纬度

热门文章

  1. 小程序动态class_微盛小程序“圈子动态”来了!仿朋友圈发布动态,引流拓客神器...
  2. mysql 7.4_CentOS 7.4 64位/ mysql
  3. linux下mysql日志配置_Linux下MySQL 5.5.21 服务器日志配置
  4. 请你描述一下 cookies,sessionStorage 和 localStorage 的区别?
  5. c语言表达逻辑量的方法,c语言中用什么表示逻辑量为真
  6. 移除IIS默认的响应头
  7. Maven中的profile和spring boot中的profile进行结合
  8. MySQL · 性能优化· CloudDBA SQL优化建议之统计信息获取
  9. openfiler 工具栏和快捷方式
  10. android工程中让人很不爽的“×××警告”