由於我自己是一個活生生地從業餘寫程式轉職到職業軟體工程師的例子,身邊自然會有一些對於入這一行也有興趣的朋友問我「如果想開始學寫程式該從哪裡開始入門」的問題。這確實是一個值得分享的話題,我這篇就盡量就我的個人經驗來回答。

示意圖:取自我近期開發的「shrewd」套件原始碼
示意圖:取自我近期開發的「shrewd」套件原始碼

入門評估

為了避免浪費讀者的時間,我想我最一開始先從最殘酷的事實講起:並不是每個人都適合學寫程式的。在考慮入門學寫程式之前,建議先評估自己是否具備如下特徵:

  1. 自學能力強。
    這點很重要,尤其在今天學程式要學的東西真的非常多、知識更新也很頻繁,如果欠缺自己上網找資料自學的能力,那會非常吃虧。
  2. 足夠的英文能力。
    基本上所有的程式語言都是用英文來撰寫的 1,所以至少不能夠看到英文就怕;是未必一定要有能力讀英文的參考文件,畢竟現在中文的書籍也很多,不過如果能讀英文,免費的資訊會更容易取得。
  3. 性向方面偏向理科,對於數理邏輯、益智、推理等等的東西有興趣。
    寫程式是一連串解決問題的過程,本來就喜歡解問題的人比較適合走這一行。不愛動腦筋的人肯定是不太適合的。
  4. 喜歡玩樂高、DIY 或手工藝之類的東西,或是愛拆機械來研究其原理。
    寫程式本質上也跟做這些事情差不多,只是變成是拿程式碼來組合出自己想要的東西。
  5. 基本的打字能力要有。
    即便現在有很多自動完成功能,寫程式碼仍舊免不了會需要打很多字,如果打字能力欠佳的話最好先練一下。
  6. 有滿多時間可以用來學習的。
    我不想騙人,不管學什麼都西都需要砸時間下去,尤其是剛入門的階段。如果讀者已經出了社會在工作,白天沒什麼空閒,晚上回到家又很累,假日時間又大多被家庭佔據掉了,這樣恐怕是很難學成的。

如果讀者覺得自己符合上述特徵,那恭喜,你大概學程式沒問題!請繼續看下去吧。

話說當年……

我先簡單描述一下我自己最初最初是怎麼開始學起寫程式的。在我的老家新竹有一個公司叫「華※資訊」2 是專門教國小兒童學電腦的,他們會跟新竹各個國小合作、借一間教室來佈置成他們的電腦教室來開課收學生。沒記錯的話我可能從小一就去上他們開的電腦才藝班,學一些繪圖或文書軟體之類的使用方法。後來我把他們一般開的課都學完了之後,他們在總公司另外有開一門「程式設計班」是要放假的時候專程跑到總公司的教室去上的(顯然是因為這門課太小眾了,即使放眼全新竹市的小朋友也湊不到多少人能開課),也忘了當初是他們問我還是我自己有興趣,反正結果就是我去上了。

奇特的是,當時這門課的內容竟然不是教任何一種比較為人熟知的程式語言,而是教 dBASE,也就是在 DOS 的那個年代中很流行的一套資料庫系統。那為什麼不是叫資料庫班而是程式設計班?關鍵就在於 dBASE 這套資料庫也有它自己的一套程式語言可以用來直譯語言的程式,所以我們基本上就是一邊學資料庫,一邊學怎麼寫程式去操作我們的資料庫。dBASE 的語言雖然很陽春,但是一些基本的概念像是變數、迴圈、函數等等在裡面都是存在的,而且只要算準在螢幕上的位置,他也可以在螢幕上用文字符號的方式畫出 UI 來(那個年代很多 DOS 軟體也都是這樣繪製 UI 的),加上寫出來的程式後面還有一個資料庫可以玩,其實是可以做很多有模有樣的事情的。我如果沒記錯,這個班好像前後是要上一年的課,而最後我用了那個語言寫了一套功能完整的圖書館管理系統:使用者可以新增搜尋書目、管理會員以及書本出借狀況等等,當時我是國小五年級左右。

之所以我覺得這是很值得一提的故事,是因為我覺得這裡面點出了很多重要的精神:

  1. 就像很多人說的,一開始學什麼語言真的不是很重要,因為各種程式語言的觀念相通性很大,學懂了一個其它的都很快。dBASE 語言後來很快地就淘汰沒人用了,但是從那個經驗衍生至其它的程式語言都很容易。在那之後,我幾乎所有的程式語言都是自學的,沒有上過任何課、除了上過一次 VB 的課之外,但是我上那門課是為了想看看能不能學到什麼我自己在書上學不到的東西,而結果基本上並沒有。
  2. 我認為學寫程式非常需要以目標為導向。也就是說,必須要最後能做出一個可以交差的東西,學起來才會有動力。我看過很多教程式語言的教材,很有系統地從基本觀念開始講起、乃至比較進階的語法和函數使用,但是學生往往不知道學這些東西可以拿來做出些什麼;我認為,一旦最基本的概念有了之後,學程式就不用再太講究系統了,應該反過來,針對腦海中想要做出的成品,直接學跟它相關的程式語法和技巧,這樣才能夠感受得到「待解決的需求」和「解決它的程式寫法」之間的鮮明關聯,而學寫程式,最重要要學的正是如何「把需求轉換成程式」的思考方法。這就好像是數學家的思考是「把命題轉換成證明」、木匠的思考是「把設計圖轉換成加工步驟」是一樣的道理。
  3. 雖然說一開始學什麼語言不重要,但是對於入門者來說,拜託不要先從難懂的(例如 C++ 或甚至 Assembly)學起!那些學習門檻高的語言很容易把入門者的興趣馬上消磨殆盡的,而且要用那些語言寫出可以亮相的成品是非常困難的,這也違反了前一個原則。

所以如今回想起來我覺得華※的課程拿 dBASE 作為學程式的入門是意外地很合適:首先其語言跟多數腳本語言一樣很簡單好學,小朋友也能懂;再來它可以順便學資料庫操作,而有了資料庫就可以寫出很多很具實際應用價值的程式出來(例如帳本、通訊錄等等),不會只是很白痴地「在螢幕上畫個九九乘法表」這種即使寫出來也覺得很沒用的程式。當然,基於 dBASE 已經被淘汰了等種種理由,過了 20 多年後的今天我不可能會推薦大家也從這個開始學起;然而上述的三個基本原則是我認為即使過了 20 多年也沒有改變的。

回到今天

那有沒有什麼東西是 20 多年後的今天跟當年不一樣的?當然很多,而這些不同之處,有些讓學習變得容易,卻也有些讓學習成了很大的困難。我先從麻煩的地方講起好了。

  • 稍早我說過學程式應該要目標導向,但是在資源充斥的今天,要找到目標反而變困難了;因為 90% 的情況中想要的程式都已經有人寫出來了,沒有什麼動機自己再寫一次。
  • 今天的程式語言種類遠比過去要多,這使得入門時的選擇障礙會更嚴重。當年的話,要走職業就學 C、要走理論就學 Fortran、想業餘玩玩的就學 QBasic,其它的選擇一隻手也能數出來;但是今天職場上會用到的核心語言隨便數一數也有十來個,而且全部又同時都能夠走理論和玩業餘。
  • 不只是程式語言而已,在程式語言之上還有框架要學。C# 上頭有 .NET MVC 跟 Blazor、JavaScript 有 jQuery, React 和 Vue.js、PHP 有 Phalcon 和 Laravel、Python 有 Django、就連不是程式語言的 CSS 都有 BootStrap,然後這些框架又各自有一大堆的外掛;然後還有「開發用語言」,像是 JavaScript 的 TypeScript、CSS 的 SCSS 等等,這些隨便講一講就把入門者都嚇跑了。
  • 更傷腦筋的是,今天要做出一個能亮相的成品,幾乎沒辦法只是學一個東西就能一口氣作到尾,連寫個網頁起碼也要會三個東西(HTML, CSS, JavaScript)才能勉強做出基本的東西來。原因是因為現在程式語言的分工變複雜了,沒有一個語言一個框架就會試圖搞定所有的事情,都是要互相合作才能做出成品。
  • 上面我講的這幾點總結起來就是「進場時機太晚了」:別人是積年累月地跟著程式的演進把東西逐漸學起來的,但是現在你要學就得一口氣把那些東西全部追趕起來;這就很像一款手遊已經推出了很久,別人是從遊戲封測就開始在玩的,花了很多時間練等級存資源,玩到現在戰力已經好幾百萬了,結果這個時候你才要跟風開始玩,可想而知地你要追上別人真的是會辛苦很多。

那優勢的地方則有:

  • 最大的優勢就在於資訊比當年要發達太多倍了。當年我不管要學什麼都得跑到電腦書店去翻好幾個小時的書,好不容易找到一本有我要的答案,然後再買回去慢慢看,照著做還未必馬上就能成功,可能還會遇到解決不了的問題;但是現在網路上要教學有一堆免費的線上課程,要參考資料多得是詳細的規格文件,有疑難雜症多得是網路群組可以發問,只要會利用這些資源,不花錢也能學得很好。
  • 開源風氣的盛行也讓我們可以很容易觀摩別人是怎麼寫程式的,這可以讓人學到一些像是架構層面以及方法論等等透過文字未必容易表達的實戰技巧;而當規格寫得不夠清楚的時候常常也可以直接去看對應框架的原始碼(像我自己就非常常跑去看 .NET Core 的原始碼)搞清楚其內部運作機制,以便實現更進階的串接整合。
  • 很多功能都已經有人寫好現成的套件,花個幾分鐘搜尋比較一下套件、就可以省下好幾小時或甚至好幾天自己寫類似程式碼的力氣,開發功能完整的專案比以前要容易太多了。
  • 此外現在的工具也遠比以前更發達:很多軟體(包括我最推薦的 VS Code)都能針對任何程式語言進行標亮語法、提供自動完成和智能檢查等等,以幫助新手避免犯錯;偵錯工具也都比以前更強大而好用,不僅可以逐行執行,即時檢查變數值,還能監看網路傳輸跟垃圾回收狀況等等;此外還有一大堆線上的 Playground,可以讓人在完全不用安裝任何編譯環境的情況下,直接練習寫程式並觀察執行的結果。
  • 總結起來,再次用手遊的比喻,你現在才開始玩的話,現在你可以領一堆之前的人沒有的新手禮包,而且新推出的角色和裝備也比較強,你只要夠肝就可以用比前人更快的速度衝戰力。

那麼要回到重點了;在現在這樣的時空條件之下,我會對想入門學寫程式的人作出什麼建議?

尋找目標

首先我一樣主張目標導向是非常重要的;而既然這個年代現成的程式這麼多,那解決的辦法就是你得更努力地去找屬於自己的目標。打個比方,已經被畫過的漫畫故事越來越多,新的漫畫家要想出一個和過去都不相似的新故事當然難度越來越高,可是他們除了更努力去想之外,也沒別招。幸好,你不一定要找一個目標是寫出一個很多人會想要用的程式,你可以完全針對你自己的需求來量身打造一個你自己專用的程式,這樣一來不但鎖定目標比較簡單,寫起來也會更有動機。

而既然是針對你自己的需求設計的,也就只有你自己能知道你想要什麼,但是你可以從下面兩個問題之中去尋找方向:

  1. 在你的日常生活中,有沒有什麼動作你經常反覆操作、或是手動計算非常困難,希望電腦或手機能幫你自動處理的?
  2. 你有沒有資料、數據、筆記或是檔案很混亂,想要比較好的管理,但是你沒看到現成的程式在管理的方式上滿足你的需求(例如它們的操作不符合你的直覺、資料輸入不方便、分類方式不是你要的……)?

我舉幾個我自己寫過的小程式來說明。

  • 我大概從國中開始玩網頁設計,其中一個需求就是我要找出指定顏色的十六進位色碼是多少,可是那個年代很多計算色碼的小工具都寫得很爛、很不直覺,我就乾脆自己用 VB 寫了「北斗色碼識別器」,讓使用者可以用各式各樣的方式拉出他想要的顏色並且轉換成色碼。而結果那個小軟體竟然在滿長一段時間裡面很受到其他也在寫網頁的國人的好評。

隨便在網路上找的截圖;竟然還有人幫我做了使用教學 😆
隨便在網路上找的截圖;竟然還有人幫我做了使用教學 😆

  • 高中的時候,正值 Unicode 剛開始流行、但是大部分軟體的核心編碼卻仍是 Big5 的過渡年代。為了方便把那些 Big5 不支援的字元呈現在網頁上,我又寫了一個工具「北斗字碼轉換器」去作這樣的轉換。這說來也妙,過了 15 年後,大概在幾個月前,我竟然還收到有人基於興趣寄信來向我索取該程式的原始碼。
  • 我唸大學的時候對西洋棋謎題很感興趣,為了方便分享謎題,我寫了一個工具可以讓我隨意編輯棋盤狀態(大部分現成的西洋棋軟體只能用來擺符合規則的盤面,但是我需要更大的自由度),然後轉換成 BBS 用的格式以便我能轉貼。另外我也寫過一些幫助我解決西洋棋謎題的程式,會針對一些特定類型的題目自動算出答案。
  • 我在準備 GRE 考試的時候,曾經寫過一個幫我背單字的程式,會用所謂的間歇性記憶法來不斷幫我複習比較不熟的單字。
  • 我在美國唸書的時候,學校的電腦基本上都沒有中文輸入法,而網路上又找不太到針對注音設計的線上輸入法,所以我自己在我的網站某處寫了一個線上版的「ㄅ半輸入法」,以便我臨時想要用學校電腦打中文的時候可以頂著用一下。
  • 我從很久以前就有記帳的習慣,最早我是用 Excel 來記帳,並且寫了很多公式來讓 Excel 能自動算出我要的統計數據。現在進入到智慧型手機的時代,需求進化到了希望可以隨時隨地記帳而同步資料到網路上、但是又要能允許離線使用,以及更方便的使用者介面等等,再加上我對記帳的分類以及預算控管有很獨特的理念,別說 Excel 了,現有的一堆手機記帳 App 也不能滿足我所有的需求,所以我就又乾脆寫了自己的 Android 版記帳 App。
  • 最近則因為我有在研究摺紙設計的關係,也有輔助摺紙設計的程式正在開發當中。

類似這樣,這些大多都是我自己的個人需求,但是都非常適合用來練習寫程式。因為長年來我三不五時就會寫一個類似上面那樣的程式,累積的經驗就已經夠我一旦開始做起了軟體工程師的工作,只要再稍微多學一點維護大型專案的方法論之後馬上就能進入狀況了。我給讀者的最大建議,就是如下的入門步驟:

  1. 從各位自身周遭的需求去尋找可以被寫成程式的題材。
    這個題材也不能難度太高,例如我並不建議各位試圖寫遊戲軟體來入門;遊戲軟體往往牽涉到很多圖形處理和演算法,並不適合新手直接挑戰。如果可能的話,盡量選擇處理的對象是文字或數值的程式,會簡單得多。功能的多或少倒不是大問題,因為你可以慢慢地把想要的功能一個一個實現。
  2. 選擇一個適合用來寫該題材的程式語言來學。
    不過講真的,到了 2020 年的今天,這個問題的答案已經開始模糊了,因為只要透過一些框架,幾乎任何的語言都可以用來寫任何的東西。所以關於程式語言的選擇,我底下再細談。
  3. 如果完全沒有程式的基礎,先有系統地照著線上課程或教材來學習基本觀念。
    你至少應該要會的基本觀念包括:變數、數值運算、字串操作、陣列、條件式、迴圈、函數。教材中有習題的話盡量做!那些也是好的練習。
  4. 不需要把課程或教材全部看完;基本觀念有了之後就直接來試著撰寫選定的題材的程式,過程中有遇到寫不出來的部份再針對性地去找解法。

程式語言建議

所以到底應該用什麼程式語言入門?我認為一個適合入門的語言需要平衡地考慮語法的簡單易學、學習樂趣、應用廣泛度、未來成長性等幾個元素;若是把這些都衡量進去,我個人頭號推薦的語言會是 JavaScript,其次是 Python。雖然很多人主張 Python 學起來比 JavaScript 更簡單,這點有可能是真的,但是我會稍微傾向於推薦 JavaScript 有底下幾個理由:

  1. 近年來有一個明顯的趨勢是逐漸把應用程式變成網頁的形式,而網頁前端的程式語言,說穿了就只有 JavaScript 一個 3,所以非常有可能在讀者學寫程式的道路上遲早是需要會 JavaScript 的;反過來 Python 倒未必,因為沒有什麼領域是非得要用 Python 來寫不可的。
  2. 在當前比較流行的各種主要程式語言之中,JavaScript 的語法和其它多數程式語言比較類似,容易切換,而語法和 Python 類似的語言則很少。
  3. 雖然學 JavaScript 意味著你必須同時順便學 HTML 和 CSS(除非你純粹寫 Node.js 的命令列程式),但是後面這兩者結合起來的排版系統、發展至今已經在各方面的表現都遠超過其它任何一種 UI 設計的語言,這使你可以輕易地用網頁做出比其它任何語言(包括 Python)要更好看、更具 RWD 的使用者介面。
  4. JavaScript 的強項本來就是設計高度互動、強調使用者體驗的前端應用程式,我認為這跟多數入門者會想追求的目標比較有關;相對來說,Python 的強項應該是演算法和後端程式,這離多數入門者比較遙遠。
  5. JavaScript 可以完全不安裝任何軟體,在任何電腦上用內建的純文字編輯器(例如記事本)即可撰寫,並且用內建的瀏覽器就可以執行。對於新手來說,可以將安裝軟體的困擾降到極致最低 4。此外現在的 JavaScript 本身就內建有 IndexedDB 的資料庫功能,所以完全不用額外安裝資料庫軟體也可以撰寫資料庫的程式 5

不過撇開上述的個人主觀意見不提的話,這兩者都是很值得學的程式語言,應用都很廣,而且學成了都是可以發展成正職的。

另外一個各位在選擇學哪一種程式語言的重要考量當然就是資源;在你的學習過程中一定會遇到很多疑難雜症,而雖然說現在網路上可以發問的平台也很豐富(尤其如果你英文沒問題,StackOverflow 論壇集結了來自全世界的專家可以回答任何從入門到超級專業的程式問題),但是一個無可取代的重要資源還是你身邊直接有一個高手可以幫你看程式碼並直接教你,所以如果你周遭剛好有會寫程式的人可以請教,那你絕對可以考慮跟著學他最擅長的程式語言。

入門篇大概就是這樣囉!至於已經有一些基礎且也寫過一些小程式,想更進一步的話,改天我再用另一篇分享經驗吧。


  1. 是有些人硬是把一些既有的程式語言發明了中文版本沒錯,不過相信我,你不會想要用那些東西的。 

  2. 為避免置入性行銷之嫌,名字稍微馬賽克一下;不過如今他們的官網已經連不上、且臉書專頁的最後貼文也停留在 2017 年,可能現在已經不在了。 

  3. 其它任何用來寫前端的語言或框架到頭來終究是要轉譯成 JavaScript 或是用 JavaScript 載入,而且也不可能不會 JavaScript 就能用那些東西。 

  4. 當然正所謂「工欲善其事必先利其器」,我也不會建議各位真的用記事本硬寫程式,裝個例如 VS Code 這樣的好工具還是推薦的。 

  5. 雖然 IndexedDB 跟各位在別的領域較容易遇到的 SQL 資料庫很不一樣;詳情可以參考我之前的這篇文章。 

分享此頁至:
最後修改日期: 2020/07/29

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。