久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

DevOps中閱讀源代碼的實用技巧有哪些

151次閱讀
沒有評論

共計 4328 個字符,預計需要花費 11 分鐘才能閱讀完成。

這篇文章給大家介紹 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 中閱讀源代碼的實用技巧有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計4328字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 密山市| 双鸭山市| 溧阳市| 土默特右旗| 高邮市| 含山县| 濮阳县| 垫江县| 丹寨县| 新兴县| 新昌县| 花莲市| 隆昌县| 鄂伦春自治旗| 凤山市| 翁源县| 化隆| 开江县| 汽车| 凤城市| 定安县| 略阳县| 乾安县| 体育| 平泉县| 苏州市| 洞头县| 南京市| 建德市| 奉贤区| 朔州市| 天镇县| 大荔县| 苗栗市| 岗巴县| 高密市| 响水县| 措勤县| 栾川县| 桦甸市| 三穗县|