微软资深软件工程师:阅读代码真的很难

导读:原文作者Eric Lippert是一名资深软件设计工程师,从1996年起一直在微软开发部门任职,协助设计并实现VBScript、JScript、JScript .NET、Windows Script Host、Visual Studio Tools for Office和C#。

以下是文章内容:

Escalation的工程师JeremyK在他博客中问到:

你是怎么教人们快速深入挖掘不熟悉的代码(不是自己所写的)?我学习如何编程的方法很传统——自己动手编码。但我现在很纠结:到底是集中精神阅读源码,还是自己编写。对我而言,似乎唯一有效的方法就是自己写过。

Eric Lippert:不是和Jeremy开玩笑,写代码的确没有读代码难。

首先,我同意你的看法,几乎很少有人能读代码但不会写代码。这不像自然书面语或口语,理解他人的意思并不需要去理解他们为什么要那样说。比如,如果我说:“写代码有两种方式:一种严格且详细,另一种模糊且草率。前者生成简洁分层的婚礼蛋糕,后者却是意大利面条。”上面这句话产生一个平衡且幽默的效果,但即使听众和读者不理解我使用“零照应”和“并列句”这样的文字技巧,也会理解我要说的意思。但是说到代码,既要从代码本身中理解代码作者的意图,又要理解代码产生的预计效果,这两者都极为重要。

因此,我又回到那个问题了,有些人需要快速切入代码,但不需要动手写代码,那我们如何编写适合这些人的代码?

下面是我在编写代码时,尽力去做的事,目的就是使其他人能轻松阅读:

使代码遵从工具。Object Browsers和Intellisense虽然很好,但我告诉你,我是守旧派。如果找不到我想要的,我会不高兴。什么使得代码成为可查询的呢?

像“i”这样的变量名不好。如果没有明确的错误提示,你就无法轻易查找代码。

避免使用是其他名字前缀的名字。比如,在代码中有个“perfExecuteManifest”,如果再有一个“perfExecuteManifestInitialize”,这就会让我抓狂,因为每次在源码中查询前者时,我不得不费力地过滤掉后者所有的实例。

“临时传递数据”(tramp data)应使用相同的名字。所谓“临时传递数据”(tramp data),就是指那些传递给方法A的变量,还要传给方法B的变量。这两类变量实际上是相同的,所以如果它们有着相同的名字,则更好。

别用宏来重命名东西。如果有个方法叫get_MousePosition,那别这样GETTER(MousePosition)来声明该方法。因为我会找不到实际的方法名。

Shadowing会引起很多问题,请不要用它。

坚持使用一种命名模式。如果你打算用匈牙利命名法,那就坚持并广泛使用,否则将适得其反。使用匈牙利命名法来记录数据,而不是存储类型;记录普遍事实,而不是临时条件。

使用断言来记录先决条件(preconditions)和后置条件(postconditions)。

别缩写英文单词。确切来说,别缩写成稀奇古怪的形式。在脚本引擎中,有个变量名叫“NME”,这让我非常抓狂!它应当叫“VariableName”。

C语言标准运行时库的设计不是很优秀。别去效仿它。

别写“聪明”的代码;当代码出现问题,维护代码的程序员没时间去理解你的聪慧。

理解编程语言特性的设计初衷,使用这些特性去做它们适合完成的工作,而不是它们能做到的工作。例如:别把异常当做一般的流控制机制来使用(即便你能做到),而应该用它们来报告错误。别强制把接口指针转换成类指针,即便你知道这样没问题。

按功能单元划分源码树,而不是按组织结构。比如:我目前所在团队中,有2个根子目录的名字是 “Frameworks”和“Integration”,这是两个团队的名字。不巧的是,Frameworks团队名下有一个叫“Adaptor”的子目录,而“Adaptor”却是Integration的子目录,这就非常令人迷惑。同理,(如果)有着相同子目录的不同的子树,有些是客户端的组件,有些是服务端的组件;有些是管理组件,有些是非管理组件;有些是处理型组件,有些是非处理型组件;有些是零售组件,有些内部测试工具。这就会乱七八糟的。

当然,我实际上根本没有回答Jeremy的问题——如何调试不是我写的代码?

这取决于我的目的。如果我只是因为一个Bug,而深挖一段具体的代码,我会在调试器中逐步跟踪所有代码,写下我“走过”的调用分支,记录下哪些方法是特定数据结构的“生产者”,哪些方法是“消费者”;我也会仔细盯着输出窗口,查看出现的有用信息;还要打开异常捕捉器,因为异常通常是问题所在。设置断点;我会记录所有和我上面建议相反的地方,因为这些东西很可能误导了我。

如果我想在理解一段代码后修改它,我通常是从代码头部开始,或者先查找公共方法。我要知道类是如何实现的,它是如何扩展的,它的作用,它是如何嵌入整个代码中的?我会尽力理解这些东西后,才去了解这些特定部分(代码)是如何实现的。这耗时虽更长些,但如果你准备改动复杂代码,你应当那样做。

译文链接:http://www.jobbole.com/entry.php/438

原文链接:http://blogs.msdn.com/b/ericlippert/archive/2004/06/14/reading-code-is-hard.aspx

时间: 2024-10-25 19:00:37

微软资深软件工程师:阅读代码真的很难的相关文章

生鲜电商盈利真的很难 那些不足为外人道的肯綮

我曾请教过投资人查立(乾龙创投合伙基金创始合伙人)先生,他直言不讳"http://www.aliyun.com/zixun/aggregation/12210.html">生鲜电商就是找死";我也同不少投资人聊到此类项目,大多持观望态度,并不那么乐观和积极. 为何? 充斥我们耳边的都是"生鲜电商不赚钱""生鲜电商难做"之类的悲观论调,包括我自己也认为真的很难. 那么,卖生鲜产品不赚钱吗? 当然赚钱,生鲜产品和其他商品一样都属于大众

微软必应Bing真的很难赢 CN域名注册遭遇尴尬

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 今天上午做一个当前各大搜索引擎收录速度的测试,想看一下当前谷歌的表现,结果上午在10个不同类型的网站发了同一篇原创文章,觉得还是百度很快,收录最快的一个站,我发完立即查询竟然收录了,也就是收录在秒内完成,也许是幸运,速度跟发文一样快.今天分多个时段查看收录,发现还是百度比较快. 到了晚上再次查看,结果还是百度表现最佳.查完最关心的SE以后,想

想要成为真正优秀的程序员是不是真的很难?

很多人认为要想成为一名优秀的程序员,那就需要一天24小时每天不断地编程--睁开眼睛要编程,闭上眼睛睡觉的时候还要梦到编程--我认为这是一种矫枉过正的方法.沿着这条路走,只会让你精疲力尽,犹如夸父逐日一般,死在半道上. 我觉得问题的关键是要想明白你为什么要编程.坦率地说,我编程是因为我喜欢别人用我的程序,这也是我之所以在读书的时候成绩不怎么优秀的原因(我并 不热衷于参加编程竞赛以及类似事情).因此,我也不喜欢参与纯研究的项目--只在论文上讨论各种点子,而不付诸于行动不去写代码(除非恰巧碰到的是研究

地区站点目前真的很难做吗?

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 大家好,我是一名新手,以目前的技术水平 还不能称之为站长,只能说是一名网站爱好者,以前从没接触过互联网,但是后来渐渐喜欢上了.喜欢上了聊天,喜欢上了网络世界的精彩,同时也喜欢上了网站,一年前的我连ftp都不知道是什么,就萌生了一个梦想,做一个网站,当一名站长,原来以为做一名站长真的好令人羡慕,有自己的网站有丰厚的广告费用.下定决心后就开始操作

新手学习建站 是否真的很难

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 ·对新手而言如何去建设一个网站,简要须知. 今天来讲解对于一个从未真正接触做网站的朋友来说,学习建站!真是件很难的事,那么不知道大家是否知道,我们这个论坛的域名,你是否有看清楚了呢?我回答你是,我们论坛是二级域名,对于有关于二级域名的解说,我在上诉文章中有所提到,那么在你对建设网站什么都不懂而你又喜欢这个行业的时候,那么你就跟我们一样,去找一

原创真的很难吗 新闻评述写作之诀窍

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 无论写什么内容,首先须从结构入手,把握好是什么.为什么.怎么办这三部分,把这三部分吃透了,写好了,你这述评也就成功了. 搞新闻,免不了要写述评,尤其是从事经济报道的记者,述评写作可以说是家常便饭,一项必备的基本功. 述评写作有什么诀窍吗?细想想,诀窍还是有一些的,那就是,无论写什么内容,首先须从结构入手,把握好三段式或者说三部分,把这三部分吃

解密十五大顶级公司软件工程师薪资

国外求职网站 Glassdoor 日前整理其薪酬信息数据库,从中列举出世界上 15 家最大科技公司支付给软件工程师的薪酬.结果非常有趣:软件工程师是一份收入不错的工作,无论你在哪里工作.但即使在科技界,软件工程师也不会收到高得离谱的薪水.此外,并非每家公司都向其软件工程师发放高额薪水. 通用电气:市值 2570 亿美元,软件工程师平均薪酬 80235 美元.员工满意度 3.6 分(总分 5 分),26% 的员工认为通用业务发展方向正确,并在未来 6 个月内有所改善.通用驻肯塔基州路易斯维尔软件工

会写程序还不够,硅谷杰出软件工程师都有的 5 种能力

曾任职于Google和Quora等公司.现任Quip软件工程师的Edmond Lau,于 <The Effective Engineer> 一书中访问任职于Facebook.Instagram和Google等知名网路公司的资深软件工程师,归纳出他们眼中高生产力的杰出软件工程师都具备的五种能力. 一.不害怕探索陌生程序语言 接触新专案或是转换工作跑道时,都有可能需要学习全然陌生的程序语言,许多人对此感到害怕,甚至未尝试就先放弃.其中,跳脱舒适圈的恐惧往往多于学习程序,会担心是否无法重现过去工作的

格力电器总裁董明珠:接班人真的很难找

自2004年以来,她已连续五次上榜美国<财富>杂志全球50大商界女强人.她是创造中国家电市场销售神话的领军人物,她的名字,牵动着整个中国空调市场的每根神经,"30位商界木兰"."中国营销女皇"."商业铁娘子"."中国最具影响力的商业领袖"......她就是董明珠,被称为"空调女皇"的格力空调总裁. 19日上午9时许,重庆国际会展中心,伴随阵阵热烈的掌声,一身红色的齐膝短裙,看上去知性而高雅.自信