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

标签: 微软 软件 工程师 | 发表时间:2014-10-06 08:16 | 作者:
出处:http://kb.cnblogs.com/

   英文原文:  Reading Code Is Hard

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

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

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

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

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

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

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

Eric Lippert

Eric Lippert 

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

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

  1. 使代码遵从工具

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

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

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

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

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

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

  2. 坚持使用一种命名模式

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

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

  4. 别缩写英文单词

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

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

  6. 别写“聪明”的代码

  当代码出现问题,维护代码的程序员没时间去理解你的聪慧。(编注:这条建议即为:编写可维护的代码,详情可参见《 明星软件工程师的10种特质》中的第8点。)

  7. 理解编程语言特性的设计初衷,使用这些特性去做它们适合完成的工作,而不是它们能做到的工作

  例如:别把异常当做一般的流控制机制来使用(即便你能做到),而应该用它们来报告错误。别强制把接口指针转换成类指针,即便你知道这样没问题。

  8. 按功能单元划分源码树,而不是按组织结构

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

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

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

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

  翻译: 伯乐在线 - 黄利民

相关 [微软 软件 工程师] 推荐:

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

- - 博客园_知识库
   英文原文:  Reading Code Is Hard.   编者按:原文作者 Eric Lippert 是微软一名资深软件设计工程师,从1996年起一直在微软开发部门任职,协助设计并实现VBScript、JScript、JScript .NET、Windows Script Host、Visual Studio Tools for Office 和 C#.

一个软件工程师在北京的反省

- Bingnan - 月光博客
  我(软件工程师berlin)于2007年来到北京,在北京工作这些年,先后在NEC、风行、百度几家公司担任软件工程师的职务. NEC是一家具有百年历史的传统日企,在知春路的分公司叫日电电子,我们部门主要从事机顶盒、数字电视上嵌入式软件的研发. 风行是一家成立于2005年的在线视频公司,主要做P2P视频点播的业务,而我主要从事P2P后台服务器的开发.

一个女软件工程师的征婚启事

- Yuan - 无聊哦
这是csdn论坛上一个女软件工程师的征婚启事,这位女工程师很是用心,做成的征婚启事给人一丝淡淡的感动. 最让人触动心灵的还是最后一页,让我看见一个人内心朴素的灵魂,正如所期待的爱情. “你以为我穷,低微,矮小,不美,我就没有灵魂没有心吗. 我的灵魂和你一样,我的心也和你完全一样. 就好像我们两人已经穿越了坟墓,站在上帝的脚下,我们是平等的.

2012 年职业排行榜,软件工程师高居榜首

- - 水煮沉浮
CareerCast公布了IT和工程专业最好的职业榜单,软件工程师高居榜首. 虽然工程师占据着领先位置,但其它职业正在向它靠拢. 1.软件工程师:平均年薪,$90,000. 2.系统分析师:平均年薪,$78,000. 3.Web开发人员:平均年薪, $75,000. 4.石油工程师: 平均年薪, $114,000.

软件工程师需要计算机科学学位么?

- - 博客 - 伯乐在线
软件工程师这个角色并不一定需要计算机科学学位. 然而,近日 Yahoo CEO Scott Thompson因计算机科学学位造假而被迫辞职一事引起了人们的热议,我们是否需要一个大学文凭呢. 比如说,在Andrew Binstock为Dr. Dobb所撰写的一篇名为“ Software Engineers All!”的文章中提及了软件工程师是否真的需要一个计算机科学学位才能完成好工作.

软件工程师必读技术书籍推荐

- - 行业应用 - ITeye博客
 --Clean Code《代码整洁之道》.  --Implementation Patterns《实现模式》.  --Code Complete《代码大全》.  --Refactoring: Improving the Design of Existing Code《重构——改善既有代码的设计》.

优秀软件工程师必备的7大特性

- - 博客园_新闻
英文原文: What Qualities Make a Good Startup Engineer?. 不是每一个程序员都能成为优秀的软件工程师. 在过去的 6 年时间里,我在 Ooyala、Quora 和 now Quip 这 3 个创业公司面试过许许多多挺有发展潜力的“种子选手”,他们都有着 5 年以上的工作经验,并且曾为类似于谷歌这样的顶级技术公司服务过,但是就是搞砸了面试.

谷歌工程师:杀毒软件根本没什么用

- - FreeBuf.COM | 关注黑客与极客
如果说你还认为杀毒软件对每个电脑用户都是必不可少的,谷歌的高级安全工程师Darren Bilby可能会给你一个不一样的答案. “不要在没用的东西上投资”. Bilby作为企业基础设施保护团队中保障平台完整(Platform Integrity)组的负责人,在近期新西兰的Kiwicon黑客大会上明确表达了自己的观点: 杀毒软件其实没什么用,安全行业应该把工作的重心放在其他真正有用的方面,像是白名单这一类的应用.

【译】测试员,敢问路在何方?来自微软工程师

- - CSDN博客研发管理推荐文章
原作者是Qingsong Yao,来自微软. 他的Linkedin在这里  http://www.linkedin.com/in/qingsongyao,里面有着详细的介绍. MS SQL Server Group — 资深测试员 — 7年. MS SQL Azure — 资深测试员 — 目前所在项目.

谷奥: 前 Google Wave 工程师说 Google 的软件架构也忒过时了

- 张宪伟 - 谷奥聚合——谷奥主站+谷安 aggregator
Google Wave前工程师 Dhanji R. Prasanna(上图是他的Twitter头像) 昨天发了一篇博文,解释了自己为何要离开Google,其中谈到了Google的文化,但最有趣的部分其实是他说“Google一直自夸的具备延展性的软件架构已经过时了”. 尽管他承认Google的硬件架构依然是完美的艺术品,但其上为搜索引擎和爬虫设计的软件架构至少落后了10年.