当前位置: 首页 > news >正文

发布了一款库(或工具包),如何持续地编写更新日志(ChangeLog)?

据说程序员最讨厌的两件事是 “别人没有写文档” 和 “要我写文档”。

编写更新日志可是也落入此怪圈呢!


本文内容

    • 程序员不写文档
    • 自动化
    • 更新日志应该包含哪些内容
    • 手工和自动化的结合
    • 优秀文档的参考

程序员不写文档

来自 GitHub 的开源调查问卷结果直接显示,最令人头痛的莫过于文档了:

Incomplete or outdated documentation is a pervasive problem, observed by 93% of respondents, yet 60% of contributors say they rarely or never contribute to documentation. When you run into documentation issues, help a maintainer out and open a pull request that improves them.

▲ 来自 http://opensourcesurvey.org

自动化

我曾经试图找到一些自动化的方式来生成更新日志,例如:

  • 查找 git 提交日志
  • 查找 issues 问题

然而,这样生成的日志真难看懂!不信你试着把一个项目的 Issues 列表读一遍?

更新日志应该包含哪些内容

站在库的使用者的角度来看,程序员们希望看到什么样的更新日志,不希望看到什么样的更新日志?

  1. 添加的接口
  2. 现有接口的改变
  3. 未来即将删除的接口
  4. 此版本已经删除的接口
  5. 此版本修复的 Bug
  6. 此版本的安全性改进

然而这些都写了会让编写者很痛苦的……

手工和自动化的结合

当存在 API 比较工具的时候,我们可以很容易地比较各个版本间 API 的变化,包括新增、改变、即将移除和已经移除。而这部分的内容由工具生成是没什么阅读障碍的。

另一部分,描述功能的手工编写会比较容易阅读。例如新增的功能、修改的功能、已经删除的功能。

优秀文档的参考

以下是 UWP 的开发文档,属手工和自动化结合生成。

在这里插入图片描述


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • Windows 无法删除文件夹 —— 访问被拒绝 / 因为目录不是空的
  • 如何精准地用打印机在贺卡或邀请函上打字
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • 使用 Postman 调试 ASP.NET Core 开发的 API
  • 只有你能 new 出来!.NET 隐藏构造函数的 n 种方法(Builder Pattern / 构造器模式)
  • UWP 中的各种文件路径(用户、缓存、漫游、安装……)
  • 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(解析篇)
  • 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(概念篇)
  • csproj 文件中那个空的 NuGetPackageImportStamp 是干什么的?
  • C#/.NET 中 Thread.Sleep(0), Task.Delay(0), Thread.Yield(), Task.Yield() 不同的执行效果和用法建议
  • WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)
  • 在 Visual Studio Code 中为代码片段(Code Snippets)添加快捷键
  • 在 Visual Studio 中使用 EditorConfig 统一代码风格(含原生与插件)
  • 在 Visual Studio Code 中添加自定义的代码片段
  • 用 dotTrace 进行性能分析时,Timeline 打不开?无法启动进程?也许你需要先开启系统性能计数器的访问权限
  • 时间复杂度分析经典问题——最大子序列和
  • CEF与代理
  • centos安装java运行环境jdk+tomcat
  • Java程序员幽默爆笑锦集
  • MobX
  • Mybatis初体验
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Quartz初级教程
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SpiderData 2019年2月23日 DApp数据排行榜
  • uva 10370 Above Average
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 巧用 TypeScript (一)
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微信小程序设置上一页数据
  • 一个项目push到多个远程Git仓库
  • Semaphore
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #laravel 通过手动安装依赖PHPExcel#
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • ()、[]、{}、(())、[[]]命令替换
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (SpringBoot)第二章:Spring创建和使用
  • (补)B+树一些思想
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十一)c52学习之旅-动态数码管
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (一一四)第九章编程练习
  • (译) 函数式 JS #1:简介
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ***监测系统的构建(chkrootkit )
  • .bat批处理出现中文乱码的情况
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划