`
mengqingyu
  • 浏览: 326906 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

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


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

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

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

  首先,我同意你的看法,几乎很少有人能读代码但不会写代码。这不像自然书面语或口语,理解他人的意思并不需要去理解他们为什么要那样说。比如,如果我说:

  “写代码有两种方式:一种严格且详细,另一种模糊且草率。前者生成简洁分层的婚礼蛋糕,后者却是意大利面条。”

  上面这句话产生一个平衡且幽默的效果,但即使听众和读者不理解我使用“零照应”和“并列句”这样的文字技巧,也会理解我要说的意思。但是说到代码,既要从代码本身中理解代码作者的意图,又要理解代码产生的预计效果,这两者都极为重要。

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

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

•使代码遵从工具。Object Browsers和Intellisense虽然很好,但我告诉你,我是守旧派。如果找不到我想要的,我会不高兴。什么使得代码成为可查询的呢?
•像"i"这样的变量名不好。如果没有明确的错误提示,你就无法轻易查找代码。
•避免使用是其他名字前缀的名字。比如,在代码中有个“perfExecuteManifest”,如果再有一个“perfExecuteManifestInitialize”,这就会让我抓狂,因为每次在源码中查询前者时,我不得不费力地过滤掉后者所有的实例。
•“临时传递数据”(tramp data)应使用相同的名字。所谓“临时传递数据”(tramp data),就是指那些传递给方法A的变量,还要传给方法B的变量。这两类变量实际上是相同的,所以如果它们有着相同的名字,则更好。
•别用宏来重命名东西。如果有个方法叫get_MousePosition,那别这样GETTER(MousePosition)来声明该方法。因为我会找不到实际的方法名。
•Shadowing会引起很多问题,请不要用它。
•坚持使用一种命名模式。如果你打算用匈牙利命名法,那就坚持并广泛使用,否则将适得其反。使用匈牙利命名法来记录数据,而不是存储类型;记录普遍事实,而不是临时条件。
•使用断言来记录先决条件(preconditions)和后置条件(postconditions)。
•别缩写英文单词。确切来说,别缩写成稀奇古怪的形式。在脚本引擎中,有个变量名叫“NME”,这让我非常抓狂!它应当叫“VariableName”。
•C语言标准运行时库的设计不是很优秀。别去效仿它。
•别写“聪明”的代码;当代码出现问题,维护代码的程序员没时间去理解你的聪慧。(编注:这条建议即为:编写可维护的代码,详情可参见《明星软件工程师的10种特质》中的第8点。)
•理解编程语言特性的设计初衷,使用这些特性去做它们适合完成的工作,而不是它们能做到的工作。例如:别把异常当做一般的流控制机制来使用(即便你能做到),而应该用它们来报告错误。别强制把接口指针转换成类指针,即便你知道这样没问题。
•按功能单元划分源码树,而不是按组织结构。比如:我目前所在团队中,有2个根子目录的名字是“Frameworks”和“Integration”,这是两个团队的名字。不巧的是,Frameworks团队名下有一个叫“Adaptor”的子目录,而“Adaptor”却是Integration的子目录,这就非常令人迷惑。同理,(如果)有着相同子目录的不同的子树,有些是客户端的组件,有些是服务端的组件;有些是管理组件,有些是非管理组件;有些是处理型组件,有些是非处理型组件;有些是零售组件,有些内部测试工具。这就会乱七八糟的。

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

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

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

转自:http://www.jobbole.com/entry.php/438
分享到:
评论

相关推荐

    微软软件工程师面试经验.doc

    微软软件工程师面试经验.doc

    微软的软件测试之道(中文完整版)

    第2章,“微软的软件测试工程师” 第3章,“工程生命周期” 第二部分,“关于测试” 第4章,“软件测试用例设计的实用方法” 第5章,“功能测试相关技术” 第6章,“结构测试技术” 第7章,“用代码复杂度分析...

    微软内部所有工程师必读之书

    微软内部所有工程师必读之书微软内部所有工程师必读之书

    微软的面试题及答案 非常好,很难找

    好好 好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好

    微软一站式示例代码库[中文版]

    微软一站式示例代码库 (Microsoft All-In-One Code Framework) 由微软社区技术支持团队为您倾力呈现。我们编写相应的代码示例,并以很短的周期发布更新...微软工程师会第一时间为您评定请求是否典型,并提供示例代码。

    .net面试题(微软、软件工程师)

    .net 面试题 软件工程师 程序员 这份面试题也是自己找得、觉得不错、针对.net软件工程师面试题目范围广而准备的。

    微软c++ STL源代码

    微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源代码微软c++ STL源...

    微软软件研发的奥秘

    《微软软件研发的奥秘:MSF精髓》作者凭借 20多年的软件开发管理和微软服务总部经验,针对微软解决方案框架(MSF)第四版,详细阐述其重要概念:解决方案交付的外部环境、基本原则,团队成员应具备的意识,证明可行的...

    微软发布的VB数据库编程代码包.rar

    微软发布的VB数据库编程代码包.rar微软发布的VB数据库编程代码包.rar微软发布的VB数据库编程代码包.rar微软发布的VB数据库编程代码包.rar微软发布的VB数据库编程代码包.rar微软发布的VB数据库编程代码包.rar微软发布...

    微软技术支持工程师笔试题--技术测试

    微软技术支持工程师笔试题,一份是语言测试,一份是技术测试,此份是技术测试的,都是英文的。

    《代码之殇(原书第2版)》_代码之殇_软件工程书_项目_

    《华章程序员书库:代码之殇(原书第2版)》是《代码大全》的姊妹篇,资深软件开发专家30余年工作经验结晶,被誉为“软件行业的财富”,微软公司软件工程师必读之书。它从软件开发流程、技术、方法、项目管理、团队管理...

    微软一站式示例代码库[中文版]110808源码

    微软一站式示例代码库[中文版]110808源码 微软一站式示例代码库 (Microsoft All-In-One Code Framework) 由微软社区技术支持团队为您倾力呈现 。我们从MSDN论坛、热门的社交网络、和多个开发者社区聆听开发者最关心...

    微软面试 BI 工程师 试题

    这个是我在微软面试BI工程师的上机题,希望对你有用,非常珍贵喔!不懂可以问我。

    微软技术支持工程师笔试题

    微软的技术支持工程师的笔试题目,一份是语言测试,一份是技术测试,都是英文的。

    微软公司内部所有工程师的必读之书

    微软公司内部所有工程师的必读之书 微软公司内部所有工程师的必读之书 微软公司内部所有工程师的必读之书

    微软360度:企业和文化

    微软公司全球资深副总裁张亚勤序(1) 微软公司全球资深副总裁张亚勤序(2) 引言:来自我们大家的问候(1) 引言:来自我们大家的问候(2) 本书主要作者介绍(1) 本书主要作者介绍(2) 谁是微软人(1) 谁是微软人(2)

    微软一站式代码示例编程规范.rar_微软代码规范_编码规范

    微软的编码规范,很有借鉴意义。他山之石,仅供大家参考。

    微软的软件测试之道

    本书是以使读者熟悉微软产品、微软工程师、微软测试人员、测试的作用和对软件工程的通常做法作为开始。书的第二部分讨论许多在微软常用的测试实践和工具。 书的第三部分探讨某些我们工作中使用过的工具和系统。书的...

    微软MVC5 代码生成

    微软MVC5 代码生成器 微软MVC5 代码生成器 微软MVC5 代码生成器 微软MVC5 代码生成器

    微软所有中文版示例代码

    由微软社区技术支持团队为您倾力呈现。...根据这些问题,我们编写相应的代码示例,并以很短的周期发布更新。以方便开发者下载参考。通过这些示例代码,可以让开发人员轻松解决典型的编程问题,真正做到事半功倍。

Global site tag (gtag.js) - Google Analytics