团队代码中Bug太多怎么办?怎样稳步提高团队的代码质量
最近负责的Android APP项目,由于团队成员变动、界面改版导致代码大幅修改等原因,产品发布后屡屡出现BUG导致的程序崩溃。
经过对异常统计和代码走读,BUG主要集中在空指针引起的NullPointerException和RuntimeException异常,这也是Android项目中最容易导致崩溃的根源。
导致这些BUG的原因主要是:
1、对项目架构不熟悉,缺乏整体思考;
2、写代码逻辑不周密,思考不全面;
3、对代码的BUG和程序的稳定性重视不足;
4、项目较为复杂,多界面跳转、数据结构复杂等。
仅仅在每次发版前对代码review的方式已经保障不了产品的稳定性。
代码出BUG是人为的因素,但不应该仅在人身上找原因。好的架构设计以及制度和工具保障,才能根本降低代码BUG。并且能在团队成员变动的情况下,做到稳步提高团队的代码质量。
在实践中总结出以下几点:
1、加强对BUG的重视程度,不能抱有侥幸心理;
2、利用APP的移动统计工具(目前我们使用的是百度移动统计)对运行期间出现的BUG进行分析;
注:百度移动统计中的错误报告可定位到发生BUG的代码行,对BUG处理非常方便,在产品测试期间也可充分利用;
3、产品发布前对代码走读,尤其是对没有经验和没形成良好编程习惯的新手编写的代码;
4、把代码走读中出现的错误不仅要修改,更重要的是记入checklist系统,最终形成积累;
注:这点非常重要,根据以往经验,如果仅仅是修改了事,重复问题还会出现,也无法在团队成员中进行信息的分享。
目前还没有相关的工具,前期checklist可以用word或者excel,通过SVN共享。今天用1个小时写了个简单的checklist,更方便团队成员查看。
形成的checklist可以在代码走读时对照list检查,可以避免犯重复性错误,随着checklist的积累,团队的代码质量也会稳步提高。
5、制定代码规约并严格执行,违反的问题记入checklist;
总之可以归纳为分析+积累+分享,没有checklist的积累,仅仅依靠团队成员的经验积累,是非常不靠谱的。
我用的checklist也非常简单,一个添加页面、一个列表页面:
添加页:

列表页:

团队代码中Bug太多怎么办?怎样稳步提高团队的代码质量的更多相关文章
- Java基础学习总结(81)——如何尽可能的减少Java代码中bug
Java编程语言的人气自然无需质疑,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能. 不过在编写代码时,bug永远是困扰每一位从业者的头号难题.在今天的文章中, ...
- 如何解决代码中if…else 过多的问题
前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...
- 如何解决代码中if/else 过多的问题
前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...
- [翻译]:怎样从C/C++代码中对C#进行回调
声明:网络上类似的中文博客大有存在,本人知识水平有限,业余爱好,也是为了备份收藏How to make a callback to C# from C/C++ code 本着共享知识的初衷,翻译一份给 ...
- 使用Notepad++快速有效删除复制代码中的行号
转载:http://plum.0602.blog.163.com/blog/static/1130006502011101524120757/ 试了该方法,很好用! 为什么我把用Notepad++删除 ...
- 使用spring代码中控制事务
1.首先需要在代码中注入事务管理器 @Autowired private PlatformTransactionManager transactionManager; 2.代码中使用如下 public ...
- 【转】消除代码中的 if-else/switch-case
在很多时候,我们代码中会有很多分支,而且分支下面的代码又有一些复杂的逻辑,相信很多人都喜欢用 if-else/switch-case 去实现.做的不好的会直接把实现的代码放在 if-else/swit ...
- 在php代码中调用帝国cms头部变量temp.header的方法
在php代码中调用帝国cms头部变量temp.header的方法 代码如下: <?php require("../e/class/connect.php"); if(!def ...
- EffectiveJava(23)为什么不能在新生代码中使用原生态类型
泛型类和泛型接口 声明一个或者多个类型参数的类或者接口. 为什么不要在新代码中使用原生态类型 原生态类型,即泛型不带参数的类型 如List的list,list就是其原生态类型 1.使用原生态类型,插入 ...
随机推荐
- idea 普通文件夹 转换成 module
经常会遇到从GitHub上download的progect在idea里面打开是普通文件夹形式,而并不是我们想要的module形式(文件夹图标右下角有个蓝色的tag),那么如何快速转换成我们想要的mod ...
- Python3 函数参数
# # 常规参数 # def jiafa(a,b): # print(a+b) # # jiafa(5,6) # # # def xinxi(name,location,sex='male'): # ...
- python基础之IO模型
IO模型分类 五种IO Model blocking IO 阻塞IO nonblocking IO 非阻塞IO IO multiplexing IO多路复用 signal driven IO 信号驱动 ...
- 初步学习pg_control文件之十二
接前问,初步学习pg_control文件之十一,再来看下面这个 XLogRecPtr minRecoveryPoint; 看其注释: * minRecoveryPoint is updated to ...
- Linux:如何获取打开文件和文件描述符数量
一.linux的文件描述符 文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符.文件描述符是一 ...
- android 怎么判断activity 从哪里启动的
有时候,你想要知道,有一个activity 从哪里启动的.怎么才能知道呢? 1.前提是,androidstadio 你下载了源码.找到你的activityBase的实现类,在startActivity ...
- fiddler抓包-简单易操作(二)
Fiddler抓包简介 原理:fiddler是通过改写HTTP代理,客户端和服务器进行交互时,数据会从他那里通过,来监控和截取数据.我是这样理解的,如果不对,欢迎指正.如下图: 如果想要抓到数据包,首 ...
- 第三篇 Fiddler数据包分析
上一篇博文写完了Fiddler的配置,本篇讲讲如何用Fiddler进行数据包的分析,下图是抓到的数据包区域,对这些区域的可见字段进行解析如下, 以便了解这些字段的含义 1. 了解数据包区域的字段含义 ...
- 初识Django —Python API接口编程入门
初识Django —Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...
- Codeforces Round #345 Div.1 D.Zip-line 动态最长上升子序列
题意概述: 给出一个长度为N的序列和M组询问,问假设把某个位置的值改成另一个给出的值之后,序列的最长上升子序列的长度. N,M<=400000. 分析: 考虑某个位置的值改动后这个位置和最长上升 ...