粗大猛烈进出白浆视频,两性色午夜视频免费播放,国内精品一区二区三区在线观看,精品无人乱码一区二区三区的特点

思誠科技 seecen LOGO
咨詢熱線:0791-87557233
 您現(xiàn)在的位置:  首頁 > 職場人生 

代碼不是文學(xué)作品

來源:網(wǎng)絡(luò)    更新時間:2014-4-19

我在最近兩個工作過的公司(Etsy和Twitter)成立過代碼閱讀小組,一些人向我征詢關(guān)于閱讀代碼以及運作代碼閱讀小組的建議。想說的太多,一言以蔽之:不要成立代碼閱讀小組。你應(yīng)該去成立小組但不是我稍后提到的那樣,而在此之前,我要解釋一下我是如何得出目前觀點的。

作為一位曾讀英語專業(yè)的業(yè)余作者,我以往總是被這樣的想法所吸引:代碼就像文學(xué)作品,我們應(yīng)該像通過閱讀優(yōu)秀范文學(xué)寫英文那樣來學(xué)寫代碼。當(dāng)然,持這種觀點的不止我一個人。Donald Knuth(著名計算機(jī)科學(xué)家,譯者注),除了致力開發(fā)TeX軟件和編著《計算機(jī)程序設(shè)計藝術(shù)》,一直以來是被他稱作“文學(xué)編程”的提倡者,并已經(jīng)把他的幾個大型程序出版成書。

另一方面,早在我加入Etsy并成立第一個代碼閱讀小組之前,手頭上就已經(jīng)有一些跡象本就表明:這是看待代碼的一個錯誤方式。

首先,當(dāng)我在編寫關(guān)于與程序員訪談的《編程人生》(書中記錄與15位世界級編程大師的對話,譯者注)一書時,我?guī)缀鯁柫嗣總人關(guān)于閱讀代碼的問題。大部分人說閱讀代碼是重要的且程序員應(yīng)該多讀,然而當(dāng)我問到他們最近讀了哪些代碼時,很少有人有好的答案。在他們還是年輕黑客時,其中有些人認(rèn)真地讀過一些代碼,然而幾乎沒人保有閱讀代碼的習(xí)慣。Knuth作為偉大的計算機(jī)科學(xué)集大成者,閱讀了大量的代碼;Brad Fitzpatrick談到出于惡作劇而閱讀過一些開源代碼片段。但他們倆是例外。

如果這還不夠,那么在完成《編程人生》之后,我獲得一次采訪Hal Abelson的機(jī)會。Hal Abelson是麻省理工大學(xué)的著名教授,《計算機(jī)程序的構(gòu)造和解釋》的合著者。當(dāng)我首次跟他談?wù)摚瑔柤爸澳菢拥拈喿x代碼問題時,他給出了普遍的答案:閱讀代碼是重要的且程序員應(yīng)該多讀。但他也沒有說出任何最近讀過的代碼,除了不得不閱讀的代碼之外,包括在谷歌休公假時審查同事的代碼以及給麻省理工學(xué)生評分時的代碼。后來我問他關(guān)于這種矛盾:


引用
Seibel: 我對人們所說的和實際所做的之間的這種分裂很好奇。每個人說“程序員應(yīng)該閱讀代碼”,但似乎少數(shù)人真正去做了。我會感到驚訝:如果我采訪小說家們并問他們最近讀了哪本小說,他們回答說“哦,自從讀研究生后,我就沒真正地去讀一本小說了”。作家們實際上會讀其他作者的書,但程序員不會真正得去讀其他人的代碼,盡管他們說應(yīng)該去讀。

Abelson: 是的。你是對的。但記住,很多時候,你增刪查改一個程序最終使之能夠運行并完成你需要它做的所有事情,所以就有很多與核心思想無關(guān)緊要的東西。

Seibel: 所以基本上你最終是說,大多數(shù)代碼不值得一讀?

Abelson: 或者說程序從一個初始計劃或某種偽代碼構(gòu)建起來。書中的許多代碼,是一些凈化過的版本,不具備使程序運行起來的所有東西。

Seibel: 我想起了《計算機(jī)程序的構(gòu)造和解釋》的前言,里面寫道“程序應(yīng)該是為了供人讀才寫的,然后順便讓機(jī)器執(zhí)行了一下!比欢媚闼枋龅氖聦嵲趯嶋H中卻是,大多數(shù)程序都是讓機(jī)器來執(zhí)行才寫的,如果有的話,只順便供人閱讀。

Abelson: 嗯,我認(rèn)為他們一開始是為了供人閱讀的,因為里面包含著一些想法。你解釋的東西,僅有一小部分存在我們的書中。書中有一些相當(dāng)重要的程序。而且部分原因是我們認(rèn)為解釋它做什么的最簡單方式就是表達(dá)在代碼中。


然而即使明顯知道大部分真正的代碼實際上不是采用人容易讀懂的方式去編寫的,但這不足以讓我在Etsy成立小組時放棄這種文學(xué)研討班模式。由于大多數(shù)Etsy開發(fā)者熟悉Javascript以及我知道Jeremy Ashkenas對可讀性代碼的編寫有濃厚興趣,所以在第一次代碼閱讀小組會時,我選取了Jeremy的backbone.js。我仍計劃了一些像文學(xué)研討會一樣的流程,但我發(fā)現(xiàn)許多人不會預(yù)習(xí)代碼(嗯,這點跟文學(xué)研討班倒是一樣)。所以我決定在小組討論環(huán)節(jié)之前演示要討論的代碼。

當(dāng)準(zhǔn)備我的演示文檔時,我發(fā)現(xiàn)自己掉進(jìn)了慣常模式:每當(dāng)試圖真正理解或心領(lǐng)神會一段代碼時,我不得不從根本上重寫它。為了更好理解,我將開始重命名一些名稱,接著順著我組織代碼思路去移動一些語句。很快,我就已經(jīng)開始深入代碼抽象化(或具體化),并開始對更大程度地重組代碼結(jié)構(gòu)。一旦完成代碼重寫,我通常已很好地領(lǐng)悟了,甚至可以溯源并理解初始版本。我經(jīng)常覺得這種閱讀代碼的方式不好,但它是迄今為止我理解代碼的唯一方式。

在代碼閱讀小組演示時,我以初始的backbone.js作為開始,然后在自己想法的指引下,一步一步演變使之更易懂。當(dāng)我問大家是否應(yīng)該轉(zhuǎn)向小組討論環(huán)節(jié)時,但似乎沒有人很感興趣。好在看到我的重構(gòu)讓組員對原始代碼的底層結(jié)構(gòu)有了與之前我通過重構(gòu)獲得的相同見解。

Etsy的第二次代碼閱讀小組會由Avi Bryant主持,展示了如何利用SmallTalk的代碼瀏覽功能來查看一些代碼。因為在Etsy少數(shù)工程師跟Smalltalk打過交道,所以我們對組員會預(yù)習(xí)代碼這件事不抱任何希望。但這次演示,對組員來說是一次領(lǐng)略SmallTalk魅力的絕佳機(jī)會,也讓有我有機(jī)會發(fā)難Avi關(guān)于Smalltalk和Lisp的區(qū)別。

當(dāng)我來到Twitter,文學(xué)研討會模式仍莫名其妙地盤旋在腦海中,盡管在Etsy的兩次看起來備受青睞的小組會幾乎沒有遵循這種模式。當(dāng)我發(fā)郵件邀請twitter的工程師參加代碼閱讀小組時,回應(yīng)相當(dāng)熱情。再次,第一次小組會由Marius Eriksen演示了一段代碼。在這個示例中,展示了Scala語言實現(xiàn)的Future包的內(nèi)部構(gòu)件。這個構(gòu)件被用于Twitter的很多服務(wù),其大部分由Eriksen本人編寫。

在演示了一段時間后,我終于明白一個淺顯的道理:代碼不是文學(xué)作品。我們不去閱讀代碼,而是解譯、審查它。一段代碼不是文學(xué)片段,而是樣本。當(dāng)我問Knuth關(guān)于他自己閱讀代碼時,他回答的其實早就給我指明了這個方向:


引用
Knuth: 但建立在大腦的東西是真正有價值的。那么我怎么利用它的呢?曾經(jīng)有臺型號為Bunker Ramo 300的機(jī)器,有人告訴我這臺機(jī)器的Fortran編譯器真的是不可思議的快,但沒有人知道它是怎么做到的。我得到了編譯器源代碼的副本。因為我沒有機(jī)器的說明書,所以甚至連機(jī)器語言是什么都不知道。

但是我把它當(dāng)成是一項有趣的挑戰(zhàn)。我能搞清楚BEGIN,然后我就開始解碼。這些指令碼對應(yīng)著雙字指令助記符,所以我開始合計著“這個可能是裝載指令,而這個可能是分支”。接著我知道它是Fortran編譯器,所以到一定程度后,看著卡片的第七列就能分辨是不是注釋。

三個小時后,我已經(jīng)弄懂機(jī)器的一小部分。接著我碰到了重大問題——跳轉(zhuǎn)表。因此這是一個難題,之后我堅持畫了些圖表,就像我在某安全局試圖解譯一個密碼一樣。但我知道它是個運行很快的Fortran編譯器,在某種意義來說這不是加密而是有意地掩蓋;因為弄不到機(jī)器的說明書,所以答案就藏在代碼中。

最終我弄明白了為什么這個編譯器如此快。不幸的是,它并不是因為使用了卓越的算法,僅僅是因為他們采用非結(jié)構(gòu)化編程并且最大限度地優(yōu)化了代碼。

畫圖表、獲取更多一點信息并作假設(shè)僅是你基本上解決某種難題的方法。通常,當(dāng)我閱讀技術(shù)文件時,是同樣的挑戰(zhàn)。我試圖理解作者的思想,嘗試搞懂這個概念是什么。我認(rèn)為,你試著去讀別人的東西越多,未來你更能創(chuàng)造屬于自己的東西。


他沒有在描述文學(xué)作品的閱讀,而在描述一個科學(xué)性調(diào)查。所以現(xiàn)在我對人們應(yīng)該如何一起從代碼中獲得深刻見解這個問題有了新答案,正如我向Twitter代碼閱讀小組解釋的一樣:


引用
在準(zhǔn)備與一起編程的女兒們即將進(jìn)行的對話時,我開始思考告訴她們一些關(guān)于代碼閱讀以及應(yīng)該讀什么代碼的事情。我再次突然想到了那些所有口惠而實不至的代碼閱讀想法,絕大部分程序員不會真正地閱讀大量代碼,至少不是純粹為了閱讀代碼而讀。這有一個簡單檢驗方法:說出一段你讀過的代碼并且肯定大部分優(yōu)秀程序員會去讀或者至少聽說過。不多,對不對?可能一行都沒有。

但我想到代碼不是文學(xué)作品,我們不是讀者。更確切地說,有趣的代碼片段是樣本,我們是博物學(xué)家。所以我認(rèn)為更好的方式是:我們其中的一位扮演著一個剛從異國回來的19世紀(jì)博物學(xué)家在國內(nèi)科學(xué)界引發(fā)關(guān)于他們所發(fā)現(xiàn)的一只新型昆蟲的議論:“看這怪物的觸須!這些觸須看起來非常笨拙,然而該物種的雄性可利用它們殺死小青蛙,然后雌性將卵產(chǎn)在其尸體中”,而不是像一群學(xué)比較文學(xué)的研究生那樣挑出一段代碼并去閱讀、討論它。

這種演示的關(guān)鍵在于介紹者要選一段自己深刻理解的代碼,并通過從進(jìn)化碎屑層(亦為臨時補(bǔ)救方案–指快速有效但丑陋的方案,譯者注)中指出核心思想,有助于聽眾理解。一種合理的方式應(yīng)該是展示真正的源碼并剝離、重寫關(guān)鍵部分,就像一個生物學(xué)家去染色樣本,使不同特征更容易辨別一樣。

典型的演示應(yīng)面向所有程序員,或男或女,或聰明或一般,但必須對與代碼出處有關(guān)的任何特定知識不作要求。為了讓組員理解代碼,演示文檔應(yīng)該提供足夠的上下文,解釋對一般水平程序員而言比較晦澀的實現(xiàn)語言的任何細(xì)節(jié)。


由于我的頓悟,我們采用新模式,已成功舉行了幾次代碼閱讀小組會議,現(xiàn)在被稱為Twitter的旨在提高編碼知識的英國皇家學(xué)會。我們?nèi)栽诿髦v演代碼的最佳方法,盡管目前方法感覺很不錯。另外,我不再覺得我這種解剖式閱讀代碼的方式是糟糕的。

至今最大的教訓(xùn)是,代碼是非常稠密的。半小時的報告只夠用來呈現(xiàn)大約十二行耐人尋味的代碼和一個主要思想。幾乎可以肯定的是:報告人必須真正深入某段代碼,要比任何人有更深的理解。除此之外,一個優(yōu)秀的演示至少可讓組員接觸到的核心思想,對于決定自己去閱讀代碼的人們來說,可能是一個好的開端。

原文鏈接: Peter Seibel   翻譯: 伯樂在線 - heloowird
譯文鏈接: http://blog.jobbole.com/64548/

  • 上一篇文章:

  • 下一篇文章:
  •  

    0791-87557233

    重視每個來電 珍惜您的時間
    思誠者開發(fā)沙龍
    江西思誠科技有限公司  贛ICP備17006097號  CopyRight©2014 - 2020