在上一封信中,我們學習了第一種程式語言 Java 與練習運算思維的方式,在這封信中我們將要正式學習新的語言 JavaScript 與全端網站開發工程師所需後端與前端的知識,學習現代網頁開發框架與工具 NodeJS、Express、ReactJS 與 Redux,內容很多,也許第一時間你會無法完全理解,但不用擔心,我希望提供你的是一張學習地圖,這封信的目的是指引你每個階段學習的重點,讓你專心理解最重要的概念。
同時我也想分享給你,身為一個軟體工程師如何持續成長,運用各種資源不斷學習新的知識並讓自己成為更好的工程師。同樣的在這封信中我只會告訴你需要學習什麼和學習的方式,你需要自己去理解它運作的方式。準備好了嗎?那我們開始吧!
學習第二種語言-建立正確的心態
身為軟體工程師無論你這專精在哪一種領域,都有機會學習第二種語言,在開始學習你的第二種語言之前,我想分享給你一些心態上的建議,他會幫助你減少學習的時間,並很快掌握新的語言的使用。
有了學習新的語言的正確觀念,讓我們正式學習每個網站工程師都要會的語言-JavaScript 吧!
學習第二種語言-JavaScript
現在是2016年,JavaScript 經過多年規範的修改已經和最剛開始被發明時的語法很不相同,很多讓人難以理解的概念也在 ES2015發佈之後被包裝得更友善了,JavaScript 正式同時擁有 Object Oriented Programming 和 Functional Programming 特性,成為一個非常有彈性的語言。
做為入門 JavaScript 的教科書我推薦 Object-Oriented JavaScript (Stoyan Stefanov, Kumar Chetan Sharma),這一本書裡面把 JavaScript 重要的觀念講得非常簡單清楚,其中有四個觀念最為重要,之後面對工程問題也常常使用:
Function 是 JavaScript 的核心,不理解 function 等於不理解這個語言,其中有三個很重要的功能:
有了基本 JavaScript 知識之後,你還需要建立基本的前端開發概念,相關的知識可以在 code school 前端系列課程學習 HTML、CSS 與 jQuery,有了這些知識之後,我們可以正式學習全端 JavaScript framework 和 library。
學習 framework 與 library-建立正確的心態
軟體工程這個產業更迭的很快,不斷會有新的技術被發明,你常常會有機會去學習新技術,然而所有技術都只是工具,需要的時候學就好,選一個你最喜歡的深入去了解它,比每一種都懂基本來得重要,在學習之前,我想分享給你我的經驗,讓你可以快速掌握你從來沒有見過的技術。
學習任何新技術第一件做的事情是理解背後設計的概念,一個技術被發明之所以有很多開發者用是因為他實現了之前沒有的概念,而這個概念是最有價值的,也是你和其他開發者溝通的基礎。
網站開發後端知識
NodeJS 是一個 runtime environment,讓我們可以在瀏覽器以外的地方運行 JavaScript,最重要的兩個概念是 Non-blocking programming 和 Callback function,理解這兩個概念就可以看得懂大部份 JavaScript 後端的程式與各種非同步的 library,我推薦可以由 code school 的課程入門,這個課程把複雜的概念講得非常淺顯易懂,當我們熟悉基本用法之後,可以在 Udemy 找更多課程學習底層的設計和運作方式。
網站開發前端知識
ReactJS 是目前最多人使用的前端框架,基本核心是將前端抽象化為 Component Based Architecture,不像傳統 jQuery 直接操作 DOM tree,ReactJS 操作 Virtual DOM 並做 DOM diffing,只更新修改過的 Component,需要理解三個設計核心:Prop,State 與 Life Cycle。
小結
恭喜你!看完了這一份學習地圖,我了解你一下子接收了太多抽象的概念,可能無法馬上理解,沒關係,所有的人都會經歷這樣的學習過程,事實上,軟體工程就是不斷實作新的抽象概念去解決工程問題,當你習慣了這份學習的焦慮感並在不斷的實作過程中得到成就感的同時,你就成為了一個更好的軟體工程師了。這封信的最後我想用 Redux 發明者 Dan Abramov 的引言做為結尾:
“Be liberal with what you learn, and be conservative with what you use.”
「帶著開放的態度看待你所學習的事物,但謹慎運用。」
所有的技術都只是工具,我們永遠可以爭論哪一個比較好,我們可以有個人的喜好,但真相是,身為一個工程師,我們只是在不同狀況選擇適合的工具去解決問題,我們只是在比較以及權衡利弊之後溝通並做出決定,軟體工程的世界這麼大,永遠有下一個概念被發明,給自己能夠不斷成長的能力,我們永遠可以變成一個更好的工程師,甚至是更好的人。
Photo credit: loverajoel