多总结,多思考,多沟通是一种很好的工作方式。很多事情看似简单和随意,但将这些事情书写出来和在脑子里打转,对以后工作的effect factor是有很大差别的。于是,写下今天调试代码的心得。
调试的过程就是从现象追溯会源头的过程。关于现象的观察,可以使用强大的debug工具,也可以使用最原始的方法——打印出错信息。很多事情,我都是使用后一种。关于现象的观察,粒度有粗有细。比如,今天我调试一个程序时,需要检查程序的正确性,编写了一段测试代码。该代码中使用了绝对值函数abs()来计算error ratio。具体的计算方法如下:
(abs(real_value - expected_value) / expected_value) * 100%
检查结果发现error ratio有很大的误差。于是,我进行细粒度的观测,将abs去掉,观测error_ratio的正负值。观测结果是所有的real_value都大于expected_value。这就表明了real_value由于计算错误,将其值算大了。然后,检查源程序中涉及到计算real_value的代码。计算real_value的代码中有判断结构,首先要查看判断结构的中判断条件是否正确,尤其是边界值。如果正确,然后在查看判断结构内的循环结构的边界值。关于边界值的判断,我的经验是列出所有涉及到边界值的实例,然后one by one检测每个实例是否能够得到正确的结果。最后,检测顺序语句,顺序语句中容易出现变量名忘记更改的情况,这主要是由于编程时粘贴代码造成的。
编程时,尽量不出现完全雷同的代码,如下所示:
for i in range(0, NUM_TOWER):
sum = 0
for k in range (0, APP_CATE):
for j in range(0, MINUTE):
sum += Matrix_Down[k][i][j]
err = (sum - Matrix_Sum_Down[i])/Matrix_Sum_Down[i]
output_1.writelines('down err ratio is: ' + str(err) + '\n')
output_1.close()
for i in range(0, NUM_TOWER):
sum = 0
for k in range (0, APP_CATE):
for j in range(0, MINUTE):
sum += Matrix_Up[k][i][j]
err = (sum - Matrix_Sum_Up[i])/Matrix_Sum_Up[i]
output_2.writelines('up err ratio is: ' + str(err) + '\n')
output_2.close()
这种代码可以归并在一起,这不仅可以缩短代码的长度,提升代码的美感,增加易读性,更重要的是便于对程序进行扩展。