最近负责的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太多怎么办?怎样稳步提高团队的代码质量的更多相关文章

  1. Java基础学习总结(81)——如何尽可能的减少Java代码中bug

    Java编程语言的人气自然无需质疑,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能. 不过在编写代码时,bug永远是困扰每一位从业者的头号难题.在今天的文章中, ...

  2. 如何解决代码中if…else 过多的问题

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  3. 如何解决代码中if/else 过多的问题

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  4. [翻译]:怎样从C/C++代码中对C#进行回调

    声明:网络上类似的中文博客大有存在,本人知识水平有限,业余爱好,也是为了备份收藏How to make a callback to C# from C/C++ code 本着共享知识的初衷,翻译一份给 ...

  5. 使用Notepad++快速有效删除复制代码中的行号

    转载:http://plum.0602.blog.163.com/blog/static/1130006502011101524120757/ 试了该方法,很好用! 为什么我把用Notepad++删除 ...

  6. 使用spring代码中控制事务

    1.首先需要在代码中注入事务管理器 @Autowired private PlatformTransactionManager transactionManager; 2.代码中使用如下 public ...

  7. 【转】消除代码中的 if-else/switch-case

    在很多时候,我们代码中会有很多分支,而且分支下面的代码又有一些复杂的逻辑,相信很多人都喜欢用 if-else/switch-case 去实现.做的不好的会直接把实现的代码放在 if-else/swit ...

  8. 在php代码中调用帝国cms头部变量temp.header的方法

    在php代码中调用帝国cms头部变量temp.header的方法 代码如下: <?php require("../e/class/connect.php"); if(!def ...

  9. EffectiveJava(23)为什么不能在新生代码中使用原生态类型

    泛型类和泛型接口 声明一个或者多个类型参数的类或者接口. 为什么不要在新代码中使用原生态类型 原生态类型,即泛型不带参数的类型 如List的list,list就是其原生态类型 1.使用原生态类型,插入 ...

随机推荐

  1. 算法竞赛入门经典-1.5.4 Q&A

    这小节考察实践能力,要求在不要查书.不要网上找答案,自己用实验的方法解决以下五个问题: 做这五道题时,好几道都没思路,违反了规则到网上找了一圈,居然没找到答案,于是打算写这篇博客.不知是否有更好的实践 ...

  2. IO复用——poll系统调用

    1.poll函数 #include<poll.h> int poll(struct pollfd* fds, nfds_t ndfs, int timeout) poll函数在一定的时间内 ...

  3. 微信公众号--JS-SDK

    JS-SDK 微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以 ...

  4. C++ vector二维数组

    C++ 构建二维动态数组 int **p; p = ]; //注意,int*[10]表示一个有10个元素的指针数组 ; i < ; ++i) { p[i] = ]; } 这样就构成10*5的数组 ...

  5. scrapy编写爬虫的时候出现缺少win32api

    环境:python3.6 工具:pycharm2017.3 scrapy fetch http://www.baidu.com ModuleNotFoundError: No module named ...

  6. 初步学习pg_control文件之十三

    接前文,初步学习pg_control文件之十二 看这个: * backupStartPoint is the redo pointer of the backup start checkpoint, ...

  7. P1823 音乐会的等待(单调栈)

    P1823 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么 ...

  8. 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库

    我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...

  9. Windows2008新建域时Administrator 帐户密码不符合要求

             Windows 2008 系统安装完毕后,(环境:在安装的时间,系统没有设置密码.做好系统后,进入制面板添加了密码或按ctrl + alt + del 设置密码后 在服务器管理-角色 ...

  10. 圣思源Java视频36节练习源码分享(自己的190+行代码对比老师的39行代码)

    题目: * 随机生成50个数字(整数),每个数字范围是[10,50],统计每个数字出现的次数 * 以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来, * 如果某个数字出现次数为0, ...