优秀程序员编写可调试的代码

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

screenshot

所有的程序都需要某种形式的日志记录建立在它们之上,以便我们可以观察到它正在做什么。这尤其在程序出错时就显得非常重要。一个优秀的程序员和一个糟糕的程序员之间的一个不同之处是一个优秀的程序员会增加日志或其他工具以便在程序失败时方便调试。

当程序如同预期的一样工作时,有日志和没日志往往没什么差异。然而,一旦程序失败,或你得到一个错误的结果的时候,你会立即明白优秀的程序员和糟糕的程序员之间的差别。

例1:“让我们做一个可调试的版本”

比如说,测试关于一个不能正常工作的调用case过来找我。我们查看了日志,然后发现问题貌似出在一个相邻的模块。对其他模块的调用返回值为 空。然后我们在那个相邻的模块中做了日志记录,重新跑了一遍测试case,却没有得到任何更多的有用信息。没有任何线索表明为什么会返回空 -难道是我们下错了参数,或者是某个外部系统导致的失败,那个相邻的模块中是不是存在一个错误,又或者?

当我们去询问负责这块代码的开发人员时,我们得到的回答是:“Oh,我们必须做一个debug的版本来看看到底发生了什么”。失败!从某种意义 来说,从日志中找到问题所在应该是可能的,如果问题存在一个运行的系统中,添加一个调试版本将会有大量的工作要做。代码需要包含足够多的信息在日志,以便 你至少可以对失败的原因有一些了解。

例2:“让我看看我们是如何走到这里的” ??

我们的一个产品在工作时会找到一个短信息传递到手机最便宜的路径。依据手机的当前位置和目标用户所属的运营商,有很多可能的路由选择, 每一个都有一个给定的成本和其他特征。除此之外,可以有一些例外,比如说禁止一些路线,以促进其他路线,通常 会有成千上万的路由被定义,在每个case中系统找到最便宜的一个路由,加上限定条件,并且传递消息。

现在,假想某个SMS信息使用A路线传递,但是我们认为他应该使用B,为什么A会被选择呢?如果没有任何日志记录信息,我们只剩下成百个可能的途径, 他们的成本,例外,以及一个复杂的算法,那么祝你好运搞清楚为什么A会被选择。

在我们的实现中,所有可能存在的路由以成本大小的顺序罗列在日志中,当路由被不同的限制条件排除时,排除掉的路由和原因就会被列在log中。 随着算法的输入,以及采取的步骤信信息列在log中,就会很容易的看出为什么某个路径会被选取。

为什么不呢?

所以,为什么不是所有的程序员都会写可调式的代码呢?我能想到三个原因:

你必须足够谦虚的意识到你的代码会有不按预期工作的时候。我相信很多程序员会对此比较难过。

如果你彻底地测试了你的代码,你应该确保它会在很多不同场合工作或失败。对于每个方案,很自然地加入日志记录,如果你没有测试 那些情况,你不太可能会在那里添加记录。

很多程序员往往不会在产品系统中修复他们自己的代码。如果在在线系统中有一个问题,但log并没有反馈任何信息给你为什么这里会有一个问题, 你会有一个很强烈的动机去增加log,以便下次遇到相同的情况时帮助到你。

你的代码可调试吗?

当然会有一些情况,对于程序为什么会失败好的日志信息也不能给你一个确切的信息。你可能还是要做出那样的调试版本, 但是你经常做记录至少还是会提供给你一些隐藏信息关于问题的可能性。

所以,你准备的怎么样了?当你的程序失败时,log会告诉你哪儿出错了吗?

原文链接: henrikwarne 翻译: 伯乐在线 - hahakaka

文章转载自 开源中国社区 [http://www.oschina.net]

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
安全 搜索推荐 开发者
"揭秘Python编写的艺术境界:不规范代码的悲剧,规范之美让你事半功倍!"
【8月更文挑战第21天】编写高质量Python代码需遵循规范以提升可读性和可维护性。例如,变量命名应采用小写字母加下划线(如`user_name`而非`uName`),函数命名清晰并避免硬编码(如使用`calculate_circle_area`替代`area_of_circle`并定义精确π值)。此外,添加有意义的注释(如解释冒泡排序逻辑),合理排版(如明确函数参数与返回值),以及适当异常处理(确保文件操作安全),都是良好实践。遵循这些规范能显著提高代码质量和团队协作效率。
38 0
|
前端开发 JavaScript 程序员
如何编写高质量代码
如何编写高质量代码
86 0
|
IDE 程序员 编译器
必备技能:程序的调试
本节内容相对来说比较笼统一些,但是也是非常非常非常重要的一节内容,毕竟一个程序猿不能只会写bug,你写一堆bug谁来修呢?所以通过调试去排查错误的能力是一个优秀的程序猿必须要掌握的技能,而且不能仅仅是掌握,更要精通,本节内容总体来说只有两大部分,一是学习调试的方法,会有举例实际去感受一下,二是在写代码就要考虑的一些问题,养成良好的写代码习惯,防患于未然。
必备技能:程序的调试
|
数据采集 存储 数据挖掘
如何编写一个完整的量化交易程序源码
如何编写一个完整的量化交易程序源码
【机房重构】VS2012 调试
【机房重构】VS2012 调试
72 0
|
开发框架 缓存 监控
测试是否有必要看开发代码?如何能看懂?
测试是否有必要看开发代码?如何能看懂?
|
Java Android开发
字斟句酌-教你调试代码 | 带你学《Java面向对象编程》之九十九
想知道自己的代码在运行时,方法和对象中各个数据发生了怎样的变化吗,本节将为读者介绍如何通过在代码中加入断点,并通过特定的入口执行调试的相关方法。
字斟句酌-教你调试代码 | 带你学《Java面向对象编程》之九十九
|
IDE 程序员 开发工具
80%的程序员都不了解的调试技巧
程序员的工作内容,除了大部分时间写代码之外,因为有不少的时间是用在调试代码上。甚至说不是在调试代码,就是即将调试代码。今天我们来谈谈调试代码的一些技巧,在使用IDE提供的debugger时一些快速定位问题的方式。
3693 0
|
Web App开发 前端开发 JavaScript
[译] 前端调试技巧与诀窍
本文讲的是[译] 前端调试技巧与诀窍,编写代码其实只是开发者的一小部分工作。为了让工作更有效率,我们还必须精通 debug。我发现,花一些时间学习新的调试技巧,往往能让我能更快地完成工作,对我的团队做出更大的贡献。
1600 0