成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DevOps之旅:運維人員閱讀源代碼的實用技巧

運維 系統運維 系統
陳晨,基礎架構工程師,目前就職于中國銀聯。主要負責IaaS平臺、容器平臺以及運維管理平臺的建設工作。本文將著重介紹運維人員學習源代碼的一些技巧。

作者簡介

[[167767]]

陳晨,基礎架構工程師,目前就職于中國銀聯。主要負責IaaS平臺、容器平臺以及運維管理平臺的建設工作。本文將著重介紹運維人員學習源代碼的一些技巧。

一、準備階段

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. 學會畫流程圖

流程圖可以更方便的展現代碼執行的邏輯。忽略不重要的代碼,強調主要的函數。

概要設計中常用的框圖:

 

思維導圖:

 

責任編輯:武曉燕 來源: 高效運維
相關推薦

2020-12-01 09:26:11

Linux 系統 運維

2020-08-21 10:45:47

Linux命令文件

2021-02-20 09:12:04

Linux技巧命令

2009-09-04 10:27:28

Linux實用技巧linux操作系統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性能優化

2011-04-08 15:40:01

Oracle認證

2022-11-03 10:28:59

PandasSAC機制

2022-10-11 08:00:47

多線程開發技巧

2024-05-17 08:52:43

SQL實用技巧行列轉換

2023-11-28 12:07:06

Python代碼

2024-03-27 14:06:58

Python代碼開發

2013-03-29 09:15:08

IT運維運維人員運維工程師

2022-05-30 09:01:13

CSS技巧前端

2019-12-22 23:10:19

LinuxSSH加密

2009-12-09 11:21:30

Linux實用技巧

2019-11-25 10:12:59

Python技巧工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩高清一区 | 毛片久久久 | 国产精品五月天 | 亚洲网站观看 | 视频一区 亚洲 | 免费观看的av | 国产精品久久久久久久久久久久 | 成人影音| 颜色网站在线观看 | 亚洲成人久久久 | 亚洲国产一区二区三区 | 看特级黄色片 | 国产精品久久久久久久久久久新郎 | 91久操视频 | 天天人人精品 | 国产乱码精品一区二三赶尸艳谈 | 亚洲综合在线一区 | 欧美精品中文 | av影音资源| 国产成人午夜高潮毛片 | 亚洲一区二区三区四区五区午夜 | 81精品国产乱码久久久久久 | 亚洲免费精品 | 日韩美香港a一级毛片免费 国产综合av | 国产欧美日韩综合精品一 | 亚洲小视频在线播放 | 久久香焦| 欧美一区二区三区的 | 91夜夜夜 | 91免费电影 | 一级黄色在线 | 久久国产精品一区二区三区 | 免费一区二区在线观看 | 精品久久久久久久久久久久久久 | 狠狠操狠狠色 | 亚洲一区二区日韩 | 97伦理电影 | 成人欧美一区二区三区黑人孕妇 | 五月天婷婷狠狠 | av电影手机版 | 国产一区二区三区 |