《高效能程序员的修炼》一避免写注释

避免写注释

高效能程序员的修炼
如果用很多的注释来“装饰”代码是件好事的话,那么在代码中加入大片大片的注释便是锦上添花了。对吗?事实上并不完全是这样。过犹不及,好心也会办坏事。

'*************************************************
' Name: CopyString
'
' Purpose: This routine copies a string from the source
' string (source) to the target string (target).
'
' Algorithm: It gets the length of "source" and then copies each
' character, one at a time, into "target". It uses
' the loop index as an array index into both "source"
' and "target" and increments the loop/array index
' after each character is copied.
'
' Inputs: input The string to be copied
'
' Outputs: output The string to receive the copy of "input"
'
' Interface Assumptions: None
'
' Modification History: None
'
' Author: Dwight K. Coder
' Date Created: 10/1/04
' Phone: (555) 222-2255
' SSN: 111-22-3333
' Eye Color: Green
' Maiden Name: None
' Blood Type: AB-
' Mother's Maiden Name: None
' Favorite Car: Pontiac Aztek
' Personalized License Plate: "Tek-ie"
'*************************************************

我经常跳过开发者写的注释,懒得看它们!他们似乎并不明白,其实他们的代码已经告诉我程序是怎样工作的;我需要注释告诉我的是,程序为什么这样工作。代码注释已经被广泛地误解和滥用,以至于你都开始怀疑它们原本的价值——注释还有存在的必要吗?你在期待什么?要当心!这里有一段完全没有注释的代码:

r = n / 2;
while ( abs( r - (n/r) ) > t ) {
  r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

明白这段代码想要做什么吗?它看起来一清二楚,但到底是干什么用的呢?

让我们加上一行注释:

// 用“牛顿-拉夫逊”近似法求解n的平方根

r = n / 2;
while ( abs( r - (n/r) ) > t ) {
  r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

这个应该就是我想要的了。不是吗?它介于完全没有注释与每隔一行就规规矩矩写上史诗般的注释这两种极端之间,看起来是一个不错的折中——对此你满意吗?

未必!与其添加注释,我更愿意把这段代码重构成这样:

private double SquareRootApproximation(n) {
  r = n / 2;
  while ( abs( r - (n/r) ) > t ) {
    r = 0.5 * ( r + (n/r) );
  }
  return r;
}
System.out.println( "r = " + SquareRootApproximation(r) );

我连一行注释也没有加,但这段神秘的代码现在已经非常容易理解了。

尽管注释本身说不上是好还是坏,它们却常常被用作支撑代码的“拐杖”。你应该总是专注于编写代码,而忘了还有注释这种东西的存在。这会迫使你竭尽全力使用最简单、最直白、最能进行自我说明的方式把代码写出来。

为了让你的程序员同伴们更容易阅读和理解你的代码,你需要不断地改进你的代码,但如果你已经重写、重构甚至重新设计了很多遍——当你已经一筹莫展,已经想不出任何办法可以让你的代码变得更加浅显易懂——这时候,也只有在这时候,你才应该在百般无奈之下加上些注释来解释你的代码。

就像Steve Yegge指出的那样,这是初级开发者与高级开发者之间的一个关键差别:

坦率地说,要是在以前,让我一下子看太多的代码会让我崩溃,它的复杂度已经超出了我能接受的极限。而当我不得不在那些代码的基础上继续工作的时候,我通常会重写它们,或者至少也会写上大量的注释。现如今,当我碰到这种情况的时候我会披荆斩棘快速通过,而不会(过多地)抱怨。当我在脑子里有了一个明确的目标并且有一段复杂的代码要写时,我会把时间花在实现代码上面,而不是(用注释)写下它的故事、讲给我自己听。

初级开发者依靠注释来讲故事,而实际上他们应该依靠代码本身。注释是“旁白”,它们有其自身的价值,但绝不能用来代替(故事里的)情节、人物和场景。

或许这才是关于代码注释不可告人的小秘密:要想写出好的注释,你必须是一位优秀的作家。注释跟代码不一样,它不是写给编译器看的。注释是用来和其他人交流想法的文字。尽管我跟(大多数)程序员同伴们关系很好,但我必须承认,与其他人有效地沟通真的不是我们的强项。我曾经收到过我们团队里一位程序员发来的电子邮件,内容只有3段文字,但着实把我搞得晕头转向。我们能相信这样的人会在代码里写出清晰、易懂的注释吗?于是我想,或许让我们中的一些人去做那些他们擅长的事情会更好些——那就是,为编译器写代码,并且尽可能写得清楚些,而只把注释当作是最后没有办法的办法。

写出好的、有意义的注释是很难的。就像写代码一样,它是一门艺术;或许写注释还要更艺术一点!就像Sammy Larbi在“Common Excuses Used To Comment Code and What To Do About Them”(给代码加注释的常见理由以及应对方法)一文中所说的那样,如果你觉得你的代码在没有注释的情况下显得过于复杂、很难被人理解,那只能说明你的代码写得太糟糕了。重写你的代码吧,直到它不再需要任何注释。如果经过努力,你仍然觉得注释是必需的,那你就务必加上注释。切记,小心!

时间: 2024-09-20 08:53:37

《高效能程序员的修炼》一避免写注释的相关文章

读书笔记--《高效能程序员的修炼》

        初次邂逅......        最近小编抽空看了一本书,书的名字叫做<高效能程序员的修炼>,从这本书的名字就能看出来,软件开发远不只是写代码那么简单,你要学会的是高效能的工作,这让小编想到了去年读过的一本书<高效能人士的七个习惯>,有兴趣的小伙伴可以看看哦,受益匪浅,<高效能程序员的修炼>这本书从人文角度而非技术角度去阐释了作为一个程序员,应该具备的基本素质,所以小编在看这本书的过程中,感到非常的有共鸣,通俗易懂,又很贴近小逼啊工作和生活中的实际,

《高效能程序员的修炼》一向橡皮鸭求助

向橡皮鸭求助 高效能程序员的修炼 在Stack Exchange上,我们坚持要求提出问题的人需要在自己的问题上多下些功夫,而且我们在这方面有些偏执.那就是说,当你开始要提问题的时候,你应该: 用足够多的细节来描述发生的状况,这样我们可以顺着你的描述继续研究下去.即使在你所在的特定领域里我们并不是专家,你也要向我们提供必要的背景情况,这样我们可以了解到底发生了什么事情. 告诉我们你为什么需要知道答案.你怎么会出现在这里?是闲来无事的好奇,还是在某个项目里遇到了障碍?我们不是要求你长篇大论地讲生活故

《高效能程序员的修炼》一如何培养写作习惯

如何培养写作习惯 高效能程序员的修炼 我得忏悔一下:程序员同胞们,从某种程度上来说,我创办的Stack Overflow网站"耍"了大家. 在你找来棍棒准备揍我之前,请允许我先解释一下. 在过去的6年时间里,我越来越坚定地有了这样一个想法,那就是:成为一名杰出的程序员其实跟写代码没有太大的关系.做程序员确实需要一些技能,当然,还要有坚韧不拔的精神.但除此之外,更重要的还是要有良好的沟通技巧. 杰出的程序员跟勉强过得去的程序员之间的差别,不在于他们掌握了多少种编程语言,也不在于他们谁更擅

《高效能程序员的修炼》一大道至简

大道至简 高效能程序员的修炼 作者在Twitter上发的一条短讯: "你永远都有简化的空间." 11:29 AM – 2012-5-21 Rich Skrenta在"Code is our enemy"(代码是我们的敌人)一文中是这么说的: 代码不是什么好东西.代码会随着时间的推移慢慢腐烂.代码需要周期性的维护.代码里还藏有bug.新增功能意味着旧的代码需要被修改.你的代码越多,bug能藏身的地方就越多,迁出(checkout)或者编译的时间也就越长,新员工理解你的

《高效能程序员的修炼》一一路向前冲

一路向前冲 高效能程序员的修炼就运营Stack Overflow这个公司而言,我采用的商业策略全来自一个人,而且只有这一个人:Curtis Armstrong. 更准确地说,是Curtis Armstrong在1985年的经典荒诞青春喜剧<再见人生>(<Better Off Dead>)中所扮演的Charles De Mar.当他被问到如何从一个特别险峻的高山上滑雪下去的时候,他回答道: 沿着那条路下去,一定要快.如果有什么东西挡住了你的去路--绕开它! 在我们宣布Stack Ov

《高效能程序员的修炼》一磨刀不误砍柴工

磨刀不误砍柴工 高效能程序员的修炼作为一名软件开发人员,你该如何磨快你的锯子? "磨锯子"实际上是一个代名词,泛指一切编程以外的活动(不必编写代码),而这些活动(从理论上来说)能使你成为一名更出色的程序员.这个词源自于Covey的一本书:<高效能人士的7个习惯>(<The 7 Habits of Highly Effective People>).1 有个人在山间漫步,偶遇一位伐木工.他便停下来观察这位伐木工,看他热火朝天地锯一棵很大的树.他发现这位伐木工干得大

《高效能程序员的修炼》一性能致胜

性能致胜 高效能程序员的修炼在Stack Overflow和Stack Exchange上,我们总是非常强调性能.不仅仅因为我们是性能的发烧友(我很内疚),也因为我们认为速度是一个竞争优势.已经有大量的实验数据表明,网站载入和显示的速度越慢,使用它的人就会越少. Google发现,显示10个结果的网页需要0.4秒来生成,显示30个结果的网页需要0.9秒来生成.半秒钟的延迟会造成20%的流量下降.半秒钟的延迟就扼杀了用户的满意度. 在A/B1测试中,亚马逊试着以100毫秒为单位逐步增加页面的延迟,

《高效能程序员的修炼》一学会读源代码

学会读源代码 高效能程序员的修炼在"沟通"这个复杂的领域里,写出能让人类领会并理解的连贯段落比敲出几行不至于让解释器或编译器"呕吐"的软件代码要难得多. 这就是为什么--就软件开发而言--所有的文档大概都是很差劲的.而且,由于为人写作比为机器写作要困难得多,恐怕在可预见的将来,文档还会继续差劲下去.对此,你基本上是无能为力的. 除了做一件事-- "卢克1,学着去读源代码." JavaScript"始终带有源代码"是一股革命性的

《高效能程序员的修炼》一导读

译者序 高效能程序员的修炼出版社的冀康一开始来找我谈翻译这本书的时候,我的第一反应是:这兄弟真是不知道我现在有多忙!我每天要处理200多封邮件:在资源有限的情况下经常要同时带6-7个项目,而且每个项目的交付计划都很紧,压力很大:每天起码工作12个小时,有时候还要熬夜跟美国同事开会:周六基本上也是工作状态--我哪里还有空来翻译书?! 后来,当我了解到这本书的作者是Stack Overflow网站的创始人Jeff Atwood,还有书的内容实际上就是从作者的博客网站Coding Horror精选而来

《高效能程序员的修炼》一关于多任务的神话

关于多任务的神话 高效能程序员的修炼在<质量·软件·管理:系统思维(第1卷)>一书中,Gerald Weinberg1提出了一个经验法则,用以计算由于切换项目而引起的浪费. 根据Weinberg的计算,哪怕在你的工作负荷中只是增加一个项目,也会严重地影响你的效率.你会损失20%的时间.当你增加第三个项目的时候,你会有将近一半的时间浪费在任务切换上面. 即便你同一时间只做一个项目,这种问题也可能会发生.轻易被电子邮件.电话以及即时消息打断你正在进行的工作,其影响可能是深远的,就像BBC2的这个研