前言

相信很多人在這資訊爆炸的年代,也想參一咖來學點程式設計,對於理工學生來說,會寫程式就跟會講英文一樣重要,在處理科學數據往往都需要程式的輔助。對於商管文組學生,會寫程式也許不是必須,但是稍微懂程式卻很有幫助,不僅能懂工程師在想甚麼,對於日常文書處理也許也能寫個小程式簡化繁冗苦工。

Hello World

我該如何開始學程式?

當你想要學程式語言,我覺得可以考慮以下幾種方式:

  • 去買/借「XX 程式語言入門」的書
    這其實是我最推薦的方式,以我個人經驗,看書是最有效率的方式,書已經很有系統地整理學習的單元,通常這類基礎入門書差異不大,可以挑一本中意的入門書。

  • 線上教學平台,找「XX 程式語言入門」的課程
    比較有名的我挑幾個介紹。台大、清大、交大的開放式課程網站都有很不錯的課程,會放上去的一定是好課,所以可以安心享用,台清交學生自己也是這樣學的。Coursera 課程幾乎都是由比較會教書的國外大學教授開授,基本上都英文,但有中文字幕,不買證書的話可以免費學習。Hahow 是中文的商業課程平台,普遍是業師開課,課程費用大約一兩千,我買過一堂課覺得課程內容和價錢相比 CP 值很高。

  • 才藝交換/找人教
    我曾經和一個設計師交換才藝,他教我畫畫,我教她程式,如果你有認識這樣的朋友,這種模式應該會很有趣。當然你也可以找個家教,或是找朋友教你,請他吃個下午茶學一課,你的工程師朋友應該會很樂意的。

  • 網路上的各種入門教學
    我比較不建議這種方式,對於初學者來說,很難判斷網路上的資源水準,同時網路資源過於零散,初學者也很難判斷學習路徑。但如果有認識朋友,可以請他替你規劃這些學習資源,有經驗的工程師可以判斷哪些東西要先學後學,以及那些東西該要去學哪些是不一定。

    所以我不建議自己 Google 「Python 入門」,自己搜尋雖然是好事,但因為搜尋到的資料不一定能真的幫到你,也有可能反而害了你,最好的辦法是找有經驗的朋友幫你過濾網路資源。

我該挑怎樣的程式語言學?

該學怎樣的語言我覺得分為兩類,如果你是商管文組,程式設計對你最重要的是學懂程式設計的概念,以及能用程式解決日常小事,例如簡單處理數據,會寫簡單程式之後也比較容易聽懂工程師在講甚麼以及和他們溝通。

如果你是科學工程相關,那你對程式設計要有個進一步的理解,因為熟知程式的各種細節對於處理問題有根本上的影響,不管是程式架構或程式效能,都需要有良好的設計,因為不管在科學研究或是業界產品對程式都會有比較高的要求。

根據以上兩種類型的人,我推薦的入門語言為:

  • 商管文組:Python
  • 科學工程:C/C++

商管文組為甚麼該學 Python?

選擇 Python 的原因是因為他夠簡單,沒有複雜語法,同時省去了一些比較進階的程式語言概念 (學 C++ 才需要懂的),對於初學者來說是非常新手友善的。

Python 是直譯式語言,意思是你寫程式的時候可以寫一行跑一行,這對於初學者也很方便,你不需要一次寫完程式才能跑。

舉例來說你可以使用 Python 做到以下效果:

image

首先打開終端機 (或稱作命令列),> python 意思是呼叫 Python 出來工作。

>>> 代表使用者輸入,所以你可以看到我是一行一行輸入,每輸入一行他就會立即執行那一行,當我呼叫 print() 時,他就馬上輸出數值出來。

如果沒有理解這張圖片在幹嘛也沒關係,一般的教學會解釋你該如何開始撰寫程式碼。上面簡單來說是強調程式開發的介面「互動性」很高。

學習 Python 的時候,你就可以照著書本或是課程影片,一邊進行輸入,觀察輸出的結果,因為實際動手對於理解是最有幫助的了。

隨著書本安排的內容,一步一步把「變數宣告」、「if else 判斷」、「for 迴圈」、「函式宣告」、「引用函式庫」、「檔案輸入輸出處理」等等重要觀念一個一個學起來,同時過程中嘗試寫一些小小的程式來做練習,例如怎麼用程式找出 1000 以內的所有質數。

Python 的好處是,你還可以使用 Jupyter Notebook 這類視覺化工具來寫程式,Jupyter 是一個網頁介面,讓你可以用互動的方式寫 Python,所以你甚至可以不用懂甚麼是終端機/命令列,那寫起來會更加輕鬆。

Jupyter 介面如下:

image

學會寫簡單的 Python 之後你就可以做到一些簡單的工作,像是幫所有檔案重新命名,或是讀取一個 csv 檔案,算出平均和標準差。而且現在資料科學和機器學習都是使用 Python,如果你對這方面有興趣也很容易找到更多相關資料。

理工為甚麼該學 C/C++?

C/C++ 其實是分別指 C 和 C++,C 比較早誕生,C++ 比較晚是 C 的改良版,這兩個目前都廣泛使用。

為甚麼推薦 C/C++ 呢?

最重要原因是學習 C/C++ 的過程會更深入理解計算機原理,其中最重要莫過於可以操作記憶體,也就是所謂的指標 (Pointer) 概念,Python 或 JavaScript 這類語言因為把操作記憶體藏起來了,所以辦不到。

在處理工程問題時,有效的運用記憶體資源往往是重要的因素,能處理記憶體我們才能做到精準有效控制記憶體。這也是 C/C++ 寫出來的程式鐵定會比 Python 寫出來的程式還快。

學習 C/C++ 方法其實也跟 Python 一致,隨著書本安排的內容,一步一步把「變數宣告」、「if else 判斷」、「for 迴圈」、「函式宣告」、「引用函式庫」、「檔案輸入輸出處理」還有重要的「指標」等等重要觀念一個一個學起來,同時過程中嘗試寫一些小小的程式來做練習,但比較不同的是,C/C++ 是編譯式語言,所以你必須一次寫完,然後編譯你的程式,才能執行編譯好的程式。

值得注意的是 C++ 多了物件導向 (OOP) 和模板 (Template) 的概念,建議初學者一開始可以不用去懂這兩個主題。

C 語言在嵌入式系統和作業系統廣泛使用,想要入門這些領域的同學推薦學習 C。

不然我會推薦直接學習 C++,C++ 歷久不衰經得起時間考驗,基本上大部分的大型應用程式,瀏覽器、單機遊戲、影片編輯軟體等等,幾乎都是 C++ 所寫成的,此外要寫系統程式 (System Programming) 也會使用 C++,C++ 應用之廣作為理解程式語言和計算機原理的入門語言最適合不過。

然後學完 C/C++ 後,你還需要把 Python 也學會,因為你不會想要用 C/C++ 來處理簡單的小任務,太麻煩了!因為你已經會 C/C++,學 Python 應該如魚得水!

那一定要先學 Python 或 C++ 嗎?

世界上有太多語言了,你可能會問那為啥不學 Java、Rust、JavaScript 等等?

當然,Python 和 C++ 只是我推薦的,你仍然可以學習其他語言,畢竟程式語言的基本概念是相通的。

不過在我看來學習其他語言會造成某種程度上的障礙,Python 的類似語言有 JavaScript,但 JavaScript 大多數時候程式運行的概念需要懂甚麼是「同步/異步」,這對於初學者來說已經太難了,總之就是個進階的觀念。

C++ 類似語言有 Java 和 Rust。Java 雖然算是編譯式語言,但也沒有指標概念,雖然也廣泛使用,但顯然在處理記憶體沒有 C++ 好。Rust 雖然具有指標概念,但是因為語言本身強調安全性,所以多了所有權 (Ownership)、生命週期 (Lifetime) 這兩個概念,事實上寫任何語言都需要懂這兩個概念,但絕對不是一開始就要懂,通常是比較進階之後才會去學,Rust 強迫你一開始就要懂,對於初學者來說門檻太高。

所以選擇其他語言我實在不太鼓勵。

程式入門之後呢?

我常比喻學程式跟學英文很像,都是必備能力且易學難精,程式入門相當於全民英檢初級,大家都稍微會講了,但程度還很淺,後續還要經過大量練習和努力才能學得更好。

想想我們怎樣學英文的,就是透過大量閱讀和寫作,而寫程式也差不多是一樣方法。除了多練習,更進一步還要透過學習電腦科學的基礎知識,才有辦法更上層樓。

練習程式

透過練習是最有效率的學習方式,能驗證自己是不是真的學會。我推薦學完一個概念可以去「高中生解題系統」練習,點選裡面的「分類題庫」,可以快速根據你學到的概念作練習。

image

比方說以這題 「a006: 一元二次方程式」,就是要解一元二次方程式,那其實就是運用我們國中學過的公式解來算,過程中你會需要能用數學函式庫來算根號,以及懂如何用 if 來判斷 $4ac-b^2 >= 0$ 來知道是否有實數解。

對於程式初學者來說,把 a 開頭系列的題目都練習過,大概就算是已經具備程式設計入門的程度了。

精進程式

程式設計入門之後,如果想要讓程式設計能力變得更強,我認為有三門課必須接著學,分別是「演算法與資料結構」、「作業系統」與「計算機結構」。我在「軟體工程師必修的三門課」一文中有深入介紹。

簡單來概述的話,資料結構與演算法讓你的程式寫出來有效率,但他解決不了系統層級的問題。系統層級的問題需要懂作業系統原理,知道 Windows 或 Linux 底層是怎樣運作的,才能讓程式在該系統上運行得更快。系統解決不了的問題就會需要懂計算機結構,其中牽扯到組合語言、記憶體機制、CPU 設計等偏向瞭解硬體的知識,但懂硬體才能讓軟體跑得更快。

上述這幾門課在台大、清大、交大開放式課程都有,大家可以找來看看。其中我很推台大張智星教授的「資料結構與演算法」,這裡面有每堂課的錄影大家可以參考。我也很推薦台大陳蘊農教授的「演算法設計與分析」,這是演算法的進階版本。

如果你未來想要走資工,或是以後要當軟體工程師,那我認為你會需要培養資工的基本素養,及牽扯到程式開發與除錯技巧、良好的程式開發習慣與風格、閱讀程式碼的能力、程式開發的協作與流程、關於電腦的一切基本知識。這些我在「資工系所學生的基本素養」一文中有深入討論。

開發應用程式

除了簡單的小程式之外,你可能也會想做一點應用程式,當你懂程式設計的基本概念,函式、迴圈、檔案處理這些都會了,那就可以考慮去學寫網站、App、Chatbot 等,這些可能會需要學新語言,像是網頁會需要懂 HTML、JavaScript 和 CSS,但因為已經會寫程式,入門並不困難。寫 Android 可能會需要學 Java 或 Kotlin,但程式基本的邏輯都一樣,所以應該也可上手。

如果你對資料科學有興趣,會 Python 之後,可以去了解甚麼是 Numpy,這是讓你在 Python 上方便算數學的函式庫,透過他你就可以開始寫一些簡單的數學模型,算一些機器學習、深度學習、NLP 之類的問題。O’REILLY 在資料科學相關的書我覺得都寫得還不錯,基本上都只要懂程式設計的基本概念,剩下的其實都是去理解數學,換言之,只要你具有能將數學轉化成程式碼的能力,學習資料科學時程式不會是你的阻力。

結論

在本文中我提出學習程式語言的具體作法,學習程式用對方法很重要,希望可以減少大家錯誤嘗試的機會。請不要相信「三小時搞懂 Python」「Python 快速入門」這類書籍或網路文章,通常看了你也還是不懂,有系統的去學習程式概念和練習運用學到的概念寫出程式,才是真正能學會的關鍵。

怎樣有系統學習可以參照本文提供的幾項方法,不管是看書看影片或找人教都是不錯選項,針對兩種類型的初學者,分別最推薦學習 Python 和 C/C++。學會程式設計的基本概念之後,就可以去學應用程式或是繼續精進程式開發能力。