溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

DevOps中閱讀源代碼的實(shí)用技巧有哪些

發(fā)布時(shí)間:2021-11-01 10:35:46 來源:億速云 閱讀:163 作者:柒染 欄目:系統(tǒng)運(yùn)維

這篇文章給大家介紹DevOps中閱讀源代碼的實(shí)用技巧有哪些,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

一、準(zhǔn)備階段

1.制定計(jì)劃

讀源碼和讀書一樣,必須有時(shí)間計(jì)劃,deadline是***生產(chǎn)力。

合理的制定計(jì)劃可能需要你先全局掌握一下代碼的結(jié)構(gòu),以及各個(gè)函數(shù)的重要程度、難易程度。

2.選擇一本好書

作為學(xué)習(xí)資料,書一定是***的。

  • 網(wǎng)上資料太零散,學(xué)習(xí)起來可能不系統(tǒng);

  • 較為系統(tǒng)的書一般都會(huì)將開源代碼的配置、集成進(jìn)行詳細(xì)的講解;然后會(huì)介紹一些通用模塊,***再對(duì)每一個(gè)組件或者流程進(jìn)行代碼的跟蹤分析。

在選書的時(shí)候,也應(yīng)該注意選擇。

  • 可以通過書的各個(gè)章節(jié)介紹,來看該書是否按照這樣的邏輯去講述。

例如,筆者當(dāng)初學(xué)習(xí)openstack的時(shí)候,根據(jù)目錄選擇了這樣一本書:他的四個(gè)篇幅分別是基礎(chǔ)-安裝-代碼-二次開發(fā)。這就是一個(gè)非常好的循序漸進(jìn)的書。

3.選擇一個(gè)好的IDE

筆者除了Java以外,全部使用Vim。當(dāng)然,這完全取決于每一個(gè)人的習(xí)慣。

筆者一般比較喜歡輕量級(jí)的IDE,因此推薦一些輕量級(jí)的:

  • Vim

  • Sublime

  • SourceInsight

IDE的全稱是集成開發(fā)環(huán)境。如果只是要將代碼運(yùn)行起來,只需要編譯器或者解釋器。代碼完全可以在純文本上進(jìn)行編輯。

IDE提供更多的開發(fā)輔助功能,使得開發(fā)人員專注于代碼的邏輯。

最常見的如自動(dòng)糾錯(cuò)、代碼補(bǔ)全、函數(shù)查詢等功能。C的很多IDE還自動(dòng)生成makefile,也省去很大的繁瑣內(nèi)容。

不過,IDE的功能性和簡約型永遠(yuǎn)是一個(gè)悖論。

讀者在選擇IDE的時(shí)候,應(yīng)當(dāng)選擇一個(gè)符合自己需求的IDE,不要過分追求功能強(qiáng)大。

一般來說,我們使用IDE可能有哪些輔助性的需求呢:

  • 測(cè)試工具的集成

  • 自動(dòng)打包

  • 代碼定位

  • 定制化、插件豐富

  • 錯(cuò)誤檢查

  • 調(diào)試

  • 項(xiàng)目模板

4.下載完整版本庫

完整的代碼庫是指反映代碼迭代過程的各個(gè)歷史版本。這樣做有很多好處:

  • 你可以獲取代碼的修改記錄。

  • 你還可以獲取到完整的測(cè)試代碼,當(dāng)你要提交patch的時(shí)候,你可以借助版本管理工具生成針對(duì)不同版本的patch。

二、初識(shí)代碼

1.閱讀項(xiàng)目文檔

大部分的開源項(xiàng)目都會(huì)對(duì)其架構(gòu)有一定的描述,通讀一下會(huì)讓你項(xiàng)目有一個(gè)比較深入的認(rèn)識(shí)。

重點(diǎn)關(guān)注類似Getting started、Example之類的文檔,從中學(xué)習(xí)如何下載、安裝、使用該項(xiàng)目所需要的知識(shí)。

比如openstack,官網(wǎng)上的網(wǎng)絡(luò)拓?fù)渲v解是最全面、準(zhǔn)確的:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

2.分類文件

分清楚代碼庫的各個(gè)文件的作用。

在恰當(dāng)?shù)臅r(shí)候,對(duì)所有文件做一個(gè)總體把握,有助于后續(xù)閱讀代碼的時(shí)候的優(yōu)先級(jí)的選擇。清楚哪些是核心、哪些是可以定制的。

如下是筆者收藏的nova的源碼文件的部分內(nèi)容:

/nova/api/auth.py:通用身份驗(yàn)證的中間件,訪問keystone;

/nova/api/manager.py:Metadata管理初始化;

/nova/api/ec2/__init__.py:Amazon EC2 API綁定,路由EC2請(qǐng)求的起點(diǎn);

/nova/api/ec2/apirequest.py:APIRequest類;

/nova/api/metadata/__init__.py:Nova元數(shù)據(jù)服務(wù);

。。。

。。。

剛開始寫注釋的時(shí)候,其實(shí)有的東西自己也不是很確定。這樣的注釋也沒有最終能讓你對(duì)代碼的所有文件的關(guān)系有非常清晰的了解。

不過不要緊,在初期的時(shí)候就嘗試去做這樣的事情是有好處的,這可能是你掌握源碼整體結(jié)構(gòu)的***步。

3.掌握開發(fā)框架

框架存在的目的就是簡化開發(fā)。但是也會(huì)讓代碼不那么直觀。

舉個(gè)例子,很多用spring開發(fā)的開源軟件,如果你連spring都不懂,你就會(huì)發(fā)現(xiàn)連代碼入口都找不到。因?yàn)樵陂_發(fā)框架下的代碼都被“劫持”啦!

我們舉個(gè)例子,spring+springmvc+mybatis開發(fā)web應(yīng)用的時(shí)候。如果理解了這三個(gè)基礎(chǔ)框架,你就可以很清楚的知道如下文件的作用:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

  • 所有的url對(duì)應(yīng)的controller都在com.dc.controller中

  • 所有的數(shù)據(jù)接口都在com.dc.dao中

  • 所有的實(shí)體對(duì)象都在com.dc.entity中

  • 所有數(shù)據(jù)接口和sql語句對(duì)應(yīng)關(guān)系都在com.dc.dao.mapper中

  • 所有的服務(wù)定義都在com.dc.service和com.dc.service.Impl中

更具體的,當(dāng)我看到這樣一個(gè)函數(shù):

DevOps中閱讀源代碼的實(shí)用技巧有哪些

馬上就知道是spring中的一個(gè)處理url路徑時(shí)/的controller函數(shù)。

所以,如果確信開源代碼使用了成熟的開發(fā)框架,請(qǐng)一定先熟悉該框架。

三、熟悉代碼行為

1. 組件執(zhí)行流程

較為復(fù)雜的系統(tǒng)都是分組件的,分別熟悉各個(gè)組件,理清他們之間的關(guān)系。

例如,openstack的執(zhí)行流程圖:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

虛擬機(jī)啟動(dòng)過程如下:

a. 界面或命令行通過RESTful API向keystone獲取認(rèn)證信息。

b. keystone通過用戶請(qǐng)求認(rèn)證信息,并生成auth-token返回給對(duì)應(yīng)的認(rèn)證請(qǐng)求。

c. 界面或命令行通過RESTful API向nova-api發(fā)送一個(gè)boot instance的請(qǐng)求(攜帶auth-token)。

d. nova-api接受請(qǐng)求后向keystone發(fā)送認(rèn)證請(qǐng)求,查看token是否為有效用戶和token。

2. 利用示例代碼和單元測(cè)試

示例代碼可以幫助你學(xué)會(huì)使用相關(guān)開源項(xiàng)目的API。

大部分的開源項(xiàng)目在開發(fā)的過程中,為了驗(yàn)證其實(shí)現(xiàn)的功能,都會(huì)寫很多單元測(cè)試代碼。這些代碼其實(shí)是非常好的示例代碼。

讀單元測(cè)試的好處太多了,這里給大家羅列一下知乎網(wǎng)友總結(jié)出來的好處:

  • 由于一個(gè)單元測(cè)試一般也就是幾個(gè)小時(shí)的開發(fā)工作量,你很容易就能讀懂相關(guān)的代碼。

  • 每個(gè)單元測(cè)試都是可以獨(dú)立運(yùn)行的,這樣節(jié)省你跟蹤調(diào)試的時(shí)間。

  • 單元測(cè)試在很大程度定義了軟件的功能,可以幫助你快速掌握項(xiàng)目的相關(guān)API。

  • 如果你修改的開源項(xiàng)目的代碼,你可以通過修改單元測(cè)試來驗(yàn)證你的修改是否正確。

注1:原文鏈接  https://www.zhihu.com/question/19637879/answer/13545260

如果該項(xiàng)目有提供現(xiàn)成的example工程:

  • 首先嘗試按照開始文檔的介紹運(yùn)行example,如果運(yùn)行順利,那么恭喜你順利開了個(gè)好頭;如果遇到問題,首先嘗試在項(xiàng)目的FAQ等文檔里查找答案。

  • 再次,可以將問題(例如異常信息)當(dāng)成關(guān)鍵詞去搜索,查找相關(guān)的解決辦法,你遇到了,別人一般也會(huì)遇到,熱心的朋友會(huì)記錄下解決的過程。

  • ***,可以將問題提交到項(xiàng)目的郵件列表,請(qǐng)大家?guī)湍憧纯?。在沒有成功運(yùn)行example之前,不要嘗試修改example。

運(yùn)行了***個(gè)example之后,嘗試根據(jù)你的理解和需要修改example,測(cè)試高級(jí)功能等。

3. 跟蹤分析

復(fù)雜的開源軟件幾乎沒有一個(gè)是一個(gè)流程走到底的,這個(gè)時(shí)候就需要我們選擇一個(gè)主要流程。

例如,在openstack中,筆者一開始就畫了大量功夫去梳理創(chuàng)建虛擬機(jī)的流程。

***步,從代碼入口處沿著創(chuàng)建虛擬機(jī)這條流程進(jìn)行一行一行的注釋:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

當(dāng)該流程基本注釋完成,自己也有所掌握后,抽絲剝繭,總結(jié)出更為直觀、簡介的表現(xiàn)方式:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

當(dāng)你逐漸理解了一個(gè)或者兩個(gè)主要流程后,一般會(huì)發(fā)現(xiàn)其他的分支流程都十分類似。這就為掌握整個(gè)流程打下了很好的基礎(chǔ)。

4. 對(duì)需要詳細(xì)了解的函數(shù)進(jìn)行排序

在安排自己深入閱讀時(shí),應(yīng)該根據(jù)預(yù)估的工作量進(jìn)行合理安排。

一般來說,初始化、讀取參數(shù)等都是次要的,也是相對(duì)簡單的。而核心模塊就復(fù)雜的多。

還是以haproxy為例,main函數(shù)中最核心的代碼就是run_poll_loop()。

筆者曾經(jīng)嘗試從init()函數(shù)開始,但是發(fā)現(xiàn)很多初始化的數(shù)據(jù)壓根就不知道干什么,看過一遍后就都什么都記不得了。

但是直接從主函數(shù)開始,不斷的發(fā)現(xiàn)對(duì)一些參數(shù)進(jìn)行處理的時(shí)候,反向追蹤他的初始化過程,則更容易理解。

四、掌握數(shù)據(jù)狀態(tài)

1. 掌握數(shù)據(jù)流

從數(shù)據(jù)流的角度來講,所有的代碼邏輯都是在加工數(shù)據(jù)。

比如說openstack,從最初用戶輸入的虛擬機(jī)名稱、配置等數(shù)據(jù)開始,openstack的代碼邏輯對(duì)數(shù)據(jù)進(jìn)行加工、處理、過濾、選擇等內(nèi)容,最終傳遞給libvirt,進(jìn)行虛擬機(jī)的***創(chuàng)建。

因此,掌握數(shù)據(jù)的組織方式,對(duì)理解代碼邏輯是很有幫助的,也是二次開發(fā)的前提條件。

所以,在學(xué)習(xí)代碼的時(shí)候,不斷詢問自己,我掌握數(shù)據(jù)的組織方式了嗎?我掌握數(shù)據(jù)在整個(gè)流程中不斷加工的流程了嗎?

2. 使用debug觀察數(shù)據(jù)狀態(tài)

前面說到細(xì)化研究某一個(gè)流程的時(shí)候,一定要注意研究數(shù)據(jù)傳遞的方式和內(nèi)容。數(shù)據(jù)流是理解流程的基礎(chǔ),擴(kuò)展數(shù)據(jù)流也是二次開發(fā)常用的技能。

例如,在eclipse通過debug打斷點(diǎn),獲取流程中某個(gè)點(diǎn)的數(shù)據(jù)內(nèi)容:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

3. 使用標(biāo)準(zhǔn)輸出觀察數(shù)據(jù)狀態(tài)

筆者有時(shí)候也喜歡直接使用console進(jìn)行輸出,打印對(duì)象的一些信息。這個(gè)用于驗(yàn)證某段代碼有沒有被執(zhí)行、或者查看某個(gè)數(shù)據(jù)的時(shí)候,也十分有效。

例如,通過chrome的標(biāo)準(zhǔn)輸出查看javascript的輸出:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

五、舉一反三階段

1.研究底層調(diào)用

研究底層調(diào)用往往是運(yùn)維的常用手段。比如在openstack的運(yùn)行初期,我們對(duì)openstack的源碼不熟悉,怎么辦呢?

直接研究openstack的底層調(diào)用。Openstack底層都是調(diào)用libvirt的接口,創(chuàng)建虛擬機(jī)等基本操作我們都研究了個(gè)遍。

因此,對(duì)于大多數(shù)openstack的問題,我們都能直擊問題現(xiàn)場,進(jìn)行恢復(fù)和排查。

那研究底層調(diào)用對(duì)理解源代碼有什么好處呢?

筆者在基本熟悉了openstack的所有底層調(diào)用之后,帶著這樣的問題去看源碼“代碼究竟是如何從入口逐漸運(yùn)行到我所知道的那個(gè)底層調(diào)用的呢?”,筆者很快就梳理了代碼的執(zhí)行流程。

2. 學(xué)會(huì)在社區(qū)或者stackoverflow提問題

社區(qū)里面的熱心人是相當(dāng)多的。

當(dāng)然筆者認(rèn)為,提問也需要一定的技巧,這里引用知乎網(wǎng)友的話:

stackoverflow很多人問問題有一個(gè)共性,就是對(duì)提出的問題先發(fā)表自己的見解,描述自己的思路,自己達(dá)到了什么地方,這是對(duì)各位回答者的尊重。

你在闡述自己所能達(dá)到的地步,你表明了你已經(jīng)做出了什么樣的努力,這是你對(duì)問題的誠意。

這樣回答者才會(huì)覺得有回答的價(jià)值,或許是想起自己過去也曾經(jīng)小白卻努力的歲月,或許是覺得你有相助的價(jià)值,或者等等。所謂自助者人助罷了。

原文鏈接:http://www.zhihu.com/question/24228283/answer/27102646

3. 學(xué)會(huì)畫流程圖

流程圖可以更方便的展現(xiàn)代碼執(zhí)行的邏輯。忽略不重要的代碼,強(qiáng)調(diào)主要的函數(shù)。

概要設(shè)計(jì)中常用的框圖:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

思維導(dǎo)圖:

DevOps中閱讀源代碼的實(shí)用技巧有哪些

關(guān)于DevOps中閱讀源代碼的實(shí)用技巧有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI