一个新人如何学习在大型系统中添加新功能和Debug

文章背景:

  今年七月份正式入职,公司主营ERP软件,楼主所在的组主要负责二次开发,使用的语言是Java。

  什么叫二次开发呢?ERP软件的客户都是企业。而这些企业之间的情况都有所不同,一套标准版本的企业资源管理系统必然难以百分之一百地满足每一家公司的所有要求。所以,在客户提出需求之后,程序员对系统进行增减修改,这就是二次开发。

  另外,我们组还负责修复客户报上来的各种漏洞。

学会如何添加新模块新功能

  为什么说从头到尾只看代码是不可行的?
  基本上,财务系统跨越的年限都会有十几二十年,代码数千万级别,更迭的版本多达十几个,更重要的是,连一份设计说明文档或者技术说明文档都没有。光看代码,根本就不可能准确地知道每一个类都是做什么的用的,类里面的方法是如何被调用,数据时如何流转处理的。

  光靠猜,根本不可能猜出来。

  熟悉代码的一个好方法就是做一个简单的新模块

  以一个最简单的系统登录界面为例子(见上图),现在就来做一个练习:要求建立一个新的页面,把“物流管理系统”六个字改为“人事管理系统”,把“账号”改为“用户名”,把“密码”标签和栏位去掉,用户名正确即可直接登录。

  代码都是现成了,直接新建相应的文件并且复制粘贴就行,再根据需求做更改。完成若干个这样的练习之后,就可以了解每个标签和栏位的作用,这是最快捷的方法。另外,我建议在看代码的同时写注释,有助于巩固记忆和加深理解。

  复杂的功能要用到断点

  如果把需求改为添加一个并不简单的功能呢?有的时候,我们可能不需要一个现成模块的所有内容和功能,只是把其中一个功能移植到另外一个模块当中去,显然是不可以简单粗暴地把所有的代码都复制过去,可是我们又不知道这个功能设计到哪些代码块,要怎么办呢?

  这个时候,我们要用到断点(Break Point)调试。

  如何添加断点,我这里就不赘述了,网上的教程一大把。如果有需要的话,我过几天找几篇好的综合一下给大家贴出来。

  在调试的过程中,可以很轻松知道哪些方法牵涉其中,一一标记即可。

谈谈如何debug
  首先,你要确定这到底是不是一个bug

  一天,网管小明被一个上网的客人叫过去,说自己的QQ被盗了,肯定是在网吧的电脑中病毒害的,要求他负责。小明面无表情地按了一下键盘上的Caps Lock(大写锁定),然后让客人再输一次密码。然后,登陆成功。

  上面举的这个例子是常识性的问题,但是很多时候用户犯的错误恰好是对系统的陌生,或者对业务知识的不熟悉。例如下面这么一个例子。前几天接到这么一个bug:用户要做一个付款单据,在付款单据页面中却读取不到。

  这时候,如果我对这一个业务知识点不熟悉,很可能会先去查数据库,看是不是数据丢失了,或者是代码的问题,某一个筛选条件设错了。可当时我的第一反应就是,会不会他已经对该张欠款单做过付款单了?(ps:可以这么理解,一张欠款单已经做过了对应的付款单,意味着你们公司已经给对方付过钱了,不可能再付一次)

  结果到他们的系统一看,果然如此。

  在基本确定是一个漏洞之后,你最好能够在本地系统中重视这个故障

  因为用户的系统都在使用当中,其中的数据也非常重要(分分钟几十万上下,出了问题码农搬十辈子砖都担不起),所以没办法任意地在用户的系统中做测试和验证。所以,你做好能够在本地系统中重视这个故障。

  另外,在本地重视故障的过程中,你也会对这个故障发生的条件有一个更为全面的了解。例子:假设一天用户过来跟你说,他有这么一个瞬间,看太阳是绿色的,你就向他询问具体情况,以便重现。他告诉你说他昨天下午五点的抬头以仰角四十五度看太阳是绿色的,而且之前还连续看了三个小时的岛国爱情动作教育片。这个时候你就可以用同样的条件一试。如果试成功了,说明条件基本完全,如果不成功,还可以继续询问客户还是不是有其他的情况。

  判断可能的方向,利用BreakPoint逐步缩小范围

  在确定了客户所报上来的故障基本情况之后其实基本就可以知道bug可能的方向。例如前几天我接到了一个bug,说用户一直在用一个功能,平时都没事,知道周二那天下午突然就不行了。

  查了相关的更新记录,那天并没有其他的同事对这个客户的代码进行更新,所以问题很有可能出现在数据库。后来发现,果然是用户做的一张单据的数量超过了系统限制,印发某个存储过程发生错误。

  如果是代码方面的问题,我们可以用前面所讲过的断点测试逐步缩小可疑的范围,找到问题所在。例如一个数据发生了错误,我们可以从跟数据库交互的方法开始查看,直到最后显示数据的方法为止。参数传递过程中,可能中间经历了几个十几个,甚至几十个的方法,使用半分法设置断点就能够快速地定位问题的所在。

  做完整的测试,证明自己的修复方案是正确可行的
  一般来说,如果被一个bug纠缠了好几天,一旦找到了问题所在一定会高兴得要死,恨不得从椅子上跳起来。可这个时候,程序员们在欣喜之余要保持足够的冷静,因为你并不一定找到全部的答案,甚至根本就没有找到答案。

  不止一次,我觉得我已经可以修复这个漏洞了,可当我以书面的形式提交修复方案的时候,总觉得不够有说服力,老大看到之后肯定会有所质疑。所以又缓了缓,再想了想,发现自己离发现问题的根本原因还差得远,更别提能够给出一个合理的解决方法。

  所以我建议大家必须要在修复bug之后做完整的测试,直到证明自己的修复方案的确是完完全全地解决了问题,并且没有引入新的问题为止。

最后说几句题外话

  好久没有写技术博客了。

  正式上班其实也不算很忙,港资企业(深圳分公司)本来就节奏不快,再加上又不是互联网行业,加班几乎也就是意思意思,基本六点左右就可以走人。不过再怎样也没有在学校里面这么闲,所以前阵子就光忙着应付公司的培训,顾不上来博客园。最近总算开始适应了工作的方方面面,抽出空来写这篇文章,给自己前三个月做一个工作总结。

  我有一个公众账号“华工小y”,每天都会分享自己工作的点点滴滴,以及业余爱好的林林种种,感兴趣的朋友可以关注一下。下面这条链接,是我前两天写的一篇文章,可以看一看。

  http://mp.weixin.qq.com/s?__biz=MjM5OTM5MTkxMw==&mid=200944770&idx=1&sn=1e563849010fa5365f3c9b4dd982a149#rd

(如果觉得这篇文章对你有帮助,可以轻轻点击下方的“推荐”按钮,同时也期待你的评论与楼主进行交流)

时间: 2024-10-13 00:54:59

一个新人如何学习在大型系统中添加新功能和Debug的相关文章

Android系统中添加一个产品----图文详解

本文本着开源的精神介绍如何向一个Android系统中添加一个产品的整个过程,按照以下过程笔者有理由相信每个将要从事本行业的人都可以完成,其实添加一个产品并不难,难的是对其相关硬件的修改,好了废话不多说. 首先我们要创建一个属于自己产品的目录,这里以WY_device为例,以WY作为产品的名字. 首先从已经存在的产品中拷贝一个以产品的名字为名的.mk文件,修改为自己的.mk文件,在这里为WY.mk 对其进行如下的修改: 然后添加AndroidProducts.mk  这是添加产品的配置文件名路径,

debian 64位系统中添加对32位的支持

dpkg --add-architecture i386 apt-get update apt-get install ia32-libs debian 64位系统中添加对32位的支持,布布扣,bubuko.com

VMWARE虚拟机系统中增加新的虚拟硬盘

VMWARE虚拟机系统中增加新的虚拟硬盘1.Vmware中增加虚拟磁盘 2.通过dmesg查看新增加硬盘的设备号启动虚拟机,通过终端获取新加硬盘设备的设备号 #dmesg|grep sdb(查看新添加的硬盘的设备号,一般为sdx或者hdx,通过查看容量,确认所找到的硬盘是新加的硬盘) 3.fdisk /dev/sdb(假设新加的硬盘为sdb)#mkfs.ext4 /dev/sdb1#mkdir /data#mount /dev/sdb1 /data 4.让系统启动的时候自动挂载新的硬盘挂载方法:

详解VMware 虚拟机中添加新硬盘的方法

一.VMware新增磁盘的设置步骤 (建议:在设置虚拟的时候,不要运行虚拟机的系统,不然添加了新的虚拟磁盘则要重启虚拟机) 1.选择“VM”----“设置”并打开,将光标定位在“硬盘(SCSI)”这一选项,然后点击下方的“添加”按钮 2.点击下一步,执行下一个步骤 3.选择磁盘类型 4.根据提示,创建一个虚拟的磁盘,并点击下一步 5.设置磁盘大小,点击下一步 6.选择存储位置,最后点击完成 以下是对虚拟机中Linux和widows中对于新的虚拟磁盘的挂载的方式的介绍 二.虚拟机中windows对

MFC中添加新的对话框

MFC工程中,除了系统自动生成的一些对话框之外,还需要根据自己的需求,添加新的对话框.这里总结下自己最近使用的方法. 首先,找到Resource View中自己新建的工程,然后右键,选择Add Class,然后弹出的对话框中对新增的类进行设置,在Base Class需要选择CDialog,然后输入新增类的名称之后,就新增了一个类.这个类不仅有对应的头文件还有.cpp文件,以及一个与这个类对应的UI界面. 然后,需要将新增的类对应的头文件包含到它对应的父类的头文件中,同时在protected域中声

在ubuntu中添加新硬盘

在ubuntu中添加新硬盘 转载于 http://www.cnblogs.com/unipower/archive/2009/03/08/1406230.html 前言 安装新硬盘这种事情并不会经常,发生同样它也并不复杂.本文将向你说明如何在现有的Ubuntu系统下安装一个新硬盘,并为它设置好分区然后使用它.在动手之前,你需要先考虑下面三个关于新硬盘使用方面的问题: 该硬盘是否只会在Ubuntu下使用? 该硬盘是否要被Ubuntu和windows两类系统使用? 你打算如何分区,是全部空间作一个个

SQLSERVER2014中的新功能

SQLSERVER2014中的新功能 转载自:http://blog.csdn.net/maco_wang/article/details/22701087 博客人物:maco_wang SQLSERVER方向MVP.MSDN论坛版主 红色标记的为本人认为的重点功能 1.内存优化表    内存中 OLTP 是一种内存优化的数据库引擎,它集成到 SQL Server 引擎中.    内存中 OLTP 已针对 OLTP 进行优化.对于内存中 OLTP 支持的 Transact-SQL 外围应用存在很

如何在github的wiki中添加新的图片

本文简单介绍在github的wiki中添加新的图片对方法 在github的wiki中,可以展现图片,可是,怎么添加图片,从网页上展示的信息来看,不是很清楚. 添加图片,基本上就是通过下面几步来完成: 1. clone wiki 2.创建图片目录 3.在图片目录中添加图片 4.在wiki中引用图片 具体操作步骤如下: 1. clone wiki git clone https://github.com/xx/xx.wiki.git 该url可以从clone this wiki locally 拿到

如何在iOS开发中添加新的字体

iOS 开发默认字体是 Heiti SC ,即我们常用的「黑体-简」 用过一段时间后,就会发现字体过于单调了 ,那么怎么在iOS开发中添加新的字体呢 ,这里教你两种方法. 1.使用系统自带的字体 搜索fonts,不难发现,系统中是有不少字体的,而这些字体也是都是可以使用的. 这些字体只用时可以通过代码来设置,也可以直接来设置,方法很简单: 将text的属性设置为Attributed,再选择自己想要的系统字体就OK啦 2.使用自己从网上下载的字体 首先从网上下载自己喜欢的字体,将下载好的字体拖入当