您好,登錄后才能下訂單哦!
這篇文章給大家介紹DevOps中閱讀源代碼的實用技巧有哪些,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
一、準備階段
1.制定計劃
讀源碼和讀書一樣,必須有時間計劃,deadline是***生產力。
合理的制定計劃可能需要你先全局掌握一下代碼的結構,以及各個函數的重要程度、難易程度。
2.選擇一本好書
作為學習資料,書一定是***的。
網上資料太零散,學習起來可能不系統;
較為系統的書一般都會將開源代碼的配置、集成進行詳細的講解;然后會介紹一些通用模塊,***再對每一個組件或者流程進行代碼的跟蹤分析。
在選書的時候,也應該注意選擇。
可以通過書的各個章節介紹,來看該書是否按照這樣的邏輯去講述。
例如,筆者當初學習openstack的時候,根據目錄選擇了這樣一本書:他的四個篇幅分別是基礎-安裝-代碼-二次開發。這就是一個非常好的循序漸進的書。
3.選擇一個好的IDE
筆者除了Java以外,全部使用Vim。當然,這完全取決于每一個人的習慣。
筆者一般比較喜歡輕量級的IDE,因此推薦一些輕量級的:
Vim
Sublime
SourceInsight
IDE的全稱是集成開發環境。如果只是要將代碼運行起來,只需要編譯器或者解釋器。代碼完全可以在純文本上進行編輯。
IDE提供更多的開發輔助功能,使得開發人員專注于代碼的邏輯。
最常見的如自動糾錯、代碼補全、函數查詢等功能。C的很多IDE還自動生成makefile,也省去很大的繁瑣內容。
不過,IDE的功能性和簡約型永遠是一個悖論。
讀者在選擇IDE的時候,應當選擇一個符合自己需求的IDE,不要過分追求功能強大。
一般來說,我們使用IDE可能有哪些輔助性的需求呢:
測試工具的集成
自動打包
代碼定位
定制化、插件豐富
錯誤檢查
調試
項目模板
4.下載完整版本庫
完整的代碼庫是指反映代碼迭代過程的各個歷史版本。這樣做有很多好處:
你可以獲取代碼的修改記錄。
你還可以獲取到完整的測試代碼,當你要提交patch的時候,你可以借助版本管理工具生成針對不同版本的patch。
二、初識代碼
1.閱讀項目文檔
大部分的開源項目都會對其架構有一定的描述,通讀一下會讓你項目有一個比較深入的認識。
重點關注類似Getting started、Example之類的文檔,從中學習如何下載、安裝、使用該項目所需要的知識。
比如openstack,官網上的網絡拓撲講解是最全面、準確的:
2.分類文件
分清楚代碼庫的各個文件的作用。
在恰當的時候,對所有文件做一個總體把握,有助于后續閱讀代碼的時候的優先級的選擇。清楚哪些是核心、哪些是可以定制的。
如下是筆者收藏的nova的源碼文件的部分內容:
/nova/api/auth.py:通用身份驗證的中間件,訪問keystone;
/nova/api/manager.py:Metadata管理初始化;
/nova/api/ec2/__init__.py:Amazon EC2 API綁定,路由EC2請求的起點;
/nova/api/ec2/apirequest.py:APIRequest類;
/nova/api/metadata/__init__.py:Nova元數據服務;
。。。
。。。
剛開始寫注釋的時候,其實有的東西自己也不是很確定。這樣的注釋也沒有最終能讓你對代碼的所有文件的關系有非常清晰的了解。
不過不要緊,在初期的時候就嘗試去做這樣的事情是有好處的,這可能是你掌握源碼整體結構的***步。
3.掌握開發框架
框架存在的目的就是簡化開發。但是也會讓代碼不那么直觀。
舉個例子,很多用spring開發的開源軟件,如果你連spring都不懂,你就會發現連代碼入口都找不到。因為在開發框架下的代碼都被“劫持”啦!
我們舉個例子,spring+springmvc+mybatis開發web應用的時候。如果理解了這三個基礎框架,你就可以很清楚的知道如下文件的作用:
所有的url對應的controller都在com.dc.controller中
所有的數據接口都在com.dc.dao中
所有的實體對象都在com.dc.entity中
所有數據接口和sql語句對應關系都在com.dc.dao.mapper中
所有的服務定義都在com.dc.service和com.dc.service.Impl中
更具體的,當我看到這樣一個函數:
馬上就知道是spring中的一個處理url路徑時/的controller函數。
所以,如果確信開源代碼使用了成熟的開發框架,請一定先熟悉該框架。
三、熟悉代碼行為
1. 組件執行流程
較為復雜的系統都是分組件的,分別熟悉各個組件,理清他們之間的關系。
例如,openstack的執行流程圖:
虛擬機啟動過程如下:
a. 界面或命令行通過RESTful API向keystone獲取認證信息。
b. keystone通過用戶請求認證信息,并生成auth-token返回給對應的認證請求。
c. 界面或命令行通過RESTful API向nova-api發送一個boot instance的請求(攜帶auth-token)。
d. nova-api接受請求后向keystone發送認證請求,查看token是否為有效用戶和token。
2. 利用示例代碼和單元測試
示例代碼可以幫助你學會使用相關開源項目的API。
大部分的開源項目在開發的過程中,為了驗證其實現的功能,都會寫很多單元測試代碼。這些代碼其實是非常好的示例代碼。
讀單元測試的好處太多了,這里給大家羅列一下知乎網友總結出來的好處:
由于一個單元測試一般也就是幾個小時的開發工作量,你很容易就能讀懂相關的代碼。
每個單元測試都是可以獨立運行的,這樣節省你跟蹤調試的時間。
單元測試在很大程度定義了軟件的功能,可以幫助你快速掌握項目的相關API。
如果你修改的開源項目的代碼,你可以通過修改單元測試來驗證你的修改是否正確。
注1:原文鏈接 https://www.zhihu.com/question/19637879/answer/13545260
如果該項目有提供現成的example工程:
首先嘗試按照開始文檔的介紹運行example,如果運行順利,那么恭喜你順利開了個好頭;如果遇到問題,首先嘗試在項目的FAQ等文檔里查找答案。
再次,可以將問題(例如異常信息)當成關鍵詞去搜索,查找相關的解決辦法,你遇到了,別人一般也會遇到,熱心的朋友會記錄下解決的過程。
***,可以將問題提交到項目的郵件列表,請大家幫你看看。在沒有成功運行example之前,不要嘗試修改example。
運行了***個example之后,嘗試根據你的理解和需要修改example,測試高級功能等。
3. 跟蹤分析
復雜的開源軟件幾乎沒有一個是一個流程走到底的,這個時候就需要我們選擇一個主要流程。
例如,在openstack中,筆者一開始就畫了大量功夫去梳理創建虛擬機的流程。
***步,從代碼入口處沿著創建虛擬機這條流程進行一行一行的注釋:
當該流程基本注釋完成,自己也有所掌握后,抽絲剝繭,總結出更為直觀、簡介的表現方式:
當你逐漸理解了一個或者兩個主要流程后,一般會發現其他的分支流程都十分類似。這就為掌握整個流程打下了很好的基礎。
4. 對需要詳細了解的函數進行排序
在安排自己深入閱讀時,應該根據預估的工作量進行合理安排。
一般來說,初始化、讀取參數等都是次要的,也是相對簡單的。而核心模塊就復雜的多。
還是以haproxy為例,main函數中最核心的代碼就是run_poll_loop()。
筆者曾經嘗試從init()函數開始,但是發現很多初始化的數據壓根就不知道干什么,看過一遍后就都什么都記不得了。
但是直接從主函數開始,不斷的發現對一些參數進行處理的時候,反向追蹤他的初始化過程,則更容易理解。
四、掌握數據狀態
1. 掌握數據流
從數據流的角度來講,所有的代碼邏輯都是在加工數據。
比如說openstack,從最初用戶輸入的虛擬機名稱、配置等數據開始,openstack的代碼邏輯對數據進行加工、處理、過濾、選擇等內容,最終傳遞給libvirt,進行虛擬機的***創建。
因此,掌握數據的組織方式,對理解代碼邏輯是很有幫助的,也是二次開發的前提條件。
所以,在學習代碼的時候,不斷詢問自己,我掌握數據的組織方式了嗎?我掌握數據在整個流程中不斷加工的流程了嗎?
2. 使用debug觀察數據狀態
前面說到細化研究某一個流程的時候,一定要注意研究數據傳遞的方式和內容。數據流是理解流程的基礎,擴展數據流也是二次開發常用的技能。
例如,在eclipse通過debug打斷點,獲取流程中某個點的數據內容:
3. 使用標準輸出觀察數據狀態
筆者有時候也喜歡直接使用console進行輸出,打印對象的一些信息。這個用于驗證某段代碼有沒有被執行、或者查看某個數據的時候,也十分有效。
例如,通過chrome的標準輸出查看javascript的輸出:
五、舉一反三階段
1.研究底層調用
研究底層調用往往是運維的常用手段。比如在openstack的運行初期,我們對openstack的源碼不熟悉,怎么辦呢?
直接研究openstack的底層調用。Openstack底層都是調用libvirt的接口,創建虛擬機等基本操作我們都研究了個遍。
因此,對于大多數openstack的問題,我們都能直擊問題現場,進行恢復和排查。
那研究底層調用對理解源代碼有什么好處呢?
筆者在基本熟悉了openstack的所有底層調用之后,帶著這樣的問題去看源碼“代碼究竟是如何從入口逐漸運行到我所知道的那個底層調用的呢?”,筆者很快就梳理了代碼的執行流程。
2. 學會在社區或者stackoverflow提問題
社區里面的熱心人是相當多的。
當然筆者認為,提問也需要一定的技巧,這里引用知乎網友的話:
stackoverflow很多人問問題有一個共性,就是對提出的問題先發表自己的見解,描述自己的思路,自己達到了什么地方,這是對各位回答者的尊重。
你在闡述自己所能達到的地步,你表明了你已經做出了什么樣的努力,這是你對問題的誠意。
這樣回答者才會覺得有回答的價值,或許是想起自己過去也曾經小白卻努力的歲月,或許是覺得你有相助的價值,或者等等。所謂自助者人助罷了。
原文鏈接:http://www.zhihu.com/question/24228283/answer/27102646
3. 學會畫流程圖
流程圖可以更方便的展現代碼執行的邏輯。忽略不重要的代碼,強調主要的函數。
概要設計中常用的框圖:
思維導圖:
關于DevOps中閱讀源代碼的實用技巧有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。