• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            XGuru's Blog

            技術(shù),是一種態(tài)度。關(guān)注:高性能后端技術(shù)/服務(wù)器架構(gòu)/C++/C/LAMP

               :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              20 Posts :: 0 Stories :: 93 Comments :: 0 Trackbacks

            公告





            twitter / xoXGuru

            feedsky
            抓虾
            google reader
            鲜果
            QQ邮箱
            九点

            常用鏈接

            留言簿(12)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它

             原作者 : Alan Skorkin

             翻   譯:Xguru

             


                  這讓我想到很多程序員討厭去閱讀代碼,來(lái)接受它吧。人人都喜歡編寫代碼--寫代碼是很有樂(lè)趣的事。但閱讀代碼卻是一種困難的工作。它不僅僅繁重,而且很無(wú)聊,讓我們面對(duì)這個(gè)事實(shí),任何不是自己寫的代碼都是差勁的(嘿嘿,雖然我們沒(méi)有這樣說(shuō)過(guò),但是其實(shí)我們都是這樣想 的)。甚至當(dāng)你寫完代碼后的僅僅幾個(gè)小時(shí)之后,你的那些代碼就開(kāi)始變得越來(lái)越爛了,時(shí)間一長(zhǎng),你就會(huì)把它當(dāng)作看起來(lái)的那種差勁作品 

                  所以,你又何必要去花費(fèi)時(shí)間來(lái)審視別人蹩腳的代碼呢,這段時(shí)間你完全可以用來(lái) 自己去寫一些非常優(yōu)秀的代碼,為什么不這樣嘗試一下,把自己寫好的代碼放上幾個(gè)小時(shí)再回頭看看,它是否依舊非常優(yōu)秀呢?如果你不站在前輩們的肩膀上,你將沒(méi)有可能成一個(gè)為技藝精湛的大師。其中一種途徑就是親自找到一個(gè)大師,讓他把他所有的知識(shí)全部傳授給你--當(dāng)然這是有可能的,雖然可能性不高,你必須非常走運(yùn)才能獲到這種機(jī)會(huì)。然而你可以不用想著去碰運(yùn)氣, 我們很幸運(yùn)的處在這樣的一個(gè)職業(yè)里--大師們的經(jīng)驗(yàn)和知識(shí)都在那里等著我們?nèi)ノ?,這些都蘊(yùn)涵在他們所寫 的代碼里。你所要做的事就是去閱讀它,當(dāng)然它可能會(huì)比找一個(gè)人坐在你旁邊向你解釋這些多占用一點(diǎn)時(shí)間,但是這是實(shí)現(xiàn)起來(lái)可能性較高,透視全局地思考下,若想成為優(yōu)秀的木匠,你就必需觀察大量的擁有優(yōu)良結(jié)構(gòu)的家具。

                  我喜愛(ài)閱讀代碼,我的直覺(jué)告訴我,你也將會(huì)從中受益匪淺,是的,它的確可能是無(wú)聊、令人惱火的的事, 但是它所產(chǎn)生回報(bào)非常值得你去努力。考慮這個(gè),如果你想成為一個(gè)優(yōu)秀的代碼寫手,你是否專門將注意力集中在編寫代碼上?你可能嘗試過(guò),但是你無(wú)法單單靠寫代碼走得更遠(yuǎn)。這是個(gè)普遍公認(rèn)的事實(shí),大多數(shù)卓越的寫手都是如饑似渴的閱讀者。在你希望去寫些體面點(diǎn)的東西之前,你需要閱讀其他卓越的寫手的作品,吸收不 同的風(fēng)格,看看在你之前別人有了怎么樣的嘗試。從而培養(yǎng)你自己的創(chuàng)造性。你的知識(shí)會(huì)慢慢增長(zhǎng),最后你自己寫的東西會(huì)顯得成熟,你將慢慢找到編碼的"感覺(jué)",編寫代碼也是同樣如此,如果你從來(lái)沒(méi)有閱讀過(guò)其他卓越的代碼, 你又憑什么指望能寫出一些優(yōu)雅的代碼?答案就是別指望這碼事了。對(duì)于優(yōu)秀的程序員來(lái)說(shuō),閱讀卓越的代碼就像作家需要閱讀卓越的書(shū)籍一樣重要。

                  盡管所有的這些都不容易讓人信服,但是有一個(gè)事實(shí)是毋庸置疑的--作為一個(gè)專業(yè)的開(kāi)發(fā)者,擅長(zhǎng)閱讀代碼能夠?qū)δ愕纳媸种匾?。如今任何正式的?xiàng)目都是一個(gè)團(tuán)隊(duì)的 努力,所以這將有大量的代碼不是你所提交,但是你又不得不要與其工作、修改和擴(kuò)展它 。因此,閱讀代碼可能將是你所擁有的最常用到并且最有用的技能;你最好盡快咬緊牙關(guān)去掌握它。

             

            如何去閱讀代碼,像... 某類代碼閱讀者么?

                  我無(wú)法告訴你我見(jiàn)過(guò)多少次這樣的情形:程序員在陌生的代碼里上下滾動(dòng)屏幕,幾分鐘以后,臉上就出現(xiàn)了郁悶的表情。然后他們就宣布這代碼就是不具備可讀性的廢物,為何要在這上面浪費(fèi)時(shí)間呢;我們只能用其他的某種方法去解決這個(gè)問(wèn)題。我不確定他們期待什么,靠潛移默化就能理解代碼的意義?或者是就靠聚精會(huì)神地盯著這些代碼,就期待能獲得啟迪?你不應(yīng)該只長(zhǎng)時(shí)間的注視著代碼,你需要理解它并將其為己所用。這里有一些我喜歡使用的技巧,它并不是一個(gè)詳盡的清單,但是我發(fā)現(xiàn)這些方法特別有用。


             


            1. 試著去編譯和運(yùn)行它。這通常是一個(gè)簡(jiǎn)單的處理步驟,比如當(dāng)你尋找工作性的代碼(與隨意的編碼相反)。然而這也并非總是如此,你能通過(guò)將其構(gòu)建和執(zhí) 行的過(guò)程中學(xué)習(xí)到代碼里很多高層的結(jié)構(gòu)組織。在工作代碼的主題中,你是否熟悉如何構(gòu)建你當(dāng)前的項(xiàng)目?項(xiàng)目的構(gòu)建通常是復(fù)雜的,但是能夠通過(guò)一點(diǎn)點(diǎn)地了解構(gòu)建過(guò)程可執(zhí)行碼是如何產(chǎn)生的,可以讓你獲得很多的體會(huì)。

            2. 不要只著眼于細(xì)枝末節(jié)。第一件事你需要做的,就是在你所讀的代碼結(jié)構(gòu)和風(fēng)格中找點(diǎn)感覺(jué),開(kāi)始瀏覽和試著弄明白各個(gè)代碼段想要做些什么。這會(huì)讓你熟悉整個(gè)代碼庫(kù)的高層的結(jié)構(gòu),同時(shí)也給你正在處理的代碼(無(wú)論是良好分解的、或者是意大利面條式【譯注:形容代碼混亂難以梳理】的等等)一些構(gòu)思,這是你找到問(wèn)題切入點(diǎn)的時(shí)候(任何發(fā)生的事,主函數(shù)、小型服務(wù)程序、 控制器等),觀察代碼是如何從這里分支出去的。但是不要花費(fèi)大量的時(shí)間在這個(gè)上面,隨著你對(duì)代碼有更深入的了解,你可以隨時(shí)返回到這個(gè)步驟。

            3. 確認(rèn)你了解了它所有的結(jié)構(gòu)。除非碰巧你是在編程語(yǔ)言上的首席專家,否則這里可能有些它讓你不了解的行為。當(dāng)你從較高層級(jí)的俯覽過(guò)其代碼時(shí),記錄下你不可能不熟悉的結(jié)構(gòu)。如果記錄的東西非常多的話,你的下一步就很明顯了。如果你對(duì)逐句的代碼是如何工作不怎么了解的話,就不要走得太遠(yuǎn)。盡管只有幾個(gè)結(jié)構(gòu)你不太熟悉,如果你去仔細(xì)探究它們的話,可能會(huì)為你帶來(lái)良好的構(gòu)思。你現(xiàn)在也是正在探索以前你所使用的編程語(yǔ)言中一些不了解的東西,我很樂(lè)意為此花費(fèi)幾個(gè)小時(shí)去閱讀代碼。

            4. 現(xiàn)在你獲取到了大多數(shù)結(jié)構(gòu)的優(yōu)良構(gòu)思,是該任意來(lái)幾個(gè)的深入實(shí)踐的時(shí)候了。像步驟2一樣,開(kāi)始在代碼里漫游,但是這次,從中挑選出任意幾個(gè)函數(shù)或者類,開(kāi)始一行一行地進(jìn)行分析。這是艱苦工作的開(kāi)始,但是同時(shí)也是 你獲得主要成果的開(kāi)始。這里的構(gòu)思就形成了你所看的這個(gè)代碼庫(kù)的觀念模式。也不要在這上面花費(fèi)太多的時(shí)間,但是在繼續(xù)前進(jìn)之前,試著深刻地吸收一些內(nèi)容豐富的模塊。這是你能夠在了解更多背景下反復(fù)地返回、并每次都能從中得到更多的東西的另外一個(gè)步驟。

            5. 毋庸置疑的事就是你在前幾個(gè)步驟中對(duì)某些方面會(huì)產(chǎn)生疑惑,所以,這是你最佳的時(shí)間去運(yùn)行和閱讀一些測(cè)試了。當(dāng)你在測(cè)試中增加對(duì)代碼的了解的同時(shí),將有或多或少潛在的麻煩在潛伏著你。我經(jīng)常會(huì)感到驚訝,當(dāng)閱讀和了解代碼時(shí),開(kāi)發(fā)者竟然會(huì)忽略其中寫得很好很全面的一個(gè)測(cè)試套件。但是有時(shí)候,它沒(méi)有提供測(cè)試用例。

            6. 你說(shuō)它沒(méi)有測(cè)試用例么,聽(tīng)起來(lái)像是該寫些東西的最好時(shí)機(jī)了。這是很有益的事, 這會(huì)有助于你自己的理解,改善代碼庫(kù)、閱讀的時(shí)候同時(shí)寫些代碼,這是給你自己找點(diǎn)事干最好的機(jī)會(huì)。即使它已經(jīng)提供有測(cè)試案例了,但是你總是能寫出讓你更受益的東西。測(cè)試代碼經(jīng)常需要換個(gè)不同的角度去思考,在你將其弄清楚之前,有些概念會(huì)躲避著你。

            7. 抽取少量稀奇有趣的代碼,將其寫成獨(dú)立的程序。我發(fā)現(xiàn)這是在閱讀代碼過(guò)程中有趣的練習(xí),即使改變了你的計(jì)劃進(jìn)度。盡管你不了解代碼底層的細(xì)節(jié),但是你可能會(huì)對(duì)代碼在高層的行為有了一些思路。為什么不抽取一些特 殊的函數(shù)將其轉(zhuǎn)變成一個(gè)獨(dú)立的程序呢?當(dāng)你讓一小塊代碼獨(dú) 立地執(zhí)行時(shí),將更易于調(diào)試,而且這又允許你有了額外的步驟去獲, 去你正在研究的代碼有了得更多見(jiàn)解。

            8. 這代碼是骯臟和有壞味的嗎?那么為何不將其重構(gòu)呢。我不是建議你重寫整個(gè)代碼庫(kù), 但是即使對(duì)一小部分的代碼進(jìn)行重構(gòu)也能使你的理解上一個(gè)層次。開(kāi)始將你所理解函數(shù)改成獨(dú)立的函數(shù)。在你了解之前,原有的規(guī)模巨大的函數(shù)看起來(lái)容易做到的, 你能在大腦里修改它。重構(gòu)允許你將代碼變成你自己東西,而無(wú)需將其完全重寫。它能為你提 供優(yōu)秀的測(cè)試用例,但是即使你沒(méi)有這個(gè),僅僅是測(cè)試并且只是講你確認(rèn)了的函數(shù)提取出來(lái)。雖然這個(gè)測(cè)試看起來(lái)完全是不足夠的 --作為一個(gè)開(kāi)發(fā)者,學(xué)著相信你自己的技術(shù)。有時(shí)候你只好需要這樣去做。

            9. 如果看起來(lái)很無(wú)助的話,那就為自己找個(gè)同伴一起閱讀代碼。你可能不是能在讀這份代碼里受益唯一的人,所以去尋找一個(gè)其他的人并試著一起閱讀。然而不要去找那些專家,他們會(huì)在高的層次向你解釋這一切,你會(huì)錯(cuò)過(guò)當(dāng)你拾起代碼自己去經(jīng)歷時(shí)所能得到其中所有微妙的地方。如果不見(jiàn)效的話,你就不要再去強(qiáng)求,有時(shí)候最好的辦法就是你去提問(wèn),問(wèn)你的同僚?;蛘吣闶窃谧x開(kāi)源代碼的話,試著去在互聯(lián)網(wǎng)上尋求他人的幫助。但是請(qǐng)記住,這是最后一步,不是第一步。

                   如果時(shí)間所迫,你需要適當(dāng)?shù)丶涌焖俣热チ私庖恍┐a時(shí),只能選上面的一個(gè)步驟的話,我會(huì)選擇重構(gòu) (第8步)。你不能很快地將其了解清楚,但是如果你做了這個(gè)工作的話,你將會(huì)牢牢地掌握它。沒(méi)關(guān)系,你需要將這句話記在心里:如果你是剛接觸一個(gè)重要的代碼庫(kù), 你不可能立刻弄懂它們,甚至不能快速地弄懂它們。這將耗費(fèi)數(shù)天、數(shù)周或者數(shù)月的不懈的努力--只要去接受它就行了。如果有專家加盟的話你也不能顯著的減少時(shí)間 (這是我下個(gè)教學(xué)系列的文章 將討論的)。然而無(wú)論如何,如果你在讀代碼(還有寫代碼)是有耐心的、有條不紊的,你最后總能變得通曉項(xiàng)目所有的方面,并且當(dāng)涉及到代碼庫(kù)的時(shí)候,你會(huì)成為能夠勝任他人難以企及工作的人(go-to man)。或者你會(huì)選擇成為逃避閱讀代碼、總是找人向你解釋問(wèn)題的家伙。我知道我會(huì)選擇哪一個(gè)的。

             

            尋找代碼閱讀機(jī)會(huì)--而不要去逃避它們

             


                  

                 

                   我們喜歡編寫新的代碼,一個(gè)誘人原因就是我們能用它恰到好處地處理問(wèn)題。好吧,可能這次不是,但是下次一定就是了。事實(shí)上,你一直在改進(jìn)你的技藝,但你永遠(yuǎn)不可能恰到好處的處理問(wèn)題。這就是寫新代碼一直存在的價(jià)值的原因,你能夠獲得鍛煉并且磨礪你的技巧,其實(shí)閱讀和把玩別人所寫代碼也有同樣的(如果沒(méi)有更多的話)價(jià)值。你不僅僅能從中得到一些有價(jià)值的技術(shù)知識(shí),還同樣經(jīng)常能獲得一些領(lǐng)域知識(shí)(歸根結(jié)底,代碼是文檔的最終的形式),這仍然是很有價(jià)值的東西。

                   即使代碼使用奇怪的方式所編寫,不經(jīng)過(guò)轉(zhuǎn)換加密的話,都可能是有價(jià)值的。你懂我所說(shuō)的那類代碼,它看起來(lái)是加密混淆過(guò)了的,但是它并不是有意而為之的(由于某種原因,Perl經(jīng)常就是這種代碼?),無(wú)論何時(shí)我見(jiàn)到這樣的代碼,我就會(huì)想到了這個(gè)方法。把這東西想象成是只能經(jīng)過(guò)解密破譯后你才能從中有所學(xué)的東西。是的,這是很痛苦的事,但是請(qǐng)你容許它,有時(shí)候你也會(huì)因?yàn)槟撤N神秘瑣碎的原因,寫出這種看起來(lái)像被混淆了的代碼(不要否認(rèn)它,你知道這是真的)。好了,如果你如此這般的投入了時(shí)間去閱讀代碼,你更可能最后能夠?qū)懗鲞@種代碼--并不是意味著你一定要將其寫出、而是你將擁有寫出它的能力。最后說(shuō)一句,態(tài)度決定一切,如果你把閱讀代碼視作乏味無(wú)聊的事,它就會(huì)變得乏味無(wú)聊,你就會(huì)去逃避它,但是如果你選擇將其看作一次機(jī)遇的話--那么好事就要降臨了。

             

             

             Creative commons license
             by XGuru is licensed under a Creative Commons 署 名-非商業(yè)性使用-相同方式共享 2.5 中國(guó)大陸 License. 原文請(qǐng) 看這里。

            Thanks to bearice for debugging.


             


            posted on 2010-06-04 15:55 XGuru 閱讀(6522) 評(píng)論(10)  編輯 收藏 引用

            Feedback

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-04 16:52 code
            我也喜歡看別人的代碼,特別是優(yōu)秀的開(kāi)源項(xiàng)目  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-04 19:10 chaogu
            但是要看什么代碼?看哪里的代碼?怎么去找到優(yōu)秀的代碼呢?這個(gè)才是最重要的問(wèn)題。如果你知道了看代碼的重要性,你會(huì)迫不及待地去看別人的代碼,但是你會(huì)遇到這么個(gè)問(wèn)題---看誰(shuí)的或者那個(gè)項(xiàng)目的代碼?這點(diǎn)上很多人都會(huì)困惑。  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-04 19:16 溪流
            說(shuō)的太好了,把我的丑惡心理全說(shuō)出來(lái)了,哈哈~~  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它[未登錄](méi) 2010-06-04 21:48 Jcily
            我覺(jué)得不喜歡讀別人代碼的情況更多的是出現(xiàn)在一個(gè)團(tuán)隊(duì)里面,而不是面對(duì)開(kāi)源代碼或者商業(yè)代碼。  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-05 10:17 小時(shí)候可靚了
            我也喜歡看代碼。。。無(wú)碼的作品我很有排斥感!  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-05 10:37 XGuru
            @小時(shí)候可靚了
            囧,你可真是個(gè)邪惡的人吶  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-05 14:43 小時(shí)候可靚了
            @XGuru
            haha  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-06 06:55 欲三更
            閱讀代碼也是一種天賦。。。  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-06 10:08 louity
            @欲三更
            閱讀代碼不需要天賦,需要心態(tài)  回復(fù)  更多評(píng)論
              

            # re: [譯文]為何我喜愛(ài)讀他人的代碼,而你也應(yīng)該去喜愛(ài)它 2010-06-10 17:13 sliu4fun
            +1 @小時(shí)候可靚了
              回復(fù)  更多評(píng)論
              


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            国产综合精品久久亚洲| 久久天天躁狠狠躁夜夜躁2O2O| 国产精品久久久久影视不卡| 久久精品午夜一区二区福利| 欧美丰满熟妇BBB久久久| 国产一级持黄大片99久久| 狠狠精品干练久久久无码中文字幕| 热RE99久久精品国产66热| 亚洲AV日韩精品久久久久久久| 久久精品国产99久久无毒不卡| 色综合久久最新中文字幕| 久久婷婷午色综合夜啪| 久久99精品久久久久久hb无码| 精品久久久久久久久久中文字幕 | 99国产欧美久久久精品蜜芽 | 精品久久久久久久中文字幕| 亚洲午夜无码久久久久小说| 亚洲国产成人久久综合一| 久久精品aⅴ无码中文字字幕不卡| 青青草原综合久久大伊人精品| 亚洲精品乱码久久久久66| 久久久久婷婷| 中文字幕精品久久久久人妻| 久久久亚洲精品蜜桃臀| 久久精品二区| 久久精品无码专区免费| 999久久久国产精品| 久久久久综合网久久| 久久久艹| 欧美牲交A欧牲交aⅴ久久| 久久天天躁狠狠躁夜夜2020一| 久久精品国产第一区二区三区| 日韩精品无码久久久久久| 无码人妻久久一区二区三区免费| 久久亚洲熟女cc98cm| 狠狠精品久久久无码中文字幕| 久久精品国产第一区二区三区| 999久久久免费国产精品播放| 久久精品国产一区二区三区不卡| 国产精品美女久久久免费| 久久只有这里有精品4|