张银奎谈软件测试和软件调试

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

张银奎谈软件测试和软件调试

好的,我更愿意把自己介绍成为一个老的程序员,其实我是96年大学毕业,之后一直做软件开发。十几年下来,一下子从黑头发做到现在已经白头发了。但是这么多年下来,我还是始终很喜欢技术,只是在做不同的技术角色吧,做过编码,也做过系统测试,现在也做架构师,不管做那个具体的脚色,我都是还是很喜欢做技术的,就说软件这个技术。那其实今天我在上午的时候曾经提到,我好像是为软件而生的,确实是这样,比如说我感觉软件对我太重要了,整个生活中,或者整个生命中,这个软件都起到了很重要的角色,有的时候甚至想,离开了软件,我是不是就还能做什么。那目前其实主要是做一些架构设计,这样的工作,也关注一些软件新的技术方向。

其实我的书可以认为是我从事软件第一线奋斗13年,差不多13年后的一个技术方面的总结,就是软件调试可以说把整个涉及到我对技术的最好的一些总结,放在那本书里面,就是给同行看的,给程序员看的,主要是给开发者看的。那今天上午这门课呢,可以认为是我十几年的一种思想方法的总结,就说软件到了这么多年之后,除了技术之外的东西,其实还有很多是方法方面的,或者是软件过程方面的。那今天上午讲的可以认为是,我对软件工程或者软件方法学方面的一些感悟,比如说怎么来提高软件的可靠性,可测试性,可调试性。从比较根本的角度来说,提高软件的质量,保证软件的质量,是有关系的。

我觉得最欠缺的是我们的重视程度,在国内我们不缺少技术,技术的天才,尤其我发现80后的一批新成长起来的一些软件工程师,技术方面非常好,他们甚至对底层的理解也非常好。但是这批程序员我感觉是两极分化,一旦说对底层感兴趣的话,他们底层就了解的很深。如果对底层不感兴趣的,基本上只关心顶层。无论如何我觉得他们的技术方面都还是很不错的,但是我觉得最缺的是他们对一种思想上的认识,一种重视,对调试的重视。

其实越是资深的工程师,或者做了很多年软件之后,越感觉到调试的重要;越是比较年轻的一些程序员,可能还没有来得及深刻的思考调试的重要性,所以说回答刚才的问题,国内我觉得最缺少的是说一些年轻程序员在能够在做了一定的技术之后,对技术有一定比较深刻理解之后,回过头来再思考,自己在软件方面怎么能够更上一层楼,怎么从一些方法学上,或者是从一些根本上来解决一些提高自己的水平,使自己更上一个台阶了。因为不重视,那自然就不会做得太好,所以就说我们国内的软件,其实我觉得目前在支持测试、支持调试,支持这种持续改进方面,其实我觉得还是有比较大的差距的,当然我不排除我们国内的有些软件也做得也是挺好的。

这个观点我想引用一句话,那就是我们在国内的这个技术界,我觉得也有一些前辈。比如引用的这句话是毛德昌老师在写《Linux内核源代码情景分析》那本书的,他说过一句话,在那本书里,他说对软件的调试的重视是再重视也不过分的,如何重视也不过分的,我是

很同意这一点。我也是觉得我们这些年轻的程序员或者是在技术角度,觉得自己已经有一定技术的程序员,要开始用调试技术来进一步的武装自己,然后通过调试技术来持续地提高自己。这个话题很长,其实对调试,大家一直是持着一种争议的态度,也不排除我们有很资深的,在算法方面,造诣很深的,在软件领域造诣很深的一些,简单说一些牛人,他们在软件方面成就很大,但是老实说他们也有部分人,他们不是太重视调试,总觉得算法是最重要的,其他很多编码对语言的理解是更重要的,对调试不是那么重视。

但是我觉得这个是有历史的背景的,或者是说有这个大的前提的。其实这些人,他们在七八十年代成长起来的这些程序员,或者七八十年代这些老的程序员,他们当时面对的这个软件环境和我们今天还是差异非常大的。举个不太恰当的例子,求伯君前辈当初写WPS的时候,大部分模块都是用汇编语言写的,整个WPS这个软件,也很小,只有不到一张软盘,就可以装的下,这样的范围。那当时来说,就说软件很小的情况下,那么软件的复杂度比今天来说是低很多的,那这种对于低复杂度的这样的软件来说,我同意不太重视软件调试也可以把这样的软件做得比较好。但是今天已经不一样了,今天的我们的软件动辄几十兆,上百兆,对于一个典型的系统都是什么,几G的这样的一个系统。那对于这样一个复杂的系统,我认为是用传统的这种文档或者理解源代码已经很难理解透了,就是说今天软件的复杂度,超出了文档可以描述的能力。

所以这个时候,我就觉得软件调试变得更加重要,软件调试的好处就是说直击要害,你想理解那里,那里是个断点,你想理解哪个模块,哪个模块单独看一下它有哪些函数;想深入到某个函数内部可以做一些追踪,所以就说你可以直接在一个真实的上下文里面直接定位到你关心的那一部分,这个是读文档和读源代码都没办法达到的。因为读源代码我们可以看源代码,但是源代码尤其是今天的典型的源代码,都是几百兆的源代码,那像Windows操作系统可能都是上G的源代码,至于这样的源代码,你如果直接读源代码的话,是很难找到你比较关心的,或者找到一个函数。

尤其是今天C++写的代码,其实在读源代码的难度会更大,因为很复杂的这种多态、继承这种关系,你读的方法和实际执行的这个方法其实是有很大的差异的,我的意思是说,只有你在实际调试的时候,你才能直接理解到是一个真实的上下文,很具体的上下文。这时候你可以看函数之间的调用关系,一些类之间的这种相互的协作的关系,当时的这种具体的整个软件的一个真实的运行环境,使你可以理解到一个很真实的一个系统,可以说很快速的理解一个真实的运行情况。所以我就觉得今天的程序员我的建议是说,慢慢的要用调试来武装自己,来适应这种日益复杂的软件环境。

这句话我觉得要稍微纠正一下,如果这样说出去可能很多人要拍

砖。因为软件开发毕竟是,还是涉及到很多方法,要涉及算法,要实现算法,最后才是调试,这个我更同意国内超级解霸的作者,梁肇新先生说的那句话,他说好的软件都是调试出来的,也就是说这句话和刚才那句话是有相近的意思,但是还是不太一样。我更同意这个梁肇新博士说的这句话,就好的软件都是调试出来的,意思是说,一个程序员写完代码,你不经过调试,最后代码就丢出去了,或者以后就发布到产品里面去了,这事情可能是很冒险的一件事情。尤其就像我前面讲到的,今天的软件和以前的软件不一样了,今天的软件实际的运行环境太复杂,也就是说我们典型的一个这样的一个进程,那进程内其实在实际运行的时候和开发者的这个环境是有很大差异的,里面可能有很多第三方的模块会插入到这个进程里面。

那其实说会有很多预料不到的情况,所以就说,一定要最好是在一个比较真实的环境下,做一些调试,做一些跟踪,这时候你才知道自己的代码实际的运行是怎么运行的,在一个实际的情况下指令运行。来进一步精化自己的设计,精化自己的这个算法的实现,然后增强自己算法,加入更多的这种容错的机制,灵活性。所以说确实我很同意梁肇新博士说的话,好的软件是调试出来的,每个程序员应该认真调试自己的代码,应该成为软件开发的一个重要部分。

这个问题很好。坦率说,测试和调试肯定是不一样的,测试主要的目标还是为了发现瑕疵,调试的目标是为了定位瑕疵的根源,简单来说,二者分别是这样的。但是他们总的来说目标又是一样的,都是

相关文档
最新文档