程序维护的时候经常遇到两个困难:

1、不知道这段代码是实现什么功能的(code —— function);
2、不知道这个功能是实现什么需求的(function —— business)。

解决第一个问题是比较容易的,大家都是搞技术的,一头扎进代码里去,看上几十分钟,通常就能明白:原来这段代码是从数据库里面找到前三个月一直处于停机状态的号码,然后把这些号码放到一个叫做QUIT_USER的数据表里面去。

第二个问题就难了,经常从代码中是看不出来的,于是项目开发的过程中就制造出来了大量的文档,来帮助开发者交流这个问题,也让将来维护这段代码的人知道这个知识。

我们可以查找与这段代码相关的文档,文档上说:这段代码把停机三个月的号码放到一个叫做QUIT_USER的表里面,一个月以后,这些号码由另外一段代码拿去筛一下,把最近刚交了费用的号码删掉,剩下的用户做退网,号码回收,冻结半年以后可以重新使用。

令人难过的是,维护程序的人很难有幸看到如此贴心的文档。他们查了半天经常看到的是:这段代码按照xxx的规则,从xxx表中查询数据,然后再把结果的数据经过xxx的处理,放到QUIT_USER表里面,over。你仍然不知道他到底是在做什么。

并且,文档与代码的同步也是一个难题。不仅是文档,即使是代码中的注释,谁又能保证他真实的描述了系统的运行方式呢?时间紧张、错误的理解都可能造成文档与实际情况不同。我们假定写文档和写注释的人是认真的、不犯错误的,他们也必须忽略一些细节,他们不能什么都写上去。而他们忽略的细节很有可能为以后的维护带来麻烦。

很多项目都有这个问题:business和function是脱节的。熟悉客户业务的人设计出一系列的功能点,这些功能点按照最初的设计是可以完成客户的业务的。然后这些功能点就拿到开发人员那里去造出来。而开发人员对用户的business其实是不了解的,他们的眼中只有function。到了维护的时候,business发生了变化,function重新设计。经常是经过一番修改,程序按照开发人员的思路运行良好,但是用户却一个劲的摇头:“不不,不是这样的,我们要的是这个……”程序到底解决了哪些business,已经成了一个迷。

什么东西可以最准确的描述程序的运行过程呢?只有代码本身。并且,经过精心设计的代码也能很好的对business进行描述。比如刚才说的那件事情,一段代码把号码放到QUIT_USER里面,另一段代码从这里面筛除一些号码做退网。这两个function其实在business方面都属于一个点,那么就应该让这两段代码写在一起,封装起来——这就是高内聚。并且这一段代码内部的操作应该与其他的功能没有任何关系,除非那个功能与这两个功能具有business上的共同点,别的代码应该不知道QUIT_USER是个什么东西——这就是低耦合。

一个项目的代码,总是由大尺度的构思开始的,然后越来越贴近细节,牵涉越来越多的技术。但是写到最后,代码应该回到对business本身的描述。代码越贴近business,对维护的帮助就越大。

我现在要维护一个公司的财务管理程序,我想知道职员的工资里面是不是已经计入了他们的个人所得税。我找到Account(会计),他应该有一个方法,每个月运行一次,把Salery发给Emplyee,我找到这个Salery,看到里面已经包含了Tax。我发现Account计算这个Tax的时候使用了一个Stratagy(策略)。他调用的是一个名叫Stratagy1998的策略,以800元作为基数计算个人所得税。现在这个基数已经发生了变化,于是我修改这个Stratagy1998、或者替换掉一个新的Stratagy2005。这样就完成了一次变更。并且我知道这样修改不可能影响到business不相关的东西。

文档永远只能表示“某时某刻我们曾经这样想过”,让文档时刻保持与代码的同步是不实际的。要想知道“现在程序是怎样运行的”,只有代码能够告诉我们。文档应该配合代码,做代码不能做的事情,配合把business说清楚。而不应该与代码发生冲突。

文档应该去描述代码无法说清楚的事情上,比如用户的工作场景、某个需求是由谁提出来的、大尺度的程序设计、重要对象的运行时序、系统安装手册。比如下面这个图,他清楚的说明了“销户”这个行为在整体的需求中处于什么地位。这样的东西用代码说清楚是比较费力的。当然用代码也能说清楚,比如可以使用State - Action模式,但是总归不如一张图表示的这么清楚。

XP和Agile方法所提倡的“尽量少写文档”,就是基于这样一种设计理念:尽量的用代码和测试代码来描述business,以达到知识的交流和维护的便利。代码是最重要的沟通语言。在代码说不清楚的情况下,文档也是必须的。

无痛苦的软件维护——文档和代码相关推荐

  1. 如何真正实现无提示保存Excel文档

    要想取消Excel文档的保存提示,从而实现文档的自动保存,应该从两个方面加以考虑,一是设置ThisWorkBook.Saved属性,当此属性为True时,Excel会认为该文档已被保存过,因此不会弹出 ...

  2. Java DOC 转换给 PDF 格式文档的代码

    工作过程,把写代码过程经常用的代码片段备份一次,下面的代码段是关于Java DOC 转换给 PDF 格式文档的代码,应该对码农们有所用. import java.io.File; import jav ...

  3. html文档支持代码高亮,为HTML中的代码添加语法高亮

    Hexo 默认对于代码高亮的处理过于粗暴,改变了其原有的 标签形式,而且并没有达到良好的效果,所以尝试自己添加语法高亮功能.此文档也适用于其它HTML文档中代码的语法高亮显示. 我这里使用highli ...

  4. 关于Typora编辑器编写markdown文档的代码块出现前字吞后字的解决方法

    关于Typora编辑器编写markdown文档的代码块出现前字吞后字的解决方法 最近使用Typora编辑器编写markdown文档的代码块出现前字吞后字的情况,结果我在网上并未搜到什么解决方法(或者并 ...

  5. 用平静的心去看文档读代码!

    我发现了很严重的问题,如果心不静下来,你对文档和代码的理解能力将会大打折扣.我就是那种心都静不下来的那种,以前看mui框架和weui框架觉得他们的jquery怎么这么晦涩难懂,说的是人话么.这就是我心 ...

  6. mras模型参考自适应无位置 可提供文档说明PMSM永磁电机

    mras模型参考自适应无位置 可提供文档说明PMSM永磁电机

  7. Jenkins 插件文档即代码:将文档迁移到 GitH​ub

    在2019年9月,我们宣布了对 GitHub 作为 Jenkins 插件站点文档来源的支持.感谢 Zbynek Konecny 和 Olivier Vernin 以及其他贡献者, 现在可以将插件文档直 ...

  8. Java基础文档,图文并茂+代码实例

    写在前面: 本文为本人在期末复习时临时撰写的java复习文档,其中引用的他人内容均已添加链接.吐血整理数万字+数十张图片+示例代码,希望本文能对你有所帮助. 1.java概述 一次编程,到处运行 .j ...

  9. Java入门day08(帮助文档、代码块、继承)

    1.如何制作帮助文档 个人理解:写一个功能类,然后对其解释说明 注意该功能类必须用public修饰,否则会报错 ​ 如class ArrayTools ​ javadoc: 错误 - 找不到可以文档化 ...

最新文章

  1. CSS3 Media Queries:移动 Web 的完美开端
  2. python数字加密解密_Python对整形数字进行加密和解密
  3. Ubuntu18.04安装Gaussian16和GaussView 6
  4. awaitUntil() 方法的使用
  5. Ubuntu下配置samba实现文件夹共享
  6. des加密算法python代码_python des加密算法代码(pydes模块加密)
  7. 出人意料的生日会400字_出人意料的有效遗传方法进行特征选择
  8. datatable使用_使用Streamlit从简单的Python脚本创建交互式WebApp
  9. 最早的齿轮计算机,世界最古老“计算机”出土后110年,科学家终于解开它的秘密...
  10. 用O(1)的时间复杂度删除单链表中的某个节点
  11. cogs 167. [USACO Mar07] 月度花费
  12. nginx 多php项目配置文件,nginx 配置文件配置多个站点
  13. [ETL] Flume 理论与demo(Taildir Source Hdfs Sink)
  14. ListView若干点
  15. 爬虫学习之抓取今日头条街拍美图
  16. 物联网云平台的远程管理
  17. 京郊经典路线之香八拉反穿游记
  18. Win10你需要提供管理员权限才能复制到此文件
  19. C语言 推箱子游戏 地图编辑器(简单)
  20. mysql的LRU队列详解

热门文章

  1. lpsolve java_如何使用LpSolve在R中设置线性编程优化?
  2. P3919 【模板】可持久化数组(可持久化线段树/平衡树)(入门第一题)
  3. STM32之AHB与APB总线
  4. java中流关闭如何打开_关于java中流关闭的问题
  5. linux 安装docker
  6. python全屏模式 spider_我可以使用PIL以全屏模式显示图像吗?
  7. mysql和oracle用户管理_五种Oracle用户的授权与管理
  8. 如何用python分析大数据_Twitter数据挖掘:如何使用Python分析大数据
  9. Vue实现一个按钮切换显示不同的div内容
  10. 关于Navicat 连接mysql报11001错误