如何學習源碼?阿里架構師教你一招攻破源碼難關

如何學習源碼?阿里架構師教你一招攻破源碼難關

最新互聯網大廠面試真題、Java程序員面試策略(面試前的準備、面試中的技巧)請移步GitHub

對於不少開源軟件來講,若是咱們把它做爲咱們業務系統的重要組成部分之一,真正地用於生產,僅僅知道如何使用是遠遠不夠的,你必須掌握它的實現原理和不少細節,這樣才能找到最佳的使用姿式,當你的系統出現問題時,你纔有可能基於它的實現原理,再根據一些現象來排查問題緣由。git

掌握這些開源軟件的最佳方式就是去學習它的源代碼。不少同窗跟我說:「我也很想去看一些開源軟件的代碼,也嘗試去看過,可是面對上千個源碼文件,幾十萬行代碼,徹底不知道從哪兒入手啊。」程序員

今天咱們就針對這個狀況來聊一聊,學習開源軟件的代碼該如何入手。github

有一點我提早說明一下,對於這節課裏面涉及到的一些名詞,我會直接使用英文,主要目的是方便你直接對應到那些開源軟件英文官網上的標題。面試

1、經過文檔來了解開源項目

學習源代碼應該從哪兒入手呢?最佳的方式就是先看它的文檔架構

經過看文檔,你能夠快速地掌握這個軟件總體的結構,它有哪些功能特性,它涉及到的關鍵技術、實現原理和它的生態系統等等。在掌握了這些以後,你對它有個總體的瞭解,而後再去看它的源代碼,就不會再有那種盲人摸象找不到頭緒的感受了。ide

首先強調一點是,你必須去看這些開源軟件官方網站上的文檔,儘可能不要去網上搜一些翻譯的中文文檔。爲何呢?學習

由於這些開源軟件,特別是一些社區活躍的軟件,它的迭代是很快的,即便是自帶官方中文翻譯的項目,它的中文文檔不少都會落後於英文版,你能看到的中文版本不少時候都已通過時了。那非官方的翻譯,問題可能就不止是過期的問題了,可能還會出現一些錯漏的地方。因此,最好仍是直接來看官方的英文文檔。網站

若是說你的英文閱讀水平確實有限,直接閱讀英文文檔有困難或者看得很是慢,怎麼辦?你仍是要按照我接下來告訴你的方法去看它的英文官網,即便閱讀大段的技術文章有困難,網站的標題你總能看懂吧?找到你須要閱讀的文章後,你能夠在網上搜一下對應的中文版本,先看一遍中文版,而後再對着英文原版過一遍,彌補中文版可能過期或翻譯不許確的問題。ui

開源社區通過這麼多年的發展,它已經造成一個相對比較成熟的文化。每一個開源軟件,代碼如何管理、社區成員如何溝通、如何協做這些都已經造成了一個比較固定的套路。大多數開源軟件,它的官網和技術文檔也是有一個相對比較固定的結構的。翻譯

接下來咱們以Kafka 的官網爲例子,來講下怎麼來看它的文檔。

若是說你對這個項目徹底不瞭解,沒用過這個軟件,你首先須要看的文檔是Quick Start,按照 Quick Start 中的指導快速把它的環境搭起來,把它運行起來,這樣你會對這個項目有個感性認識,也便於你在後續深刻學習的時候「跑」一些例子。

而後你須要找一下它的Introduction,通常裏面會有項目的基本介紹。這裏面很重要的一點是,你須要找到這個項目用到的一些基本概念或者名詞的介紹文檔,在 Kafka 的文檔中,

這些內容就在 Introduction 裏面,好比 Topic、Producer、 Consumer、Partition 這些概念在 Kafka 中表明的含義。

有些開源項目會單獨有一個 Basic Concepts 文檔來說這些基礎概念。這個文檔很是重要,由於這些開源社區的開發者都有個很很差的愛好:發明概念。不少開源項目都會本身創造一些名詞或者概念,瞭解這些基本概念纔有可能看懂它項目的其餘文檔。

對項目有個基本的瞭解以後呢,接下來你能夠看一下它的使用場景、功能特性以及相關的生態系統的介紹。在 Kafka 中功能相關的內容在Use cases和EcoSystem兩篇文章中,有些項目中會有相似名爲 Features 的文檔介紹功能和特性。

其中項目的生態系統,也就是 EcoSystem,通常會介紹它這個項目適用的一些典型的使用場景,在某個場景下適合與哪些其餘的系統一塊兒來配合使用等。若是說你的系統不是特別特殊或者說冷門的話,你大機率能夠在 EcoSystem 裏面找到和你相似的場景,能夠少走不少的彎路。

你在讀完上面這些文檔以後,對這個項目的總體應該會有一個比較全面的瞭解了,好比說:

  • 這個項目是幹什麼的?
  • 能解決哪些問題?
  • 適合在哪些場景使用?
  • 有哪些功能?
  • 如何使用?

對這些問題有一個初步的答案以後,接下來你就能夠去深刻學習它的實現原理了。這是否是意味着,你能夠當即去看它的源碼呢?這樣作或許可行,但並非最好的方法。

你知道大部分開源項目都是怎麼誕生的嗎?通常來講是這樣的:某個大學或者大廠的科學家,某天腦海裏忽然出現了一個改變世界的想法,科學家們會基於這個想法作一些深刻的研究,而後寫了一篇論文在某個學術期刊或者會議上發表。論文發表後在業內得到不少的贊,這時候就輪到像 Google、Facebook 這樣的大廠出手了:這個論文頗有價值,不如咱們把它實現出來吧?一個開源項目就這樣誕生了。

因此,對於這樣的開源項目,它背後的這篇論文就是整個項目的靈魂,你若是能把這篇論文看完而且理解透了,這個項目的實現原理也就清楚了。

學習完項目靈魂,就能夠開始閱讀源碼了。

2、用以點帶面的方式來閱讀源碼

須要注意的是,你在讀源碼的時候,千萬不要上來就找 main 方法這樣泛泛地去看,爲何?你能夠想一下,一篇文章,它是一個線性結構,你從前日後讀就好了。一本書呢?若是咱們看目錄的話,能夠認爲是個樹狀結構,但大多數的書的內容仍是按照線性結構來組織的,你能夠從前日後讀,也能夠經過目錄跳着讀。

那程序的源代碼是什麼結構?那是一個網狀結構,關係錯綜複雜,因此這種結構是很是不適合人類去閱讀的。你若是是泛泛去讀源代碼,很容易迷失在這個代碼織成的網裏面。那怎麼辦?
我推薦你們閱讀源碼的方式是,帶着問題去讀源碼,最好是帶着問題的答案去讀源碼。你每次讀源碼以前,肯定一個具體的問題,好比:

  • RocketMQ 的消息是怎麼寫到文件裏的?
  • Kafka 的 Coordinator 是怎麼維護消費位置的?

相似這種很是細粒度的問題,粒度細到每一個問題的答案就是一兩個流程就能夠回答,這樣就能夠了。若是說你就想學習一下源代碼,或者說提不出這些問題怎麼辦呢?答案仍是,看文檔

肯定問題後,先不要着急看源代碼,而是應該先找一下是否有對應的實現文檔,通常來講,核心功能都會有專門的文檔來講明它的實現原理,好比在 Kafka 的文檔中,DESIGN和IMPLEMENTATION兩個章節中,介紹了 Kafka 不少功能的實現原理和細節。一些更細節的非核心的功能不必定有專門的文檔來講明,可是咱們能夠去找一找是否有對應的Improvement Proposal。(Kafka 的全部 Improvement Proposals 在這裏。)

這個 Improvement Proposal 是什麼呢?你能夠認爲它是描述一個新功能的文檔,通常開源項目須要增長一個新的功能或者特性的時候,都會建立一個 Improvement Proposal,通常標題都是"xIP- 新功能名稱",其中 IP 就是 Improvement Proposal 的縮寫,x 通常就是這個開源項目的名稱的首字母,好比 Kafka 中 Improvement Proposal 的標題就都是以KIP 來開頭。

每一個 Improvement Proposal 都是有固定格式的,通常要說明爲何須要增長這個功能,會對系統產生那些影響和改變,還有咱們最關心的設計和實現原理的簡述。

你讀完講解實現的文檔再去看源代碼,也就是我剛剛說的,不僅是帶着問題去讀,而是帶着答案去讀源碼。這樣你在讀源碼的時候,不只僅是更容易理解源代碼,還能夠把更多的精力放在一些實現細節上,這樣閱讀源碼的效果會更好。

使用這種以問題爲閱讀單元的方式來讀源代碼,你每次只要花很短的時間,閱讀不多的一部分源碼,就能解決一個問題,獲得一些收穫。這種方式實際上是經過一個一個的問題,在網狀的源代碼中,每次去讀幾個點組成的那一兩條線。隨着你經過閱讀源碼瞭解的問題愈來愈多,你對項目源碼的理解也會愈來愈全面和深刻。

3、總結

若是你想了解一個開源項目,學習它的代碼,最佳的切入點就是去讀它的官方文檔,這些文檔裏面,最重要的靈魂就是項目背後的那篇論文,它通常是這個開源項目的理論基礎。

在閱讀源碼的時候呢,最佳的方式是帶着問題去閱讀,最好是帶着問題的答案去讀,這樣難度低、週期短、收穫快。不要想着必定要從整體上去全面掌握一個項目的全部源代碼,也沒有必要。

相關文章
相關標籤/搜索