某熊的技術之路指北 ☯

王下邀月熊發表於2019-02-23

當我們站在技術之路的原點,未來可能充滿了迷茫,也存在著很多不同的可能;我們可能成為 Web/(大)前端/終端工程師、服務端架構工程師、測試/運維/安全工程師等質量保障、可用性保障相關的工程師、大資料/雲端計算/虛擬化工程師、演算法工程師、產品經理等等某個或者某幾個角色。某熊的技術之路系列文章/書籍/視訊/程式碼即是筆者蹣跚行進於這條路上的點滴印記,包含了筆者作為程式設計師的技術視野、知識管理與職業規劃,致力於提升開發者的學習能力與實際研發效能。

本指北就是對筆者不同領域方面沉澱下的知識倉庫的導航與索引,便於讀者快速地尋找到自己需要的內容。我們也可以在筆者的個人主頁,或者公眾號(WIP)中,或者使用 alfred-sg 這樣的本地工具進行關鍵字檢索。路漫漫其修遠兮,吾正上下而求索,也希望能給所有遇見過筆者痕跡的同學些許幫助,在浩瀚銀河間能順利達到一個又一個彼岸。Just Coder,Travel in Galaxy,歡迎關注某熊的技術之路公眾號,讓我們一起前行。

image.png

0.閱讀,筆記與編碼

博觀而約取,厚積而薄發。在這個知識爆炸與終身學習/碎片化學習為主的時代,我們面臨的問題之一就是如何進行有效學習,不僅能有效平衡廣度與深度,並且能真正的積澱下來,提升自己的研發效能。於筆者而言,常常鬱結於胸的就是以下三個問題:

  • 應該學習什麼?這是怎樣的一個技術世界?存在著怎樣的高峰與路徑?
  • 如何克服遺忘帶來的無效學習?
  • 如何不再碎片化地學習?

究其根本,也就是需要擴充自己的知識廣度,精進自己的知識深度,錘鍊自己的程式設計能力。所謂知識廣度,即是為實際問題選擇合適的解決方案的能力,廣義來說也是眼界與格局的表現。它並不拘泥於某個技術方向或者行業領域,而需要對傳統/流行的各類語言、工具、框架、庫、服務等有一定的認識;能夠明晰各個方案的優劣,並在較高的層次(High Level)描述相關原理。知識廣度的擴充與保持需要建立在龐大的閱讀量與知識沉澱能力上。

Awesome Lists 就為我們準備了精而全的技術開發學習與實踐資料索引,去蕪存菁,去重留一;譬如其中的 Awesome WebSites 一文就為我們推薦了值得閱讀的資訊、部落格等站點列表。知識廣度的擴充也並非一蹴而就之事,需得循序漸進,從初窺門徑,到登堂入室,最後融會貫通,當我們感覺亂花漸欲迷人眼,太多的碎片化知識反而使自己迷失方向之際,就可以前往 Awesome CS Books Warehouse,去深入地閱讀學習各個領域的精選書籍、課程等系統化的內容。

俗話說,好記性不如爛筆頭,當我們閱讀的多了,自然也要開始記錄;而筆者認為記錄的開始就要有自己的知識體系。在自己的知識體系下隨看隨記、定期整理。唯有建立符合自己認知方式的知識圖譜,才能有效地沉澱知識,明晰知識邊界並進行不斷地探索。上車伊始,筆者即致力於構建自己的 MindMap, IT 技術圖譜與知識架構,提供了軟體工程通用、前端、後端、DevOps、測試、架構師、人工智慧工程師等多領域的知識圖譜、學習成長路線與面試必備內容,並在數年來不斷維護與重新整理。

筆者目前選擇的是以 MarkDown 格式記錄,並且將所有的筆記存放於 Github-文件札記以 Git 方式進行版本管理;編輯器是直接使用的 VSCode,移動端編輯的話也是用的 GitGo/WorkCopy 這樣的 Git 應用。這些筆記即是筆者自身技術視野與認知的外化,也類比於外設之於記憶體,在需要的時候分頁載入到腦海中使用,以應對這知識爆炸的時代。其中的典型代表,Awesome CheatSheets,對於日常開發中用到的相關知識的備忘錄/清單進行總結, 適合快速掌握或者回顧某個語言/框架/工具的語法或使用要點。Tech Road, 我的技術之路是對於筆者多年學習與認知變遷的總結。

先賢有云,知行合一,知是行之始,行是知之成,Linus Torvalds 也曾提到: 'Talk is cheap. Show me the code.',在閱讀與筆記之後,就是要開始實踐編碼。所謂程式設計能力,並不僅僅是編寫程式碼(Write Code)的能力,而是包含了閱讀、編寫、理解、重構、抽象等多個方面,是所謂的程式碼管理/掌控。其外在表現之一即是能夠隨時隨地用合適的語言無阻塞地實現某些功能需求,對於常見的語法,介面,演算法,設計模式等能夠做到心隨意動,信手拈來。程式設計能力是提升研發效能的重要保障,於筆者而言也是畢生應該追求的目標與愛好之一。筆者的程式設計能力較弱,日常開發,特別是在多語言多框架並用的場景下,往往會需要不斷地中斷,查詢以繼續工作,也是令我頗為苦惱。

前文重在討論如何拓寬技術視野、追尋技術的廣度,但是需要銘記的是,技術深度才是技術廣度的基石,正如中國自古以來常用道術之辯,知其然,也要知其所以然;亦如 Richard Feynman 所述:”What I cannot create, I do not understand.”。所謂知識深度,即是能夠對某個方面做到深入瞭解,並且達到融會貫通,洞若觀火,可以隨心所欲地加以擴充套件、優化、創新等改造或變換。這方面則更加的見仁見智,不同的領域與方向對於深度的定義與挖掘方向也是千差萬別。

我們需要自己去從零開始造些輪子,才能深刻理解使用的框架/庫/平臺的內部原理,才能在碰到故障時快速地修復;在下文的幾乎每個章節中,我們都會提到某些筆者自造的輪子。

1.程式語言

程式語言是一切的基礎,正如 Steve McConnell 在 Code Complete 一書中提及,我們應該 Program into a language 而不是 Program in a language,針對不同的需要選擇合適的程式語言來實現,而不是受制於自己所會的語言。在知識圖譜中也包含了跨程式語言的公共知識雜談,筆者與程式語言相關的文章存放在 Programming Language Series | 程式語言語法基礎與工程實踐倉庫中,其涵蓋了 C/C++、Go、Java、JavaScript、Python、Rust、Swift 等常見的語言,以及通用的程式語言理論

程式設計能力鍛鍊的基礎,首要的就是關於資料結構與演算法,以及物件導向的設計模式,其對應的程式碼分別存放在了 coding-snippets, algorithm-snippets, design-pattern-snippets 中。此外,我們還可以從零編寫一些類似於 Guava & Lodash 這樣的自己的通用工具庫,筆者自身是整合在了 Guash 中。

在程式語言之上,我們就需要考慮如何去實現真正的軟體系統,譬如 軟體工程基礎 系列中的開發工具/Git 漫談、軟體系統架構、軟體質量保障等內容,我們也可以自己去實現一些自己的工具,譬如筆者的 Soogle 是構建自身搜尋、外部服務訪問能力的工具集合;而 xCompass 是包含個人主頁在內的多端閱讀能力的原始碼倉庫。

2.Web 與大前端工程師

如果您對於 JavaScript 基礎語法尚不完全瞭解,那麼建議您首先瀏覽現代 JavaScript 語法基礎與工程實踐或者 JavaScript-CheatSheet 以瞭解基礎的 JavaScript 語法及實踐應用。

如果您想快速地瞭解 Web 開發實踐,或者是想查閱某些清單,那麼建議您前往 Awesome-CheatSheets/Web;或者從導論篇開始閱讀,它會包含 Web 開發簡史與變遷資料流驅動的介面模組化與元件化工具化與工程化前後端分離與全棧架構微前端與大前端執行機制與效能優化等內容。

接下來,您可以選擇以下章節中感興趣的模組進行深度閱讀:

  • 基礎篇: 對於 HTML、CSS、DOM 等 Web 開發中涉及的基礎知識與理念的總結介紹。
  • 工程實踐篇: 構建工具,測試,安全,WebAssembly。
  • 架構優化篇: 元件化,狀態管理,效能優化,PWA。
  • React 篇:近年來前端領域百花齊放,各種技術方案爭妍鬥豔,各領風騷。本書立足於其中的佼佼者 React,深入淺出的介紹 React, Webpack, ES6, Redux, MobX 等常見前端開發工具與開發庫的用法,幫助初學者能夠迅速成為一名合格前端工程師。而本書也不僅侷限於工具使用的層面,探尋各種技術方案背後蘊含的設計思想與架構模式,從前端工程化的角度討論前端開發者在進階過程中需要掌握的工程實踐、模組化與元件化、質量保障、效能優化等知識要點。最終幫助開發者在前端開發中能夠因地制宜的指定合理方案,以儘可能快的速度實現可信賴的產品。

在閱讀之外,我們同樣需要進行大量的程式碼實踐,不僅僅是熟悉常用的框架,還需要去積累自己的元件、框架等功能庫:

  • fe-boilerplates 是筆者對於日常工作中的基於 React/Vue.js 技術棧與實踐的收集與沉澱;為了方便不同級別/熟練程度的開發者使用,筆者將模板儘可能地泛化為多個專案,包含了從入門級到生產環境,微前端等多個不同層次/複雜度的模板專案。
  • fractal-components 則是筆者日常工作中總結出來的應用、元件庫以及元件開發模式,為了保證其獨立性與複用性,筆者以不同的方式實現了元件。
  • Ueact 旨在從零開始實現自定義的元件系統,多調和策略與資料流響應方式,同時能夠被渲染/編譯到多種元件。
  • Legoble 則承載了自己實現一款視覺化的應用構建工具的念想。
  • Pudding 是有關於 Web Automation、多維度記錄、回放、優化工具等集合。

3.服務端架構工程師

這是全棧的時代,我們更多地以業務來劃分而非單純地前後端,Backend Series | 服務端應用程式開發與系統架構/微服務架構與實踐承載了筆者在服務端的總結與經驗,其包含了服務端應用程式開發基礎,深入淺出 Node.js 全棧架構,Spring Boot 5 與 Spring Cloud 微服務實踐等內容。

  • Backend-Boilerplates is Boilerplate for Your Server Side(Backend) Application, Java | Spring(Boot, Cloud) | Node.js(Express, Koa, Egg) | Go | Python | DevOps.
  • winter-boot is Another boot for your Java applications like Spring Boot, but Winter is coming.

4.測試/運維/安全工程師

軟體系統的質量保障是服務端運維不可繞過的部分,其包含了軟體測試基礎以及 DevOps 與 SRE 實戰,資訊保安與滲透測試必知必會等相關內容。在實踐方面,我們還可以參考:

  • Chaos-Scanner 混沌守望者(掃描器),半自動化分散式智慧網路空間測繪、管理與安全探測。
  • xe-crawler 是遵循宣告式、可監測理念的分散式爬蟲,其計劃提供 Node.js、Go、Python 多種實現,能夠對於靜態 Web 頁面、動態 Web 頁面、關係型資料庫、作業系統等異構多源資料進行抓取。

5.大資料/雲端計算/虛擬化工程師

前文討論的更多是應用層的知識,而對於更底層的作業系統、資料庫、大資料處理等分散式基礎架構相關內容,都存放在了 Distributed-Infrastructure-Series | 深入淺出分散式基礎架構系列中,主要包含分散式計算、分散式系統、資料儲存、虛擬化、網路、作業系統等幾個部分。

如上文所述,我們需要在重構輪子中成長:

  • Reinvent-MQ 即是 Multiple home-made Message Queues, LocalMQ(akin RocketMQ), PongoMQ(akin Kafka), etc.
  • Reinvent-DB 即是 Multiple home-made Databases, Godis(akin Redis), HiSQL(akin MySQL), MemDB, DataGo(akin ETL) etc. Understanding DBs by Reinventing It.
  • Focker 是從零開始自定義的類 Docker 簡化版容器實現。
  • SparkChain 即是在區塊鏈方面的實驗探索的積累。

6.演算法工程師

前文我們討論過資料結構與演算法的相關內容,而在人工智慧火熱的現在,AIDL-Series | 人工智慧與深度學習實戰系列包含了數學原理篇、機器學習篇、深度學習篇、自然語言篇、工程實踐篇、人工智慧與深度學習課程篇等內容。在實踐方面,程式碼主要存放於 Artificial Intelligence & Deep Learning Workbench 中。

7.產品經理

筆者選擇了產品經理作為壓軸之篇,也是希望能表述自己關於產品的觀點,無論是我們創造的庫、框架、應用還是平臺,乃至於我們的文章、整理的系列書籍,都當以產品視之,跳出上帝視角,從使用者的角度去考量。我們首先可以閱讀些產品經理/使用者體驗方面的書籍

筆者目前積累不多,主要在 Product Series | 產品迷思中,其首先會關注產品經理的基礎素養、使用者互動體驗、文件處理等方面。其次會討論有關於專案管理、通用的領域能力構建(流程引擎、CRM 等)以及對於經典產品的分析。最後,該系列還會關注於具體的行業觀點,譬如電子商務、智慧製造等。

很多時候,自己動手做些小產品也是有趣的事情,譬如 MushiChat 這樣的聊天平臺與聊天機器人、IoTable 這樣在 IoT 領域的一些探索。

相關文章