分享我的幾個學習故事

serialcoder發表於2019-02-28

上一篇文章收到了一些反饋,相當多朋友說那篇文章幫到了他們。能幫到人,體現自己的價值,我很高興。現在再分享一些我學習的故事,也許會對你有些啟發。

其實我要講的故事只是很普通的發散學習方法,大部分學習者應該都有這種體驗。我只是從我的知識積累路徑,展示我是怎樣被驅動著一點一點積累學習的。接下來我還是會提到一些資源和大的概念,有些我只是略瞭解,有些我能鑽很深。不是為了掉書袋,我不懂的我會說我不懂,我懂的我能解釋清楚。

故事一

剛進阿里的時候,花了很久時間學習阿里的技術棧。其中 BFF (Backend for frontend) 我還是第一次接觸,所以我花了些時間學了些相關的知識。當時我連 RPC 協議都還是第一次聽說,然後邊學邊和師兄們討論 BFF 和 Serverless 這些架構問題。其實我只是從巨集觀上了解一下,並沒什麼很深的見解。好在師兄們耐心,沒有嫌棄我。

我在找資料時找到了 Netflix 的實踐案例。其實這是不可避免的,Netflix 在這方面探索走在最前面。然後 Netflix 對自家的技術非常開放,你能經常在各種地方看到他們工程師的分享(Netflix UI 工程團隊對於函式響應式程式設計的推崇,讓我產生了好奇,然後不算掙扎地入了門)。下面是我找到的三個 Netflix 的分享:

Why Netflix Rolled Its Own Node.js Functions-as-a-Service for its API Platform - The New Stack

這篇文章介紹了為什麼 Netflix 要轉向 FaaS。之前 Netflix 採取的是 BFF 架構。這種架構的好處是客戶端不需要和提供服務的後端直接通訊,以滿足各種客戶端快速迭代的需求。但同時由於 BFF 和客戶端 UI 層的高度耦合,BFF 只能由 UI 工程師來維護,這無疑增加了 UI 工程師的工作量。UI 工程師(前端,客戶端)是被僱來寫 UI 的,卻要維護服務端,這顯然沒有做到人力資源的最優配置。FaaS (Functions As A Service) 的提出就是為了解決這個問題。

Going FaaSter: Function as a Service at Netflix - YouTube

在這個演講裡,Netflix 工程師肖雨濃介紹了 FaaS 在 Netflix 的實踐。之前我和師兄討論時,有提到雲函式不好 debug,但 Netflix 不僅解決了這個問題,甚至更進一步把整個開發環境,從開發 debug,live reloading,單元測試,釋出構建等都解決了。

Netflix: What Happens When You Press Play? - High Scalability -

這一篇更好懂一點,作者從小白的視角,解釋了當你在 Netflix 上點選播放按鈕之後發生了什麼。Netflix 內容傳輸整個鏈路都有涉及。雖然面向小白,但是有些細節應該對有經驗的工程師也有啟發。比如 Netflix 為什麼要自己建 CDN,為什麼把 CDN 放到 ISP 那裡。

故事二:

之前關注過我的朋友應該知道我很喜歡用 Ramda。目前的團隊沒有使用 Ramda,一開始我很不適應。當時我想我能不能自己手寫幾個 Ramda 函式自己用(其實也是不可以的,別人要維護,但我當時也想挑戰下)。大部分函式挺好寫,但是寫到我最喜歡的 lens 時卡住了。去看 Ramda 原始碼,感覺太黑魔法了看不懂。然後我就去找了些文章讀,去了解 lens 的思想。

Lenses and Virtual DOM Support Open Closed 這篇文章介紹了 Lens 在操作 Virtual DOM 的用處,角度比較新。

Functional Lenses, How Do They Work 這篇文章介紹了 Lens 的原理和實現。看懂差不多能自己寫個簡單的 lens 了,但不夠完整。

只看兩篇還是不夠的,應該還有再深入的。於是找到了這三篇:

Functional lenses in JavaScript 介紹了 lens 的原理和使用。

Functional lenses in JavaScript - Isos 同一個作者寫的,更近一步,介紹 Isomorphic Lens, 到這裡就需要理解抽象代數裡面的 isomorphism 是什麼鬼。看原始碼再查下資料不算太難理解。

Functional lenses in JavaScript - Traversables 這篇再深入一點,介紹 lens 在 Traversable 資料型別裡面的應用。

作者沒有親自解釋什麼是 Traversable,而是給了個連結 Fantas, Eel, and Specification 12: Traversable · Tom Harding 跟著這個連結,你能發現這篇文章的作者還有一系列文章在解釋 Fantasy Land Specification 裡面的各種 ADT。於是又開啟了一扇知識的大門……

看了這些文章之後,我寫出的 lens 夠用,但是沒法實現 isomorphic lens,實在沒辦法又去逆向 Ramda 原始碼了,這次終於看懂了,寫出了自己的版本。當時還發文章分享過:Lens 原理及應用

故事三

有一次在看 Redux Thunk 的相關文件時,很偶然跟著連結跟到了 Stack Overflow 的一個熱門答案。有答主在回答裡推 Redux Saga,並說了 Redux Saga 的好處。其中有一部分引起了我的好奇:

Imperative VS declarative:

  • DOM: jQuery is imperative / React is declarative
  • Monads: IO is imperative / Free is declarative
  • Redux effects: redux-thunk is imperative / redux-saga is declarative

啥?IO Monad 也是指令式的?Monad 我懂,Free Monad 又是什麼鬼?還有比 Monad 高一階的抽象?然後我去找資料瞭解了。

首先就是可愛的 Dr. Boolean 老師,在三個 YouTube 視訊裡介紹了 Free Monad 的 JS 實現。在這個實現版本里,Dr. Boolean 用了一個叫 daggy 的庫,這個庫引起了我的注意。查了一下資料,其實它是給 JS 提供 Tagged Union 型別的。這個概念我之前瞭解過,但是已經淡忘了,然後我又去查了。

很多語言,比如 TypeScript 和 Rust 都提供了 Sum Type。看文件,這似乎是個很簡單的功能,但其實它背後有很深的數學理論,在語言層面也可以挖很深。我找到了這篇文章 Better JS Cases with Sum Types 剛好作者是我比較喜歡的一個老師,之前在 YouTube 聽他解釋過 lambda 演算和組合子。這篇文章鑽的很深,值得花幾個星期去消化。

然後跟著兔子洞接著鑽。我看到文章評論區有人在問 Gabriel Lebec 老師函數語言程式設計學習資源,然後 Gabriel 推薦了一個視訊 Domain Modeling Made Functional 然後我就很偶然闖進了一個全新的知識領域 -- 領域驅動設計。這個視訊讓我很震撼,我當時還寫文章總結過

第三個故事最能體現 發散-無序-偶然-意外發現 的知識積累路徑。從 Redux thunk,到 Free Monad,到 Union Type,到領域驅動設計。這些知識相差很遠,而又線性地出現在我的知識路徑裡。

知識整理

我每週這樣雜亂地吸收知識,學習容易失去主線。這也是比較困擾我的一個地方。我的一個方法是在家裡的白板上無序記錄下我正在學的知識,每天早上看一眼,提醒一下我前幾天學了什麼,有空了再回憶複習一下。

下圖是我幾周之前寫在白板上的內容。當時準備回家過年,離開房間之前拍了張照片。當時要是知道我會把這些內容分享出來,就好好寫字了……

分享我的幾個學習故事

上面的內容有些標題太大,其實我只是瞭解了一點而已。比如 ML 和 TensorFlow,我只是當時在 Udemy 學習 Machine Learning in JavaScript,而我並不能確定我機器學習到底入門了沒有。Clojure 我只是瞭解了 LISP 裡面的遞迴資料型別和 Cons 構造,當時想用 JS 實現,需要用到資料結構共享的知識。

我並不是自律狂魔

我總是會給人一種錯覺,就是我很自律。要是我本性真有這麼自律,我就不會走這麼艱難的路了,也不會高考復讀才考個二本。我靠的都是習慣。

其實人類農業文明才幾千年,在漫長的進化過程中,人腦是朝著更適應狩獵繁殖等任務去進化的。寫程式碼,學 CS,剋制自己的本能衝動,並不符合人類本性。這些關於人類本性的共識是任何嚴肅的關於習慣和自律行為研究的起點。

我也有習慣系統失效的時候,這時候我就並不顯得那麼自律了。

一兩個月前,我決定認真學下數學。然後決定搞個一百天計劃,每天打卡記錄。我把打卡記錄訂在留言板上,每天出門就看得到。如下圖:

分享我的幾個學習故事

當時還發朋友圈裝逼立 flag,配文 Make it visual, make it a ritual. 一副大幹一場的樣子。然而你們可以看到。我一開始是 1 月 26 日開始這個計劃的,堅持了兩天就從入門到放棄了。我就不多總結原因了,就是沒計劃好,失敗了。而不是怪自己懶。然後我又想資源重複利用,繼續用這個表記錄學習 CS 吧。也是每天在 edx 上學兩小時本科 CS 課程。你們可以看到,我把時間改到 2月 18 日了,然而這次更慘,一天都沒堅持。

這只是我習慣系統失效了,不是因為我自不自律。我會從外界找原因:1. 下班太晚了,晚上太累,沒精力去規劃明天的事情。2. 我為了省電,客廳裡沒開電暖,所以我總是避開在那裡待太久,所以我經常看不到留言板……

就分享這些故事。可以看到其實學習資源真的很好找。積累的多了,你知道哪些公司會分享什麼技術,你關注的領域有哪些專家,跟著這些行業專家,你又能繼續擴充套件你的知識面。


【重點】 螞蟻金服保險體驗與社群技術組招高階前端開發工程師/專家。我所在的團隊,隊友們個個都是獨當一面。學霸很多,我天天跟著他們學習。(坐在我右手邊的同學是清華醫學博士。可能是因為玩過手術刀,這位大神擼程式碼行雲流水,全 Vim 擼到底)我們開發了很有社會公益價值的相互寶,接下來會有更多激動人心的產品。有興趣的同學聯絡我 ray.hl@alipay.com

相關文章