下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、如何深理解開源項(xiàng)感謝這個(gè)時(shí)代,我們有了github,有了近乎窮的開源項(xiàng)可以看,可以學(xué)。記住,看的的是學(xué),但是看不等于學(xué)!、從代碼集看起對于個(gè)新,是絕對不適合上來就追求spring,web容器,數(shù)據(jù)庫這種級別的代碼。萬事開頭總是要從簡單的來。如果沒有太多閱讀開源代碼經(jīng)驗(yàn)的話,請從個(gè)代碼量在千級別或更的repository開始吧。在閱讀代碼中,也慢慢留意些約定,如代碼的檔般寫哪了(README.md ? 或者 docs錄?)代碼的起名字和錄組織概遵循什么規(guī)范代碼如何配置代碼如何build這些將幫你構(gòu)建個(gè)初步的可以深代碼的路徑,并為進(jìn)步深理解代碼打基礎(chǔ)。這點(diǎn)不得不夸下javascript的npm。n
2、pm有相當(dāng)多的很的好代碼。牌web框架express的代碼數(shù)才4000多。些具如隨機(jī)字符串產(chǎn)器、分布式ID產(chǎn)器只有數(shù)。常適合門學(xué)習(xí)。、聚焦有多少是抱著顆不切實(shí)際的預(yù)期去看代碼的?有說,我Java想提升下去看看Spring吧;有說我Web沒有太理解,去看看Tomcat吧。結(jié)果可想知。正像問問題時(shí)不應(yīng)該問過于寬泛的問題,看任何代碼都不應(yīng)該抱有看遍全都看懂的期望因?yàn)榫瓦B代碼作者都做不到。寫代碼時(shí)往往都會(huì)做些抽象,把某個(gè)特定問題拆解。如分層、如抽象為個(gè)class代表個(gè)實(shí)際的概念等等。每個(gè)抽象都可能解決個(gè)具體的問題??创a也是如此,定要先聚焦,把看代碼的scope限制住,不要貪多。如當(dāng)看Java Col
3、lections代碼,可能是希望學(xué)習(xí)其數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)式到底鏈表、樹、跳表等是怎么實(shí)現(xiàn)的,內(nèi)存中個(gè)個(gè)object是如何關(guān)聯(lián)起來的,如何被快速訪問的;或者是特定算法的實(shí)現(xiàn)(如Collections.sort的是什么排序算法)。此時(shí),其他的部分就不要太過于在意,直接忽略那些抽象隱藏起來的地,以及不相關(guān)的細(xì)節(jié)。對于更復(fù)雜的服務(wù)就更要聚焦。如Jetty解決了相當(dāng)多問題,如:如何啟動(dòng)、如何找到Java Runtim、如何加載配置件、如何load核class、如何打log如何處理IO、如何解析HTTP協(xié)議的數(shù)據(jù)、如何將數(shù)據(jù)轉(zhuǎn)換為Servlet標(biāo)準(zhǔn)的處理、如何管理集群 并且,這些代碼還會(huì)夾雜著些設(shè)計(jì)模式的層,
4、如XXXXFactory,XXXXAdaptor 如此復(fù)雜的代碼,即使是很有經(jīng)驗(yàn)的也不可能兼顧著在短時(shí)間內(nèi)全看懂。所以,每次看代碼之前,務(wù)必先確定個(gè)要學(xué)習(xí)的的。如果代碼量很龐,就可以安排個(gè)學(xué)習(xí)計(jì)劃,每次聚焦于個(gè)的。對于像Java這樣的向?qū)ο笳Z,優(yōu)秀的設(shè)計(jì)往往都是基于組代表概念的類成的對象的相互交互。學(xué)習(xí)代碼時(shí),優(yōu)先去看類名,組織起層的全局感常重要。如,如果希望學(xué)習(xí)個(gè)“駕駛模擬”系統(tǒng)的代碼中有關(guān)“如何駕駛”的部分,定會(huì)找到代表操作、油門和向盤概念的類。然后去觀察他們是如何互動(dòng)的。此時(shí)絕對不該扯上變速箱、發(fā)動(dòng)機(jī)和傳動(dòng)軸。作為像C這樣的語,其源碼致是向過程的,即分多個(gè)步驟做件事,每個(gè)步驟再細(xì)分為更多
5、步驟。例如,nginx分配段內(nèi)存來存儲(chǔ)個(gè)http請求頭就概包括1. 利個(gè)具函數(shù)分配指定的內(nèi)存2. 從socket中將數(shù)據(jù)讀出來,并填充到分配的內(nèi)存上第步可以進(jìn)步細(xì)化為:從個(gè)內(nèi)存池把段內(nèi)存借出來,如果沒有可內(nèi)存了就得找操作系統(tǒng)要,要到了內(nèi)存可能還需要填充為零等等步驟。這時(shí)預(yù)先畫畫流程圖對理解代碼會(huì)常有幫助??傊绻惚积嫷脑创a打敗,概率不是因?yàn)槟惚?,是因?yàn)槟氵^于貪急躁了。三、請先看檔解釋Redis的常數(shù)據(jù)類型 https:/redis.io/topics/data-types-intro解釋如何實(shí)現(xiàn)個(gè)key過期 https:/redis.io/commands/expire解釋如何做主從復(fù)制
6、https:/redis.io/topics/replication這些檔能常好的指導(dǎo)閱讀相關(guān)的源代碼。更復(fù)雜的開源系統(tǒng)往往都有對應(yīng)的書籍來解釋其內(nèi)部作原理。如,MySQL技術(shù)內(nèi)幕:InnoDB存儲(chǔ)引擎是很好的指引如何理解InnoDB源代碼的書,名乎每個(gè)做業(yè)務(wù)的同學(xué)都會(huì)接觸到;當(dāng)年侯捷先的深淺出MFC常細(xì)致的剖析了MFC內(nèi)部的C+是怎么把本來C+運(yùn)時(shí)做不到的事情通過些歪招給搞定的;C專家編程(稱魚書),很多例來解釋如個(gè)復(fù)雜的函數(shù)指針的是怎么被parse的,變量是如何被保存和傳遞的。等等等等。如果你閱讀的是著名系統(tǒng)的源代碼,請盡量先從檔/書籍找到切點(diǎn),往往能事半功倍。對于可讀性,給寫的東西總是好
7、過給機(jī)器寫的東西啊。四、關(guān)注資源的命周期有產(chǎn)意義的系統(tǒng)般總是會(huì)有些核的資源需要管理,這些資源的命周期的維護(hù)往往是這類系統(tǒng)代碼的核。如對于spring-core來講,其核資源是“Bean”。個(gè)Bean被創(chuàng)建、初始化、被使、被解構(gòu),是整套代碼的核;對于spring-webmvc,其核資源是“HTTP 請求”。個(gè)http請求從被收到開始、其數(shù)據(jù)被注到請求handler,其返回的數(shù)據(jù)結(jié)構(gòu)被設(shè)定,是整套代碼的核;對于個(gè)池 (如commons-pool,thread-pool),其核資源是池中的Object。Object從創(chuàng)建,被借出,被使,被歸還,到最后被銷毀,是整套代碼的核數(shù)據(jù)庫系統(tǒng)、隊(duì)列系統(tǒng)、web
8、系統(tǒng)、些業(yè)務(wù)系統(tǒng)(如做活動(dòng)、發(fā)紅包)、安全系統(tǒng)等等,都有這樣的資源的存在。把握住核資源的命周期就能掐到代碼的命門。五、找個(gè)好具很多年前我們做C開發(fā)時(shí)都喜歡款叫做Source Insight的軟件來學(xué)習(xí)代碼。他可以開很多窗,在不同的函數(shù)間跳來跳去,還可以做書簽便定位。如今,基本上是個(gè)IDE都會(huì)有這些功能,就連沒有類型的js也能很便的在VS Code中做各種符號跳轉(zhuǎn)和多串切換。代碼嘛,了解其執(zhí)順序,其寫作順序更有利于學(xué)習(xí)。六、建調(diào)試環(huán)境如果對于某些系統(tǒng)需要特別細(xì)致的理解,就需要把代碼跑起來。通過打斷點(diǎn),輸出log驗(yàn)證等式印證的想法。對于js,python這類會(huì)相當(dāng)簡單,因?yàn)閚pm/pip等具解決了
9、很多依賴問題,且需編譯,直接啟動(dòng)-修改-重啟-修改-即可不斷的嘗試。jvm類的系統(tǒng)只要能滿mvn install或者gradle build這樣的通編譯約定,或者通過IDE直接加載,也能相對容易的把系統(tǒng)跑起來。對于C/C+的系統(tǒng)就要煩許多,需要建個(gè)虛擬機(jī),然后安裝必要的包。對于它們,遠(yuǎn)程GDB之類的技術(shù)是常必要的。對于前端代碼,使jsfiddle配合chrome開發(fā)具這樣的具可讓你快速的構(gòu)建段js+html+css代碼的段,并且實(shí)時(shí)的看到效果。值得提句的是,有些系統(tǒng)可能涉及到較復(fù)雜的多進(jìn)程/線程并發(fā)執(zhí),對調(diào)試學(xué)習(xí)常不利。此時(shí)需要優(yōu)先尋找將系統(tǒng)退化到單線程/進(jìn)程的運(yùn)式(畢竟代碼作者也得靠這個(gè)模式
10、調(diào)試不是:)。個(gè)典型的例是nginx通常會(huì)有1個(gè)master進(jìn)程+多個(gè)worker進(jìn)程并發(fā)運(yùn),但在開發(fā)時(shí)只要配置中設(shè)定:worker_processer 1;即可使其退化為單進(jìn)程運(yùn)時(shí)模式。七、看代碼很累,要堅(jiān)持就像跑步能跑多遠(yuǎn),跑多久,都是要靠。閱讀代碼的確能極地提個(gè)能。但是能多遠(yuǎn)要靠毅堅(jiān)持。堅(jiān)持的敵就是過的挫折感。上提到的種種法從簡單的、聚焦、有計(jì)劃、找好具,說了就是盡量減少挫敗感,最限度的提“正反饋”。但是即便如此,不可否認(rèn)的是,對于多數(shù),看代碼是項(xiàng)??菰锏倪^程。這時(shí)你的恒,你的毅,你的“熬”的勁頭決定了你能多遠(yuǎn)。畢竟,想成為級程序員并不是輕輕松松的事情。橫下條來,挑戰(zhàn)我吧。最后附上部分我曾經(jīng)看過的質(zhì)量開源代碼:nginxM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年外研版七年級物理下冊月考試卷含答案
- 建筑工程中的電氣安裝要點(diǎn)講解
- 新郎父親婚禮上經(jīng)典致辭集錦15篇
- 妥善安置殘疾人的工傷事故保障
- 增強(qiáng)客戶服務(wù)技能的培訓(xùn)
- 商業(yè)銀行的金融科技實(shí)驗(yàn)室與孵化器
- 成長儀式發(fā)言稿集合15篇
- 設(shè)施維護(hù)的標(biāo)準(zhǔn)化流程與實(shí)踐
- 高檔商務(wù)建筑室內(nèi)外材料及施工的解析
- 職場中的領(lǐng)導(dǎo)力與團(tuán)隊(duì)賦權(quán)的平衡
- 勞務(wù)經(jīng)紀(jì)人培訓(xùn)
- 如何提高售后服務(wù)的快速響應(yīng)能力
- 成人氧氣吸入療法-中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)
- ?;愤\(yùn)輸安全緊急救援與處理
- Unit-3-Reading-and-thinking課文詳解課件-高中英語人教版必修第二冊
- 高數(shù)(大一上)期末試題及答案
- 婚介公司紅娘管理制度
- 煤礦電氣試驗(yàn)規(guī)程
- JCT796-2013 回彈儀評定燒結(jié)普通磚強(qiáng)度等級的方法
- 物業(yè)客服培訓(xùn)課件PPT模板
- 火力發(fā)電廠節(jié)能管理制度實(shí)施細(xì)則
評論
0/150
提交評論