自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

DevOps之旅:運(yùn)維人員閱讀源代碼的實(shí)用技巧

運(yùn)維 系統(tǒng)運(yùn)維 系統(tǒng)
陳晨,基礎(chǔ)架構(gòu)工程師,目前就職于中國(guó)銀聯(lián)。主要負(fù)責(zé)IaaS平臺(tái)、容器平臺(tái)以及運(yùn)維管理平臺(tái)的建設(shè)工作。本文將著重介紹運(yùn)維人員學(xué)習(xí)源代碼的一些技巧。

作者簡(jiǎn)介

[[167767]]

陳晨,基礎(chǔ)架構(gòu)工程師,目前就職于中國(guó)銀聯(lián)。主要負(fù)責(zé)IaaS平臺(tái)、容器平臺(tái)以及運(yùn)維管理平臺(tái)的建設(shè)工作。本文將著重介紹運(yùn)維人員學(xué)習(xí)源代碼的一些技巧。

一、準(zhǔn)備階段

1.制定計(jì)劃

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

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

2.選擇一本好書

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

  • 網(wǎng)上資料太零散,學(xué)習(xí)起來(lái)可能不系統(tǒng);
  • 較為系統(tǒng)的書一般都會(huì)將開(kāi)源代碼的配置、集成進(jìn)行詳細(xì)的講解;然后會(huì)介紹一些通用模塊,***再對(duì)每一個(gè)組件或者流程進(jìn)行代碼的跟蹤分析。

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

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

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

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

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

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

  • Vim
  • Sublime
  • SourceInsight

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

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

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

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

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

一般來(lái)說(shuō),我們使用IDE可能有哪些輔助性的需求呢:

  • 測(cè)試工具的集成
  • 自動(dòng)打包
  • 代碼定位
  • 定制化、插件豐富
  • 錯(cuò)誤檢查
  • 調(diào)試
  • 項(xiàng)目模板

4.下載完整版本庫(kù)

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

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

二、初識(shí)代碼

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

大部分的開(kāi)源項(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)確的:

 

 

2.分類文件

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

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

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

/nova/api/auth.py:通用身份驗(yàn)證的中間件,訪問(wè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ù);

。。。

。。。

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

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

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

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

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

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

 

  • 所有的url對(duì)應(yīng)的controller都在com.dc.controller中
  • 所有的數(shù)據(jù)接口都在com.dc.dao中
  • 所有的實(shí)體對(duì)象都在com.dc.entity中
  • 所有數(shù)據(jù)接口和sql語(yǔ)句對(duì)應(yīng)關(guān)系都在com.dc.dao.mapper中
  • 所有的服務(wù)定義都在com.dc.service和com.dc.service.Impl中

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

 

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

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

三、熟悉代碼行為

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

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

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

 

 

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

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

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

c. 界面或命令行通過(guò)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)開(kāi)源項(xiàng)目的API。

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

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

  • 由于一個(gè)單元測(cè)試一般也就是幾個(gè)小時(shí)的開(kāi)發(fā)工作量,你很容易就能讀懂相關(guān)的代碼。
  • 每個(gè)單元測(cè)試都是可以獨(dú)立運(yùn)行的,這樣節(jié)省你跟蹤調(diào)試的時(shí)間。
  • 單元測(cè)試在很大程度定義了軟件的功能,可以幫助你快速掌握項(xiàng)目的相關(guān)API。
  • 如果你修改的開(kāi)源項(xiàng)目的代碼,你可以通過(guò)修改單元測(cè)試來(lái)驗(yàn)證你的修改是否正確。

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

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

  • 首先嘗試按照開(kāi)始文檔的介紹運(yùn)行example,如果運(yùn)行順利,那么恭喜你順利開(kāi)了個(gè)好頭;如果遇到問(wèn)題,首先嘗試在項(xiàng)目的FAQ等文檔里查找答案。
  • 再次,可以將問(wèn)題(例如異常信息)當(dāng)成關(guān)鍵詞去搜索,查找相關(guān)的解決辦法,你遇到了,別人一般也會(huì)遇到,熱心的朋友會(huì)記錄下解決的過(guò)程。
  • ***,可以將問(wèn)題提交到項(xiàng)目的郵件列表,請(qǐng)大家?guī)湍憧纯?。在沒(méi)有成功運(yùn)行example之前,不要嘗試修改example。

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

3. 跟蹤分析

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

 

五、舉一反三階段

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的問(wèn)題,我們都能直擊問(wèn)題現(xiàn)場(chǎng),進(jìn)行恢復(fù)和排查。

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

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

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

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

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

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

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

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

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

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

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

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

 

思維導(dǎo)圖:

 

責(zé)任編輯:武曉燕 來(lái)源: 高效運(yùn)維
相關(guān)推薦

2020-12-01 09:26:11

Linux 系統(tǒng) 運(yùn)維

2020-08-21 10:45:47

Linux命令文件

2021-02-20 09:12:04

Linux技巧命令

2009-09-04 10:27:28

Linux實(shí)用技巧linux操作系統(tǒng)linux

2022-03-23 09:18:10

Git技巧Linux

2009-12-21 15:50:39

2024-11-26 14:18:44

Python代碼技巧

2010-10-08 15:44:17

vim

2009-01-03 09:34:30

ASP.NET.NET性能優(yōu)化

2011-04-08 15:40:01

Oracle認(rèn)證

2022-10-11 08:00:47

多線程開(kāi)發(fā)技巧

2022-11-03 10:28:59

PandasSAC機(jī)制

2024-05-17 08:52:43

SQL實(shí)用技巧行列轉(zhuǎn)換

2024-03-27 14:06:58

Python代碼開(kāi)發(fā)

2023-11-28 12:07:06

Python代碼

2013-03-29 09:15:08

IT運(yùn)維運(yùn)維人員運(yùn)維工程師

2022-05-30 09:01:13

CSS技巧前端

2010-09-14 10:41:24

DIV+CSS排版

2009-12-09 11:21:30

Linux實(shí)用技巧

2019-11-25 10:12:59

Python技巧工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)