转自:http://blog.jobbole.com/438/

相关文章

  • 微软资深软件工程师:阅读代码真的很难(第2篇)
  • 阅读优秀代码是提高开发人员修为的一种捷径
  • 学会阅读源代码
  • 如何阅读大型代码库?
  • 熊绎:我看软件工程师的职业规划
  • Google前女软件工程师分享工作经历
  • Google软件工程师:从战争中得到的启示
  • 明星软件工程师的10种特质
  • 阅读代码就像阅读犹太法典
  • 王忻:我对女生做软件工程师的一些看法

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

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

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

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

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

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

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

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

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

转载于:https://www.cnblogs.com/kira2will/p/4014920.html

转:Eric Lippert:阅读代码真的很难相关推荐

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

    编者按:原文作者EricLippert是一名资深软件设计工程师,从1996年起一直在微软开发部门任职,协助设计并实现VBScript.JScript.JScript.NET.Windows Scrip ...

  2. (资源)百度云盘:驴火歌王:阅读真的很难提分第2讲:洞茶 (2013北京中考)

    (资源)百度云盘:驴火歌王:阅读真的很难提分第2讲:洞茶 (2013北京中考)见上图 <祖逖>"天天练"(周六) 诸葛学堂<窦神归来文言文全年班>第 17 ...

  3. 数据结构真的很难学?

    如果你关注计算机专业招聘试题,会发现越是大型公司,问的问题越基础,有的甚至问你什么是栈和队列,反而一些小公司会关心你做过什么系统.从关注点的不同可以看出,大公司更注重基础扎实和发展潜力,而小公司希望你 ...

  4. 【转载】哈希表的原理,真的很难弄懂么?

    [转载]哈希表的原理,真的很难弄懂么? 刘小爱v 发布时间:05-0909:06科技达人 转载路径: https://baijiahao.baidu.com/s?id=1666172942887109 ...

  5. 零基础学习java编程,真的很难吗?手把手将你带入编程世界。

    零基础学习java真的很难吗?本人脑袋比较笨,从接触java到职业生涯已经小有4年了.怎么说呢,就是现在我依然能够保持着当年的那份不断学习的热情,是不是很不可思议.我告诉你,这是最基本最基础从事编程行 ...

  6. OSChina 周二乱弹 —— 球真的很难玩!

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2018)请戳(这里) [今日歌曲] @clouddyy :推荐歌曲<Love Will Set You ...

  7. 民营企业的项目,真的很难做

    民营企业的项目,真的很难做 笔者加入现在的项目超过2个月了.随着对于客户的了解越来越深入,尤其是通过合作的乙方咨询公司了解到一些情况,发现客户虽然越做越大越做越强了,但是却永远改变不了其民营企业的德性 ...

  8. 二本学校考211计算机,普通二本学校的学生考211/985的研究生真的很难吗?

    原标题:普通二本学校的学生考211/985的研究生真的很难吗? 网友一: 我本科就是二本,念了一个交叉学科,交叉到什么地步呢,就是有些学校是把它放在教育学院,有些是设在物理学院,还有些是设在计算机学院 ...

  9. java左手画圆右手画方_左手画圆,右手画方真的很难吗?为什么人们很难做到呢?...

    导语:左手画圆,右手画方真的很难吗?为什么人们很难做到呢? 我们经常会看到有些人能够实现左手画圆.右手画方的这一个行为,并且是可以通过这样的方式来训练自己身体的协调能力的,那么当我们自己去尝试的时候, ...

最新文章

  1. python openpyxl读取excel_Python使用openpyxl读写excel文件
  2. 使用MySQL验证Open***用户登录访问
  3. 作为本科大学生比较适合的水准比较好的,嵌入式软件系统的会议
  4. mysql四种修改密码的方式
  5. SeekBar的用法和自定义滑块的样式
  6. 特征向量的辨析(数学,机器学习)
  7. sql truncate_SQL Truncate和SQL Delete语句的内部
  8. 英语语料库与英文写作
  9. 截止失真放大电路_新手必看!基本放大电路应该如何分析?
  10. array_unshift php,php array_unshift函数怎么用?
  11. 微信小程序 微信授权登录 微信登录
  12. 不同以“网”,云端地球全新升级上线!
  13. Qt编写安防视频监控系统(支持win/linux/mac/海康/大华/宇视/264/265等)
  14. java显示图片缩略图_java中生成图片的缩略图
  15. CCS6-28335新建工程
  16. 方面级情感分析任务汇总
  17. 无线充电技术介绍系列之一(技术科普)【无线充电圈 技术分析】
  18. Slack设计团队告诉你市值28亿美元的秘密武器是什么
  19. 大豆技术面分析_基本面+技术面分析的两个案例,别怪我没提醒啊
  20. 15款免费又好用的安全软件

热门文章

  1. java 实现ps功能_JS实现在线ps功能详解
  2. AI绘画天花板软件数画迎来重大更新,二次元虚拟头像一键生成
  3. 年终总结 | 怎样识别并投资高效能人才?
  4. 云创大数据荣膺英特尔“行业贡献奖”
  5. python面向对象编程指南([美stevenflott_Python面向对象编程指南 ([美]StevenFLott洛特) 中文_IT教程网...
  6. QT 关于颜色的总结
  7. 朋友圈gys是什么意思,女生微信朋友圈说说经典句子
  8. 互联网、云计算之用户服务
  9. 支付宝app支付对接1
  10. 内存不能为read或written的解决方案