前端软件开发体系
前端軟件開發體系
程序員知識框架
前端工程師的技能模型分成三層,最底層的是三大能力「編程能力」、「架構能力」、「工程能力」,第二層是「前端知識」,最上面的則是「領域知識」。
知識框架同樣也是分為 3 層,最底層應該是「基礎知識」,第二層是「工程知識」,最頂層則是「領域知識」。
基礎知識
程序員最首要的應該是會寫程序,比如設計一個控制家庭 IoT 的程序,或者寫一個簡單網頁,處理一些業務的日志。想要做好這些事情就需要對應的基礎知識,這些知識是作為工程師都應該具備的。
前端知識
首當其沖的就是學習各種編程語言,對于前端程序員來說這部分是前端獨有的領域知識,比如,我們是用 JS 寫代碼,界面描述用的是 HTML,樣式用的是 CSS,還有還原設計稿的能力(這個是后端程序員跨領域最大的難題)等等。
編程能力
掌握了前端知識之后,這時候能寫一些簡單的程序,但是還寫不了幾萬行的大程序,比如,寫一個能夠工作的人臉識別程序,因為涉及的方面太多,光會寫程序的人是 hold 不住的。要想做到這一點,就需要理解搭建計算機軟件的模塊 —— 數據結構和算法。可以把數據結構理解為蓋房子的鋼筋、門窗和大梁,把算法理解為蓋房子的結構原理。沒有這些很難從沙石蓋成一個大廈。
這部分叫做編程能力,編程能力其實就是解決難問題的能力,一個比較難的算法題能不能寫出來。當然也不是特指寫算法題,應該是綜合了算法、數據結構、基本的編程能力等等。
編程能力可以通過刻意練習獲得,比如刷 leetcode、參加 ACM 競賽等。
計算機基礎知識
有了前端知識和較好的編程能力之后,應該能用一些半成品很快蓋出一座房子。可能又會遇到一些問題。即便在設計軟件時可以不受資源的限制,但是世界上任何一臺真實的計算機都是資源有限的。
如果想寫一個效率高的程序,就需要了解計算機能夠提供多少資源,程序在計算機系統結構這個框架內,應該怎么優化。
這時候就需要學習計算機的原理、計算機的系統結構、計算機網絡、操作系統(對于前端來說是瀏覽器)、編譯原理等等。
當然這一部分的知識可以對于大部分程序員來說沒有那么緊急,并且都是較為難啃的骨頭,可以邊工作邊補齊。
工程知識
工程知識就是解決人多的問題的能力,在軟件工程提出來之前都是用人力的手段進行管理(比如,代碼的行數、統計 bug 數)。
工程知識基本上只能選擇對應的公司,在具體的項目上學習。比如,淘寶前端的架構不復雜,但是工程問題非常復雜。
組件化
組件化的概念可能對于前端開發、Android 開發這種寫 UI 頁面的程序員更加熟悉,其實就是對于 UI 頁面上各種元素的抽象,最主要是為了解決代碼復用的問題。比如,可以直接使用業內各種著名的 UI 庫 Ant Design、Elements、iView 等等,而不是再去開發一遍。
對于其他領域可能更加熟悉的概念是模塊化,雖然可能名詞不一樣,但是都是計算機領域的核心 —— 解決代碼復用的問題。復用前人的經驗,利用搭積木的方式才能在幾十年內讓計算機發展到今天這個地步。
工具鏈
對于一個工程來說其實也是有對應的生命周期的,可以分為初始化、開發/調試、測試、發布 4 個階段。
這 4 個階段是我們前面學到的知識還不夠用,但是也能肯定有對應的解決方案。對于前端來說有各種工具,比如 webpack、babel、create-react-app、vue-cli、npm 等等。
大部分的需求可能直接使用對應的工具就能解決了,因此熟悉各種工具的用法是至關重要的。但是總有些需求是現成工具不能滿足的,要學會開發自己的工具。當然這些工具還是在計算機軟件的范疇內,所以前面學習的基礎知識都是通用的。
持續集成
持續集成是近現代軟件工程中的一個非常重要的概念。在軟件開發過程中,以定期或者實時的方式,集成所有人的工作成果,做統一的構建和測試。
性能
由于計算機的資源是有限的,因此運行的計算機之上的應用程序能夠使用的資源也是有限的。只有提供性能更好的軟件才能獲得用戶的青睞。
當然不同的領域對于性能的要求不一樣。對于前端可能更多的是看首屏加載時間,而對于后端來說可能是數據的吞吐量、并發數等等。
安全
隨著今各種用戶信息、用戶數據數字化,安全問題也是非常重要的,不僅涉及用戶的隱私,還可能涉及企業的商業機密。
領域知識
比如,做電商的、做硬件的都有自己獨特的領域知識。
學習領域知識的地方:1. 公司,2. QCon 每年都有優秀的講師分享他的領域知識。
領域知識基本上需要在實踐中學習。
架構能力
架構能力就是解決大問題的能力,包含了對復雜系統進行分析、軟件設計、管理多個程序員之間的協同。因為這部分的能力要涉及的知識非常龐雜,需要熟悉各種系統、各種框架,同時還需要對需求有非常深刻的見解,才可能在技術選型時做到最合適。
架構能力應該是對前面所有知識的融會貫通。可以通過讀源代碼、參與開源項目,學習前人的思想來提高。
學習源代碼的方法,先參與項目,讀一讀 issue,解決一些實際問題,在解決問題的期間讀一部分源代碼。
學習方法
了解了整個程序員的知識框架,非常龐大,想要學好就需要一定的方式方法。最主要是根據一定關系整理出來一個具有「完備性」的知識脈絡,后面碰到不會的知識,能夠迅速定位這個知識再學習就事半功倍了。
順序關系
每一個子節點是父節點的一個步驟,并且子節點之間具有明顯的先后關系,順序不能打亂。比如:
組合關系
父節點在描述一個事物,子節點在描述事物的各個屬性,父節點由子節點組合而成。比如:
維度關系
從不同角度去看待一個東西,比如,可以從文法、語義、運行時的角度去描述 JavaScript。
分類關系
子類是父類的一個子集,比如:
追溯法
現在網上的資料非常多,可能有些還是互相沖突的,那么就要使用追溯法去找到這個知識最開始的出處,從源頭弄清楚這個知識。
可以根據下面這些線索去查找:
總結
- 上一篇: 人工智能AI Boosting HMC
- 下一篇: 芯片工具链概述