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

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

导读:原文作者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

目录
相关文章
|
15天前
|
程序员 开发者
接上篇! 2025 年是程序员黄金时代元年本文面向真正的程序员与开发者,从夯实基础到把握前沿机遇,给出超详细具体实施步骤,教你一步步进阶,万丈高楼平地起,一分耕耘一分收获-优雅草卓伊凡
接上篇! 2025 年是程序员黄金时代元年本文面向真正的程序员与开发者,从夯实基础到把握前沿机遇,给出超详细具体实施步骤,教你一步步进阶,万丈高楼平地起,一分耕耘一分收获-优雅草卓伊凡
37 1
接上篇! 2025 年是程序员黄金时代元年本文面向真正的程序员与开发者,从夯实基础到把握前沿机遇,给出超详细具体实施步骤,教你一步步进阶,万丈高楼平地起,一分耕耘一分收获-优雅草卓伊凡
|
开发者 知识图谱
免费下载!《阿里工程师的自我修养》公开10位阿里大牛解决问题的思维方式
今天,阿里技术公布一波阿里P8、P9技术大牛的思维模型,将他们的思维模式呈现出来。你可以在阿里资深专家职业生涯的真切感悟中,找到应对危机的最佳方法。《阿里工程师的自我修养》现已正式公开,可免费下载阅读。
135657 1
免费下载!《阿里工程师的自我修养》公开10位阿里大牛解决问题的思维方式
|
8月前
|
JavaScript 前端开发 Java
代码之舞:从编程新手到资深开发者的旅程
【7月更文挑战第19天】编程,一种现代魔法,让无数人为之着迷。本文将通过个人的技术感悟,探讨如何从一个对代码一无所知的新手成长为一名能够自如驾驭复杂项目的资深开发者。我们将穿越编程语言的选择、学习资源的利用、项目实践的重要性以及持续学习的必要,最终达到技术与创造力的和谐共舞。
86 10
|
8月前
|
设计模式 持续交付 开发者
探索代码之美:从新手到专家的编程之旅
【7月更文挑战第25天】在编程的世界里,每一行代码都蕴含着无限可能。本文将带你领略编程的艺术,从基础概念到高级技巧,一起探索如何通过实践、学习和创新,提升编程技能,并享受这一过程中的乐趣和成就感。
|
7月前
|
开发者
探索编程之旅:从新手到专家的心路历程
【8月更文挑战第15天】编程,一个充满挑战与创新的领域,吸引着无数人投身其中。本文将带你领略编程世界的奇妙之处,分享我从一名初学者逐步成长为资深开发者的心得体会。在这个过程中,我们不仅会探讨技术层面的成长,还会深入理解编程背后的哲学思考。无论你是刚开始接触编程的新手,还是已经有一定经验的开发者,这篇文章都会给你带来新的启示和思考。让我们一起踏上这段探索编程之旅,感受编程带来的无限可能。
|
SQL 安全 Java
硬核,腾讯内部整理的面向开发人员代码安全指南,适合所有程序员
硬核,腾讯内部整理的面向开发人员代码安全指南,适合所有程序员
184 0
|
架构师 Java 中间件
首版发布!2023年AlibabaJava中高级架构师面试手册(对标P5-P8)
2023年AlibabaJava中高级架构师面试手册(对标P5-P8) 一年一度的金九银十面试招聘季已经到来,最近好多粉丝后台私信凯撒想要我整理一份最新的Java面试手册,我去各大程序员网站搜罗了这一份2023年AlibabaJava中高级架构师面试手册(对标P5-P8)
|
设计模式 程序员
程序员成长第三篇:好的代码和好的工程师
程序员成长第三篇:好的代码和好的工程师
93 0
|
架构师 Java 中间件
首版发布!2022年AlibabaJava中高级架构师面试手册(对标P5-P8)
最近好多粉丝后台私信凯撒想要我整理一份最新的Java面试手册,我去各大程序员网站搜罗了这一份2022年AlibabaJava中高级架构师面试手册(对标P5-P8),现在就和我一起看一下吧!
首版发布!2022年AlibabaJava中高级架构师面试手册(对标P5-P8)
谷歌如何管理世界上最聪明的工程师?
工程师不喜欢别人干预工作,但不拒绝管理者能够密切关注他们的职业发展。 谷歌一直以关注人力资源和管理战略而著称,该公司的一大重要任务就是说服旗下大量工程师服务各自老板和主管经理的管理,并让这些工程师信服这些管理者的价值。
208 0
谷歌如何管理世界上最聪明的工程师?