编译:伯乐在线/黄小飞
【指南】:代码注释的作用不需要向程序员解释。 有时候看别人的代码,能看到一些让人发笑的注释。 例如:
或者:
// 当我写下这段代码时,只有上帝和我知道它在做什么
// 只有上帝现在才知道
我最近在 Quora 上看到一篇帖子,号召程序员分享他们见过的最有趣的代码注释。 看到各种有趣的笔记后,我打算分多段摘录与大家分享。
1. Bill Poucher 的份额(他是计算机科学系的院长)
我见过的最好的注释都是在源代码中用 HTML 编写的,任何想要阅读它们的人都可以看到。 我称之为“塞尔尼效应”。
曾经有一位非常聪明的德国研究生Tomas Cerny,在贝勒大学ICPC(国际大学生编程竞赛)技术开发总监Jeff Donahoo博士的带领下,负责将另一位非常聪明的研究生的设计原型转化为一个实际的产品。
三天来,杰夫来到我的办公室,告诉我,在他们的ICPC实验室里,冷战的格局正在显现。 因为有人在源码的注释里写了一些东西网站模板 源码,得罪了其他人。 (看看发生了什么,)我和他一起去了托马斯。
Jeff走后开门见山地问道:“Tomas,你是不是给Joel的代码加了注释,说他的代码荒唐(弱智)?” 托马斯坦言:“是的。” 杰夫接着问:“你为什么这样写?” 托马斯回答道:“因为(他的代码)实在是太可笑了(弱智)!”
我只是站着看,托马斯一脸困惑,杰夫强忍着怒火,场面实在是太尴尬了。 接下来,托马斯拿出他的《捷克英词典》,打开一看,上面写着,意思是:“under发达:弱智”(译注:其实,弱智这个词有两个意思,都是“智障、愚蠢”的意思)该项目尚未完成,正在开发中,这也是造成这种误解的原因。)
是的,开发确实还没有完成……后来,Tomas 将注释改为“正在建设中”。 然后,杰夫和我都对托马斯扩展法语的热情感到捧腹大笑。 我还不知道这个误会是否真的解除了。
让我告诉你,杰夫和我非常喜欢这个笑话。 以后,每当我们向新的ICPC会员介绍托马斯时,我们一定会讲这个笑话。 托马斯现在是布拉格捷克技术大学计算机科学系的系主任。 他也是学校ICPC技术部的创始人,也是我很好的同事。
除了从贝勒学院获得硕士学位外,托马斯还在这里找到了他的伴侣,一位音乐家和奥运会级别的短跑运动员。 当然,这又是一个关于奥林匹亚的爱情故事。
ICPI-ACM 国际大学生编程竞赛,由 IBM 赞助。
2. Anirudha Bose 分享:
当谢尔盖·布林(Sergey Brin,谷歌联合创始人之一)攻读博士学位时。 在斯坦福大学计算机科学专业,他的简历中没有包含任何“招聘要求”(Objective)的字样。 但当你去查看他简历的HTML源代码时,你会看到(他在简历HTML源文件中明确写了“薪酬要求”,但被注释掉了,并没有显示在浏览器页面上):
(“薪酬要求”的内容是:办公室要大,钱要赚,工作要少,如果能经常去精彩的地方旅游,还能报销就更好了。)
3. Abhinav Upadhyay 分享
/* 你不应该理解这一点 */
/* 我们不期望你理解这段文字 */
这条评论不是我亲眼所见,但在网络上却广为流传。 此评论来自贝尔实验室的 Unix 系统第六版,在《Lions' Commentary on UNIX 6th Edition, with Source Code》一书中标注。
代码及标记详情如下:
/*
* 切换到新的进程堆栈并设置其段寄存器
*/
retu(rp->p_addr);
确定();
/*
* 如果新进程因被换出而挂起,则将其堆栈级别设置为最后一次调用并将其传递给 sayu(u_ssay)。
* 这样做的目的是保证aretu方法调用后立即返回的值本质上是上次调用sayu的返回值。
* 你不应该理解这一点。
* 我们不期望你能理解这段话
*/
if(rp->p_flag&SSWAP){
rp->p_flag=&~SSWAP;
aretu(u.u_ssav);
/*
* 这里返回的值有许多微妙的含义。
* 请参阅 newproc 注释。
*/
返回(1);
4.卡尔佩什·辛格分享:
我有一个坏习惯,每当我看到一个做得很好的网站时,我都会回到控制台查看它的源代码。 我想很多后端工程师都喜欢这样做。
我购买了 Box8 服务并在他们的控制台中看到了以下信息。 (伙计们,他们正在控制台/源代码上发布紧急招聘广告。我已经受够了广告之类的,你就不能想出一些新的东西吗?)
你可以看一下Box8.in的控制台。
但这真的很有趣。
另一个有趣的注释是target.com编程游戏网站的源代码
可查看:通过 The Geekiest 联系表(测试版)使用 Target 编写代码
玩得开心!
5、刘伟分享【注:这明显是来自中国的工程师】:
一周前我看到很多人在社交网站上讨论这个网站,网站的源代码中就包含了那些评论。
有人说,公司应该加强对代码的初步审查机制。 有人怀疑公司可能没有足够的人力资源来进行最初的代码审查,因为至少需要两名程序员才能完成这项工作。
6. 埃德温·罗梅罗分享:
我不确定有多少人熟悉网站上的 Robots.txt 文件。 事实上,这个文件并不是运行所必需的代码,但它声明了爬虫/搜索引擎可以抓取/搜索网站的哪些内容。
我在Nike网站上找到的Robots.txt文件特别有趣,如下:
如果你读一下文档后面的内容,你会发现它是这样写的:
“……就爬它吧。”
这种文笔与耐克著名的广告语“Just Do It”不谋而合。
**更新**
耐克最近更改了他们的机器人文件并添加了一个有趣的模式:
感谢克里斯·谢泼德爆料!
7.Soham Bhowmik的分享:
嗯,这个答案当然不完全是关于注释,而是关于代码。
我的第一个项目是一个针对美国非常受欢迎的新闻频道的 iOS 应用程序,在交付之前需要遵守规则。 这件事已经过去很久了,大约是六年前的事了。 当时iOS最新版本仅为3.2。 每当公司将应用程序发送给客户时,该应用程序就会在 5 天后过期,用户必须回到我们这里来修复该应用程序。
代码是用 Objective-C 编写的:
BOOLappExpired=.....一些代码......;
if(应用程序已过期)
[NSString哈哈哈哈];//现在会故意崩溃,不会使用exit(1)
//这里故意让程序崩溃而不使用exit(1)
当然,如果今天代码还是这样写的话,编译器会报错,但那时编译器只会给出警告信息,然后程序在运行时就会因为调用了未定义的方法而崩溃。
8. 雷·穆林斯分享:
任何使用过IBM的VSAM系统(包括z/OS和z/VSE及其后续版本)的人都应该体验过该系统的二手特性。
我曾在一家日本软件公司工作,负责一个事务处理检测程序的技术运营、维护和开发。 该检测程序是在日本开发的,具有 VSAM 文件的套接字。 事实上,程序需要一个控制模块来负责文件的访问操作。 显然,写这个控制模块的人今天过得很糟糕,因为在控制模块获取通用错误方法地址的代码中,有这样一条注释:“VSAM is FUCKED UP AGAIN,过来。”更有趣的是,这些控制模块的代码即将被打印在操作手册上(包括带有FUCK的文字),所以在近20年的实践中,这个注释写在那里,然后发送给客户。 然后直到三天后一个客户想要更换控制模块,他发现有这样的说明,然后告诉我们。
下一篇不是评论,而是我的实际工作。 我们有一套内部标准和技术文件。 我们的系统程序员需要记录并演示一个渣4GL产品的延迟方法。 他的文档草稿初稿大致是这样写的:
IFTIMEDIFF>=5
SAY"THE SYSTEM IS FUCKED, PLEASE BEAR WITH US"//如果系统很SB,请耐心等待
睡眠(10)
万一
草稿完成后,他忙着其他事情网站模板 源码,没有时间处理文件。 然后他突然意识到提交文件的截止日期是晚上。 所以他连看都没看就直接把草稿发给了文档经理。 一周后,数百份文件被复制并分发。 而且内容和他草稿里写的一模一样,没有改一个字。
9.特里·兰伯特分享:
有两个我最喜欢的笔记,都是比尔·保罗的。 这个人为 FreeBSD 做了很多工作,现在受雇于 Wind River Systems,我听说最近该公司将被 Intel 收购。 比尔是一位非常有才华的程序员,但他对荒唐事的容忍度也低得惊人,而且他有一种不同寻常的幽默感。
这是我喜欢的第一个评论,在 RelTek 8129/8139 PCI NIC 驱动程序中找到。
/*
*RealTek8139PCI NIC 重新定义了“低端”的含义。
RealTek8139PCINIC重置下限
*这可能是有史以来写得最差的 PCI 以太网控制器驱动程序
*SMC 制造的 FEAST 芯片可能除外。
*8139支持bus-masterDMA,但它很糟糕
*接口会抵消任何性能提升
*总线主控 DMA 通常提供。
*对于传输,该芯片提供了四个 TX 系列
*描述符寄存器。每个传输帧必须是
*连续缓冲区,在长字(32 位)边界上对齐。
*这意味着我们几乎总是必须按顺序 dombuf 副本
*传输帧,除非在不太可能的情况下)
*数据包适合 asinglembuf,并且 b) 数据包是
*在mbuf 的数据区域内32 位对齐。 的存在
* 只有四个描述符寄存器意味着我们永远无法拥有
* 任一处排队等待传输的数据包数量超过 4 个
* 时间。
* 接待也好不了多少。 驱动程序必须分配一个
* 单个大缓冲区(最大大小为64K),其中
* 芯片将DMA接收帧。 因为我们不知道在哪里
*在这个区域内收到的数据包将开始或结束,我们
*别无选择,只能将数据从缓冲区复制到
*mbufs 以便将数据包传递给更高层
*协议级别。
*考虑到这种糟糕的设计,不可能真正实现
这么糟糕的设计是不可能达到100Mbps的
* 100Mbps 时性能不错,除非你碰巧有
除非你有一台有强大CPU驱动的笔记本电脑
* 400Mhz PII 或一些同样强大的 CPU 来驱动它。
* 好的一面是,8139 确实有一个内置 PHY,
*虽然不是使用 MDIO 串行接口,例如
* 大多数其他 NIC,PHY 寄存器可直接访问
* 通过8139的寄存器空间。 8139支持
*自动协商,以及 64 位多播过滤器。
这绝对是一个很酷的笔记。 传说,为了让比尔删除/修改/修改/更新这张纸条,制造商用各种条件诱惑他,但他拒绝了。
第二条注释位于修改后的 BSD 许可证的“损害限制”条款中,比尔在其代码中引用了该条款。 其实它并没有对原来的合同做大的改动,所以很多人听到这个合同后,看到它和模板差不多,就直接跳过了。 很少有人仔细阅读全文。
比尔·保罗或他脑子里的声音对任何事件都不负有责任
对于任何直接、间接、附带、特殊、示范或
间接损失
什么,你还没看过这个吧? 其实很容易错过。 有趣的地方就在这里:
“比尔·保罗或他脑子里的东西绝不会造成任何直接、间接、偶然、特殊、示范性或实质性的损害。”
无论如何,这家伙是个天才。
10.鲍里斯·扎莫鲁耶夫分享
我之前从事过一个高性能分布式键/值存储项目。 这是一款设计精良的软件,具有极其简单的 API。 如果你想获取一个值,那么你可以使用命令:GETN(get,value)。 如果要保存值,请使用命令:PUTN(put, value)。 其他命令也很简单,比如MGETN(获取多个,值),MPUTN(放入多个,值),INCR(增量),MINCR(多个增量),(基本上命令可以不言自明)。
所有的命令都会被发送到一个dispatcher函数来分析、识别逻辑,然后调用相应的处理函数。 处理函数也基本上是不言自明的,所以代码上不需要太多注释,例如:
intServer::handle_getn(...){...}
intServer::handle_mgetn(...){...}
但是三天了,有人让我检查下面的代码:
// 在苏维埃俄罗斯,Putn 会对付你!
// 在前苏联,Putn 会抓到你! 【译注:注意Putn和普京的英文拼写(Putin)非常接近。 普京曾经是南斯拉夫的中央情报局局长。 】
intServer::handle_putn(...){
我立即选择pass,合并到代码库并发布。 据我所知,这段代码仍然在代码库中。
11. Nikunj Madhogaria的分享
//喝醉了,稍后修复
//我太醉了,稍后再改
捕获(异常){
//谁在乎?// ← 这不是翻译的,我猜你能理解它
我最喜欢的注释之一是:
很久很久以前; /* 在遥远的星系 */
如果读者不明白什么意思,请看右图:
12. 萨莎·克拉索夫斯基分享
有一次,我从一个中学生给我的代码中随机挑选了一段代码,然后发现了这样一段注释:
/* 不要删除该评论 */
/* 不要删除这条评论 */
当然,我只是想尝试看看如果评论被删除会发生什么。 所以我只是删除并重新编译。 结果,程序确实无法运行。 然后我重新添加注释,它又起作用了。
删除评论后会报错LINK1000。 根据链接器错误文档的描述,错误原因直接是:“未知错误;请参阅文档或寻求技术支持”。
为什么这条评论删不掉? 恐怕这个问题对我来说仍然是个谜。
13. Wojtek Swiatek 分享
我看到了一些数据分析代码,然后被下面的评论震惊了:
# 不要再使用 anal 作为变量名
# 我到处都能看到肛门这个词!
#请不要再这样做了!
# 如果你想使用它,请使用analyze或xbvvzr,或者你可以使用任何其他。 只是不要将其写为 anal_insert 或 anal_check 。
14. 迈克尔·德姆洛分享
我新加入一家公司,然后发现三周前写的评论。 此评论是开发团队在项目之前写的。 我写的日期是我笔试和即将进入公司之间的时间段。
在最初负责该项目的先生们被解雇的前一天,我很幸运地被派到这个项目上工作。
/*这段代码写得一塌糊涂,写这段代码的SB做了一些蠢事
* 他们使itvinserter.dll 依赖于egg_end470.dll。
* 然后让egg_en470.dll依赖itinserter.dll。 真是个蠢才! 但,
*有一个合理的方法来解决这个问题,我正准备做一些挖掘来解决它。
*然而,真正解决问题的唯一办法就是找到这个曾经写代码的王八蛋,
*然后用力踢他的两腿之间。虽然这并不能解决问题,但是
* 可以帮助正义。
*真正的TM是SB
**呵呵*
* EEGEN470::TapeDeck 是一个用于控制磁带的抽象类
*套牌...啊,操,我做不到。 我什至无法记录这次黑客攻击。
* 想想看,你是个聪明人。
*/
15. 瑞安·詹茨施 (Ryan Jentzsch) 分享
我很多年前在一家公司工作过,我还保留着当时的C盘,里面有我当时写的程序代码以及我给前任CEO留下的笔记。
/*
这家公司的首席执行官(我的前老板)告诉我想写什么就写什么,我就应该写。
我将前首席执行官称为 Dip Shit,简称 DS。
DS 认为自己是软件开发天才。对我来说不幸的是(我是该程序的维护者),我的
主要任务是擦掉他不干净的粪便。
DS是一个一想到就想到的开发者。 就像 Evel Kievel 在他的代码中所做的那样,
大量使用 GOTO 语句,以及大量从模块直接访问
跳转到另一个模块的IF...THEN语言中间,而这个模块
它与第一个模块完全无关。
说起IF结构,DS很喜欢用,他都不知道
CASE或者SWITCH挡住了这些东西。那我就只能是一段代码了
考古学家,挖掘深层 IF-ELSE 嵌套层次结构(仍然是未缩进的层次结构)
缩进)IF...THEN...ELSE 逻辑块。
DS 认为他很聪明,这在他命名变量时就表现出来了:
全局 i=0;
全局 dateMyWife = 1;
日期区域AFruit = '12/12/98';
GiveDatesToMyWife = 日期AreAFruit + dateMyWife;
如果(一些学生)
给我的妻子=假;
// 瑞安. 为什么有时会崩溃?
if (giveDatesToMyWife) 转到 :hotTub
//好的 DS,因为您更改了 GiveDatesToMyWife 数据类型
(不仅如此,你还将整数乘以字符串——编译器已经
警告你)......无论如何,在弱类型语言中你会得到
脑残能力,你经常改变数据类型,把字符串改成布尔值,所以当
从字符串到布尔值,因此当
当变量是字符串时 if(giveDatesToMyWife) 执行
当 if(giveDatesToMyWife) 运行时,里面的变量是一个字符串,
程序肯定会崩溃——因为字符串不是
逻辑上可确定的类型。另外,由于 someStuid 是全局的,所以
只有你有超能力,你才能知道这样的全局变量是在哪里定义的,
或者那里已经被改变了。
DS 将仅使用全局变量,而不使用局部变量。 引用他的话:“
当我使用局部变量或私有成员变量时,我的程序总是报错,
说找不到变量。 所以我会让一切都全球化。 ”
我还有更多反例。 事实上,如果你被这些不合情理的代码滥用了,你就会
我能感觉到什么。
*/