我的程式學習之路—如何克服自學程式語言的挑戰

打從內心深處覺得自己跟科技有密不可分的關係?總是想嘗試所有最新、最有趣的科技應用裝置?或是想要參與創造可以改變世界的科技?是,以上都是我對於科技的熱情,當然每個人對於科技有著不同程度的情感,如果你跟我一樣非本科系出身,卻又對於科技感到無比的狂熱,很可能地,你也曾經想過要自學程式語言。本篇文章的目的,是和正在自學程式語言的人分享自己的學習經驗,並希望能夠對你有些幫助。

我從2014年底開始接觸網站前端開發,利用 HTML 和 CSS 進行網站排版和設計,2015年上了一些線上課程如 codeschoolUdacity,然後看了幾本 JavaScript 和 Node.js 的書籍,如 JavaScript & jQuery: The Missing Manual, Eloquent JavaScript, Node.js in Action,也在 codewars 和 Project Euler 上練習用演算法解數學問題,現在則透過 edX.org 修習電腦科學基礎課程。

對於非本科系的人而言,在學習程式語言的路上最大的困擾是週遭沒有什麼人熟悉電腦科學及程式語言,所有的資源都必須自己一步步收集,所有的知識網絡都必須自己建立。對於初學者而言,真的困難重重,而我認為以下三點是最大的挑戰:

1. 了解語法 (Syntax),只是開始


大多數的線上課程教的是程式語言的語法 (Syntax) 或是開發框架的慣例 (Convention),就像英文的文法和慣用語一樣,這些規定是軟體開發的基礎,當你花了好一段時間總算熟悉了這些基礎後,才發現這只是剛開始而已,若要嘗試實作比較複雜、有趣的功能,可能就得透過 API 介接第三方服務,或客製化既有套件,過程中發現整個專案愈來愈龐大,馬上就超乎自己能夠理解的程度。

2. 高度抽象的軟體物件


除了 CPU 效能數據及使用者介面的變化之外,初學者幾乎看不到軟體內部的運作。什麼是 Socket?什麼是 Asynchronous?什麼又是 Event Emitter?軟體的世界裡充滿了許多抽象的專有名詞,雖然有時候可以透過與實體世界的關聯性去理解,不過還是經常不同,而這些抽象的軟體物件功能又非常強大而且相當重要,於是會經常發現自己在一個高度抽象的世界裡打轉。

3. 在雲霧中解構軟體組成


程式設計的主要工作在於定義軟體組成,設計資料格式和存取資料或執行演算法的各種函式。軟體專案內的各個檔案的用途是什麼?各個模組背負著什麼樣的功能?模組內的函式群又各自有什麼功能?模組和模組之間如何進行資料交換?欲替這些問題找到解答實在沒有捷徑,把程式碼從頭開始一行、一行的解讀,隨著判斷邏輯在不同檔案和行列之間切換自己的視線就是唯一的方法,當然,這對初學者而言並不容易。

四個步驟克服挑戰


上面的三個挑戰都屬於技術層面的障礙,並非無法克服,透過反覆不斷的閱讀及練習可以提升自己的掌握度,而對於初學者而言,如何能讓自己維持反覆不斷閱讀及練習的動機,或許才是關鍵,以下四個步驟是我認為非常有幫助的方法:

1.掌握原理


每一種科學領域,不論外表看起來如何的令人難以接近,都是建立在某些基本原理之上,若能徹底掌握底層原理,所有上層的應用都會變得容易理解。經常被譽為自學天才的真實世界鋼鐵人 Elon Musk 被問到「為什麼你可以學得這麼快?」時回覆:把知識的整體視為一顆大樹是很重要的,如果我們先把一門知識的基本原理搞清楚(樹幹和大樹枝),再開始了解細節和應用(小樹枝和樹葉),這些小樹枝才不會因為沒有可以依據的地方而被迫『長在空中』。畢竟,長在空中的知識不會穩固,也不可能持久。

2.呼朋引伴


維持自己學習動機的方法之一就是想盡辦法把自己放在有同樣想法的群體裡,參加別人所舉辦的活動總是有成千上萬個藉口無法參加,最棒的辦法就是自己辦一個,主題自己想,利用社群媒體成立興趣團體,積極認識這個領域的新手和熟手。我在2014年8月成立 Taipei Beginner Programmers meetup 團體,在今年7月開始了「12 in 12 挑戰計畫」,接受挑戰的人將在 12 個月內,每個月完成一個軟體專案,題目及規格自己設定,參加的人在每週的聚會上向大家分享自己過去一週的進度,並於每個月的最後一週進行成果 demo。

來參加 12 in 12 挑戰計畫的朋友們背景很多元,有產品經理、軟體工程師、設計師、創業家等,每個人的專業和領域都不同,所以每個人都像是一本書一樣豐富。每次聚會中總會有資深軟體工程師可以為初學者解惑之外,在聚會中大家共同關注的主題就是彼此的專案內容、執行進度,並互相督促,「你這週做了什麼?」已成為這個聚會的問候語。

3.創造至上


「創造」會產生莫大的成就感,藉由動手創造,維持繼續努力學習的動機,並可藉此了解自己的技術水平。對於參加12 in 12 挑戰計畫的挑戰者,我們鼓勵用下列的原則完成每一個專案,讓自己持續創造、持續學習。

學習原理與新技術:每一個專案都學習新的技術

  • 在一個月內完成:每ㄧ個專案都在一個月內完成
  • 保持參加駭客松的心情:每一個專案都以參加駭客松的心情進行
  • 4.永不放棄


    程式設計本來就不是一件簡單的事情,特別是對於非本科系的人而言,即便是本科系出身的人也很有可能經歷過這樣的階段。拿手的事情做起來當然簡單,但一直做簡單的事情又有什麼意義呢?永不放棄是克服自學程式語言挑戰的最後一個步驟。有想做的事情就一定要試著動手把它完成,尋求夥伴協助和支援,即使最後失敗了也用不著氣餒。

    Whatever it is. Let’s get it done.

    Photo Credit: Bao Wen Chen