當一門技術出現之時,總會極盡可能地搶佔鎂光燈,以各式各樣的資訊吸引開發者的注目,然而,開發者蜻蜓點水式地樣樣都學是行不通的。只是,若以不變應萬變,又怕思想或作法上逐漸老舊、落後於時代。在不同技術上的深度學習,對於開發有著絕對的幫助,只是又該如何從中取捨呢?
不同語言的深度學習
對於一門技術,什麼樣的方式才稱得上深度?各個開發者可能有所不同,就我而言,雖然接觸過不少技術,然而,多半只是略略看過,若某個技術確實引發了興致,而且想要深入學習,我採取的方式是為它寫文件,並在這個過程中,記錄下自己的一些想法,學習技術與文件撰寫本身,都需要時間、心力等成本,若一門技術值得我付出這些成本,那它與其他技術之間,必然有著一些不同的概念,值得一探究竟。
就語言來說,值得深入學習一門支援「物件導向」的語言,像是Java,這也是我最先開始深入(而且大量)學習的對象,物件導向的概念雖然遠比Java古老,然而,這概念說是在Java語言上獲得發揚光大,並不為過,各式文件、書籍、研討會主題對設計模式、重構的大量探討,也是出現在Java如日中天之時,這也是為何我在Java上投注如此多的時間與心力。不過,是否選擇Java並不是重點,而是以物件導向為典範的語言,值得選擇一門做深度的投資。
在今日「函數式程式設計」已不算是新奇的概念了,學習一門支援函數式典範的語言是值得的,就我而言,當初接觸到函數式概念的首門語言是Scala,儘管現今對Scala的評論是它有點走偏了發展方向,而且面臨著Java 8的威脅,然而,它在函數式典範的雙重支援,以及試圖讓物件導向與函數式兩個典範並存,就深入學習來說,非常值得——我至今仍記得閱讀《Programming in Scala》中函數式的介紹時,給予我的想法衝擊。
如果你是靜態定型語言的支援者,應該深入學習一門動態定型語言,反之亦然,這會讓你瞭解「定型」的意義、帶來的限制與彈性、思考物件應有的行為等。就我個人的推薦而言,動態定型的語言學習上,Python會是不錯的開始,它在追求簡潔與彈性的同時,亦不失其嚴謹,其背後強大的社群資源,日會也會讓你覺得這是門不錯的投資。
若是想要追求彈性,那麼,可以找一門在「meta-programming」上有著不錯支援的語言,像是Ruby,即使我並不喜歡它,然而還是很認真地研究了好一陣子,因為我對於它如何實作「內部DSL」很有興趣。
在物件導向這方面,像Java、Scala、Python、Ruby等,基本上是以基於類別(Class-based)的方式支援,若想接觸一下不同的方向,JavaScript「基於原型(Prototype-based)」的方式,可以是種選擇,當然,就實用性而言,就現今它在前端當道、後端吃香來說,也是不錯的投資,或許還有個能觀察、學習的重點,那就是「語言的風行與否,與它設計的完美與否不見得有關係」。
前面談到的幾門語言,就現今而言,或多或少都有著函數式的影子融入其中,許多新興的語言也是如此。若你始終對於函數式有著模糊、摸不著內涵的感覺,那麼花點時間,深入學習一門「純函數式」的語言吧!而我選擇的是Haskell,學會其中的概念之後,在Java等語言中應用函數式元素時,也就得心應手了。
程式庫與框架的深入學習
在程式庫與框架等技術上的選擇,更多元了,扣除工作等需求時是否會使用的這個因素,「想要深入學習,就不要在概念上重複」。有許多程式庫或框架實作細節雖然不同,然而核心概念、設計典範類似,面對的問題也差不多,若暫時用不著,稍微翻翻文件瞭解可以,不需要花費時間深入研究。
由於程式庫與框架等技術很多元,這邊就單就Web開發開始舉些例子。可以選擇一個支援「Web MVC模式」,而且不是訴求快速開發的框架來學習,就Java領域來說,就像是Struts、Spring MVC這類框架,以現今來說,這類框架雖然有點麻煩,然而可以控制比較多的細節,也因此可以瞭解到開發Web應用程式時的諸多考量。
儘管現今常見的Web快速開發框架,常「依賴注入(Dependency Injection)」這部份的概念實現,然而,就元件、程式庫或框架間的銜接來說,支援這個概念的框架可以學習,像是Java界的Spring,其中有關於各層元件之間如何整合,是非常值得瞭解的部份。
現今在不少語言領域,都找得到「Web快速開發框架」,你可以選擇一個來深入學習,多了就不必要了。雖然各家在設定、程式撰寫、元件、語法等各有所長,然而,就快速開發的流程而言基本上相同。如果你從沒獨立學習過一門「ORM(Object-Relatonal Mapping)」框架,趁這個時候深入瞭解一下,Web快速開發框架的永續層,通常都是ORM,這益於瞭解物件與關聯式模型在對應時,所要考量的一些議題。
工具的深入學習
在這邊對工具的定義是,它不會是最後上線產品的一部份,然而會是開發過程中需要參與的一部份。這方面我比較尷尬,因為有的工具,我並沒有為它寫過文件,理由可能是它在發展、變化上很快,特別是指令的部份,不過,我確實對這類工具,曾經系統性地閱讀過兩、三本書以上。
事實上,你應該深入學習一門「測試」工具(框架),這類工具通常不難,而且多半是基於xUnit,重點在於吸收其背後如何對程式進行測試的概念,以及其引發而來如何改進程式品質的方式,無論你是否贊同TDD或BDD,也可以進一步瞭解一下,這是不同的開發方式,對於後者,除了學到如何測試,也可以學到如何應用DSL。
現今應用程式日益龐大,一個應用程式當中往往使用數個模組,而各模組又會有其各自相依的模組,模組的管理是個大問題,就連JavaScript也開始需要使用Bower這類工具,來「管理模組相依性」,因此,你需要知道這類工具的存在。進一步地,也許可以學習一門「自動化建構」工具,像是Java界的Gradle、Maven,這類工具往往也有著管理相依模組的能力。
學習一門「版本控制」工具,就現今而言,是絕對必要的,無論是集中式,或者是分散式版本控制作為開始都好,重點是能從中深入學得版本控制可能面對的各種情況,以及應對的方式;「虛擬化工具」是個值得瞭解但很廣的主題,可以的話,試用幾個虛擬化工具,選擇一個有興趣的、開始深入瞭解,某些程度上,這也與版本控制有關,因為你也會面對不同版本的開發環境需求。
不追逐重複的技術
喜好新知的開發者,會從許多管道獲悉最新的技術趨勢,然而,必須知道的一個事實就是,有些頻繁出現在鎂光燈前的技術,實際上是在解決相同的問題,它們可能宣稱這樣、那樣,極力強調與前一個方案的不同點,然後吸引了一群人投入,接著,若干時間出現了不滿意的一群人,又創造出一個技術出現在鎂光燈前,然後歷史就這麼反覆重演。
當然,篇幅有限,沒辦法列舉我摸過的技術中,有哪些背後概念值得學習,每個人的學習順序也不盡相同,不過可以強調的是,如果一門技術,沒辦法從中沒學到任何的新典範、得到新的啟發、解決不同的問題,就不用因為目前有鎂光燈聚焦,而花費過多時間追逐;反過來說,若是發現技術上,有值得深入的典範、啟發等,學習過後,往往日後在面對另一個概念類似的技術時,也能派得上用場!