本篇文章給大家分享的是有關(guān)如何看待看源代碼,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
成都創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的南安網(wǎng)站建設(shè)公司,南安接單;提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行南安網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
1. 前言
很多人問(wèn)我如何看源代碼?是不是我在看源代碼這方面特別有天賦?
其實(shí)不是的,我也只是個(gè)普通人,跟大伙沒(méi)啥分別,
只不過(guò)我沒(méi)有別的特別愛(ài)好,一有空時(shí),不是寫(xiě)自己的代碼就是看別人的代碼,
我在看源代碼時(shí)比較有耐心,純粹就是興趣驅(qū)動(dòng),或者說(shuō)是一種好奇心。
當(dāng)然,我不會(huì)隨隨便便拿起一個(gè)開(kāi)源項(xiàng)目就看,而是經(jīng)過(guò)一定了解后才決定看它的源代碼的,
一旦決定要看了,我至少要把這個(gè)開(kāi)源項(xiàng)目80%以上的代碼看完,并不是那種膚淺的看,
而是仔細(xì)研究每一行代碼。
2. 我看過(guò)這些開(kāi)源項(xiàng)目
按時(shí)間先后順序:
2007:
OpenJDK Javac1.7
2008:
Erlang編譯器 (看得最少的一個(gè),只看了一半源代碼)
2009:
Tomcat6
Junit4
Ibatis2.3
OSCache2.4
Ehcache1.6
MongoDB-mongo-java-driver1.2
Velocity1.6
2010:
MySQL JDBC Driver (mysql-connector-java-5.1.13)
PostgreSQL JDBC Driver (postgresql-jdbc-8.4-701)
Netty3.2
Tomcat7
2011:
Jetty8
目前主要關(guān)注這4個(gè):
OpenJDK Javac1.7
Netty4.0
Tomcat7
Jetty8
我現(xiàn)在每隔1到7天就會(huì)看這4個(gè)開(kāi)源項(xiàng)目的源代碼庫(kù)中有沒(méi)有更新,
我裝了TortoiseHg, TortoiseGit, TortoiseSVN,
因?yàn)榭碕avac1.7的源代碼更新用TortoiseHg比較方便,
而看Netty4.0要用TortoiseGit,最后兩者用TortoiseSVN。
3. 我對(duì)看源代碼的人進(jìn)行了分類(lèi)
分5種人:
1) 解決問(wèn)題型
這種類(lèi)型的人通常是在工作學(xué)習(xí)中碰到了一個(gè)很費(fèi)解或很棘手的問(wèn)題,
文檔也看了,google也找了,同事、同學(xué)也問(wèn)過(guò)了,
但是問(wèn)題還是無(wú)法解決,于是不得不把源代碼下下來(lái),然后一邊看一邊debug,直到問(wèn)題解決。
2) 三分鐘熱度型
可能是看到別人也在看或者在論壇上看到某些人說(shuō)XXX設(shè)計(jì)得很好,性能也不錯(cuò),或者看到某些人在論壇上發(fā)了些分析源代碼的文章,
再加上自己一開(kāi)始也興趣滿滿,然后也跟風(fēng)了,看了10來(lái)個(gè)類(lèi)的代碼,啊,發(fā)現(xiàn)太痛苦,方法之間調(diào)來(lái)調(diào)去的,太繞了,頭快炸了,
給自己找個(gè)理由,這代碼寫(xiě)得太垃圾了,媽的,不看了。
3) 一知半解型
網(wǎng)上經(jīng)??吹接腥嗽趯?xiě)分析源代碼的文章,一上來(lái)就是一陀陀的源代碼,然后告訴你這做了什么,那做了什么,
就加了點(diǎn)中文注釋?zhuān)袝r(shí)這中文注釋還不如源代碼中的英文注釋好理解,然后過(guò)了一段時(shí)間,發(fā)現(xiàn)文章不更新了,也沒(méi)有后續(xù)了。
4) 真才實(shí)學(xué)型
像原作者一樣思考,能輕松說(shuō)出此開(kāi)源項(xiàng)目的核心架構(gòu),精確理解80%以上的源代碼,能找出bug并能提交相應(yīng)patch,
5) 創(chuàng)新型
對(duì)此開(kāi)源項(xiàng)目的優(yōu)缺點(diǎn)了然于心,能夠提取其精華為我所用,想出更好的方案解決現(xiàn)有問(wèn)題,超越原作者。
4. 我看源代碼的經(jīng)驗(yàn)
僅供參考,不要隨意模仿,每個(gè)人都應(yīng)該找到適合自己的方式,
唯一重要的是以下3點(diǎn):
1) 時(shí)間
最好能有一大段時(shí)間集中精力去看,比如你要看Tomcat7,要有3個(gè)月的時(shí)間每天花3到8小時(shí)去不停的看,
時(shí)間拖拉得越久,會(huì)看了前面忘了后面。
2) 興趣
看代碼不要有任何功利性,你要對(duì)它有興趣,充滿好奇心,去理解它做了什么,怎么做的。
3) 耐心
這一點(diǎn)說(shuō)起來(lái)容易,真正要做到是極其困難的,比如當(dāng)你某些類(lèi)連看了三次時(shí)還看不懂,不要先想別人寫(xiě)的代碼是否垃圾,
先想想你在這方面的背景知識(shí)是否足夠,比如在看Tomcat實(shí)現(xiàn)http協(xié)議相關(guān)的代碼時(shí),一邊看代碼一邊看http協(xié)議是最有效的方式,
再比如你想看編譯器相關(guān)的代碼,最起碼在看之前,你要對(duì)<<編譯原理>>這門(mén)課中的內(nèi)容有基本的了解。
如果背景知識(shí)有了還看不懂怎么辦,看不懂的代碼先放下,有些if分支只有你把整個(gè)項(xiàng)目都大致了解了一下后才能理解的,
要反復(fù)的看,看三次僅僅是個(gè)入門(mén)級(jí)別。
先簡(jiǎn)單說(shuō)一下我的經(jīng)歷:
小學(xué)到初中我還算是個(gè)好學(xué)生,在班里經(jīng)常拿第一,
但是從小學(xué)6年級(jí)到初三這4年比較特殊,遇到了一個(gè)很垃圾很垃圾很垃圾的數(shù)學(xué)老師,
所以這4年我的數(shù)學(xué)基本上就是自學(xué)的了,我的自學(xué)能力從小到現(xiàn)在都是非常的強(qiáng)。
當(dāng)然,這不能歸功于這位垃圾老師,我自小就很叛逆,不喜歡這禽獸的教學(xué)方式,沒(méi)有此垃圾,也許我的生活會(huì)是另一番景色。
我不像正常人那樣上完初中上高中,然后再上大學(xué),
而是上完初中后就直接到一所師范大學(xué)上中專(zhuān)+自考大專(zhuān),2001年就畢業(yè)了。
中專(zhuān)是學(xué)會(huì)計(jì)統(tǒng)計(jì)類(lèi)的,自考大專(zhuān)是計(jì)算機(jī)應(yīng)用,大專(zhuān)一共才12門(mén)課,沒(méi)有英語(yǔ),數(shù)學(xué)方面只有高數(shù),而且還是第一冊(cè),
核心專(zhuān)業(yè)課方面只有pascal、c、8086匯編語(yǔ)言、FoxPro、模擬電路、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、軟件工程、計(jì)算機(jī)接口與技術(shù)。
只要不是硬件類(lèi)的專(zhuān)業(yè)課程我就學(xué)得非常好,硬件類(lèi)課程就只是聽(tīng)老師講,當(dāng)時(shí)連硬盤(pán)長(zhǎng)什么樣都不知道。
我2001年畢業(yè)時(shí)才19歲,然后就出來(lái)找工作了,說(shuō)這些只是想說(shuō)我從學(xué)校得到的教育并不多,
現(xiàn)在回想起來(lái)從學(xué)校學(xué)的C語(yǔ)言、匯編語(yǔ)言、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)為我以后的自學(xué)提供了一些幫助。
直到2006年,我辭職了,之前我己經(jīng)工作了4年,都只是做應(yīng)用軟件項(xiàng)目,
所以數(shù)學(xué)基本上沒(méi)用過(guò),英語(yǔ)也用得少之又少,英語(yǔ)其實(shí)比現(xiàn)在的高中生水平還差,
所以要看英文的技術(shù)文章也是看不懂的。
2006年我本來(lái)是要復(fù)習(xí)考研究生的,我從3月份開(kāi)始連背了三個(gè)月的英語(yǔ),每天花4到8小時(shí)背新概念英語(yǔ)的課文,
一、二冊(cè)全部背完,第三冊(cè)背了前42課,第四冊(cè)背了前10課,我以為這樣的水平足夠應(yīng)付考研英語(yǔ)了,結(jié)果拿試卷一做,
閱讀理解至少有2/5的單詞認(rèn)不得,不得不去背考研英語(yǔ)的單詞。
數(shù)學(xué)基本上忘光了,到網(wǎng)上下初中和高中的新課標(biāo)課本下來(lái)看,
高數(shù)、線性代數(shù)、概論全都自學(xué),還買(mǎi)了相關(guān)的數(shù)學(xué)書(shū)來(lái)看(像幾何、離散數(shù)學(xué)等等)。
天天做那些垃圾數(shù)學(xué)題,還要背馬哲、毛概,專(zhuān)業(yè)課倒是小兒科。
一直到10月份,各校出來(lái)招生簡(jiǎn)章了,想報(bào)10大高校,結(jié)果別人不鳥(niǎo)你專(zhuān)科生,你專(zhuān)科生沒(méi)有報(bào)名資格,
好吧,換二線的可以了吧,結(jié)果還是差不多,不是要本科,就是要發(fā)表啥論文才能報(bào),
最后,很不情愿的報(bào)了個(gè)很平庸的所謂211大學(xué)。
此后越發(fā)覺(jué)得天天做題背單詞背書(shū)實(shí)在是件極其無(wú)聊的事,再加上報(bào)考這件事,嚴(yán)重打擊積極性,一直想放棄考研但是又一直堅(jiān)持著,
直到11月23日,那天去書(shū)店看書(shū),翻到一本講編譯器實(shí)現(xiàn)的書(shū),
也就是所謂的"虎書(shū)",當(dāng)時(shí)并不知道編譯器是什么,因?yàn)槲以趯W(xué)校時(shí)沒(méi)學(xué)過(guò)編譯原理,在書(shū)店連看了一小時(shí),覺(jué)得很有趣,
就買(mǎi)了回來(lái),接著就把考研的書(shū)全丟到一個(gè)角落里了。
接下來(lái)你應(yīng)該懂的,我瘋狂的買(mǎi)書(shū),"龍書(shū)","鯨書(shū)"啥的我都買(mǎi)了,只要是有關(guān)編譯器的,不管是國(guó)內(nèi)還是國(guó)外我都買(mǎi),
因?yàn)槲也⒉皇且豢淳腿?,也是因?yàn)?quot;虎書(shū)"剛開(kāi)始一兩章還好理解,后面的我當(dāng)時(shí)就看不懂了,
我有個(gè)習(xí)慣,就是實(shí)在看不懂的書(shū),我就會(huì)換一本,確認(rèn)一下是我自己的原因還是書(shū)本身的問(wèn)題,
現(xiàn)在我只會(huì)說(shuō)"虎書(shū)"翻譯得并不好,"龍書(shū)"更好理解,當(dāng)然一開(kāi)始就看"龍書(shū)"也并不是那么好理解,
所以我當(dāng)時(shí)甚至連形式語(yǔ)言和自動(dòng)機(jī)相關(guān)的書(shū)我都買(mǎi)來(lái)看了。
我連看了3個(gè)多月,當(dāng)時(shí)覺(jué)得看書(shū)不過(guò)癮,就想找個(gè)實(shí)際的編譯器來(lái)玩,
我下了GCC和LCC,當(dāng)時(shí)剛好sun公司又把javac開(kāi)源了。
因?yàn)楣ぷ髦兄挥玫絧hp和java,c語(yǔ)言已經(jīng)4年沒(méi)用過(guò)了,加上javac比前兩者要小很多,
所以從2007年二月份開(kāi)始第一次看javac的源代碼,也是第一次看別人的源代碼。
javac的源代碼不多,8萬(wàn)行都不到,花了我3個(gè)月的時(shí)間,平均每天至少花7小時(shí)看代碼。
因?yàn)槲耶?dāng)時(shí)只會(huì)java1.4,java1.5之后出來(lái)的很多東西都不懂,所以也是一邊看javac的源代碼一邊學(xué)新語(yǔ)法。
2007年5月份時(shí)我還在JavaEye上發(fā)了第一篇有關(guān)javac的文章,得了個(gè)精華,引起了一點(diǎn)小轟動(dòng),
這里有證據(jù): http://www.iteye.com/topic/84833
內(nèi)容貌似當(dāng)年被我刪除了,想不起來(lái)是什么原因了,zhh3007就是我本人以前的id。
當(dāng)時(shí)看代碼的方法是非常原始的,但是直到現(xiàn)在我還在用這種方法,只不過(guò)現(xiàn)在有時(shí)會(huì)用eclipse來(lái)看,
我是這么做的:
看原代碼用 EditPlus,
找到第一個(gè)入口類(lèi): com\\sun\\tools\\javac\\Main
自己再寫(xiě)一個(gè)Debug類(lèi),按執(zhí)行流程看到一個(gè)方法時(shí),就加入類(lèi)似下面的代碼塊:
public static int compile(String[] args) { try {//我加上的 DEBUG.P(Main.class,"compile(1)"); DEBUG.PA("args", args); com.sun.tools.javac.main.Main compiler = new com.sun.tools.javac.main.Main("javac"); return compiler.compile(args); }finally{//我加上的 DEBUG.P(0,Main.class,"compile(1)"); } }
然后一定要重編譯源代碼,再運(yùn)行,保證自己加的代碼被執(zhí)行到了,我會(huì)把輸出的debug結(jié)果重定向到一個(gè)文件中,
然后一邊看源代碼一邊看輸出結(jié)果,一些變量或表達(dá)式自己想看結(jié)果也會(huì)加DEBUG.P(...),
碰到一些代碼行數(shù)很多的類(lèi),我甚至?xí)衙總€(gè)方法copy出來(lái)放到一個(gè)新的java文件中,
然后打開(kāi)多個(gè)EditPlus,每個(gè)EditPlus看一個(gè)方法,而且是按照方法的調(diào)用順序打開(kāi)EditPlus看的。
可能看到這很多人會(huì)覺(jué)得這種方式好土,我也不能說(shuō)好不好,從今年開(kāi)始,因?yàn)槲业碾娔X裝了Eclipse了,
所以Jetty8的源代碼我是用Eclipse看的,也不再打DEBUG輸出,也不再copy方法,而是直接用eclipse的debug跟蹤功能,
但是我現(xiàn)在提出質(zhì)疑了,Jetty8的代碼量只是Tomcat6的1/3,我用Eclipse這種方式來(lái)研究源代碼并不能節(jié)省我的總時(shí)間,
我用最原始的方式研究Tomcat6也只花了3個(gè)月,現(xiàn)在研究Jetty8已經(jīng)用了我兩個(gè)月的時(shí)間,而且看Tomcat6和Jetty8是兩個(gè)類(lèi)似的東西,
按理說(shuō)先看Tomcat6后看Jetty8應(yīng)該花的時(shí)間更少才對(duì)。
我總結(jié)了一下,為什么最初的方式好,那是因?yàn)槲夷菢硬粩嗾垓v源代碼的過(guò)程中已經(jīng)間接讓我記住了代碼的布局,
我在敲那些重復(fù)的DEBUG.P代碼時(shí)我把局部變量、表達(dá)式、字段都輸出了一次,這有助于我的記憶。
而Eclipse的debug功能只是在不停的按F5-F6-F7-F8,打斷點(diǎn),方法調(diào)用太深時(shí)很難理清前后關(guān)系,
有時(shí)看了一星期,連哪個(gè)類(lèi)在哪個(gè)目錄都不知道,因?yàn)閐ebug時(shí),跟到相關(guān)的類(lèi)eclipse會(huì)自動(dòng)打開(kāi)那個(gè)類(lèi),不用你從目錄中找。
Eclipse的代碼折疊粒度又不能折疊到塊級(jí)別,不能折疊if、while,一旦方法的行數(shù)很多,看起來(lái)會(huì)很累,分不清這個(gè)方法的層次結(jié)構(gòu),
而EditPlus在看方法時(shí)就看得很舒服,因?yàn)樗苷郫Bif、while,看完了一個(gè)while我可以把他折疊起來(lái),
有多個(gè)if-else時(shí)只要折疊一下就不會(huì)超過(guò)一屏。
你能打開(kāi)20個(gè)EditPlus,但是你不能同時(shí)打開(kāi)10個(gè)Eclipse,除非你電腦的內(nèi)存牛X到不行。
有一點(diǎn)很重要,不管是哪一種方式,一定要把環(huán)境搭建好,你自已要能夠編譯源代碼,并且多寫(xiě)些例子去驗(yàn)證源代碼中的執(zhí)行流程,
我一般不會(huì)去看源有代碼中的例子或測(cè)試用例的,只有想不出時(shí)才去看(特別是看編譯器時(shí),一些用例你很難想到)。
我為什么要看這么多源代碼?
除了個(gè)人興趣之外,現(xiàn)在想起來(lái)其實(shí)還有個(gè)很好笑的原因:
2007下半年和2008一整年,這段時(shí)間很多人說(shuō)Java快死了,Ruby/Rails、Erlang很火,
我經(jīng)常上JavaEye,免不了也受影響,所以在2008年時(shí)還學(xué)習(xí)了Ruby/Rails、Erlang,連Erlang的編譯器都玩了一下,
之后發(fā)現(xiàn)并不是那樣滴,只不過(guò)是一些大佬在鼓吹而已,再加上2008年家里出了點(diǎn)事,所以過(guò)得很郁悶,
一有閑情就跟JavaEye的大佬們"打架",想來(lái)也是種樂(lè)趣,算是種排解壓力的方式。
當(dāng)然,與此同時(shí),也會(huì)從技術(shù)的角度思考Java出了什么問(wèn)題,所以從2009年開(kāi)始就專(zhuān)心研究技術(shù)了,還把douyu的原型鼓搗出來(lái)了。
2009年研究的那些開(kāi)源項(xiàng)目其實(shí)都是很順其自然的事,我要做一個(gè)http服務(wù)器,Tomcat已經(jīng)做好了,我想知道他怎么做的,
我就去看,看這些項(xiàng)目就是為了想知道他們做了什么,怎么做的,哪里做得不好,我能不能比他們做得更好。
現(xiàn)在,看代碼已經(jīng)是我的一種習(xí)慣了,從畢業(yè)那年到2008年我買(mǎi)了幾萬(wàn)塊錢(qián)的書(shū),以至于我來(lái)杭州后都沒(méi)有把桂林的房子退了,
因?yàn)闀?shū)多,桂林那房子除了回去能住個(gè)幾天外,現(xiàn)在是租給書(shū)住的了。
從2009年到現(xiàn)在,兩年多時(shí)間我沒(méi)有再買(mǎi)書(shū),都是看源代碼學(xué)新東西,
如果是一個(gè)全新的領(lǐng)域,最多也就是在網(wǎng)上找點(diǎn)入門(mén)資料,然后再看源代碼,
包括下半年我準(zhǔn)備研究HotSpot,已經(jīng)是C/C++的領(lǐng)域了,我沒(méi)有任何學(xué)習(xí)壓力,只是一個(gè)時(shí)間問(wèn)題。
一個(gè)人的自我學(xué)習(xí)能力非常的重要,Java相關(guān)的和Java之外的所有東西我都是自學(xué)的,
我沒(méi)有特別問(wèn)過(guò)什么人,也沒(méi)參加過(guò)培訓(xùn),實(shí)在不懂的地方就查資料買(mǎi)書(shū)看。
如果看代碼看不懂,這幾點(diǎn)一定要明白:
1) 相關(guān)背景知識(shí)是否具備
2) 要有耐心,多看幾遍
3) 不要指望別人告訴你答案,別人沒(méi)跟你說(shuō)也不要說(shuō)別人高高在上不理你,因?yàn)檫@不是別人的義務(wù)
4) 經(jīng)過(guò)對(duì)比之后再說(shuō)別人的代碼爛
以上就是如何看待看源代碼,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
標(biāo)題名稱(chēng):如何看待看源代碼
當(dāng)前網(wǎng)址:http://www.rwnh.cn/article36/ipcesg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、域名注冊(cè)、網(wǎng)站排名、App設(shè)計(jì)、搜索引擎優(yōu)化、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)