JavaScript權(quán)威Douglas Crockford代碼閱讀和每個人都該學(xué)的編程(javascript權(quán)威指南第七版 pdf)

      網(wǎng)友投稿 1369 2022-05-30

      關(guān)于javaScript

      Seibel:在程序?qū)W習(xí)之路上有哪些令你后悔的事情?

      Crockford:我了解一些語言,但卻一直沒有機會使用。我花了不少時間學(xué)習(xí)APL并了解到其衰敗的原因,但這門語言真的非常優(yōu)雅,可我卻沒有花時間使用它,這太遺憾了。除此以外,我還了解其他一些語言,知道能用它們做什么,但實際上卻并沒有機會用這些語言思考。

      Seibel:我聽說你喜歡ES3版本JavaScript的簡潔性。

      Crockford:嗯,最終無論怎么對語言進行修訂,其要義都是希望促進語言的不斷成功。語言越成功,修改的代價就越大。隨著你的不斷成熟,再教育的成本就會變得更大,同時還有潛在的破壞代價,而這些成本和代價也會變得難以接受。如果你確實非常成功,那就更要小心提防所做的任何變化了。反之,如果你尚未成功,那么就有更大的自由空間來改變了。

      JavaScript成為世界上最流行的編程語言純粹是偶然。目前世界上JavaScript處理器的數(shù)量要高于任何其他語言。得益于其安全模型帶來的種種問題,JavaScript是唯一一門可在任何機器上編寫并運行的語言。 這些還嫌不夠的話,再看看那么多嵌入了JavaScript的應(yīng)用吧。Adobe的大多數(shù)應(yīng)用都嵌入了JavaScript,這樣就可以在本地編寫腳本控制這些應(yīng)用了。還有其他很多應(yīng)用,不勝枚舉。這么一看,JavaScript已經(jīng)變得非常流行了。

      JavaScript這門語言的問題在于推向市場以及標(biāo)準(zhǔn)化的過程都過于匆忙了。其大多數(shù)缺陷都沒有出現(xiàn)在目前的實現(xiàn)當(dāng)中——只存在于規(guī)范中。標(biāo)準(zhǔn)說照錯的做,這聽起來太嚇人了,但這就是JavaScript的狀態(tài)。它于1999年凍結(jié)了,接下來本應(yīng)走向滅亡。但Ajax的橫空出世改變了這一切,JavaScript變成了世界上最重要的編程語言。

      于是,我們現(xiàn)在認(rèn)為應(yīng)該修復(fù)它。但這事應(yīng)該是在2000年就開始做的,而那時并沒有這么做,因為根本沒人關(guān)注JavaScript。現(xiàn)在它已經(jīng)長大了。

      Web環(huán)境下的JavaScript還有一點非常怪異:如果編寫服務(wù)器端應(yīng)用、桌面應(yīng)用或是嵌入式應(yīng)用,你不僅需要選擇語言,還要選擇特定的編譯器以及特定的運行時。但對JavaScript而言你別無選擇,你必須在所有的環(huán)境下運行。

      由于要在所有環(huán)境下運行,bug就沒法修復(fù)了。如果某個瀏覽器廠商搞出個bug,他們會說“天啊,搞砸了”,下個月就會發(fā)布另一個版本,但我們卻不能指望著所有用戶都會升級。大多數(shù)人一旦在機器里裝上IE就再也不會升級了,那些bug就會常年駐留在瀏覽器上。

      Seibel:你希望JavaScript有哪些變化呢?

      Crockford:我認(rèn)為改進JavaScript最好的辦法就是瘦身。如果我們能夠取其精華,棄其糟粕,那JavaScript會變得更棒。我認(rèn)為這個辦法也適合于HTML、HTTP和CSS。我們應(yīng)該仔細(xì)思考所用的各種標(biāo)準(zhǔn),搞清楚需要哪些特性,遺漏了哪些特性并重新審視它們,絕不應(yīng)該盲目地增加新特性。

      代碼閱讀

      Seibel:能否詳細(xì)談?wù)勅绾芜M行代碼閱讀呢?

      Crockford:每次開會都讓一些人閱讀他們各自的代碼,他們會引領(lǐng)我們查看其編寫的所有內(nèi)容,其他人則負(fù)責(zé)檢查。對于團隊的其他成員來說,這絕對是個學(xué)習(xí)的好機會,通過這個過程他們就可以知道自己的東西該如何與他人的相配合。

      每個人都圍坐在桌邊,手里拿一疊紙,同時還把代碼在屏幕上打出來,大家一起閱讀。我們會在編寫代碼的過程中加上注釋。有人會說“我看不懂這個注釋”或是“這個注釋與代碼風(fēng)馬牛不相及”。大家的意見極具價值,因為作為開發(fā)者的你是不會閱讀自己編寫的注釋的,你也根本沒有意識到自己寫的注釋誤導(dǎo)了讀者。有這么多人幫助你編寫整潔的代碼是多么幸福的一件事啊——你會找到自己根本無法找到的缺陷。

      我認(rèn)為一小時的代碼閱讀抵得上兩周的QA。這種剔除錯誤的手段真是很高效。如果你讓能力很強的同事閱讀代碼,那么他們周圍的新手們就會學(xué)到很多東西,而這一切是無法通過其他手段獲得的;如果新手來閱讀代碼,那么他會得到很多極具價值的建議。

      但這件事我們不能一直留到最后再做。回憶過去,我們會在項目完成之際安排代碼閱讀,但這個時候已經(jīng)太遲了,只好取消。現(xiàn)在我深信代碼閱讀應(yīng)該伴隨著整個項目的生命周期。我花了很長時間才意識到這一點,這么做的好處不勝枚舉。

      首先,這么做有助于把控項目,我們能夠真切地看到大家的進度,也能及早發(fā)現(xiàn)是不是有人已經(jīng)偏離了軌道。

      我曾經(jīng)管理過一些項目,馬上就到最后期限了,有人說“耶,馬上就干完了”,然后我拿到了代碼,發(fā)現(xiàn)里面什么都沒有,有的也是一些垃圾,離完成還遠(yuǎn)著呢。管理層最厭惡這種事情了,我覺得代碼閱讀能夠有效避免這種窘境的發(fā)生。

      Seibel:那你需要指導(dǎo)別人如何進行代碼閱讀么?可以想象,既不想讓代碼編寫者感覺受到侵犯,又能給出頗具價值的意見是很難的。

      Crockford:沒錯,這需要給予團隊成員充分的信任,要明確界定好邊界。如果團隊不和睦,那就別指望這么做了,這會導(dǎo)致團隊分崩離析。如果還沒有意識到團隊的不和睦,那這么做很快就能發(fā)現(xiàn)。這個過程會讓你學(xué)到很多,也會揭示出很多問題。起初會覺得不太自然,但一旦適應(yīng)后就會覺得再自然不過了。 另外,我們要編寫可讀性好的代碼。大家都知道,整潔很重要,而代碼風(fēng)格也同樣如此。所有這一切會提升代碼的質(zhì)量并增強編程社區(qū)的能力。

      Seibel:如何編寫可讀性好的代碼呢?

      Crockford:可讀性有幾個等級。最簡單的一級是與表達保持一致,適當(dāng)?shù)乇3挚s進,在適當(dāng)?shù)牡胤绞褂每崭瘛N矣幸粋€習(xí)慣來自于早年學(xué)習(xí)Fortran的時候,那就是,我往往會使用過多的單字母變量名,這個習(xí)慣可不好。我真的在很努力改掉這個壞習(xí)慣,但太難了——這么多年來還在與之斗爭。

      Seibel:有什么具體的舉措可以提升代碼的可讀性呢?

      Crockford:子集的想法非常重要,尤其對于JavaScript來說更是如此,因為這門語言包含了太多的糟粕,當(dāng)然其他語言也一樣。當(dāng)還是個菜鳥時,我會翻閱語言規(guī)范并弄明白每個特性。我知道該如何使用這些特性并一直在用。但事實證明很多特性并非是深思熟慮的結(jié)果。

      我現(xiàn)在想到的是Fortran,但其實所有語言都難逃這個宿命。有時語言設(shè)計者本身就錯了。依我看來,C在設(shè)計上存在很多不妥之處。

      Seibel:你如何閱讀別人編寫的代碼呢?

      Crockford:清理。我會把代碼放到文本編輯器中并開始修復(fù)。首先,我會統(tǒng)一標(biāo)點符號,適當(dāng)縮進,等等這類的事情。我有些程序可以完成這些事情,但從長遠(yuǎn)來看自己完成會更加高效,因為這有助于我加深對代碼的理解。Morningstar曾教會我如何完成這些事情。他非常善于重構(gòu)別人的代碼,并且這也是他所使用的方法,很好。

      Seibel:你是否遇到過這種情況:看到代碼寫得一團糟,然后進行清理,但最后發(fā)現(xiàn)原來的代碼其實寫得很不錯?

      Crockford:還沒遇到過。我認(rèn)為隨隨便便寫出來的代碼肯定不好。好的代碼意味著可讀性要好。在某種程度上,如果我搞不懂代碼的意圖,那么寫得再好也沒用,有可能代碼在我不關(guān)心的方面表現(xiàn)得很好,比如很高效、很緊湊,等等。

      代碼的可讀性是我的第一要義。它比速度還重要,可以與正確性一爭高下,可讀性是正確性的重要前提。如果可讀性不好,那就不是好代碼,代碼的編寫者可能做出了錯誤的權(quán)衡。

      Seibel:你偏愛K&R風(fēng)格?

      Crockford:是的,我認(rèn)為他們是對的,其最初的風(fēng)格沒錯,對于JavaScript更是如此。JavaScript會自動插入分號,這樣如果將花括號放在左邊而不是右邊,那么程序的含義就會發(fā)生天大的變化,這種變化是很糟糕的。事實表明K&R風(fēng)格不會遇到這個問題,但flush風(fēng)格會。

      對于JavaScript來說,花括號是有著正確的擺放位置的;而其他C風(fēng)格的語言則不是這樣,哪種擺放位置都可以看作是正確的。有些人喜歡flush風(fēng)格的花括號,我也看過有人就風(fēng)格的正確與否爭論了半天,但這些解釋都毫無意義,因為他們真正爭論的是自己在學(xué)校里用的是什么、在第一份工作中又用了什么風(fēng)格,或者是影響過他的某人使用了哪種風(fēng)格,那這種風(fēng)格就是正確的,而其他則是錯誤的。

      這就好比是關(guān)于應(yīng)該靠左還是靠右行駛的爭論,結(jié)果當(dāng)然是無疾而終。如果住在孤島上,靠哪邊行駛都無所謂,但如果大家能達成統(tǒng)一確定走同一邊,整個社區(qū)都會受益無窮。

      Seibel:在閱讀代碼時你會先排版,那你會對代碼進行多大程度上的重構(gòu)呢?

      Crockford:我會重新編排代碼以便所有東西都會在使用前聲明和創(chuàng)建。有些語言提供了很大的靈活性,讓你無需再這么做了。但這種靈活性我不需要。

      Seibel:你曾在之前的一次演講中引用了《出埃及記》第23章第10節(jié)和第11節(jié)的內(nèi)容——六年你要耕種田地,土產(chǎn),只是第七年你要叫地歇息,不耕不種。并建議每次第7個sprint都應(yīng)該用來清理代碼。那什么時候做比較好呢?

      Crockford:每6個周期——不管周期間是什么都該如此。如果你是每月交付,那么我覺得每隔半年都應(yīng)該跳過一個周期,專門用來清理代碼。

      每個人的必修課:編程

      Seibel:編程是不是越來越容易了,門檻逐漸降低?

      Crockford:我對編程的興趣在于幫助其他人編程、設(shè)計特定的語言或編程工具,這樣會有越來越多的人能夠從事編程工作——這也是Smalltalk的初衷。Smalltalk后來的發(fā)展方向出現(xiàn)了變化,但最初的方向確實吸引了我。我們?nèi)绾卧O(shè)計一門面向兒童的語言,如何為那些并非程序員的人們設(shè)計一種語言?

      Seibel:你是不是認(rèn)為每個人都應(yīng)該學(xué)習(xí)編程,至少了解一些?

      Crockford:沒錯。當(dāng)今世界快被計算機控制了,為了保護自己或是讓自己更加全面,你應(yīng)該了解這些東西的工作方式。

      Seibel:有些人認(rèn)為通過編程可以學(xué)到一種重要的思考方式,比如閱讀和數(shù)學(xué)就是不同的思考方式,但都非常重要。

      Crockford:我以前也這么想。在開始編程時我就有過這種想法:一切都是那么地井然有序,我看到了之前從未接觸過的結(jié)構(gòu)等東西。我在想“喔,這太神奇了。每個人都應(yīng)該學(xué)習(xí)學(xué)習(xí)”,因為我突然之間感覺自己變聰明了。但不久之后,在與其他程序員交流的過程中發(fā)現(xiàn),他們并沒有開竅。程序員其實與常人也沒什么區(qū)別,有時他們也會出現(xiàn)誤解。當(dāng)認(rèn)識到這一點后我覺得很難過。

      Seibel:那編程只是年輕人的專利么?

      Crockford:過去我是這么認(rèn)為的。幾年前我患有睡眠呼吸暫停的癥狀,但沒有意識到。我想可能是太累了,年紀(jì)也有些大了吧,結(jié)果發(fā)現(xiàn)自己的注意力很難集中,甚至都沒法編程了,因為我的大腦沒法承載太多的東西。很多時候編程都需要先在腦子里想好,然后再寫出來,但我卻不行。

      JavaScript權(quán)威Douglas Crockford:代碼閱讀和每個人都該學(xué)的編程(javascript權(quán)威指南第七版 pdf)

      我喪失了這種能力,想當(dāng)然地認(rèn)為是年齡太大的緣故。幸好,病情得到了好轉(zhuǎn),于是我又開始編程了。現(xiàn)在的我編程水平可能比以前還要好,因為我知道如何不過多地依賴于記憶。現(xiàn)在的我更喜歡將代碼文檔化,因為我不敢保證下一周還能記得寫這些代碼的意圖。事實上,有時我會檢查自己的代碼,但會驚訝于自己怎么會這么寫代碼:我壓根就不記得自己曾經(jīng)這么寫過,這些代碼有的非常丑陋,有的卻非常優(yōu)雅。我實在不知道怎么會這樣。

      Seibel:你曾說過文學(xué)編程就像Donald Knuth所說的那樣,是個非常棒的想法,那你使用過文學(xué)工具么?

      Crockford:沒有。我一直在考慮這個問題,并為我所使用的一些語言設(shè)計過文學(xué)工具,但我現(xiàn)在并沒有從事文學(xué)編程工作。

      Seibel:這僅僅是個工具鏈問題么?如果有現(xiàn)成的工具,你還會編寫文學(xué)程序么?

      Crockford:當(dāng)然會了。比如說,如果使用文學(xué)風(fēng)格編寫JSLint的話,那維護工作就輕松多了。我所說的文學(xué)風(fēng)格是指在設(shè)計程序時要特別考慮到閱讀問題,這么做會給程序帶來巨大的價值。

      Seibel:你覺得文學(xué)編程工具的主要特征是什么?

      Crockford:Knuth的主要貢獻在于提出了以各種順序編寫代碼的想法。這樣,如果我所關(guān)注的東西涉及很多地方的代碼,那么我會將這些代碼整合起來并加以說明,然后工具會在適當(dāng)?shù)牡胤浇鉀Q細(xì)節(jié)問題。 他還幫助你擺脫了函數(shù)大小的困擾。理想情況下,一個函數(shù)不應(yīng)該超出屏幕的范圍,這樣就能一覽無余了。如果達不到這個要求,那可以將一個函數(shù)拆分成多個函數(shù),如果函數(shù)對程序結(jié)構(gòu)起不到什么作用,那么它也沒有存在的價值。

      Knuth建議抓住函數(shù)的各個方面,它們很可能是緊密相關(guān)的——具有一致性,但就是太大了;有時函數(shù)確實過于龐大——他建議使用具有描述性的標(biāo)簽來表示每個函數(shù),“這個函數(shù)是:”,然后列出這些標(biāo)簽。你當(dāng)然可以使用函數(shù)達成目的,但這兩者并不一樣,如果使用函數(shù),你必須要處理函數(shù)之間的通信,等等。這么做會引入更多與問題不相關(guān)的結(jié)構(gòu)。

      最后,我非常希望看到新的文學(xué)編程語言的出現(xiàn)。Knuth非常擅于將這些想法應(yīng)用到Pascal和C當(dāng)中,但我打心底想看到有人能真的設(shè)計出一種新的使用這種風(fēng)格的語言。

      Seibel:你讀過Knuth的文學(xué)程序么?

      Crockford:當(dāng)然讀過。

      Seibel:如何讀的?像小說一樣?

      Crockford:沒錯,就像小說一樣。我像在讀他的散文而非程序,喜歡他的展現(xiàn)方式,他寫得確實好,偶爾還會搞個笑話出來。我很享受這種閱讀體驗。

      Seibel:Knuth的大部頭《計算機程序設(shè)計藝術(shù)》如何?你是從頭到尾讀過這本書呢,還是將其作為參考隨時翻閱,抑或是把它束之高閣碰也不碰呢?

      Crockford:除了你說的最后一種情形之外。在上大學(xué)時,有那么幾個月我連房租都沒交,就是為了買他的書。我讀過這些書,從中得到了不少樂趣,比如在第一卷的索引有個關(guān)于拖車的笑話就很好玩。我到現(xiàn)在為止還沒能把書上的內(nèi)容全部搞懂。Knuth對某些地方的研究要比我深入得多,但我還是喜歡這些書并把它們當(dāng)作參考資料。

      Seibel:你是從頭到尾逐字閱讀,跳過那些不理解的數(shù)學(xué)部分?

      Crockford:是的,我會很快略讀過星號太多的部分。我試圖將熟悉Knuth的書作為招聘標(biāo)準(zhǔn),但結(jié)果卻大失所望,根本沒幾個人讀過他的書。依我看來,任何自稱為專業(yè)程序員的人都應(yīng)該讀過Knuth的書,至少也應(yīng)該買過他的書。

      Seibel:也就是說Knuth講述的是如何實現(xiàn)最根本的東西,然后才有全景。即便清理了平臺,但使用理性的方式構(gòu)建大型系統(tǒng)和設(shè)計也是非常困難的。請問你是如何設(shè)計代碼的?

      Crockford:編寫程序與對程序的生命周期進行迭代是不同的。通常,編寫軟件的原因在于我們知道將要修改它,而修改任何東西都不那么容易,因為很多時候修改意味著打破舊有的東西。

      你不能期望使用這種方式完成所有事情,但還是應(yīng)該盡力保證足夠的靈活性,這樣不管做什么都能適應(yīng)。這就是我的觀點。如何避免誤入死胡同?如何保證靈活性?

      這就是我喜歡JavaScript的原因之一。我發(fā)現(xiàn)JavaScript可以輕松實現(xiàn)重構(gòu),而重構(gòu)一個繼承層次很深的類實在太痛苦了。

      Seibel:你覺得自己是個科學(xué)家、工程師、藝術(shù)家、工匠還是什么?

      Crockford:我覺得自己是個作家。有時我使用英語寫作,有時使用JavaScript。歸根結(jié)底,這完全取決于交流方式以及為了促進這種交流所采取的結(jié)構(gòu)。人類語言與計算機語言在很多地方都是大相徑庭的,我們需要閱讀計算機語言,因此必須與之交流,我根據(jù)語言的這種交流能力判斷計算機程序的優(yōu)劣。在這個層次上,人類語言與計算機語言的差別不大。

      Seibel:你對自學(xué)的程序員有什么建議呢?

      Crockford:兩個字:多讀。現(xiàn)在有不少好書,去找些好書來看吧。如果從事Web開發(fā)工作,請找一些優(yōu)秀的站點,看看他們的代碼。話雖如此,其實我不太想這么建議。大多數(shù)Web開發(fā)者都是從“查看源代碼”開始走上Web開發(fā)之路的,但直到現(xiàn)在,大多數(shù)源代碼的質(zhì)量都是非常低劣的。因此有一代程序員都被那些低劣的示例誤導(dǎo)了,他們寫的代碼質(zhì)量也不高。現(xiàn)在的情況已經(jīng)有所改觀,但依然有很多低質(zhì)量的代碼游離于你我之間,所以我是不太想給出這個建議的。

      參考:

      http://www.ituring.com.cn/article/39021

      Java JavaScript

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:軟件開發(fā)丨關(guān)于軟件重構(gòu)的靈魂四問(什么是軟件重構(gòu))
      下一篇:excel一個表格分成多表格的方法(excel一個表格分成多個表格)
      相關(guān)文章
      亚洲精品高清在线| 国产99在线|亚洲| 亚洲国产欧洲综合997久久| 亚洲欧洲校园自拍都市| 精品亚洲成a人片在线观看少妇| 国产亚洲成AV人片在线观黄桃| 亚洲中文字幕无码久久2017| 亚洲综合另类小说色区| 久久亚洲精品无码观看不卡| 亚洲伊人色欲综合网| 亚洲女久久久噜噜噜熟女| 亚洲日产无码中文字幕| 国产成人A人亚洲精品无码| 国产v亚洲v天堂无码网站| 久久精品亚洲视频| 亚洲欧洲日韩国产综合在线二区| 亚洲电影一区二区| 亚洲精彩视频在线观看| 亚洲精品日韩专区silk| 亚洲一区二区三区深夜天堂| 中文字幕亚洲综合小综合在线| 国产亚洲中文日本不卡二区| 在线观看亚洲AV每日更新无码| 亚洲日本成本人观看| 日韩国产精品亚洲а∨天堂免| 国产亚洲精品美女久久久久久下载| 亚洲av日韩片在线观看| 中文字幕亚洲一区二区三区| 亚洲精品中文字幕乱码三区| 亚洲AV日韩AV天堂久久| 亚洲成人免费网站| 亚洲欧美国产精品专区久久| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲国产婷婷综合在线精品| 亚洲综合av永久无码精品一区二区| 亚洲AV无码码潮喷在线观看| 亚洲图片中文字幕| 亚洲人成中文字幕在线观看| 亚洲国产第一页www| 亚洲专区中文字幕| 亚洲精品乱码久久久久久V|