做為合格的程序員,要提高自己的編程技能,需要進(jìn)行各種努力來達(dá)到目標(biāo)。
一些程序員學(xué)習(xí)編程課程并獲得機(jī)構(gòu)認(rèn)證,還有一些程序員積極做實(shí)踐,比如創(chuàng)建自己喜歡的項(xiàng)目,為開源項(xiàng)目做貢獻(xiàn)等等。
而經(jīng)常瀏覽流行的開源項(xiàng)目,查看源代碼來學(xué)習(xí)軟件開發(fā)模式、工程實(shí)踐和架構(gòu)設(shè)計(jì),是一個(gè)良好的習(xí)慣。
程序員不僅僅是編碼——要參與設(shè)計(jì)、開發(fā)和維護(hù)軟件系統(tǒng)的整體生命周期。
因此,我們需要掌握軟件架構(gòu)、DevOps、解決問題能力,當(dāng)然還有編碼,才可能成為一名合格并成功的程序員。
高級(jí)開發(fā)者通常從自己的編程經(jīng)驗(yàn)中啟動(dòng)開源項(xiàng)目。這些開源項(xiàng)目經(jīng)常收到來自開發(fā)者社區(qū)的各種貢獻(xiàn),因此瀏覽流行的開源代碼存儲(chǔ)庫是一種很好的學(xué)習(xí)方式。
在本文中,我向大家展示幾個(gè)當(dāng)今流行的開源項(xiàng)目,并希望大家知道為什么要研究每個(gè)項(xiàng)目的源代碼。坦白說,這些項(xiàng)目幫助我提高了編程技能。也是有了這些項(xiàng)目,本人還發(fā)起了幾個(gè)流行的開源項(xiàng)目。
一起來看看。
Chromium — 構(gòu)建更廣泛的應(yīng)用程序
我們要開發(fā)具有不同復(fù)雜度的軟件系統(tǒng),還要面對軟件架構(gòu)設(shè)計(jì)的挑戰(zhàn)。而開發(fā)者應(yīng)該使用最佳架構(gòu)模式來構(gòu)建高質(zhì)量的軟件,不要增加不必要的復(fù)雜性。
想成為優(yōu)秀的程序員,掌握軟件架構(gòu)是必須能力。
根據(jù)Wikipedia上的數(shù)據(jù),Chromium 在 2020 年擁有大約 3500 萬行代碼 (LOC)。盡管它的代碼庫包含所有不同平臺(tái)的代碼,包括 Android、iOS 和 Fuchsia 代碼,但它的代碼庫組織良好。
例如,可以Chromium如何將特定于桌面 UI 的代碼分離到一個(gè)名為Chrome Views的可重復(fù)使用的最小框架里面。如下圖示:
Chrome Views 控制源碼結(jié)構(gòu)
Chromium 代碼庫僅實(shí)現(xiàn)瀏覽器應(yīng)用程序功能,查看 Blink 瀏覽器引擎代碼庫(WebKit 的一個(gè)分支)可以查看 Web API 實(shí)現(xiàn),查看 V8 源代碼能夠查看到 JavaScript 實(shí)現(xiàn)方式,查看 Skia 源代碼可以了解網(wǎng)頁的渲染過程。
Electron — 掌握 DevOps 技能
DevOps 原則幫助開發(fā)團(tuán)隊(duì)通過自動(dòng)化提升整個(gè)軟件開發(fā)生命周期 ( SDLC )。
幾乎所有軟件開發(fā)團(tuán)隊(duì)都在 DevOps 上投入大量精力,以便用高質(zhì)量的產(chǎn)品來保持軟件開發(fā)市場的競爭力。因此掌握 DevOps 并不僅限于 DevOps 工程師——程序員也還需要學(xué)習(xí) DevOps 的原理。
Electron 框架的代碼庫教了我們各種 DevOps 原則,并且可以在自己的開發(fā)項(xiàng)目中使用它們。例如看看它包含的結(jié)構(gòu)良好的測試套件來識(shí)別代碼中的缺陷:
Electron 測試套件中的一個(gè)測試用例
它的開發(fā)團(tuán)隊(duì)使用一個(gè)名為SudoWoodo的 GitHub 機(jī)器人來處理發(fā)布流程。根據(jù) Electron 開發(fā)文檔,他們可以通過 Slack 調(diào)用發(fā)布機(jī)器人來觸發(fā)新版本。Electron 通過其腳本目錄中的大量 Python、JavaScript 和 Bash DevOps 腳本自動(dòng)化了幾乎所有手動(dòng)的行為。
同樣,我們也可以通過使用自己的首選腳本語言的自動(dòng)化執(zhí)行任務(wù)來節(jié)約時(shí)間。
Flutter — 選擇解決問題的最佳方式
一個(gè)工程問題可能有多種解決方案。例如可以通過在前端編寫大部分應(yīng)用邏輯來構(gòu)建特定的 Web 應(yīng)用程序。
另外,要仔細(xì)研究應(yīng)用程序的性能需求、開發(fā)者體驗(yàn)以及交付時(shí)間,用什么樣的方式將應(yīng)用程序邏輯以前端和后端形式拆分。
Flutter 為跨平臺(tái)應(yīng)用程序開發(fā)問題提供了最優(yōu)化的解決方案。大多數(shù)框架都使用基于 Chromium(或基于 webview)的跨平臺(tái)開發(fā)方法。由于瀏覽器實(shí)現(xiàn)的性能開銷,它不適合構(gòu)建大型跨平臺(tái)應(yīng)用程序。
而Flutter 使用了最優(yōu)化的方式,它開發(fā)了自己的 GUI 工具包,并提供了一個(gè)高性能的二進(jìn)制消息協(xié)議來與來自 Dart 環(huán)境的本地平臺(tái)特定 API 進(jìn)行通信。
瀏覽 Flutter Engine 源碼,了解 Flutter 架構(gòu)如何解決跨平臺(tái)開發(fā)問題。在我們的軟件開發(fā)活動(dòng)中,可以使用相同的方法并選擇最優(yōu)之解決方案。
React 和 React Native — 軟件系統(tǒng)中代碼的可重用性和靈活性
DRY、YAGNI、KISS 和 SOC 原則激勵(lì)程序員用干凈代碼編寫易于管理和優(yōu)化的軟件。
DRY 原則指導(dǎo)我們通過避免代碼重復(fù)來構(gòu)建干凈的代碼庫。如果掌握了 DRY 原則,就可以構(gòu)建可以輕松修改、移植和集成到其他系統(tǒng)中的軟件模塊。
React 和 React Native 的實(shí)現(xiàn)展示了如何通過代碼可重用性使軟件系統(tǒng)變得靈活。
例如,Meta 最初創(chuàng)建 React.js 用于渲染 DOM 元素,但后來通過引入 React 渲染器概念引入了 React Native。由于 React 的架構(gòu)靈活性,我們擁有各種基于社區(qū)的 React 渲染器來創(chuàng)建 PDF、交互式 CLI 應(yīng)用以及嵌入式系統(tǒng)。React Native 代碼庫也很靈活,微軟借它創(chuàng)建了 RN Windows 和 RN macOS 項(xiàng)目。
而我們可以使用這個(gè)概念來構(gòu)建與平臺(tái)/基礎(chǔ)設(shè)施無關(guān)的軟件系統(tǒng),而軟件組件或基礎(chǔ)設(shè)施遷移再不會(huì)成為開發(fā)團(tuán)隊(duì)的噩夢。
Go——掌握 YAGNI 原則
C語言用于編寫高性能軟件的語言。但是C 沒有提供大多數(shù)現(xiàn)代開發(fā)人員尋求的功能,例如自動(dòng)內(nèi)存管理、內(nèi)置數(shù)據(jù)結(jié)構(gòu)支持以及字符串操作等。
而Golang 項(xiàng)目引入了一種具有現(xiàn)代特性又類似 C 的快速且小巧的語言。
Go 代碼庫和架構(gòu)教我們?nèi)绾问褂?YAGNI 原理,為復(fù)雜問題引入簡單的解決方案。例如,Go 在以下詞法標(biāo)記圖中,僅定義了 25 個(gè)保留關(guān)鍵字:
Go的token map定義
整個(gè) Go 實(shí)現(xiàn)也是十分精巧的。Go 核心開發(fā)團(tuán)隊(duì)甚至傾向于將源代碼分解為具有單字母變量的最小段落:
一個(gè)使用單字母變量的 Go 函數(shù)(在Go AST源代碼中)
結(jié)論
上面這些開源庫能夠有效幫助我們改進(jìn)軟件架構(gòu)、DevOps、自動(dòng)化、問題解決和通用編程技能。
深入研究這些開源項(xiàng)目,學(xué)習(xí)他們的編程實(shí)踐,并在自己的項(xiàng)目中進(jìn)行測試是自學(xué)軟件開發(fā)概念的良好手段。
當(dāng)我們今天檢查一個(gè)新的 GitHub 存儲(chǔ)庫時(shí),可以觸發(fā)我們以前沒有想到的編程新概念。也有可能,你在瀏覽開源存儲(chǔ)庫時(shí)引發(fā)一個(gè)超級(jí)好的新想法,它可以為整個(gè)開源生態(tài)系統(tǒng)賦能,那也是極好的。
開發(fā)者們,不斷檢查、學(xué)習(xí)、實(shí)踐和創(chuàng)新。而學(xué)習(xí)永無止境。