程序员要学会读源代码

  在“沟通”这个复杂的领域里,写出能让人类领会并理解的连贯段落比敲出几行让解释器或编译器不致于“呕吐”的软件代码要难得多。

  这就是为什么——就软件开发而言——所有的文档大概都是很差劲的。而且,由于为人写作比为机器写作要困难得多,文档恐怕在可预见的将来还会继续差劲下去。对此,你基本上是无能为力的。

  除了做一件事……

  “卢克,学着去读源代码。”

  译者注:卢克(Luke Skywalker)是电影《星球大战》中的一个角色,他来自塔图因星球,在发现了莉雅公主输入到机器人R2-D2中的求救信息后,他与绝地骑士欧比旺一起迎战邪恶的银河帝国,最终救出了公主。《星球大战》系列电影是由卢卡斯电影公司出品的科幻电影。卢卡斯电影公司首先于1977年推出了《星球大战》,之后又分别于1980年和1983年推出了《星球大战2》和《星球大战3》。之后又分别于1999年、2002年和2005年推出了3部《星球大战前传》系列。

  JavaScript“始终带有源代码”是一股革命性的力量,这也是我提出“阿特伍德法则”的一个主要原因(我对这个法则至今仍然坚信不疑)。即使“查看源代码”(View Source)这个功能没有内嵌(但它完全应该有),你也应该要求查阅在你的软件之下的基础源代码的权限。不管文档上面怎么说,源代码才是最终的事实,是你所能找到的最好的、最确定的、最新的“文档”。这个事实永远不会改变,所以你越早接受这个事实,你作为一名软件开发者的境况就会越好。

  译者注:“阿特伍德定律”(Atwood’s Law)是作者自己提出的一个观点,内容是:任何可以用JavaScript来写的应用,最终都将用JavaScript来写。

  我本来想针对这个问题好好地写一写,但是后来在Hacker News网站上发现Brandon Bloom已经写了一个很棒的帖子。我自愧不如。大家去认真读一下吧,因为他解释了阅读源代码的好处,以及在何种情况下你需要阅读源代码。

  我大约在15岁的时候就开始在微软的平台上工作了,并且以此为业。我曾经作为一名软件开发员为微软在Visual Studio上面做集成工作。从我写下第一行Visual Basic代码后的十多年以来,我希望我可以再也不用和一个封闭的库去链接了。

  使用软件和开发软件是不一样的。当你使用大多数软件的基本功能时,一般不会出现什么问题,因为这条“老”路已经被人走过了很多遍。也许其他一些人碰到了问题,并且有足够多的人把这些问题反映出来,这样会促使核心开发人员修正这些问题。而当你在开发软件的时候,你是在做一些“新”东西。而且,把东西做出来可以有很多条“路”,你会碰到之前从来没有接触过的部分、到达早已腐蚀的角落、走到那些尚未完成的试验性质的代码路径。你会遇到一些边缘情况,它们的问题是已知的,但从来没有被真正地解决过(之前只是被绕开了)。

  有些时候,文档是不完整的。有些时候,它干脆就是错误的。源代码是从来不会撒谎的。对于一名有经验的程序员来说,阅读源代码通常会更快些(尤其在你已经熟悉了软件包架构的情况下)……我现在和几个创业公司在一个中等规模的共享办公区域里一起工作。很多其他公司的首席技术官和工程师都时常跑到我们团队来寻求指导和建议。当他们带着有问题的软件过来的时候,我问他们的第一个问题就是:“嘿,你看过源代码了吗?”

  我鼓励开发人员“git clone”他们依赖的所有源代码。起初,他们都有些害怕。“那个项目太大了。我永远也无法把问题找出来!”“我没那么聪明,看不懂那些代码。”“那些代码太难看了!简直惨不忍睹!”但是,你不必把那些代码翻个底朝天,而只需要跟着线索走。况且,如果你不能理解你所依赖的平台,你又怎么能驾驭你自己的软件呢?在大多数情况下,菜鸟程序员认为漂亮的,往往止于肤浅;而他们认为丑陋的,往往是骇客大师们所写的久经考验的产品级代码。现在,在经过了一两年之后,有几个开发人员专程过来找我,感谢我当初强迫他们在别人的代码里“潜水”或者“畅游”。他们现在的技能都比以前大有长进,而且他们还感叹:真不知道过去在没有别人源代码的时候是怎么把事情做好的……

  译者注:git是一个在开源社区里广泛应用的源代码管理工具。git clone是一条命令,能把远程的源代码复制到本机。

  当你运营一个公司的时候,如果你的软件出了故障,你的客户不会在乎是你的失误还是Linus的,或者是由Rails的开发人员造成的。他们只知道是你的软件出了问题。所有其他人的软件都成了你的软件,因为他们的错误都算到了你的头上。一旦有故障发生,你需要找出问题,并且把它修好。你需要在“应用链”的合适位置把它修复,以减少风险、维护成本以及周转时间。有时候,一个快速的权变措施是最好的;而在其他时候,你得重新编译你的代码。很多时候,你可以让其他人在上游把问题修复了;但是也有很多时候,你得自己动手解决。

  译者注:Linus Torvalds(李纳斯·托瓦兹),是Linux核心的创作者,人称“Linux之父”。美国《时代》周刊对他的评价极高:“有些人生来就具有统率百万人的领袖风范;另一些人则是为写出颠覆世界的软件而生。唯一一个能同时做到这两者的人,就是托瓦兹。”甚至,在《时代》周刊根据读者投票评选出的20世纪100位最重要的人物中,李纳斯居然排到了第15位,而比尔·盖茨不过才是第17位。

  译者注:Rails即指Ruby on rails,是一个构建在Ruby语言之上的Web应用程序框架。

  处理封闭软件的问题有两个选择:乞求他们的慷慨救援,或者采用变通方案。

  对于开源软件,如果他们的开发者不给力,建议像处理封闭软件的问题那样处理。

  老到一些的软件商家倾向于慢慢培养他们维护分支、补丁以及处理其他琐碎事务的能力。

  真正的骇客世界里只有一个简单的事实:如果一个软件在我的机器上运行,那它就是我的软件。我对它负责。我必须把它弄明白。从源代码开始构建是一条必须遵循的原则,而且从不例外。我必须控制我的环境,我还要控制所有我依赖的东西。

  没有人是为了好玩才去读别人的代码的。见鬼了,我甚至都不愿意读我自己的代码。想着你舒服地坐在皮椅上,穿着便装,端上一杯白兰地,郑州牛皮癣阅读着别人的代码来度过一个美妙的夜晚——这个念头真是荒诞至极!

  但是,我们需要能接触到源代码。我们必须阅读别人的代码,因为我们只有理解了那些代码之后才能把我们自己的事情做好。所以,卢克,请你不要害怕阅读源代码——不管它看起来有多么可怕,也不管它会把你带向何方,跟它去吧!

时间: 2024-10-13 03:13:44

程序员要学会读源代码的相关文章

StackOverflow程序员推荐:每个程序员都应读的30本书

“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西.” 很多程序员响应,他们在推荐时也写下自己的评语.以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10的书.其实除了前10本之外,推荐数前30左右的书籍都算经典,伯乐在线整理编译这个问答贴,同时摘译部分推荐人的评语.下面就按照各本书的推荐数排列. 1. <代码大全>史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,&l

程序员应该学会放松,更应该努力前行

之前实习的时候,偶尔和同事聊到为什么我们这一行会这么累?觉得同事分析的挺有道理,因为我们不像保安.清洁工阿姨(当然这里没有别的意思,只是简单的叙述事例)的工作,他们每天重复着几乎完全相同的工作,所以比较轻松:而我们每天面临的是不同的需求,需要解决不同的问题,换句话说就是我们每天将面对新的挑战,所以我们需要集中精力解决问题,包括学习新知识:而且相对而言,写程序是来不得半点马虎的,有半点错误都会出现问题:所以一旦要解决一个问题,我们必须集中精力,所以导致我们会非常累. 但是从另外一个方面想,我们的工

国外程序员推荐:每个程序员都应该读的非编程书

1. <银河系漫游指南>by Douglas Adams 2. <人性的弱点> by Dale Carnegie 3. <别逗了,费曼先生> 4. <一九八四> by George Orwell 5. <哥德尔.艾舍尔.巴赫:集异璧之大成> by Douglas Hofstadter 6. <设计心理学> by Donald A. Norman 7. <搞定:无压工作的艺术>by David Allen 8. <人月

每个程序员都应读的书(转)

收藏,有时间,就读一读,有好处! 很多程序员响应,他们在推荐时也写下自己的评语.以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10的书.其实除了前10本之外,推荐数前30左右的书籍都算经典,伯乐在线整理编译这个问答贴,同时摘译部分推荐人的评语.下面就按照各本书的推荐数排列. 1. <代码大全> 史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,<代码大全>注重个人技术,其中所有东西加起来,就是我们本能所说的“编写整洁的代码”.这本书有50页在谈论代码布

国外程序员推荐:每个程序员都应读的书

[更新]:近日(2012年8月17日)重看 StackOverflow 的原讨论帖,发现于今年年初被关闭了.不过有人做了汇总,把其他回复中提到的书籍,放在投票数最高的回复中.新更新添加 59 本书,详情可见文章后半部分. 编者按:2008年8月4日,StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的? “如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东

【Mood-10】每个程序员都应该读的30本书

“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西.” 很多程序员响应,他们在推荐时也写下自己的评语.以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10的书.其实除了前10本之外,推荐数前30左右的书籍都算经典,伯乐在线整理编译这个问答贴,同时摘译部分推荐人的评语.下面就按照各本书的推荐数排列. 1. <代码大全>史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,&l

中国程序员最爱读错的70个英文单词!注有正解

以下是中国程序员最常发错音的一些英文单词.图中标注了正确的读音和错误的读音.并且部分标注了中文辅助音. 怎么样?敢不敢透漏下你有多少是读错的呀?欢迎大家留言噢. 原文地址:https://blog.51cto.com/14226273/2375793

10个程序员必须学会接受的残酷真相

大多数时候,写代码都是挺有意义的一件事,不光能增加经验值,解决难题的时候还特别爽.耐心.毅力.执着,再加上正确的工具——只要有它们的亲密协作,优雅.漂亮的代码就是手到擒来的事儿. 但是,紧接着拙劣的资源部署.新增的特性请求.糟糕的文档更新汹涌而来,打破了我们的美梦. 但是这并不是说我们的努力就没有价值.只是我们需要面对现实罢了.下面就是编程开发人员必须接受的10个残酷真相. 残酷的开发真相No. 1: 编程就是if-then-else语句的运用 编程语言设计者讨论.抽象化思考等等作为,其实都只是

菜鸟好文推荐(二十三)——成为一名更好的程序员:如何阅读源代码

阅读源代码有许多益处.你会发现新的架构(construct)和库,与其他的代码维护者产生共鸣,但最重要的是学会如何组织代码,避免因内部极其复杂而变得不可维护. 但是也有一个不好的地方,那就是阅读源代码太困难了.每当我看到一个新的代码库(code base)时,这种让人眩晕的感觉就充斥了我的大脑.我的内心告诉我压根不想趟眼前这趟浑水. 这是(希望是)正常的反应.当我们的大脑接触过多的新东西,就会产生排斥.造物主赋予我们的这台强大的模式匹配机器根本找不到规律.所有的抽象(abstraction)都是