[置顶] 你的灯还亮着吗?》

你的灯还亮着吗?》一书中写道:
当你为了寻找解决问题的方法而累得筋疲力尽时,不妨向后看看,看看你是不是已经迷路了?你的问题究竟是什么?





2005.01.29  增补:

QUOTE:

节选自 http://wiki.perlchina.org/main/show/brian%27s+Guide+to+Solving+Any+Perl+Problem
当你的程序碰到了问题时,请试着按照下面的思路处理一下:

这是个人问题

别老想着是你的代码。你可能觉得自己是个艺术家,但实际上就算是经验丰富的大师也会写出很多垃圾。每个人的代码都是垃圾,我的也是你的也是。要学着去喜欢它。当你碰到问题的时候,你应该想:噢,我写的垃圾代码出了点问题。这说明你不再去责怪Perl。不应该变成个人性的问题。

个人责任感

如果你的代码出了问题,那仅仅是————的问题。你应该尽最大的力量自己解决。记住,每个人都有自己的代码,每个人都有自己的问题。自己的作业自己做,在麻烦别人之前先尽自己最大的努力。如果你老老实实地按照这个指南做了所有能做的事之后,依然不能解决问题,那么你已经尽力了,应该找别人来看看。

改变你做事的方法

改正之后不要再犯同样的错误。很可能是你写代码的方法错了,而不是你写的代码错了。改变你以前做事的方法,让生活更容易些。不要指望Perl来习惯你,因为这是不可能的。你要习惯Perl。它只是种语言,而不是种生活方式。

解决第一个问题先!

你从Perl中得到警告或者错误信息之后,先解决第一个,然后看Perl是否依旧报出其他错误。因为后续的错误很可能是由于第一个错误衍生而来的。

检查错误信息行号之前的代码!

Perl在错误已经发生的时候才报错,而不是在此之前。因此当Perl报出行号时错误已经发生了,而出错的地方是在这之前。看看错误行号之前的代码和表达式是否有问题。

那个变量值是你想的那样吗?

不要乱猜!在表达式中使用某个值的时候先检查它是否正确。世界上最好的调试器就是print

print STDERR "The value is [$value]/n";

我用括号括住$value的原因是因为这样我可以看见开头和尾巴上是否有空格或者换行。
如果打印出来的结果不是你所期望的,那么移到前面几句,再来!找到这个值最后正确的位置。

你用的函数是正确的吗?

我写perl程序的时间已经不短了,可我还是几乎每天都要查perlfunc。有些东西我就是吃不准,而有时候我太缺乏睡眠了以至于没了常识,然后总搞不懂为什么sprintf()不打印到屏幕上。

你用小脚本测试过了吗?

如果你在尝试新的东西,或者觉得某一小段代码很奇怪,你可以写一个最短的程序运行一下这一个片断。这个方法把所有其他的因素都排除在外。如果测试没有问题,那说明问题可能不在这段代码里面。如果测试结果不对,那你大概就找到了你的问题所在。

你检查环境了吗?

有些东西是依赖环境变量的。你确定你的环境变量都是对的吗?程序运行的时候用到的环境变量是你现在看到的环境变量吗?记住有些CGI程序或长时间运行的程序可能用到的环境变量和你在shell里看到的不一样,尤其是在不同的机器上的时候。

Perl讲环境变量存储在%ENV里。如果你需要某个环境变量,就算是在测试的时候,也记住先提供一个默认值,如果它原来不存在的话。

你试过Google了吗?

你碰到一个问题的时候,说不定其他人也碰到过同样的。用Google Groupshttp://groups.google.com)搜索看看是不是有人在comp.lang.perl.misc上贴过什么。在新闻组里问问题的人和回答问题的人的差别在于,他们使用Google Groups的能力高底不同。

你和小熊说话了吗?

把你的问题大声说出来。把它变成语言。有几年我很愉快地和一个很优秀的程序员一起工作,他几乎能解决任何问题。当我被什么问题堵住的时候,我总去请教他,跟他解释我的问题。几乎每次都是这样的情况:我说不到第三句,就停下来,说:噢我明白了,没问题了。他每次也都是这样。

你可能需要做太多次这样的事情,所以我推荐拿一个长毛绒玩具做为你的Perl临床诊断家,这样你就不会惹怒你的同事了。我的桌子旁边就有一只小熊,我每次都把我的问题解释给他听。每次当我自言自语的时候,我女朋友跟本都不会注意,她习惯了。

你认真检查自己了吗?

如果到了这一步你还没有解决的话,这说不定是个心理问题。可能你对某段代码有特别的感情,所以不想改掉它。说不定你觉得只有你是对的,别人都错了。当你有这种感觉的时候,你没有认真考虑bug的最大来源——你自己。不要放过任何东西,保证它们全都是对的。

你可能感兴趣的:([置顶] 你的灯还亮着吗?》)