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

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

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

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

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

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

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

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

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

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

为什么不呢?

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

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

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

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

你的代码可调试吗?

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

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

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

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

时间: 2024-09-28 23:19:15

优秀程序员编写可调试的代码的相关文章

优秀程序员眼中的整洁代码

有多少程序员,就有多少定义.所以我只询问了一些非常知名且经验丰富的程序员. Bjarne Stroustrup,C++语言发明者,C++ Programming Language(中译版<C++程序设计语言>)一书作者. 我喜欢优雅和高效的代码.代码逻辑应当直截了当,叫缺陷难以隐藏:尽量减少依赖关系,使之便于维护:依据某种分层战略完善错误处理代码:性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来.整洁的代码只做好一件事. Bjarne 用了"优雅"一词.说得好!我

优秀程序员素质培养

踏入程序员这个行业,你就注定要学习一辈子,新技术层出不穷,技术体系更新快速,这是和其他行业最大的区别之一.所以,如果你想在这个行业混出点样子,那么请你随时做好学习的准备,如果你想成为优秀的程序员,那么一定要有正确的学习方式,下面推荐几条程序员的最佳学习方式,希望能帮你事半功倍. 书籍和期刊是必不可少的 无论你是新手菜鸟还是高级程序员,你都离不开书籍,当然我们要有选择的读书,尽量选择一些经典的书籍来看,如果你英文水平比较好,那么读一些老外撰写的书籍是最好不过的了.书籍能让你在繁杂的互联网上总结出一

那些优秀程序员身上的共同特质

你是否发现,在我们身边的那些优秀程序员身上总是能找到一些共同的特质,这些特质并非与生俱来,但却逐渐在他们身上留下深深的烙印,这也使得他们变得与众不同,更成为我们心目中的佼佼者. 至少深入理解一门编程语言 学习编程和学驾驶很像,你很容易就能学会驾驶,比如,经过一个月的驾校培训,你就能获得驾照,但要真正成为一名优秀的司机,却必须经过长时间的驾驶实践才行,这将帮助你在头脑中形成一套完整意识体系以应对驾驶中所遇到的不同情况.编程也是一样,当程序员们作出那些优秀的程序设计时,看似自然,但它的背后却是程序设

可以使你成为更优秀程序员的5个好习惯

我们都希望能够在我们所做的事情中得到成长,在WEB开发领域,我们花费时间最多的就是编写代码.这可能包括HTML, CSS, JavaScript, PHP, Python, ActionScript或者任何其他你构建WEB站点时选用的语言. 这篇文章中,我们将分享一些实际的步骤,使你可以扩充技能,成为一个更优秀的程序员.我们提出五个不同的生活习惯,它们可以使你在你所从事的领域变得更加优秀. 1. 一个时间段内只专注于一种类型的语言 如果你正在设计或开发网站,你将需要同时熟悉多种不同的语言.你可能

优秀程序员的十个习惯

--转来和大家一起共勉 在这个世界上,有数百万的人热衷于软件开发,他们有很多名字,如:软件工程师(Software Engineer),程序员(Programmer),编码人(Coder),开发人员(Developer).经过一段时间后,这些人也许能够成为一个 优秀的编码人员,他们会非常熟悉如何用计算机语言来完成自己的工作.但是,如果你要成为一个优秀的程序员,你还可以需要有几件事你需要注意,如果你能让下 面十个条目成为你的习惯,那么你才能真正算得上是优秀程序员. 1. 学无止境 .就算是你有了1

具备这些特性 说明你是个优秀程序员

编程是个很复杂的玩意,但是成就优秀程序员的很多因素和我们在学校中早期学到的相差无几.本文灵感来源于Robert Fulghum的<All I Really Need to Know I Learned in Kindergarten>. 1.分享 尽可能地使用开源,并且如果有能力的话也可以把自己的成果分享给大家.整个社会的智慧结晶肯定比一些大公司自管自闭门造车要好. 2.公平的心态 不要以为你的选择就是唯一能奏效的,试试其他技术.框架.方法和建议,也许其他的选择比你原先的好也未可知.要用开放的

避免成为优秀程序员

我曾经和我认为优秀的程序员一起工作,但是他们是真正优秀的程序员吗?是什么让他们如此优秀?(或者,他们只是普通的程序员?) 最近读到Mark Pearl博客里一篇名为<Programming, a Subset of Writing>的文章,其中的观点让我十分推崇,尤其是下面这段: 优秀程序员和普通程序员最大的区别在于,优秀的程序员会使用整洁.易于理解的方式进行编程,任何不必要的复杂代码均不会出现.和我工作过的那些真正优秀的程序员总是尊学这样的编程步骤:写代码.重构.进一步重构. 就像日常生活技

成为优秀程序员的十个有效方法

http://www.aliyun.com/zixun/aggregation/7026.html">优秀的程序员是在穿过一条单行道的时候还会往两边看的人. 作为一个IT行业的软件程序员,每天驱使我们日复一日的辛勤工作的,是来自我们对编程的兴趣和激情.但是要让编程变得始终有趣,我们必须学会坚持某些成为优秀程序员的基本原则. 我并不是要写出一些咒语,你照着执行就可以成为一个优秀程序员了.我的目的是想记录下我学习到的和用过的一些有用的经验,它们帮助我获得比较好的结果.对于优秀程序员是没有明确定

优秀程序员与普通程序员在行为上的差别

优秀程序员的行为: 拿到任务,就开始仰望星空或天花板上那盏高悬的电灯棒,状如老僧入定 忽而皱眉,忽而展颜一笑,忽而手舞足蹈,忽而在纸上指指戳戳,忽而口中念念有词,忽而长吁--感觉有点神经病啊 桌子上摆的是代码大全.设计模式.敏捷实践之类的书籍,并且没有灰尘 chrome或firefox的书签栏里分门别类,类别多于10个,8个以上是技术相关的 容不得破窗户,看见别人的烂代码就想改过来 随手就能在白板上画出软件的流程图或者时序图-- 项目做完了,别人在打游戏.看视频.忙着回复QQ.向剁手族前进,他在