編譯:伯樂在線/黃小非
【導(dǎo)讀】:代碼注釋的作用,不需要對程序員解釋了。有時在查看他人代碼,能看到一些令人不禁大笑的注釋。比如:
或者:
// 寫這段代碼的時候,只有上帝和我知道它是干嘛的
// 現(xiàn)在只有上帝知道
最近在 Quora 上看到一個帖子,號召程序員分享自己見過最有趣的代碼注釋。看到了各種有趣的注釋,打算分多篇摘編分享給大家。
1. Bill Poucher 的分享(他是一位計算機科學(xué)教授)
我見過的最佳注釋是以 HTML 格式寫在源代碼里的,任何想要閱讀的人都能看得見。我管它叫“Cerny效應(yīng)”。
曾經(jīng)有一位很有天賦的捷克研究生 Tomas Cerny,在 Baylor 大學(xué) ICPC(國際大學(xué)生程序設(shè)計競賽)技術(shù)研發(fā)部主任 Jeff Donahoo 博士的領(lǐng)導(dǎo)下,負責將另外一位很聰明的研究生的設(shè)計原型轉(zhuǎn)換成實際產(chǎn)品。
有一天,Jeff 到我的辦公室跟我說,在他們ICPC實驗室,冷戰(zhàn)的格局正在形成。因為有人在源代碼的注釋里寫了一些話,冒犯到了其他人。(為了看看情況,)我就隨他一起去找了Tomas。
Jeff去了以后就開門見山地問:“Tomas,你是不是在Joel的代碼上加了注釋,說他的代碼是愚蠢()的?”Tomas倒是很坦白地說:“是的。”Jeff又問:“你憑什么這么寫呢?”Tomas回答說:“因為(他的代碼)確實愚蠢()啊!”
我就站在一邊看著,Tomas一臉懵逼,Jeff強壓怒火,場面真是大寫的尷尬。接著,Tomas拿出了他的《捷克語-英語詞典》,打開,上面寫著,詞義:“開發(fā)中(under ):”(譯注:其實這個詞有兩個意思,既有“弱智,愚蠢”的意思,也有項目未完成,正在開發(fā)中的意思,這也是造成這個誤會的原因。)
是的,開發(fā)確實還沒完成……后來,Tomas就把注釋修改為了“建設(shè)中(Under )”。然后我和Jeff都對Tomas拓展英語能力的熱情捧腹大笑。我至今不知道當年這個誤會是不是真的解決了。
跟你們說,我和Jeff都很愛講這個段子,后來每當我們把Tomas介紹給ICPC新成員的時候,就一定會講這個段子。Tomas現(xiàn)在已經(jīng)是布拉格捷克技術(shù)大學(xué)的計算機科學(xué)系教授了,他還是學(xué)校ICPC技術(shù)部的奠基人,也是我非常好的朋友。
Tomas不僅在Baylor大學(xué)獲得了碩士學(xué)位,而且他在這里找到了他的伴侶,一位音樂家,同時也是奧運會級別的田徑選手。當然,這是另外一個關(guān)于奧林匹克的愛情故事了。
ICPI-ACM國際大學(xué)生程序設(shè)計競賽,由IBM贊助。
2. Bose 的分享:
謝爾蓋.布林(Google的聯(lián)合創(chuàng)始人之一)在斯坦福大學(xué)念計算機科學(xué)博士學(xué)位的時候,他的簡歷里并不含任何”待遇要求“()的字眼。但當你去查看他的簡歷的HTML源代碼的時候,你會看到(他在簡歷HTML源文件里明確寫了“待遇要求”,只是用注釋注掉了,在瀏覽器頁面上不顯示。):
(其“待遇要求“的內(nèi)容是:辦公室要大,掙錢要多,干活要少。如果能經(jīng)常去奇妙的地方旅行而且還能給報銷的話,那就更好了。)
3. Abhinav 的分享
/* You are not to this */
/* 我們并不指望你能看懂這段話 */
這段注釋并不是我親眼所見,但是它在網(wǎng)上傳得很厲害。這段注釋是出自于貝爾實驗室的Unix系統(tǒng)第六發(fā)行版,并在《Lions’ on UNIX 6th Edition, with Source Code》這本書中標注出來的。
代碼和標注的細節(jié)如下:
/*
* 切換到新進程棧,并設(shè)置其段寄存器
*/
retu(rp->p_addr);
sureg();
/*
* 如果新進程因為被換出而暫停,則設(shè)置其棧級別為last call,并傳至sayu(u_ssay).
* 這樣做的目的是確保aretu方法被調(diào)用后立即返回的值實質(zhì)上是上一次調(diào)用sayu的方法的返回值。
* You are not to this.
* 我們并不指望你能看懂這段話
*/
if(rp->p_flag&SSWAP){
rp->p_flag=& ~SSWAP;
aretu(u.u_ssav);
/*
* The value here has many subtle .
* See the newproc .
*/
return(1);
4. Kalpesh Singh 的分享:
我有個壞習(xí)慣,每當我看到做得不錯的網(wǎng)站,我就回去控制臺看它的源代碼。我想很多前端工程師都喜歡這么干吧。
我訂購了Box8服務(wù),并在他們的console里看到了如下信息。(伙計們,他們居然在console/源代碼里面打招聘廣告。我對廣告什么的早就受夠了,你們就不能搞點兒新花樣?)
你們可以看看Box8.in的console。
不過這樣真的是挺有趣的。
還有一個比較有意思的注釋是編程游戲網(wǎng)站的源代碼
可查看:Code With Target via The Contact Form (BETA)
好好享受樂趣吧!
5. Liu Wei 的分享[譯注:這明顯是一位來自中國的工程師]:
我在一周前在社交網(wǎng)站上看到很多人在討論這個網(wǎng)站,網(wǎng)站的源代碼包含了這些注釋。
有人說,這家公司應(yīng)該加強對代碼的審核機制。有人則懷疑這家公司可能沒有足夠的人力資源來做代碼審核,因為至少需要兩個程序員才能完成這項工作。
6. Edwin Romero 的分享:
我不確認有多少人熟悉站點內(nèi)的Robots.txt這個文件。其實這個文件不是運行必要的代碼,但是它聲明了爬蟲/搜索引擎能爬到/搜到站點的哪些內(nèi)容。
我在Nike網(wǎng)站上發(fā)現(xiàn)的Robots.txt文件非常有意思,如下:
如果你讀一下文件頭部的內(nèi)容,你就會發(fā)現(xiàn)它是這么寫的:
“…just crawl it.”
這種寫法和Nike品牌著名的廣告標語“Just Do It”不謀而合。
**更新**
Nike最近修改了他們的robots文件,并在里面加入了一個有趣的圖案:
感謝Chris 告訴我這個消息!
7. Soham Bhowmik 的分享:
好吧,這個回答其實并不完全是關(guān)于注釋,而是關(guān)于代碼。
我的第一個項目,一個為印度非常流行的新聞頻道做的iOS應(yīng)用,要求在交付之前制定規(guī)則。這件事情已經(jīng)過去很久了,大約6年左右。當時iOS的最新版本還只是3.2。無論公司什么時候把應(yīng)用交付給客戶,應(yīng)用都會被設(shè)置在5天之后過期,然后用戶就不得不回頭來找我們解決應(yīng)用的問題。
代碼是用-C寫的:
=............;
if()
[];//will crash now, will not use exit(1)
//這里故意讓程序崩潰,而不使用exit(1)
當然,如果現(xiàn)在還這么寫代碼編譯器就會報錯,但是當時編譯器只會給出警告信息,然后程序在運行的時候會因為調(diào)用未定義的方法而崩潰。
8. Ray Mullins 的分享:
曾經(jīng)用過IBM的VSAM系統(tǒng)(包括z/OS和z/VSE以及其后續(xù)版本)的人,都應(yīng)該體驗過這個系統(tǒng)的逗比特性。
我曾經(jīng)在一家德國的軟件公司任職,負責對一個事務(wù)處理監(jiān)測程序進行技術(shù)運維和研發(fā),這個監(jiān)測程序是美國開發(fā)的,有一個針對VSAM文件的接口,那么當然程序就需要一個控制模塊負責對文件進行存取操作。明顯寫這個控制模塊的人那天過得不太如意,因為在控制模塊獲取通用錯誤方法地址的那段代碼里,寫著這樣的注釋:”VSAM又SB了(FUCKED UP AGAIN), 到這里來。“ 更有趣的是,這些控制模塊的代碼被正式印到操作手冊上(包括帶有FUCK的那段文字),所以在差不多20年的實踐里,這個注釋就這么被寫在那里然后發(fā)給客戶。然后直到某一天有個客戶想對控制模塊進行替換,然后才發(fā)現(xiàn)有這么個注釋,然后才告訴我們。
接下來的這個不是注釋,而是來自于我的實際工作。我們當時有一套內(nèi)部標準和方法文檔。我們的系統(tǒng)程序員需要為一個什么渣渣的4GL產(chǎn)品的延遲方法編寫文檔,并進行演示。他的文檔草稿第一版草稿大概是這么寫的:
>=5
SAY"THE SYSTEM IS FUCKED, PLEASE BEAR WITH US"http://如果系統(tǒng) SB了,請和我們一起忍受
SLEEP(10)
ENDIF
草稿寫完了以后他就去忙東忙西,根本沒時間搞文檔,接著突然發(fā)現(xiàn)文檔的提交期限就在晚上了。于是他就直接把草稿發(fā)給文檔管理人員了,根本都沒看。一周以后,上百份文檔就這么被打印出來分發(fā)出去了。并且,內(nèi)容就是他草稿上寫的那些,一個字都沒改。
9. Terry Lambert 的分享:
我最喜歡的注釋有兩個,都是Bill Paul寫的。這家伙為FreeBSD做了大量的工作,現(xiàn)在受雇于Wind River System,聽說這個公司最近要被Intel收購了。Bill是一個非常有才華的程序員,但是他對愚蠢的容忍度也出奇的低,并且他的幽默感也很不同尋常。
下面是我喜歡的第一條注釋,這是從RelTek 8129/8139 PCI NIC 驅(qū)動程序里找到的。
/*
* NIC the 'low end.'
重刷了low逼的下限
*這可能是史上寫得最爛的PCI以太網(wǎng)控制器驅(qū)動
*with the of the FEAST chip made bySMC.
*-,but
* any gains that
*bus-master DMA .
*,the of four TX
*. frame must beina
*,(32-bit).
* we almost always
*, )
*the packet ,andb)the
*32-bit aligned within thembuf's data area. The of
* only four means that we can never have
* more than four packets queued for at any one
* time.
* is not much better. The driver has to a
* single large buffer area (up to 64K in size) into which the
* chip will DMA frames. Because we don'tknow where
* packets will ,we
*have no choice data from the buffer area into
* the packets uptothe higher
*.
*It's given this rotten design to really achieve
要讓這么爛的設(shè)計去達到100Mbps的速度簡直就是天方夜譚
* decent at 100Mbps, unless you happen to have a
除非你有一臺CPU強勁的電腦去驅(qū)動
* 400Mhz PII or some equally CPU to drive it.
* On the bright side, the 8139 does have a built-in PHY,
* rather than using an MDIO serial like
* most other NICs, the PHY are
* through the 8139'.
*,-bit .
這絕對是一個很爽的注釋。傳說為了讓 Bill 能把這段注釋刪掉/修訂/修改/更新等等,廠家用了各種條件去誘惑他,但是他都拒絕了。
第二段注釋是寫在一個修改版的BSD許可證的“限制傷害”條款里的,Bill在他的代碼里引用了這個許可證協(xié)議。其實它并沒有對原先的協(xié)議做大的修改,所以很多人看到這個協(xié)議以后,一看跟模板差不多,然后就跳過了,幾乎沒什么人仔細去看整個文字。
INNO EVENT SHALL Bill HEAD BE LIABLE
,,,SPECIAL,,OR
怎么樣,你沒見過這條吧。其實很容易就看掉了。有趣的地方正好在這里:
「Bill Paul以及他頭腦中的想法絕不會直接,間接,偶然,特殊,典型或?qū)嵸|(zhì)性地造成任何損害。」
總之,這哥們兒是個天才。
10. Boris 的分享
我曾經(jīng)做過一個高性能分布式鍵/值存儲的項目。這是一個設(shè)計很精巧的軟件,API非常簡潔。如果你要獲取一個數(shù)值,那么你就用命令:GETN(get, 數(shù)值)即可。如果你要存一個數(shù)值,那就用命令:PUTN(put, 數(shù)值)即可。其他的命令也很簡單,比如MGETN(get , 數(shù)值),MPUTN(put , 數(shù)值),INCR(增量), MINCR(多個增量),(基本上命令都可以自解釋)。
所有的命令都會被送到一個函數(shù)去進行解析,辨明邏輯,然后去調(diào)用相應(yīng)的處理函數(shù)。處理函數(shù)基本上也是自解釋風(fēng)格的,因此代碼里面也不需要太多注釋,例如:
::(…){…}
::(…){…}
不過有一天,有人讓我review一下下面這段代碼:
// In Soviet Russia, Putn handles you!
// 在前蘇聯(lián),Putn 就會搞定你!【譯注:注意,Putn 和普京的英文拼寫(Putin)非常接近。普京曾經(jīng)是蘇聯(lián)的克格勃。】
::(…){
我當即就選擇了通過,然后合并到代碼庫并且發(fā)布了。據(jù)我所知,現(xiàn)在這段代碼還在代碼庫里。
11. Nikunj 的分享
//drunk, fix later
//喝大了,一會兒再改
Catch(){
//who cares?// ← 這不翻譯了,估計都能看懂吧
我最喜歡的一個注釋是:
long long ago; /* in a galaxy far far away */
讀者如果不明白什么意思,請看下圖:
12. Sasha 的分享
曾經(jīng)有一次, 我從學(xué)生交給我的代碼里隨便挑了一份來看,然后發(fā)現(xiàn)了這么一條注釋:
/* Do NOT delete this comment */
/* 不要刪除這段注釋 */
當然,我就是要試一下如果把注釋刪除了到底會怎么樣。所以我就刪除了,然后重新編譯。結(jié)果程序真的就不能運行了。然后我把注釋重新加回去,結(jié)果又好了。
刪掉注釋以后會報錯 ,根據(jù)鏈接器錯誤文檔的說明,錯誤的原因直接就是:“未知錯誤;請參考文檔或?qū)で蠹夹g(shù)支持。”
為什么這個注釋不能去掉呢?我估計這個問題對我來說一直就是個謎。
13. Wojtek Swiatek 的分享
我看過一些數(shù)據(jù)分析的代碼,然后就被下面的注釋震驚了:
# 不要再用 anal 做變量名了[譯注:寫注釋的人是想用 anal 這個縮寫來表示analyze(分析),可是 anal 這個單詞的意思是“肛門”]
# 我特么在哪都能看到 anal 這個詞!
# 請不要再這么做了!
# 你們要用就用analyze,或者xbvvzr,要不然用什么其他的都可以。就是別寫成 或者 了【譯注:insert是插入的意思,check是檢查的意思,其他的你們自行腦補吧】
14. Michael Dehmlow 的分享
我新入職了一個公司,然后發(fā)現(xiàn)了一段三周之前寫的注釋,這段注釋是項目之前的研發(fā)團隊寫的,寫的日期就是我來公司面試和正式入職的這段期間。
我有幸在原來負責這個項目的先生們被炒魷魚的前一天被派來參與這個項目。
/*這坨代碼寫得像屎一樣,寫代碼的SB做了很蠢的事情
*他們讓.dll依賴.dll。
*然后又讓.dll依賴.dll. 簡直是白癡!不過,
*是有一個合理的辦法能解決這個問題,而我正好打算做點兒深入研究去解決。
*不過,真正唯一能解決問題的辦法是,找到這個當初寫代碼的狗娘養(yǎng)的,
*然后沖他的兩腿之間狠狠踢上一腳。雖然這樣解決不了問題,但是這樣
*能伸張正義。
*真TM是個SB
**呵呵*
* The :: is an class for tape
* decks....ah, fuck, I can't do it. I can't even fucking the hack.
* Just figure out, you're a smart fellow.
*/
15. Ryan 的分享
好多年前我在一個公司工作,我現(xiàn)在都還保留著那時的磁盤,上面有我當時寫的程序代碼和我對前任CEO留下的注釋。
/*
這個公司的CEO(也就是我的前任老板)告訴我可以隨意寫注釋,而且我確實也該這么做。
我把前任CEO稱為蘸屎(Dip Shit),簡稱DS.
DS覺得他自己是一個軟件開發(fā)的天才。很遺憾對我來說(我是程序的維護者),我的
主要任務(wù)就是擦他沒擦干凈的屎。
DS是一個想一出是一出的開發(fā)者。就像Evel Khievel在他的代碼做的一樣,
大量使用GOTO語句,而且貿(mào)然直接從一個模塊
跳到了另外一個模塊的IF...THEN語言中間,況且這個模塊
和第一個模塊根本就沒關(guān)系。
說到IF結(jié)構(gòu),DS真的很喜歡用。他根本就不知道還有
CASE或者SWITCH塊這種東西。然后我就只能去當一個代碼
考古學(xué)家,在深深的IF-ELSE嵌套層次(而且還是沒有縮進的那種)中苦苦挖掘
) IF...THEN...ELSE logic blocks.
DS認為他自己很聰明,并且這在他給變量命名的時候就有體現(xiàn):
global i=0;
global = 1;
= '12/12/98';
= + ;
if ()
= false;
// Ryan. Why does this crash?
if () goto :hotTub
//好吧DS,因為你修改了數(shù)據(jù)類型
(不僅如此,你還把整型和字符串類型相加——編譯器已經(jīng)
警告你了)...總之在弱類型的語言里你獲得了
腦殘的能力,你時不時修改數(shù)據(jù)類型,把字符串改成布爾型,所以當
from a string to a Boolean, so that when the
if() , when the is a string
if() 運行時,里面的變量是一個字符串,
程序肯定會崩潰——因為字符串不是一個
可邏輯判斷的類型。還有,因為是全局的,所以
只有你擁有超能力,才能知道這些全局變量在哪里定義,
或者是在哪里被修改過。
DS只會用全局變量,而不會用局部變量。引用他的原話:“
我用局部變量,或者私有成員變量的時候,我的程序老是報錯,
說變量未找到什么的。所以我干脆就把所有東西都搞成全局的好了。”
我還有更多的例子,其實如果你也被這種天馬行空的代碼虐過的話,你就
能體會我是什么感受了。
*/
一款網(wǎng)頁版音樂播放器,可直接下載想聽的歌曲到手機中
適合系統(tǒng):Android、iOS(iOS暫時不能使用下載功能,但可以直接播放)
圖文說明
哈嘍各位小伙伴,今天小編給大家分享一款,非常好用的網(wǎng)頁版音樂播放器,還不占用我們的手機內(nèi)存,不僅能搜到你想聽的歌曲,而且還可以直接下載到我們的手機中。
感興趣的小伙伴,可以在我們的微信公眾號后臺回復(fù)編碼:062,就可以獲取這款網(wǎng)頁鏈接。
我們“點擊進入音樂狂”,之后,我們再點擊屏幕右上角的三個小圓點,然后選擇從瀏覽器中打開,如果你不想下載歌曲的話,就不需要操作此步驟。
在上方,我們能看到有四個選項:播放器、正在播放、播放列表和歌曲搜索,我們點擊歌曲搜索這個選項,在輸入框內(nèi)直接搜索你想要聽的歌曲即可。
這里他給我們提供了五個搜索路徑,如果你沒能搜索到你想聽的歌曲,可以直接換一個路徑搜索試一下。
搜索到歌曲之后,我們點擊歌曲右邊的三個豎直的小圓點,如果你想要下載歌曲的話,直接點擊下方的下載就可以了,或者直接在這里聽也是可以的。
選擇在瀏覽器中打開后,才可以下載歌曲,此下載鏈接僅支持安卓下載,暫時不支持蘋果用戶下載。
記得點個贊吶
END
▼
往期精彩回顧
▼
每日一句
人一生下就會哭,笑是后來才學(xué)會的。所以憂傷是一種低級的本能,而快樂是一種更高級的能力。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。