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

一個使用單字母變量的 Go 函數(shù)(在Go AST源代碼中)
結論
上面這些開源庫能夠有效幫助我們改進軟件架構、DevOps、自動化、問題解決和通用編程技能。
深入研究這些開源項目,學習他們的編程實踐,并在自己的項目中進行測試是自學軟件開發(fā)概念的良好手段。
當我們今天檢查一個新的 GitHub 存儲庫時,可以觸發(fā)我們以前沒有想到的編程新概念。也有可能,你在瀏覽開源存儲庫時引發(fā)一個超級好的新想法,它可以為整個開源生態(tài)系統(tǒng)賦能,那也是極好的。
開發(fā)者們,不斷檢查、學習、實踐和創(chuàng)新。而學習永無止境。