(更多文章,可到微信公眾號(hào):bigdata321, 尋求報(bào)道轉(zhuǎn)載,請(qǐng)加微信:didaomaster)
最近在 某Q上看到一個(gè)帖子靡挥,號(hào)召程序員分享自己見過最有趣的代碼注釋⊙炻蹋看到了各種有趣的注釋跋破,打算分多篇摘編分享給大家。
1. Bill Poucher 的分享(他是一位計(jì)算機(jī)科學(xué)教授)
我見過的最佳注釋是以 HTML 格式寫在源代碼里的瓶蝴,任何想要閱讀的人都能看得見毒返。我管它叫“Cerny效應(yīng)”。
曾經(jīng)有一位很有天賦的捷克研究生 Tomas Cerny舷手,在 Baylor 大學(xué) ICPC(國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽)技術(shù)研發(fā)部主任 Jeff Donahoo 博士的領(lǐng)導(dǎo)下拧簸,負(fù)責(zé)將另外一位很聰明的研究生的設(shè)計(jì)原型轉(zhuǎn)換成實(shí)際產(chǎn)品。
有一天男窟,Jeff 到我的辦公室跟我說盆赤,在他們ICPC實(shí)驗(yàn)室,冷戰(zhàn)的格局正在形成歉眷。因?yàn)橛腥嗽谠创a的注釋里寫了一些話牺六,冒犯到了其他人。(為了看看情況汗捡,)我就隨他一起去找了Tomas淑际。
Jeff去了以后就開門見山地問:“Tomas,你是不是在Joel的代碼上加了注釋扇住,說他的代碼是愚蠢(retarded)的春缕?”Tomas倒是很坦白地說:“是的∷姨#”Jeff又問:“你憑什么這么寫呢淡溯?”Tomas回答說:“因?yàn)椋ㄋ拇a)確實(shí)愚蠢(retarded)啊簿训!”
我就站在一邊看著咱娶,Tomas一臉懵逼米间,Jeff強(qiáng)壓怒火,場(chǎng)面真是大寫的尷尬膘侮。接著屈糊,Tomas拿出了他的《捷克語(yǔ)-英語(yǔ)詞典》,打開琼了,上面寫著逻锐,詞義:“開發(fā)中(under developed):retarded”(譯注:其實(shí)retarded這個(gè)詞有兩個(gè)意思,既有“弱智雕薪,愚蠢”的意思昧诱,也有項(xiàng)目未完成,正在開發(fā)中的意思所袁,這也是造成這個(gè)誤會(huì)的原因盏档。)
是的,開發(fā)確實(shí)還沒完成……后來燥爷,Tomas就把注釋修改為了“建設(shè)中(Under construction)”蜈亩。然后我和Jeff都對(duì)Tomas拓展英語(yǔ)能力的熱情捧腹大笑。我至今不知道當(dāng)年這個(gè)誤會(huì)是不是真的解決了前翎。
跟你們說稚配,我和Jeff都很愛講這個(gè)段子,后來每當(dāng)我們把Tomas介紹給ICPC新成員的時(shí)候港华,就一定會(huì)講這個(gè)段子道川。Tomas現(xiàn)在已經(jīng)是布拉格捷克技術(shù)大學(xué)的計(jì)算機(jī)科學(xué)系教授了,他還是學(xué)校ICPC技術(shù)部的奠基人立宜,也是我非常好的朋友愤惰。
Tomas不僅在Baylor大學(xué)獲得了碩士學(xué)位,而且他在這里找到了他的伴侶赘理,一位音樂家宦言,同時(shí)也是奧運(yùn)會(huì)級(jí)別的田徑選手。當(dāng)然商模,這是另外一個(gè)關(guān)于奧林匹克的愛情故事了奠旺。
2. Anirudha Bose 的分享:
謝爾蓋.布林(Google的聯(lián)合創(chuàng)始人之一)在斯坦福大學(xué)念計(jì)算機(jī)科學(xué)博士學(xué)位的時(shí)候,他的簡(jiǎn)歷里并不含任何”待遇要求“(Objective)的字眼施流。但當(dāng)你去查看他的簡(jiǎn)歷的HTML源代碼的時(shí)候响疚,你會(huì)看到(他在簡(jiǎn)歷HTML源文件里明確寫了“待遇要求”,只是用注釋注掉了瞪醋,在瀏覽器頁(yè)面上不顯示忿晕。):
(其“待遇要求“的內(nèi)容是:辦公室要大,掙錢要多银受,干活要少践盼。如果能經(jīng)常去奇妙的地方旅行而且還能給報(bào)銷的話鸦采,那就更好了。)
布林簡(jiǎn)歷的原始鏈接在這里咕幻。
3. Abhinav Upadhyay 的分享
12/* You are not expected to understand this *//* 我們并不指望你能看懂這段話 */
這段注釋并不是我親眼所見渔伯,但是它在網(wǎng)上傳得很厲害。這段注釋是出自于貝爾實(shí)驗(yàn)室的Unix系統(tǒng)第六發(fā)行版肄程,并在《Lions’ Commentary on UNIX 6th Edition, with Source Code》這本書中標(biāo)注出來的锣吼。
代碼和標(biāo)注的細(xì)節(jié)如下:
123456789101112131415161718192021/** 切換到新進(jìn)程棧,并設(shè)置其段寄存器*/retu(rp->p_addr);sureg();/** 如果新進(jìn)程因?yàn)楸粨Q出而暫停蓝厌,則設(shè)置其棧級(jí)別為last call玄叠,并傳至sayu(u_ssay).* 這樣做的目的是確保aretu方法被調(diào)用后立即返回的值實(shí)質(zhì)上是上一次調(diào)用sayu的方法的返回值。** You are not expected to understand this.* 我們并不指望你能看懂這段話*/if(rp->p_flag&SSWAP){rp->p_flag=&~SSWAP;aretu(u.u_ssav);}/** The value returned here has many subtle implications.* See the newproc comments.*/return(1);
出處
4. Kalpesh Singh 的分享:
我有個(gè)壞習(xí)慣拓提,每當(dāng)我看到做得不錯(cuò)的網(wǎng)站读恃,我就回去控制臺(tái)看它的源代碼。我想很多前端工程師都喜歡這么干吧崎苗。
我訂購(gòu)了Box8服務(wù),并在他們的console里看到了如下信息舀寓。(伙計(jì)們胆数,他們居然在console/源代碼里面打招聘廣告。我對(duì)廣告什么的早就受夠了互墓,你們就不能搞點(diǎn)兒新花樣必尼?)
你們可以看看Box8.in的console。
不過這樣真的是挺有趣的篡撵。
還有一個(gè)比較有意思的注釋是target.com編程游戲網(wǎng)站的源代碼
可查看:Code With Target via The Geekiest Contact Form (BETA)
好好享受樂趣吧判莉!
5. Liu Wei 的分享[譯注:這明顯是一位來自中國(guó)的工程師]:
我在一周前在社交網(wǎng)站上看到很多人在討論這個(gè)網(wǎng)站,網(wǎng)站的源代碼包含了這些注釋育谬。
有人說券盅,這家公司應(yīng)該加強(qiáng)對(duì)代碼的審核機(jī)制。有人則懷疑這家公司可能沒有足夠的人力資源來做代碼審核膛檀,因?yàn)橹辽傩枰獌蓚€(gè)程序員才能完成這項(xiàng)工作锰镀。
6. Edwin Romero 的分享:
我不確認(rèn)有多少人熟悉站點(diǎn)內(nèi)的Robots.txt這個(gè)文件。其實(shí)這個(gè)文件不是運(yùn)行必要的代碼咖刃,但是它聲明了爬蟲/搜索引擎能爬到/搜到站點(diǎn)的哪些內(nèi)容泳炉。
我在Nike網(wǎng)站上發(fā)現(xiàn)的Robots.txt文件非常有意思,如下:
如果你讀一下文件頭部的內(nèi)容嚎杨,你就會(huì)發(fā)現(xiàn)它是這么寫的:
“…just crawl it.”
這種寫法和Nike品牌著名的廣告標(biāo)語(yǔ)“Just Do It”不謀而合花鹅。
**更新**
Nike最近修改了他們的robots文件,并在里面加入了一個(gè)有趣的圖案:
感謝Chris Shepherd 告訴我這個(gè)消息!
7. Soham Bhowmik 的分享:
好吧枫浙,這個(gè)回答其實(shí)并不完全是關(guān)于注釋刨肃,而是關(guān)于代碼古拴。
我的第一個(gè)項(xiàng)目,一個(gè)為印度非常流行的新聞?lì)l道做的iOS應(yīng)用之景,要求在交付之前制定規(guī)則斤富。這件事情已經(jīng)過去很久了,大約6年左右锻狗。當(dāng)時(shí)iOS的最新版本還只是3.2满力。無論公司什么時(shí)候把應(yīng)用交付給客戶,應(yīng)用都會(huì)被設(shè)置在5天之后過期轻纪,然后用戶就不得不回頭來找我們解決應(yīng)用的問題油额。
代碼是用Objective-C寫的:
1234567BOOLappExpired=........some code....;if(appExpired){[NSString hahahahhaha];//will purposely crash now, will not use exit(1)//這里故意讓程序崩潰,而不使用exit(1)}
當(dāng)然刻帚,如果現(xiàn)在還這么寫代碼編譯器就會(huì)報(bào)錯(cuò)潦嘶,但是當(dāng)時(shí)編譯器只會(huì)給出警告信息,然后程序在運(yùn)行的時(shí)候會(huì)因?yàn)檎{(diào)用未定義的方法而崩潰崇众。
8. Ray Mullins 的分享:
曾經(jīng)用過IBM的VSAM系統(tǒng)(包括z/OS和z/VSE以及其后續(xù)版本)的人掂僵,都應(yīng)該體驗(yàn)過這個(gè)系統(tǒng)的逗比特性。
我曾經(jīng)在一家德國(guó)的軟件公司任職顷歌,負(fù)責(zé)對(duì)一個(gè)事務(wù)處理監(jiān)測(cè)程序進(jìn)行技術(shù)運(yùn)維和研發(fā)锰蓬,這個(gè)監(jiān)測(cè)程序是美國(guó)開發(fā)的,有一個(gè)針對(duì)VSAM文件的接口眯漩,那么當(dāng)然程序就需要一個(gè)控制模塊負(fù)責(zé)對(duì)文件進(jìn)行存取操作芹扭。明顯寫這個(gè)控制模塊的人那天過得不太如意,因?yàn)樵诳刂颇K獲取通用錯(cuò)誤方法地址的那段代碼里赦抖,寫著這樣的注釋:”VSAM又SB了(FUCKED UP AGAIN), 到這里來舱卡。“ 更有趣的是队萤,這些控制模塊的代碼被正式印到操作手冊(cè)上(包括帶有FUCK的那段文字)轮锥,所以在差不多20年的實(shí)踐里,這個(gè)注釋就這么被寫在那里然后發(fā)給客戶要尔。然后直到某一天有個(gè)客戶想對(duì)控制模塊進(jìn)行替換交胚,然后才發(fā)現(xiàn)有這么個(gè)注釋,然后才告訴我們盈电。
接下來的這個(gè)不是注釋蝴簇,而是來自于我的實(shí)際工作。我們當(dāng)時(shí)有一套內(nèi)部標(biāo)準(zhǔn)和方法文檔匆帚。我們的系統(tǒng)程序員需要為一個(gè)什么渣渣的4GL產(chǎn)品的延遲方法編寫文檔熬词,并進(jìn)行演示。他的文檔草稿第一版草稿大概是這么寫的:
1234IFTIMEDIFF>=5SAY"THE SYSTEM IS FUCKED, PLEASE BEAR WITH US"http://如果系統(tǒng)SB了,請(qǐng)和我們一起忍受SLEEP(10)ENDIF
草稿寫完了以后他就去忙東忙西互拾,根本沒時(shí)間搞文檔歪今,接著突然發(fā)現(xiàn)文檔的提交期限就在晚上了。于是他就直接把草稿發(fā)給文檔管理人員了颜矿,根本都沒看寄猩。一周以后,上百份文檔就這么被打印出來分發(fā)出去了骑疆。并且田篇,內(nèi)容就是他草稿上寫的那些,一個(gè)字都沒改箍铭。
9. Terry Lambert 的分享:
我最喜歡的注釋有兩個(gè)泊柬,都是Bill Paul寫的。這家伙為FreeBSD做了大量的工作诈火,現(xiàn)在受雇于Wind River System兽赁,聽說這個(gè)公司最近要被Intel收購(gòu)了。Bill是一個(gè)非常有才華的程序員冷守,但是他對(duì)愚蠢的容忍度也出奇的低刀崖,并且他的幽默感也很不同尋常。
下面是我喜歡的第一條注釋拍摇,這是從RelTek 8129/8139 PCI NIC 驅(qū)動(dòng)程序里找到的亮钦。
1234567891011121314151617181920212223242526272829303132333435363738/**The RealTek8139PCI NIC redefines the meaning of'low end.'RealTek8139PCI NIC重刷了low逼的下限*這可能是史上寫得最爛的PCI以太網(wǎng)控制器驅(qū)動(dòng)*with the possible exception of the FEAST chip made by SMC.*The8139supports bus-master DMA,but it hasaterrible*interfacethat nullifies any performance gains that*bus-master DMA usually offers.**Fortransmission,the chip offersaseries of four TX*descriptor registers.Eachtransmit frame must be ina*contiguous buffer,aligned onalongword(32-bit)boundary.*Thismeans we almost always have todombuf copies inorder*totransmitaframe,except inthe unlikely casewherea)*the packet fits intoasingle mbuf,andb)the packet is*32-bit aligned within the mbuf's data area. The presence of* only four descriptor registers means that we can never have* more than four packets queued for transmission at any one* time.** Reception is not much better. The driver has to allocate a* single large buffer area (up to 64K in size) into which the* chip will DMA received frames. Because we don'tknow where*within thisregion received packets will begin orend,we*have no choice but tocopy data from the buffer area into*mbufs inorder topass the packets up tothe higher*protocol levels.**要讓這么爛的設(shè)計(jì)去達(dá)到100Mbps的速度簡(jiǎn)直就是天方夜譚*除非你有一臺(tái)CPU強(qiáng)勁的電腦去驅(qū)動(dòng)*400MhzPII orsome equally overmuscled CPU todrive it.**On the bright side,the8139does haveabuilt-inPHY,*although rather than using an MDIO serial interfacelike*most other NICs,the PHY registers are directly accessible*through the8139'sregister space.The8139supports*autonegotiation,aswell asa64-bit multicast filter.*
這絕對(duì)是一個(gè)很爽的注釋。傳說為了讓 Bill 能把這段注釋刪掉/修訂/修改/更新等等授翻,廠家用了各種條件去誘惑他或悲,但是他都拒絕了孙咪。
第二段注釋是寫在一個(gè)修改版的BSD許可證的“限制傷害”條款里的堪唐,Bill在他的代碼里引用了這個(gè)許可證協(xié)議。其實(shí)它并沒有對(duì)原先的協(xié)議做大的修改翎蹈,所以很多人看到這個(gè)協(xié)議以后淮菠,一看跟模板差不多,然后就跳過了荤堪,幾乎沒什么人仔細(xì)去看整個(gè)文字合陵。
123INNO EVENT SHALL Bill Paul ORTHE VOICES INHIS HEAD BE LIABLEFORANY DIRECT,INDIRECT,INCIDENTAL,SPECIAL,EXEMPLARY,ORCONSEQUENTIAL DAMAGES
怎么樣,你沒見過這條吧澄阳。其實(shí)很容易就看掉了拥知。有趣的地方正好在這里:
「Bill Paul以及他頭腦中的想法絕不會(huì)直接,間接碎赢,偶然低剔,特殊,典型或?qū)嵸|(zhì)性地造成任何損害〗蟪荩」
總之姻锁,這哥們兒是個(gè)天才。
10. Boris Zamoruev 的分享
我曾經(jīng)做過一個(gè)高性能分布式鍵/值存儲(chǔ)的項(xiàng)目猜欺。這是一個(gè)設(shè)計(jì)很精巧的軟件位隶,API非常簡(jiǎn)潔。如果你要獲取一個(gè)數(shù)值开皿,那么你就用命令:GETN(get, 數(shù)值)即可涧黄。如果你要存一個(gè)數(shù)值,那就用命令:PUTN(put, 數(shù)值)即可副瀑。其他的命令也很簡(jiǎn)單弓熏,比如MGETN(get multiple, 數(shù)值),MPUTN(put multiple, 數(shù)值)糠睡,INCR(增量), MINCR(多個(gè)增量)挽鞠,(基本上命令都可以自解釋)。
所有的命令都會(huì)被送到一個(gè)dispatcher函數(shù)去進(jìn)行解析狈孔,辨明邏輯信认,然后去調(diào)用相應(yīng)的處理函數(shù)。處理函數(shù)基本上也是自解釋風(fēng)格的均抽,因此代碼里面也不需要太多注釋嫁赏,例如:
C++
123intServer::handle_getn(…){…}intServer::handle_mgetn(…){…}
不過有一天,有人讓我review一下下面這段代碼:
C++
1234// In Soviet Russia, Putn handles you!// 在前蘇聯(lián)油挥,Putn 就會(huì)搞定你潦蝇!【譯注:注意,Putn 和普京的英文拼寫(Putin)非常接近深寥。普京曾經(jīng)是蘇聯(lián)的克格勃攘乒。】intServer::handle_putn(…){}
我當(dāng)即就選擇了通過惋鹅,然后合并到代碼庫(kù)并且發(fā)布了则酝。據(jù)我所知,現(xiàn)在這段代碼還在代碼庫(kù)里闰集。
11. Nikunj Madhogaria 的分享
C++
12//drunk, fix later//喝大了沽讹,一會(huì)兒再改
Java
123Catch(Exceptione){//who cares? // ← 這不翻譯了,估計(jì)都能看懂吧}
我最喜歡的一個(gè)注釋是:
C++
1longlongago;/* in a galaxy far far away */
讀者如果不明白什么意思武鲁,請(qǐng)看下圖:
12. Sasha Krassovsky 的分享
曾經(jīng)有一次爽雄, 我從學(xué)生交給我的代碼里隨便挑了一份來看,然后發(fā)現(xiàn)了這么一條注釋:
C++
1
/* 不要?jiǎng)h除這段注釋 */
當(dāng)然沐鼠,我就是要試一下如果把注釋刪除了到底會(huì)怎么樣挚瘟。所以我就刪除了,然后重新編譯。結(jié)果程序真的就不能運(yùn)行了刽沾。然后我把注釋重新加回去本慕,結(jié)果又好了。
刪掉注釋以后會(huì)報(bào)錯(cuò) LINK1000侧漓,根據(jù)鏈接器錯(cuò)誤文檔的說明锅尘,錯(cuò)誤的原因直接就是:“未知錯(cuò)誤;請(qǐng)參考文檔或?qū)で蠹夹g(shù)支持布蔗√傥ィ”
為什么這個(gè)注釋不能去掉呢?我估計(jì)這個(gè)問題對(duì)我來說一直就是個(gè)謎纵揍。
13. Wojtek Swiatek 的分享
我看過一些數(shù)據(jù)分析的代碼顿乒,然后就被下面的注釋震驚了:
C++
123456# 不要再用 anal 做變量名了# [譯注:寫注釋的人是想用 anal 這個(gè)縮寫來表示analyze(分析),可是 anal 這個(gè)單詞的意思是“肛門”]# 我特么在哪都能看到 anal 這個(gè)詞泽谨!# 請(qǐng)不要再這么做了璧榄!# 你們要用就用analyze,或者xbvvzr吧雹,要不然用什么其他的都可以骨杂。就是別寫成 anal_insert 或者 anal_check了#【譯注:insert是插入的意思,check是檢查的意思雄卷,其他的你們自行腦補(bǔ)吧】
14. Michael Dehmlow 的分享
我新入職了一個(gè)公司搓蚪,然后發(fā)現(xiàn)了一段三周之前寫的注釋,這段注釋是項(xiàng)目之前的研發(fā)團(tuán)隊(duì)寫的丁鹉,寫的日期就是我來公司面試和正式入職的這段期間妒潭。
我有幸在原來負(fù)責(zé)這個(gè)項(xiàng)目的先生們被炒魷魚的前一天被派來參與這個(gè)項(xiàng)目。
C++
123456789101112131415161718/* 這坨代碼寫得像屎一樣揣钦,寫代碼的SB做了很蠢的事情* 他們讓itvinserter.dll依賴egg_end470.dll雳灾。* 然后又讓egg_en470.dll依賴itinserter.dll. 簡(jiǎn)直是白癡!不過拂盯,* 是有一個(gè)合理的辦法能解決這個(gè)問題佑女,而我正好打算做點(diǎn)兒深入研究去解決记靡。* 不過谈竿,真正唯一能解決問題的辦法是,找到這個(gè)當(dāng)初寫代碼的狗娘養(yǎng)的摸吠,* 然后沖他的兩腿之間狠狠踢上一腳空凸。雖然這樣解決不了問題,但是這樣* 能伸張正義寸痢。*** 真TM是個(gè)SB** 呵呵** The EEGEN470::TapeDeck is an abstract class for controlling tape* decks....ah, fuck, I can't do it. I can't even fucking document the hack.* Just figure out, you're a smart fellow.**/
15. Ryan Jentzsch 的分享
好多年前我在一個(gè)公司工作呀洲,我現(xiàn)在都還保留著那時(shí)的磁盤,上面有我當(dāng)時(shí)寫的程序代碼和我對(duì)前任CEO留下的注釋。
C++
12345678910111213141516171819202122232425262728293031323334353637383940414243444546/*這個(gè)公司的CEO(也就是我的前任老板)告訴我可以隨意寫注釋道逗,而且我確實(shí)也該這么做兵罢。我把前任CEO稱為蘸屎(Dip Shit),簡(jiǎn)稱DS.DS覺得他自己是一個(gè)軟件開發(fā)的天才滓窍。很遺憾對(duì)我來說(我是程序的維護(hù)者)卖词,我的主要任務(wù)就是擦他沒擦干凈的屎。DS是一個(gè)想一出是一出的開發(fā)者吏夯。就像Evel Khievel在他的代碼做的一樣此蜈,大量使用GOTO語(yǔ)句,而且貿(mào)然直接從一個(gè)模塊跳到了另外一個(gè)模塊的IF...THEN語(yǔ)言中間噪生,況且這個(gè)模塊和第一個(gè)模塊根本就沒關(guān)系裆赵。說到IF結(jié)構(gòu),DS真的很喜歡用跺嗽。他根本就不知道還有CASE或者SWITCH塊這種東西战授。然后我就只能去當(dāng)一個(gè)代碼考古學(xué)家,在深深的IF-ELSE嵌套層次(而且還是沒有縮進(jìn)的那種)中苦苦挖掘DS認(rèn)為他自己很聰明桨嫁,并且這在他給變量命名的時(shí)候就有體現(xiàn): global i=0; global dateMyWife = 1; datesAreAFruit = '12/12/98'; giveDatesToMyWife = datesAreAFruit + dateMyWife; if (someStuid) { giveDatesToMyWife = false; } // Ryan. Why does this sometimes crash? if (giveDatesToMyWife) goto :hotTub // 好吧DS陈醒,因?yàn)槟阈薷牧薵iveDatesToMyWife數(shù)據(jù)類型(不僅如此,你還把整型和字符串類型相加——編譯器已經(jīng)警告你了)...總之在弱類型的語(yǔ)言里你獲得了腦殘的能力瞧甩,你時(shí)不時(shí)修改數(shù)據(jù)類型钉跷,把字符串改成布爾型,所以當(dāng)if(giveDatesToMyWife) 運(yùn)行時(shí)肚逸,里面的變量是一個(gè)字符串爷辙,程序肯定會(huì)崩潰——因?yàn)樽址皇且粋€(gè)可邏輯判斷的類型。還有朦促,因?yàn)閟omeStuid是全局的膝晾,所以只有你擁有超能力,才能知道這些全局變量在哪里定義务冕,或者是在哪里被修改過血当。DS只會(huì)用全局變量,而不會(huì)用局部變量禀忆。引用他的原話:“我用局部變量臊旭,或者私有成員變量的時(shí)候,我的程序老是報(bào)錯(cuò)箩退,說變量未找到什么的离熏。所以我干脆就把所有東西都搞成全局的好了〈骼裕”我還有更多的例子滋戳,其實(shí)如果你也被這種天馬行空的代碼虐過的話钻蔑,你就能體會(huì)我是什么感受了。*/
(更多文章奸鸯,可到微信公眾號(hào):bigdata321, 尋求報(bào)道轉(zhuǎn)載咪笑,請(qǐng)加微信:didaomaster)