我如何零基礎轉行成爲一個自信的前端

來自將來的補充:原標題是「學前端,我如何在一年內學到三年的知識」。經網友批評和本身反思後,決定改一個合適點的標題。另外,有很多朋友覺得我在國外,其實我一直在深圳。目前我也在想進入技術好一點的團隊,可打雜。前端

這個大言不慚的標題源自我與我所認識的前端從業者的比較,也源自別人的評價。讀者也能夠看我其它文章,評估個人專業能力。固然我不是在每一個領域都能匹配別人三年的實踐經驗。我還有不少技術棧沒掌握,好比沒寫太小程序,沒用過 jQuery(這個也不想再學了,只是依然還有用人單位在要求)。也有不少坑沒踩過,好比沒有作過瀏覽器兼容(說實話也不太想兼容 IE,浪費生命)。我想說的是我對 JS 這門語言以及 CS 這門學科掌握的深度,前端生態圈理解和熟悉的程度,以及知識遷移能力。react

我不是想炫耀本身多牛,而是想幫助和我有類似背景的人。我在掘金髮了幾篇文章後,有幾個朋友在知道我零基礎學編程一年半就進步這麼快後,想知道我是怎麼學的。這篇文章就是對他們的詳細回答。程序員


1、背景介紹

我本科學的是國際貿易,亂選的專業。畢業後作了半年外貿,實在不喜歡,而後去作英文編輯了。第二份工做也很無聊,就是寫英文軟文,發表在國外的行業期刊上,給公司作廣告。而後也作英文官網的內容。這是一個很沒創意的工做。天天在一堆不利數據裏找個別利好數據,包裝一下,忽悠人。最重要的是,這份職業裏我找不到持續精進的方向,作一年和作三年好像區別不大。web

後來學前端也是誤打誤撞。由於我同時在作英文官網的內容和產品,會和前端打交道。當時公司的前端是學 UI 轉過來的,我觀察他的工做,覺得就是 HTML 寫個頁面結構,而後 CSS 作個樣式,而後用 JS 作點效果就能夠了。這個簡單啊,我也能夠作。而後我就裸辭去學習前端開發了…… 後來發現我錯了,可是本身跳的坑,流着淚也要爬出來。接下來我經歷了人生中最難熬的一段時間,也經歷了人生中第一次大的轉變。算法

我從 2017 年年初開始高強度學習,去年十一假期以後開始個人第一份前端工做,到今天恰好工做一年時間。接下來我將個人學習路徑,學習方法,和學習資源整理分享出來,但願能夠幫到更多人。數據庫


2、準備工做

學習不僅是找到好的學習路徑,掌握好的學習方法就能夠了的,要成爲優秀的學習者,是要求不少素質和習慣的。我長期以來都是一個懶散的人,三分鐘熱度,自律不好。我相信大部分人都這樣。在乎識到學習任務的艱鉅後,我想的是我不能再放棄了,我以爲我年輕試錯的階段已通過了,經不起再失敗了,因而我專門花了很長時間來調整本身的習慣和行爲。這裏我分享一些對我幫助最大的資源:編程


一、一本書

《習慣的力量》(The Power of Habit)。這本書讓我意識到本身的壞習慣是須要科學的方法來改變的,一味地自責和焦慮是沒用的。習慣的改變靠的不是主觀意志力,而是 cue (不知道怎麼翻譯,刺激物?)和平常流程(routine)來維持的,因此我把學習場所從家換到了星巴克。而 cue 分爲情緒,時間,場所,上一個行爲等,這些都須要本身去定位查找。找到觸發你的壞習慣的 cue,改變它。另外,天天都要有計劃,計劃會觸發獎賞期待,讓你更不容易回到壞習慣。最重要的是,關鍵好習慣的養成,會讓你養成其它好習慣更容易。好比早起的習慣一旦養成,我又養成了早上學習最具挑戰知識的習慣。小程序


二、一門課程

Coursera 上有一門課叫 Learning How To Learn, 目前是世界上參與人數最多的一門 MOOC 課程。這門課免費。講師 Dr. Barbara Oakley 是奧克蘭大學的工程學教授。她原本是學斯拉夫語言文學的,一直畏懼工科,數理學科成績也不好,直到快 30 歲時,她才決定挑戰本身去學工程學。聽她講學習過程是最有說服力的。另外一位講師 Dr. Terrence Sejnowski 是頂尖的神經科學專家。他會從腦科學和神經科學的實證角度告訴你爲何應該怎樣學。下面講下我對這門課程的一些理念的應用。後端


1、大腦的發散和集中工做模式設計模式

發散模式(diffuse mode)指的是注意力從工做對象處轉移開來,放鬆下來,讓靈感有機會出現。集中模式(focused mode)天然是指所有注意力放在工做對象上,高強度思考。學習時,我採用番茄工做法,每工做 25 分鐘休息 5 分鐘。而後每工做 2 到 3 個小時,出門散下步,或者在家時耍下壺鈴。這個習慣養成後,不少神奇的事情會發生。好比有一次我在寫 Rxjs 應用時,卡在一個地方,怎麼也想不出來解決方案,而後去洗了個澡,靈感就來了,換幾個操做符的組合就解決了。還有數不清有多少次在夢裏想出一個解決方案,起牀就去試,結果然的行的通。


2、多運動

Dr. Terrence Sejnowski 講解了爲何運動會促發大腦新的神經元的生長。高強度的腦力活動,你須要大腦保持最佳機能。我在開始學習以前就是個健身狂魔(見下圖),每週有至少四天要去健身房。找到工做前的學習期,我也保持着這個頻率鍛鍊。工做後,沒時間再去健身房了,我就買了個 Concept 2 划船機,早上在家鍛鍊。鍛鍊推薦 HIIT (高強度間歇訓練)方法,燃脂迅速,最短期內達到鍛鍊效果。

硬拉訓練


3、刻意訓練

學生時代我常常忽略作題訓練,看懂了答案就覺得本身掌握了。但其實懂答案和本身寫出來是兩回事。學習者很容易產生能力幻覺(Illusion of Competence),看懂了知識點,就覺得本身掌握了。只有本身能獨立解釋清楚的,纔算是本身掌握的。本身在網上找些小挑戰作(好比 100 days of code, 還有 JavaScript 30),多在 codewars 和 LeetCode 上刷題(我主要是在 codewars 上作題),能夠鞏固剛學的知識。


4、間隔重複

一天花 6 個小時學一個主題,和用 6 天時間,一天花 1 小時來學習同一個主題相比,確定是後者掌握的更好。固然重複不是簡單的重讀一遍。而是刻意回憶,測試本身還能不能想起來。你們能夠試試 Studies 這個軟件,建立和管理知識卡片,方便複習。iOS 和 Mac 上都有。

還有不少,我就不全列了。強烈建議你們去學一遍課程,本身摸索出適合本身的方法。中文版在這裏


一個習慣

早起。天天早上 4 點準時起牀。我知道這個聽起來挺瘋狂,但我堅持了一年半了。(也有例外,但最晚大多數時候不超過 5 點,極個別例外好比加班,也不會超過 6 點)。我之前的習慣是常常晚上玩手機到凌晨 2 點睡,還騙本身,覺得本身是夜貓子型。轉變習慣用了一個月。下面是一些技巧。1. 吃補劑。我吃的是 Swiss Sleep,一種澳洲的草本保健品。我知道不少專家說保健品不靠譜,但我吃了這個真的睡的更香了,用 Sleep Cycle 監測到的深度睡眠增長了。2. 下午 2 點以後不喝咖啡,晚上 8 點以後不看電子屏幕。3. 睡前深呼吸,放慢呼吸頻率。四,我用 Yeelight 牀頭燈,早上定時模擬日出。天然醒的感受,不會像鬧鐘那樣討厭。早起後,早上至少有 3 個小時不會有人打擾你(我作的更極端,直接把微信卸載了,全天都沒人打擾)。而晚上睡的早,也不會漫無目的地玩手機聊天。從早上起牀到中午 12 點,我能夠完成 10 個番茄鬧鐘。中途還有充足的休息時間。


一個 APP

Headspace 是國外一個比較流行的冥想軟件。可能不少人對冥想的感受就是太玄學,但它真的做用很大。對於我而言,主要是兩個做用,一個是集中注意力,另一個是克服焦慮。一我的沒有其餘幫助,學習一個全新的領域,也不知道能不能成功,壓力仍是很大的。而這種壓力可能並不必定會轉化爲動力,而是會積累着,成爲拖累。冥想可讓我暫時遠離這些擔心,調整注意力。Headspace 的指導語速很慢,聽懂比較容易。


3、學習資源

前面的準備工做作好後,開始進入正題了。這部分我分享下對我幫助最大的一些學習資源。

一、Frontend Masters

正如 Frontend Masters 這個網站名字所說明的,能在這裏講課的,都是大師級別。我挑幾門對我幫助最大的課程,並簡短說明以下:


一、The Good Parts of JavaScript and the Web

老師是 Douglas Crockford,JS 教父級人物,《JavaScript 語言精髓》做者。這門課講了 JS 的歷史和一些重要的語言細節,並把重點放在函數上。Crockford 認爲函數這是 JS 這門語言最重要的部分。後半部分講了瀏覽器和服務器的工做原理,以及網絡安全。

二、(1) Deep JavaScript Foundations (2) Rethinking Asynchronous JavaScript (3) Functional-Light JavaScript, v2 (4) ES6: The Right Parts (5) Organizing JavaScript Functionality (6) Coercion in JavaScript

共 6 門課,老師都是 Kyle Simpson.《你不知道的 JS 》系列書做者,等下還會提到他。第一門課深刻了 JS 的大部分重要細節,這是學好 JS 的第一步。其它幾門課分專題繼續深刻,分別是異步編程,ES6 的重要部分,組織 JS 功能模塊(學了這個後,我從沒寫過麪條代碼),輕量級函數式編程(有配套書,我的以爲是 JS 開發必學),最後是 JS 中的強制類型轉換。

三、(1) Webpack 4 Fundamentals (2) Web Performance with Webpack (3) Webpack Plugins System

共 3 門關於 Webpack 的課程,老師都是 Sean Larkin。微軟 Edge 團隊的 Technical Program Manager,Webpack 和 Angular 核心團隊成員,前不久剛來中國參加過前端圈的大會。這幾門課從基礎開始,一直到進階,呈現了 Webpack 的基本原理,操做技巧,以及插件生態。

四、Hardcore Functional Programming in JavaScript

老師是 Brian Lonsdorf,學函數式編程的話,不知道他會多不少掙扎。等下還會提到他。課程從基本的函數組合開始,逐漸講到硬核函數式編程(Functors, Applicatives 和 Monads 的應用等)

五、(1) Asynchronous Programming in JavaScript (with Rx.js Observables) (2) Advanced Asynchronous JavaScript

共兩門課。老師是 Jafar Husain。Netflix UI 工程團隊 leader,響應式編程專家,TC39 成員。第一門課從零開始寫經常使用的 Rxjs 操做符,逐漸進階到 DOM 事件流處理,網絡請求的處理等。第二門課是進階課,從零開始寫個 Observable,而後用 Observable 來解決一些棘手的動畫問題。最後會用課程知識寫個應用。

六、Advanced Vue.js Features from the Ground Up

老師是尤雨溪,這位不用我介紹了吧。這門課裏面,尤雨溪會教你從零開始實現 Vue 的核心構成,如響應式系統,插件,渲染函數,路由,狀態管理等。在我入職我目前所在公司的時候,我還沒寫過 Vue,入職後第一週學了這門課,而後帶着團隊重構 Vue 項目了。

還有不少優秀課程,所有列出來篇幅太大了。建議你們去探索尋寶。另外 Frontend Masters 是訂閱制,費用比較貴,按月付的話,接近 40 美圓一個月,年付會便宜不少。黑五和開學季會有折扣。我是在開學季用折扣價訂了一年。

另外,Frontend Masters 每一年都會出一個免費的前端學習手冊。今年的點擊這裏。


二、Egghead

這個網站的風格是簡短精煉。每一個視頻都很短,語速很快,適合有必定基礎,想用碎片時間充電的前端從業人員。不少庫的做者會在這裏講他們的做品,好比 Dan Abramov 會在這裏講 Redux,Michel Weststrate 會在這裏講 Mobx 和 Mobx State Tree 等,這些都是免費的。付費課程質量也大部分很高。你想學的某些主流技術,熱門的庫,大部分都在這裏找獲得教程。好比 Ramda,它有 200 多個 API,並且與其它庫風格迥異,我是怎麼短期內對這麼多 API 應用自如的?除了大量地訓練和擠地鐵時間查看文檔,還離不開 Egghead 上的實戰課程。這裏再挑幾門對我幫助最大的部分課程。剩下一些課程我會在本文後面再提。

一、(1) RxJS Beyond the Basics: Creating Observables from scratch (2) RxJS Subjects and Multicasting Operators (3) Save time avoiding common mistakes using RxJS (4)Use Higher Order Observables in RxJS Effectively

全是 RxJS 的課程,老師是 André Staltz,我最崇拜的技術人之一,等下還會講到他。這些課程從 RxJS 的入門一直講到高階操做。這些課程和前面提到的 Jafar Husain 的課程會有重合,但我以爲從不一樣的老師那裏,從不一樣角度學習,能夠掌握地更全。固然你不用每一個主題都找兩個老師學……我只是發現我訂閱的兩個網站都有 RxJS 課程,因此全學了。

二、Automate Daily Development Tasks with Bash

做爲開發人員,你應該掌握一些自動化工做流,提高開發效率。這門課講了開發中經常使用的 Bash 操做技巧,無論是前端和後端,都適用。

三、Quickly Transform Data with Transducers

我以前發表的消滅 for 循環的那篇文章,裏面用的 Transduce 寫法,就是在這門課裏學到的。

Egghead 還有不少高階 CSS 課程以及其它大前端的課程,好比單元測試,Serverless,等等。還有三門高階函數式編程的課程,我放到後面部分講。


三、Udemy

Udemy 是個在線教育界的淘寶,什麼課程都有。你能在那裏學音樂,學繪畫,甚至還能學詠春拳…… 固然能學編程,並且有些熱門編程老師確實很厲害。Udemy 有個套路,標價 200 美圓的課程,常常悄悄打折 9.9 美圓賣。我全部課程都是最低價買的,先後一年半共買了 60 多門課,一般是在黑五聖誕等折扣季買,固然,Udemy 幾乎每月都在促銷。我買的課程覆蓋前端後端,深度學習,區塊鏈開發等。我只把前端課程的 2 / 3 學了,其它的真學不動了,大多數屬於衝動消費……

我學習的課程部分截圖

這部分我就不詳細介紹課程了,只推薦三個老師。

一是 Stephen Grider,我買了他大部分課程。Stephen 擅長用很直觀的圖表來拆解工程概念,再難的東西他也能拆到用平常語言解釋。我一開始自學算法時,感到很吃力。Stephen 的算法課讓我經過 JS 掌握了基礎的計算機算法。他還有 Node,React,MongoDB 以及 GraphQL 的課程,大部分涵蓋了入門和進階。

第二個是 Andrew Mead。他講課能力也很優秀,我第一次學 Node 是學的他的課程,收穫很大。另外他對學員的問題迴應很是及時和詳細。他的課程和 Stephen 的重複率挺高,不用兩個都買。

若是有興趣學 iOS 開發,強烈推薦 Angela Yu 的課。(我作了半年 React Native 開發,因此去學了原生開發。)Angela 講課幽默可愛,新人友好。她彷佛是中國長大的,在英國學醫。原本是醫生,後來轉行作 iOS 開發和設計了。厲害的人生各有各的不一樣啊……


四、Wes Bos

Wes Bos 可能至關於北美阮一峯…… 固然這種類比是不恰當的。個人意思是,他的課程覆蓋了前端很廣領域,也廣受歡迎。若是你入門沒多久,能夠學他的免費課程 JavaScript 30. 用一個月時間,天天用原生 JS 寫個網頁應用。Mozilla 還贊助他開了 CSS Grid 的課程,吸引開發者用 FireFox。你也能夠免費學這門課。他還有付費的 Node 和 React 課程。最近他準備出一個高階 React 和 GraphQL 課程,我觀望中,可能會買。另外他還主持了一個播客節目叫 Syntax,主題是前端開發,我每期都會聽。擠地鐵時用兩倍語速聽,能吸取到不少新鮮知識。


五、YouTube

YouTube 是個很神奇的地方,每一個知識和娛樂的領域都能在這裏找到精華。我在這裏列出幾個前端和泛編程的頻道。


一、Fun Fun Function

主播名字太長了,粉絲都叫他 MPJ。MPJ 是瑞典人,以前一直在 Spotify 工做,最近辭職後全職作 Fun Fun Forum 論壇了。這個頻道覆蓋了很雜的 JS 和前端開發知識。我在這個頻道學到的都是在其它地方學過的,好比函數式編程,設計模式等,可是在這裏學更像一種放鬆和實時看高手是怎樣寫代碼和解決問題的。

二、Traversy Media

主播很是勤奮,更新很頻繁。內容大可能是初級和中級,很是適合新人學習。我如今偶爾也會看他新出的教程,用原生 JS 寫個動效,用 CSS 寫完成度 100% 的企業展現頁面等。

三、Coding Tech

這個頻道會持續更新計算機行業最新的優質演講。前端和其它領域都有。


六、GitHub

GitHub 上參考別人的代碼,能加快本身的理解。好比,Jason Miller(等下我還會介紹他) 的熱門 repo 我每一個都會看。EventEmitter,狀態管理,異步函數自動放到 web worker 的工具庫,Fetch API polyfill,等等聽起來挺複雜的東西,他五六行,十幾行代碼就實現了,還發布到 NPM 成爲完整的包。還有 You Don't Need jQuery, You Don't Need Lodash, 30 Seconds of Code 等 Repo,對提高原生 JS 解決問題的能力有很是大的幫助。碎片時間能夠在手機上學習。


七、JavaScript Weekly

我以爲 JavaScript Weekly(免費 Newsletter) 是前端開發者必須訂閱的,但我發現好像身邊人都不知道。不多有人能不關心技術趨勢還能走在前面的。你應該關注同行最近又開發出了什麼酷的東西,你關注的技術又出了哪些新教程。不過,天天盯着技術熱點看也容易分心。一週關注一次,頻率剛恰好。


4、影響個人技術人

若是你瞭解過一萬小時天才理論,你可能知道一個好的 Mentor 在我的成長中的沒法替代的做用。大多數人都沒有如此幸運,找到一個好的導師。我也是。對此個人一個並不完美的替代方案是關注行業裏的思考者和先行者,聽下他們的建議,瞭解他們是怎樣思考和工做的。下面是對我影響最大的技術人:

一、Kyle Simpson. 個人 JS 是他領入門的,也是他帶着走向進階的。個人整個學習路徑,都有他的影響。做爲一個教育者,他會給學習者不少各方面的建議。我會關注他全部的演講和開源項目。Twitter: @getify

二、Eric Elliott. 我學函數式編程是始於他。我比較幸運,一開始學編程的時候恰好碰到 Eric 開始在 Medium 上連載函數式編程教程。我在學了三個月 JS 以後,就遇到了一個全新的編程範式,而且被說服了。我推薦全部 JS 開發者都瞭解下這一系列文章 Composing Software 你能夠聽一個從 BASIC 時代就開始寫程序的前輩,是怎樣看待不一樣編程範式的;瞭解爲何組合比繼承更優,爲何 JS 適合用來函數式編程。Twitter: _ericelliott

三、André Staltz. 他是社區裏面的響應式編程專家。若是你想學響應式編程的話,必定要看他寫的這篇文章,The introduction to Reactive Programming you've been missing. 他還寫了一個函數響應式框架叫 Cycle.js 除了技術,他最讓我佩服的還有他對技術與社會之間關係的思考。他對於目前 Facebook 和 Google 等互聯網巨頭控制用戶數據的現狀不滿,他的一個 mission 就是要創造去中心化的互聯網。(萬維網的創始人,Tim Berners-Lee 爵士,也在作這件事)他最近發佈了一款安卓手機應用叫 Manyverse,一個真正去中心化社交平臺。這款應用是用 React Native 寫的,開源。感興趣的話,你能夠看下源碼,看下他是怎麼組織代碼的。Twitter: @andrestaltz

四、Sarah Drasner. Sarah 是個很是 nice 的姐姐,很是有親和力。她是 SVG 動畫專家,CSS 專家,微軟資深開發。仍是 Vue 核心團隊成員。她在 Frontend Masters 上有 Vue.js,高階 SVG 動畫,UI 設計等課程。她在 Twitter 上也會發不少開發 Tips。Twitter: @sarah_edo

五、Wes Bos. 剛剛提到過這位。他除了在播客上給開發者提供不少建議外,還在 Twitter 上分享不少開發技巧,JS, CSS, Bash, VSCode 等技巧都有。我在開發中也用了不少他分享的技巧,省了不少時間。Twitter: @wesbos

六、Mathias Bynens. 谷歌 V8 引擎工程師,TC39 成員。他會從引擎實現的角度,告訴開發者怎麼寫代碼。他也會分享一些 V8 的項目細節等。我以前寫了消滅 for 循環的文章,好多人反對,還有些人直接嘲諷我。其中有一個說法是高階函數沒有 for 循環性能好。做爲一個新手,我哪來勇氣去對槓來自資深開發者的質疑的?由於引擎開發者都說了,那點微觀語言層面的性能差別,不會成爲你整個應用的性能瓶頸。你應該把注意力放在編寫易理解和易維護的代碼上。 Twitter: @mathias

七、Brian Lonsdorf. 網名 Dr. Boolean. 這傢伙就是個天才。他有些害羞,可是在講他最擅長的函數式編程的時候,總能把滿腦子天馬行空的想法講地很清楚。若是想學硬核函數式編程的話,推薦從關注他開始。他 Twitter 更新不頻繁,可是更新的時候通常都是值得你記筆記的時候。Twitter: @drboolean

八、Jason Miller. 剛有提到他。他是 Google Chrome 團隊工程師,仍是 Preact 的做者。他寫了一堆平均只有十幾行代碼的庫。研究他的代碼不用一個文件一個文件地跳由於就在一個文件裏…… 他在 Twitter 上也很活躍。Twitter: @_developit

九、Bartosz Milewski. 這位真是位大神。我說我被他影響都有強行給本身貼金的嫌疑。他有量子物理博士學位,後來去作軟件開發了,成了 C++ 專家,出過 C++ 的專著。後來因受不了 C++ 糟糕的設計,去寫 Haskell 了,也成了專家。最近又把興趣轉向範疇論了,開始給程序員教範疇論。業餘還研究音樂理論(我看他 YouTube 點贊列表知道的……)。我最近幾個月每週都安排幾個早晨,去他的 YouTube 頻道聽他講範疇論(這個不須要高數基礎)。等下我會繼續談他的範疇論教程。Twitter: @BartoszMilewski

在聽 Bartosz Milewski 講範疇論


5、函數式編程學習路線圖

若是你是新人,不要被這部份內容嚇到了。這只是個人我的技術偏好。你不用懂抽象代數和範疇論也能夠走很遠,不過,輕量級的函數式編程,好比高階函數,函數組合,閉包,柯里化,偏函數應用,遞歸,memoization,惰性求值等等,是必需要掌握的。我之因此把這部分加進來,除了有人問我函數式編程學習資料以外,還由於對函數式編程的興趣是推進我持續學習的強大動力。我從一個高數一半課程掛科的文科生,到如今成爲一個能夠理解 lambda 演算和邱齊編碼(Church Encoding)的程序員,這對於我是頗有智力成就感的。這種成就感是之前從沒體會過的。

我建議你們都找到驅動本身成長的興趣點,不必定要和我同樣。你能夠選擇數據可視化,高階動畫,UI/UX 設計(同時懂代碼和設計會讓你擁有獨特的競爭力)等等。對後面兩個部分感興趣的能夠關注 Sarah Drasner 和 Mary Lou 的做品。


系統教程

一、Functional-Light JavaScript ,Kyle Simpson 的做品,剛剛有提到。這本書和 Eric Elliott 的 Composing Software 是入門 JS 函數式編程的最佳教程。這兩個教程所教的知識,能讓你輕鬆應付工做中對於函數式編程的實際需求。通常狀況下,你的項目中所容許出現的函數式代碼,也只能在這個範圍內了,再硬核一點別人維護起來就困難了。

二、Professor Frisby's Mostly Adequate Guide to Functional Programming 做者是 Brian Lonsdorf。他寫代碼時是 Dr. Boolean, 寫書時是 Professor Frisby... 學完這本書,你能夠掌握函數式編程應用 90% 以上知識。

三、Professor Frisby Introduces Composable Functional JavaScript 做者仍是 Brian。Egghead 上的課程。雖然課程內容和上面那本書重複了,但仍是值得看一下。Brian 用動畫方式講課,有些呆萌。

四、Learn You A Haskell for Great Good 學 Haskell 最佳資源之一。這個教程不一樣於其它教程之處在於它語言幽默風趣,會讓你讀着讀着笑出來。教程默認讀者沒有函數式編程訓練,因此對新人來講學習難度曲線平緩些。

五、Category Theory for Programmers Bartosz Milewski 的範疇論教程。視頻教程地址。這一系列教程是面向程序員的,因此不用太擔憂一開始就聽不懂,難以入門。不過,後期要學懂仍是要花點精力多去找些材料讀的,畢竟範疇論是種高度抽象的知識。教程涉及到代碼的部分會用 C++ 和 Haskell,讀者最好懂點 C++。


其它值得學習的

一、How to Deal with Dirty Side Effects in Your Pure Functional JavaScript 這篇文章是最近 JavaScript Weekly 推的。在我弄懂了一些 FP 概念以後,再回頭看這篇入門文章,也收穫了不少,更清楚了 FP 的每一步爲何要那樣作。一個應用的實際意義就是要產生做用 (effects),例如從服務器請求到內容而後展現到瀏覽器上等,全是 effects,可是函數式編程不容許反作用 (side effects),即在計算過程當中不準產生做用,那還怎麼寫程序?這篇文章一步一步嘗試解決如何消除程序中的反作用,只在計算所有完成再釋放做用。此文不會扔概念,而是用普通代碼來解決問題,一步步地,你在不知不覺中就懂了 Functors, Applicative Functors 和 Monads。只要你懂普通 JS 你就能懂本文代碼。

二、A Million Ways To Fold Brian Lonsdorf 的演講。在我發表《如何在 JS 代碼中消滅 for 循環》的時候,反對的觀點之一是,我所展現的寫法不是很靈活,一個新需求下來,讓我乖乖改回 for 循環。我理解一些開發者忙於實際開發,學一些太基礎的東西彷佛對開發沒什麼用處,因此不去學習積累。在這個例子裏,我明白了不懂 CS 基礎是會限制想象力的。在這個演講裏,Brian 介紹了範疇論裏面的 F-algebra 和 catamorphism。沒見過這些術語不要緊,只用知道,理解了這個演講,你就能明白,能用 for 循環表達的計算,所有能用 reduce 函數表達。還會有人說,reduce 底層也是用 for 循環實現的!這就好像我告訴你蓋房子要用磚頭而不要直接用沙子,你告訴我磚頭是用沙子製成的。

三、State Monad in JavaScript 在用純函數寫應用時,處理狀態是件很麻煩的事。State 是函數式編程中專用來解決狀態管理的一個代數數據類型(Algebraic Data Type)。這門課會用一個叫 crocks 的庫,學了這門課程你能夠繼續本身探索 crocks 的其它數據類型和工具函數。

四、Safer JavaScript with the Maybe Type 函數式編程不會用 if else 來作空值處理,取而代之的是 Maybe 數據類型。Maybe 讓你在組合函數時不用擔憂空值處理。

五、The Quantum Electrodynamics of Functional JavaScript 讀懂這篇文章,你就明白了 Combinatory Logic (組合子邏輯) 和 Church Encoding (邱齊編碼)。這篇文章只介紹了原理,有人根據這篇文章,寫了兩個庫: church,用 JS 實現邱齊編碼。combinators-js,用 JS 實現全部的 Combinator(組合子)。懂這些東西對你實際寫代碼並無幫助,就好像懂量子物理對建造橋樑也沒什麼用處。

六、Reginald Braithwaite 的博客 上一篇文章也源自這個博客。本打算把我看過的所有列出來的,但實在有些繁瑣了。你們能夠自行翻閱。


6、犯過的錯誤

一、嘗試着一次學太多東西。無論你再怎麼努力,人的時間和精力是有限的,一次能學的內容有限。我在找到開發工做以前的學習階段,還學了 Python 和 Django,花了較長時間,效果也很差。工做後看到機器學習挺有意思,也花了一段時間學。我數學基礎太差,就去 Khan Academy 學本科統計學和線性代數了。後來實在精力跟不上了,就擱置了。之後可能會再去挑戰這個,但仍是要一步一步來。

二、浪費時間學當前階段不適合學的東西。去年三月份學 Andrew Mead 的 Node 課程時,有一天收到他的郵件,說他新出了一個全棧課程,如今購買享受最低價。我一看簡介,一個 JS 框架同時解決了前端後端和數據庫,這個能夠呀,學完我就能作全棧了。而後我就去花了一個月學 Meteor。那時候我 JS 基礎還不是很好,學這種高階的框架也只是記一堆 API,學完後一直沒用過,到如今已經忘光了。

三、不顧人才市場的需求,盲目學暫時用不到的技術棧。在找到開發工做前,個人學習期是比較長的,主要緣由是我一直以爲本身學的還不夠,好多東西還沒掌握。可是我那個時候學的一些技術,並非大多數用人單位所要求的,好比 Rx.js 和 GraphQL。雖然我並不後悔學了這兩個技術,但我以爲我不必在還沒工做時就給本身那麼大壓力。我想不多有用人單位會要求一個沒有工做經驗的新人會寫 Rx.js 和 GraphQL,再說國內用這兩個技術的公司也不多。


7、接着學什麼

一、Haskell 和範疇論我還只學了冰山一角,接下來會繼續學習。學 Haskell 只是在看教程,寫代碼不多,接下來試着用它寫些簡單應用。

二、數據可視化。我一直斷斷續續在 Frontend Masters 上學 D3 課程,可是還沒練過手。D3 也是 API 太多了,要掌握的話得多花點時間。

三、CS 基礎。今年四五月份時,我很認真想學一個在線 CS 學位,恰好我找到了 OSSU。可是我比較沒耐心,我都經過 JS 學到比較高階了,在基礎課程裏面還要用 Racket 學基礎函數編寫,我試着跳過一些課程,可是有些知識是依賴以前課程的,跳過了就聽不懂了。後來我以爲進度實在太慢了就停下來了。可是 CS 基礎我仍是得學的,包括網絡,算法,數據庫,底層語言等。正如我發現的,不懂基礎是會限制開發的想象力的。在合適的時機我會回去 OSSU 繼續學,爭取能學完課程。


後記

基於我這一年多的學習和工做經驗,我想給準備從事前端的朋友一些建議。

首先是不要以爲前端比後端簡單。我一開始是這樣認爲的,後來發現本身錯了。前端要掌握的知識是不少的,前端工程複雜度也在提高。你可能常常聽到前端圈有人說 「學不動了」,國外也有個現象叫 JavaScript fatigue. 你須要基礎學很紮實,才能在技術飛速發展中不感到疲憊和迷失。我也不是勸你不要學前端,而是提醒你,作出決定前要有一個清楚的權衡考量。

要有持續學習的準備。如今是學習者的最好的時代,你真的能在網上學到任何你想學的東西(高精尖核武器製做和火箭技術可能學不了……)。Google 和 Stack Overflow 上能找到你大部分問題的答案。找不到還能夠問,問了別人也答不上來的話,那你已經學到很前沿了。本科學 CS 固然會讓你起步更早,可是若是沒有 CS 學位,如今開始也不會太晚。不遠的未來,若是別人問我學歷,除了真實學歷,我還會很自信告訴對方,個人最高學歷是 OSSU (Open Source Society University, 開源社會大學)。

相關文章
相關標籤/搜索