日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

開源項(xiàng)目學(xué)習(xí)方法

系統(tǒng) 1854 0

學(xué)習(xí)各種開源項(xiàng)目,已經(jīng)成為很多朋友不可回避的工作內(nèi)容了。筆者本人也是如此。在接觸并學(xué)習(xí)了若干個(gè)開源項(xiàng)目之后,筆者試圖對(duì)自己工作過程中的若干體會(huì)加以總結(jié),以期對(duì)一些希望借鑒的朋友有所裨益。

需要說明的是,筆者本人接觸的開源項(xiàng)目大多屬于計(jì)算機(jī)系統(tǒng)領(lǐng)域,例如Linux kernel,KVM,QEMU,OpenStack等。因此,此處介紹的經(jīng)驗(yàn)必定也有些局限。請(qǐng)讀者們自行分辨,區(qū)別對(duì)待。

1. 學(xué)習(xí)分層和目標(biāo)管理?

對(duì)于一個(gè)開源項(xiàng)目,可以將與之相關(guān)的各種知識(shí)和技能的學(xué)習(xí)大致劃分為如下五個(gè)層次:?

第一層次: 了解項(xiàng)目的基本概念、基本用途、邏輯結(jié)構(gòu)、基本原理、產(chǎn)生背景、應(yīng)用場景等基本知識(shí)。?

這個(gè)層次的基本定位其實(shí)就是“科普”。如果對(duì)于一個(gè)項(xiàng)目只需要有些基本了解,且短期內(nèi)并不需要上手進(jìn)行實(shí)際技術(shù)工作,則學(xué)習(xí)到這個(gè)層次也就可以先應(yīng)付一下了。?

第二層次: 掌握項(xiàng)目的基本安裝流程和使用方法。?

這個(gè)層次的基本定位是“入門”,以便對(duì)這個(gè)項(xiàng)目獲得直觀認(rèn)識(shí),對(duì)其安裝和使用獲得親身體驗(yàn)。如果只是需要以as-is方式使用這個(gè)項(xiàng)目,則初步學(xué)習(xí)到這個(gè)層次即可。?

第三層次: 了解代碼的組織,找到各個(gè)主要邏輯/功能模塊與代碼文件之間的對(duì)應(yīng)關(guān)系,通過代碼分析走通幾個(gè)關(guān)鍵的、有代表性的執(zhí)行流程。?

這個(gè)層次的基本定位是“深入”,開始理解這個(gè)項(xiàng)目的實(shí)際實(shí)現(xiàn),能夠真正將項(xiàng)目的功能、工作原理和代碼實(shí)現(xiàn)對(duì)應(yīng)起來,獲得對(duì)這個(gè)項(xiàng)目工作過程的直觀認(rèn)識(shí)。這個(gè)層次是學(xué)習(xí)開源項(xiàng)目代碼的真正開始。如果希望基于這一項(xiàng)目進(jìn)行應(yīng)用開發(fā),或者針對(duì)與這一項(xiàng)目密切相關(guān)的其他項(xiàng)目進(jìn)行工作時(shí),則對(duì)項(xiàng)目本身的代碼進(jìn)行這一層次的理解,會(huì)很有幫助。?

第四層次: 了解該項(xiàng)目所有代碼模塊、程序文件的作用,走通所有主要執(zhí)行流程。?

這個(gè)層次的基本定位是“掌握”,能夠比較全面、系統(tǒng)地理解這個(gè)項(xiàng)目的設(shè)計(jì)和實(shí)現(xiàn),并且熟悉項(xiàng)目各個(gè)部分的代碼。如果希望對(duì)項(xiàng)目進(jìn)行深度定制修改,或者對(duì)社區(qū)有所貢獻(xiàn),則應(yīng)當(dāng)以達(dá)到這個(gè)層次作為目標(biāo)。?

第五層次: 鉆研、領(lǐng)悟該項(xiàng)目的各種設(shè)計(jì)思想與代碼實(shí)現(xiàn)細(xì)節(jié)。?

這個(gè)層次的基本定位是“精通”,精益求精,學(xué)無止境。這是大神們追求的境界。如果希望成為項(xiàng)目社區(qū)的重要貢獻(xiàn)者乃至核心貢獻(xiàn)者,則應(yīng)當(dāng)以這個(gè)層次作為努力的目標(biāo)。?

綜上,對(duì)于一個(gè)開源項(xiàng)目的學(xué)習(xí)過程可以大致分為五個(gè)層次。至于到底要學(xué)習(xí)到什么階段,投入多少相關(guān)精力,則完全取決于學(xué)習(xí)的目的。?

2. 知識(shí)基礎(chǔ)?

學(xué)習(xí)一個(gè)開源項(xiàng)目需要的知識(shí)基礎(chǔ)主要包括:?

1)該項(xiàng)目涉及的技術(shù)領(lǐng)域的背景知識(shí) ?

舉例而言,分析Linux Kenrel,則應(yīng)該了解操作系統(tǒng)原理;學(xué)習(xí)OpenStack,則應(yīng)該知道什么是云計(jì)算。如果沒有這些背景知識(shí)作為基礎(chǔ),上來就死磕源代碼,只能是事倍功半。?

2) 該項(xiàng)目開發(fā)使用的語言及其各種開發(fā)調(diào)試工具 ?

這個(gè)就無需多言了。?

3) 英語?

很遺憾,目前為止真正流行的開源項(xiàng)目大部分不是起源于國內(nèi)。因此,除了學(xué)習(xí)個(gè)別極其流行、文檔完備的項(xiàng)目之外,大家還是需要自行搜集閱讀英文資料參考。學(xué)好英語很重要。?

當(dāng)然,到底需要準(zhǔn)備多少知識(shí)基礎(chǔ),完全取決于學(xué)習(xí)的目的和層次。如果只是想科普一下,也就不必太過麻煩了。?

3. 學(xué)習(xí)思路?

學(xué)習(xí)一個(gè)項(xiàng)目的過程,其實(shí)就是由表及里了解分析它的過程。上述提及的五個(gè)學(xué)習(xí)層次便組成了這樣一個(gè)逐漸深入的過程。在此基礎(chǔ)之上,學(xué)習(xí)、分析代碼的過程,也可以嘗試做到由表及里、逐漸深入。?

在剛開始接觸一個(gè)項(xiàng)目的時(shí)候,我們看到的其實(shí)就是一個(gè)黑盒子。根據(jù)文檔,我們一定會(huì)發(fā)現(xiàn)盒子上具有若干對(duì)外接口。通常而言,這些接口可以被分為三類:?

  • 配置接口: 用于對(duì)盒子的工作模式、基本參數(shù)、擴(kuò)展插件等等重要特性進(jìn)行配置。這些配置往往是在盒子啟動(dòng)前一次性配好。在盒子的工作過程中,這些配置或者不變,或者只在少數(shù)的情況下發(fā)生改變。?
  • 控制接口: 用于在盒子的工作過程中,對(duì)于一些重要的行為進(jìn)行操縱。這是盒子的管理員對(duì)盒子進(jìn)行控制命令注入和狀態(tài)信息讀取的通路。?
  • 數(shù)據(jù)接口: 用于盒子在工作過程中讀取外部數(shù)據(jù),并在內(nèi)部處理完成后向外輸出數(shù)據(jù)。這是盒子的用戶真正關(guān)心的數(shù)據(jù)通路。?

因此,在分析一個(gè)開源項(xiàng)目的代碼時(shí),可以圍繞重要的配置、控制、數(shù)據(jù)接口展開分析工作,特別應(yīng)該注意理解一個(gè)關(guān)鍵的接口背后隱藏的操作流程。例如,針對(duì)數(shù)據(jù)接口,至少應(yīng)當(dāng)走通一條完整的數(shù)據(jù)輸入輸出流程,也即在代碼中找到數(shù)據(jù)從輸入接口進(jìn)入盒子后,經(jīng)過各種處理、轉(zhuǎn)發(fā)步驟,最終從輸出接口被傳輸出去的整個(gè)執(zhí)行過程。一旦走通了這樣一條流程,則可以將與數(shù)據(jù)處理相關(guān)的各個(gè)主要模塊、主要步驟貫穿起來,并將邏輯模塊圖上和文檔中的抽象概念對(duì)應(yīng)到代碼實(shí)現(xiàn)之中,可以有效推進(jìn)對(duì)于項(xiàng)目的深入理解。?

在實(shí)踐這一思路的過程中,筆者建議可以優(yōu)先從控制接口和數(shù)據(jù)接口中各自選擇一二重要者進(jìn)行背后的執(zhí)行流程詳細(xì)分析,力爭找到其中每一步的函數(shù)調(diào)用及數(shù)據(jù)傳遞關(guān)系(對(duì)于一些系統(tǒng)、應(yīng)用庫提供的底層函數(shù)可以先行跳過以節(jié)省時(shí)間)。這一工作完成之后,則第1節(jié)中第三層次的學(xué)習(xí)目標(biāo)即可初步達(dá)成。?

配置接口在不同的項(xiàng)目中的重要程度不同。對(duì)于一些架構(gòu)極為靈活、配置空間甚大的項(xiàng)目(如OpenStack的Ceilometer),則可以適當(dāng)多花些時(shí)間加以研究,否則簡單了解即可。?

對(duì)于這個(gè)學(xué)習(xí)思路,下文中還將結(jié)合實(shí)例進(jìn)行進(jìn)一步的說明。?

4. 若干小建議?

以下是筆者的一些零散建議,供大家參考。?

1)做好記錄?

在剛剛?cè)胧珠_始學(xué)習(xí)某個(gè)項(xiàng)目的源代碼時(shí),其實(shí)很有點(diǎn)破譯密碼的感覺。大量的數(shù)據(jù)結(jié)構(gòu)和函數(shù)方法散落在代碼的各個(gè)角落里,等待著學(xué)習(xí)者將它們貫穿到一個(gè)個(gè)重要的執(zhí)行流程中。因此,在分析學(xué)習(xí)的過程中,無論有什么零散收獲,都值得認(rèn)真記錄下來。珍珠自然會(huì)串成項(xiàng)鏈的。?

2)不要過分糾纏于細(xì)節(jié)?

立志搞懂一個(gè)項(xiàng)目的每行源代碼是值得尊敬的,但至少在剛剛?cè)胧值臅r(shí)候是沒有必要的。如果過于糾纏于代碼的實(shí)現(xiàn)細(xì)節(jié),則可能很快就被搞得頭暈眼花不勝其煩了(看英文資料的時(shí)候,每遇到一個(gè)不認(rèn)識(shí)的詞都要立刻查詞典么?)。不妨避免細(xì)節(jié)上的過度糾纏,還是先盡快走通關(guān)鍵的執(zhí)行流程,將項(xiàng)目的骨干框架搭起來,然后再以此為參照,就可以清晰判斷什么代碼值得深入分析,什么地方可以簡單略過了。?

3)想像和聯(lián)想很重要?

如前所述,從零開始搞懂一個(gè)項(xiàng)目的代碼,就像破譯密碼。因此,不妨展開合理的想象和聯(lián)想,將各個(gè)零散的發(fā)現(xiàn)和理解聯(lián)系起來,并加以分析印證。在這個(gè)過程中,對(duì)項(xiàng)目所在領(lǐng)域的背景知識(shí)、對(duì)項(xiàng)目本身的邏輯框架和工作原理等方面的理解,都是想像和聯(lián)想的參照與指導(dǎo)。此外,一些關(guān)鍵的函數(shù)名、變量名等等都是聯(lián)想的hint。本質(zhì)上,編程語言也是語言,而程序代碼就是說明文。在分析代碼時(shí),一定要超越語言和代碼的細(xì)節(jié)去理解被說明的事物本身。?

4)該搜就搜?

分析代碼的時(shí)候,很容易出現(xiàn)的情況就是,一個(gè)執(zhí)行流程走到半截找不到下一步了。。。在這種情況下,當(dāng)然首先還是推薦采用各種調(diào)試工具的單步執(zhí)行功能加以跟蹤。如果暫時(shí)不會(huì),或者種種原因只能進(jìn)行靜態(tài)代碼分析,那么該搜就搜吧。各種IDE工具的文本搜索都能用,哪怕是grep也行。至于到底以什么為搜索關(guān)鍵詞,就需要琢磨琢磨了。?

5)外事不決問google,內(nèi)事不決問百度?

如題,不解釋。?

?

?

轉(zhuǎn)自CSDN 作者資料

? ? ?章宇于2002年及2007年分別于清華大學(xué)電子工程系獲得學(xué)士及博士學(xué)位,其后一直從事計(jì)算機(jī)系統(tǒng)領(lǐng)域的研究與開發(fā)工作,目前供職于華為技術(shù)有限公司云操作系統(tǒng)部門,從事OpenStack相關(guān)工作。出于工作原因和個(gè)人興趣,作者陸續(xù)關(guān)注了一些開源項(xiàng)目,主要包括:KVM/QEMU,libvirt,virt-mamager,OpenStack,Open vSwitch,Ceph,Zabbix等。

開源項(xiàng)目學(xué)習(xí)方法


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 白玉县| 沅江市| 商城县| 吉安县| 临潭县| 苏州市| 阜平县| 开化县| 阜阳市| 平谷区| 普宁市| 连江县| 沙雅县| 隆林| 大悟县| 英山县| 烟台市| 库车县| 逊克县| 卢氏县| 延庆县| 乡宁县| 上思县| 板桥市| 仪征市| 沂源县| 西林县| 原阳县| 若尔盖县| 顺义区| 墨竹工卡县| 黄冈市| 石狮市| 时尚| 武隆县| 全南县| 和平区| 嘉鱼县| 崇礼县| 岳阳市| 长海县|