这周准备下一个QA测试的版本,把版本发到测试环境就开始发现各种问题,修修补补搞了一周,总算告一段落了。
 
分析一下几个bug的问题,都集中在程序模块的整合中。一个模块的一个小的修改,造成另一个模块的连锁反应。这种bug在排查的时候非常花时间,因为往往程序出错和报错的地方并不是程序真正错的地方,对着本来就没有问题的代码一遍一遍的看是看不出来问题的。这次我们最后解决问题,用了一个笨办法。我们把从上一个版本到现在的有关的commit都看了一遍,最后在一个很不起眼的地方找到了问题。
 
在retro过程中,和同事讨论了一下以后如何减少这种bug的出现。
 
首先,当这种bug出现的时候,我们不应该纠结于我们认为问题在的地方。特别是当自己不确定的时候,我们最好找个同事一起来看。如果两个人四双眼睛半个小时都看不出来问题,这就很有可能是因为方向错了。这个时候,跳出来换个思路可能是更好的选择。
 
第二,因为单元测试已经把上下文的环境都固定了, 这种bug单元测试对它是无效的。回看这周遇到的bug,每个代码修改都有充足的单元测试,但是这些单元测试从假设就搞错了。对于这种bug,我们更需要有上下文的集成测试。写好和维护好集成测试是一个很大的工程,但是对发现这种跨模块的问题会很有帮助。同时,可以考虑使用一些BDD的测试框架,这些框架经过包装可以让QA对很多测试自动化。当有新同事的时候,让他们从集成测试中开始了解系统,也是很好的选择。
 
最后,我们在软件的设计和开发中还应该注意什么呢?通过对这几个bug的分析,我们认为代码在最初的设计中使用了很多继承来提高重用性,避免重复开发。这些代码经历了4,5年一代一代的程序员,现在已经过于臃肿了,很多最初的设计考虑也在人事更替中慢慢消失了。当一些代码进入维护期的时候,我们更希望它们小而精,这样的代码更加便于维护,也就更加容易修改,而更有生命力。相反,这种在当初强调高重用而设计的大而全的代码,反而非常难以修改,面对一个1500行的class,我们几个人经过讨论,最终决定推倒重建。 

最新文章

  1. 【转】浅谈JavaScript、ES5、ES6
  2. phpMoadmin CVE-2015-2208 远程代码执行漏洞分析
  3. 将csv文件读入数据库
  4. android 布局优化常用技巧
  5. (旧)子数涵数·C语言——条件语句
  6. [LeetCode] Regular Expression Matching(递归)
  7. rsync传输性能测试总结 转
  8. js的选择星级评分插件
  9. leetcode 95 Unique Binary Search Trees II ----- java
  10. 非常非常好!写了好久 k-th-smallest-in-lexicographical-order
  11. 【学习笔记】【C语言】算术运算
  12. 一个 XSD 实例
  13. Wince6 RIL层移植
  14. Java网络编程:利用apache的HttpClient包进行http操作
  15. BootstrapQ 包Bootstrap tree,dialog等待
  16. VMware Workstation 12 Pro 之安装林耐斯优麒麟 X64系统
  17. 【java】聊聊java里的接口
  18. 关键字voltale
  19. Nodejs 菜鸟教程学习-创建第一个应用
  20. delphi判断线程是否正在运行

热门文章

  1. day10 消息队列,多进程和多线程以及协程,异步IO,事件驱动等
  2. jmter+ANT+jekins之配置文件简单优化(build.xml)
  3. 内置函数,重要的四个reduce,map,lambda,filter
  4. 使用jQuery ui创建模态表单
  5. CentOS6.4编译Hadoop-2.4.0
  6. python 模块初识
  7. 深入学习之mysql(五)连接查询
  8. 【译】从现有的容器里创建新的Docker镜像
  9. BZOJ2141&洛谷1975 排队 【线段树套treap】
  10. Linux系统——机制策略(一)