初學程式設計

想學寫程式該如何入門?初學者怎麼選擇程式語言?完全沒有技術背景也可以學嗎?

Last Updated on

在這個資訊科技爆炸性發展的時代,人們生活已離不開網路與各種電子產品,尤其手機幾乎像是身體的一部分器官,每天「不滑不行」。

這些電子產品背後是由一個個軟體程式串連運作,使得「學寫程式」越來越夯,許多國家紛紛將程式設計納入學校必備課程。

而身為軟體工程師的我,身邊不乏有一些無資訊或電腦科學相關背景的朋友陸陸續續發問:

「沒有基礎但想學程式,不知道該從哪裡開始?」、「怎麼選擇適合自己的程式語言來學習?什麼適合初學者?寫 code 會很難嗎?」…

你也有類似的煩惱嗎?如果答案是”Yes”,那一定要好好看完這篇文章!

對新手來說,要先找到「為什麼想學」,再思考「什麼適合自己」,選擇恰當的學習方式與工具,並建立正確的心態,才能保持學寫程式的熱情與動力。

學寫程式的目的是什麼?

很多人想學寫程式的動機其實很單純,也許「只是想了解寫程式是怎麼一回事」、「想做個自動化的小工具」或「想幫助自己的工作更有效率」…。

你為什麼想學寫程式?只是單純想學但沒有特定目標,還是想做出一個東西(比如 App、網站 …)呢?

無特別目標,純粹想學

如果你只是純粹想學,覺得以後可能會用到,先學起來鍛鍊一下腦袋、培養邏輯思考,也許可以從使用較廣泛的幾個程式語言下手。

如下圖,C、Java 從 2002 年以來穩居前 2 名,隨後是 C++,而 Python 近兩年竄升,普及程度逐漸追過 C++。

程式語言走勢
截自 TIOBE – Top 10 程式語言趨勢圖

有特定目標,想做出一個成品

如果設定好目標,網路上有許多免費資源可以幫助學習,想學得有系統或深入一點,也有許多付費課程可以去上。針對不同目標,簡介如下:

想做 App

你要先決定選 Android 還是 iOS,這二者大不相同,Android 主要是寫 Java 來開發,而 iOS 大多是寫 Swift 語言,且只能在 Apple 自己的裝置運行,所以還需要一台 Mac 才能進行。

想做 UI 或平面設計

若你要走網頁平面設計,學習脈絡大概會是 HTML => CSS => JavaScript,先嘗試把圖層轉成 HTML,設計 CSS 將格式與功能分開,再寫 JavaScript 讓網頁增加互動性。

如果接下來要走前端(Front-end),就把 JavaScript 學到底、用到底。

想架設網站

若不需要有太複雜的客製化,那你不一定要會寫程式,有許多功能強大又好操作的軟體可以利用,比如 WordPress、Wix、Weekbly …。

尤其 WordPress 的用戶量很大,所以有非常多功能完整的擴充外掛工具分享,可以方便快速地安裝使用,不必自己開發,只要學會用這些工具就行了。

但想扎實的從底層學習則另當別論,同樣舉 WordPress 為例,就是由 PHP 語言開發的,搭配網頁設計一定要用到的 HTML、CSS、JavaScript 等,這些程式語言都是網站前端開發的基本元素。

如果再加上後端(Back-end)開發,就還有資料庫和 Web Server 要考慮與學習。


如何選擇適合自己學習的程式語言?

多數新手學習程式最常問要從哪個程式語言學起,不過「怎麼找到合適的教材與工具」以及「遇到難題時,怎麼找到資源幫助解決」才是最首要考慮的,而非「如何挑選第一個程式語言」。

找到合適的教材與工具

有的人喜歡從文字學習、有的人喜歡從影片,有的人喜歡理論式學習、有的人則喜歡實務操作,每個人的學習喜好不同,適合的學習方式也不同。

你一定要找到自己喜歡、恰當的方法,以及能幫助你有效學習的教材與工具,這樣比較容易繼續學下去。


找到資源幫助解決難題

每個人擁有的資源不同,如果你的身邊有工程師好友,跟他學同樣的程式語言是最方便快速的,遇到卡關想放棄的時候,拜託他稍微指點,你也許一下子就能茅塞頓開,突破瓶頸。

尤其,對新手來說,剛開始最容易遇到環境安裝問題,如果一直解不了,真的會超級崩潰想放棄,但這對工程師朋友來說可能只是 a piece of cake,因為這種小事就放棄學習程式不大值得。

此外,大部分第一手的資料都是英文,所以看懂英文也很重要,若是你的英文能力不錯,可以找到非常多很棒的國外網站或線上課程,享用更豐富詳盡的資源。

而如何準確下關鍵字讓 Google 搜尋到真正有幫助的資料,是你值得琢磨的能力之一。


前 5 熱門程式語言比較

如果你做了一些功課,仍決定不了要選哪個程式語言開始學習,絕大多數人會從熱門且普及度高的前幾名中挑選,這些程式的學習需求量大,相對地資源也較多、較完整,你可以參考。

2021年程式語言排名
截自 TIOBE – 2021 年程式語言流行度排名前 5 名

從上圖中可看到,相較於去年,前 5 名的程式語言不變,只有前 3 名的程式語言互相交換排名而已。

以下簡單介紹與比較前 5 名熱門的程式語言,希望幫助程式新手能快速、大致地了解,並做出選擇:


C 語言

C 語言

C 是一個歷史悠久且非常通用的程式語言,能用很簡單的方式編譯,所以速度快、容量小、移植方便,大多在硬體上使用。

C 語言把很多底層操作交給使用者處理,不像 Java 或 Python 會處理好很多底層的東西,所以初學者會需要學習多一些底層相關知識,也需要撰寫多一些程式碼,不過換個角度,它也因此較彈性、靈活、高效。

所以,非常適合想要學到更多有關電腦軟硬體底層相關知識和技術的人

C 的優點
  1. 靈活方便、簡潔緊湊
  2. 數據類型豐富、表達力強、可移植性高
  3. 允許直接訪問物理地址對硬體進行操作
  4. 能夠跨平台使用
C 的缺點
  1. 官方無大型函式庫,都要親手寫或下載別人寫的 code
  2. 當程式有誤時不容易 debug (除錯)
  3. 處理字串很麻煩

※ 推薦書籍:(適合剛入門、還沒有基礎的初學者)
(1) C語言入門精要
(2) 入門首選 C 語言程式設計附範例檔

※ 如果你的英文程度還不錯,推薦 C 語言入門的線上課程:
(1) C Programming Made easy for Beginners -Step by Step Approach
(2) C Programming For Beginners

ps. 不管是書還是線上課程,選一個自己能看得下去的,然後認真地讀完書 /上完課 + 仔細地跟著裡面的實作練習,都可以大大增加功力!


Java

Java 語言

Java 的設計初衷就是跨平台,而這也是它最大的特點,其結構與風格十分接近 C++,採用 C++ 物件導向的特性,但改善許多 C++ 的缺點,所以熟悉 C++ 的人,學起來會特別輕鬆。

Java 的靈活性和多功能性,讓應用程式得以「一次編寫,隨處運行」,解決跨平台、跨裝置的麻煩,使其應用廣泛,可以說無所不在,舉例如下:

  1. 用戶超過 20 億的 Android 作業系統主要就是用 Java 開發。
  2. 許多金融業在處理程式交易、撰寫相關文件、資料處理專案也用 Java 來設計系統前台和後台,如電子交易系統、ATM 等。
  3. Facebook、Google 等大型科技公司逐漸朝物聯網佈局,絕大多數物聯網應用程式以 Java 撰寫。
  4. 有名的大數據平台 Hadoop 以 Java 為框架編程。(ps. 雖然 Hadoop 有名的大數據平台,但目前大數據處理的主流是用 Python, 不過只要 Hadoop 猶存,Java 依然不可取代。)

Java 程式設計是現今市場上需求最大的,工作機會很多,若未來有意朝專業的軟體工程師邁進可以考慮。

Java 的優點
  1. 跨平台、相容性高
  2. 應用廣泛
  3. 安全性高
Java 的缺點
  1. 執行速度緩慢(為了改善 C++ 且更具便利性所導致)
  2. 編譯過程繁瑣
  3. 停止更新免費版本

※ 推薦書籍:(適合剛入門、還沒有基礎的初學者)
(1) 深入淺出 Java 程式設計
(2) 從零開始!Java 程式設計入門
(3) 圖說演算法:使用Java / 電子書

※ 推薦線上課程:
(1) 【Java 程式語言】從 0 到 1
(2) 從零開始學 JAVA 程式設計
(3) Java編程語言從入門到精通

ps. 不管是書還是線上課程,選一個自己能看得下去的,然後認真地讀完書 /上完課 + 仔細地跟著裡面的實作練習,都可以大大增加功力!


Python

Python

Python 是一種直譯式、物件導向、功能強大的程式語言,其設計宗旨力求程式的結構清晰、明瞭,所以特別強調程式碼的可讀性與簡潔的語法,相比於 C 或 Java,Python 讓開發者能以更少的代碼表達想法。

由於 AI 和 Big Data 相關概念與技術日益盛行,使得 Python 從 2018 年慢慢崛起,是近期熱門程度上升幅度最高的語言。

如果你只是想先嘗試寫程式、體驗寫程式的感覺,Python 是我最推薦給什麼都還不懂也不會的入門初學者,因為:

  1. 程式碼簡潔又容易閱讀,不用經過編譯(compile)就可以執行程式,對初學者較友善。
  2. 簡單易學但又功能強大,不僅能編寫網站、桌面應用程式、開發遊戲等,還是機器學習 & 深度學習等資料科學應用的重要程式語言。
Python 的優點
  1. 容易撰寫,非常直觀
  2. 功能強大,有許多函式庫可以輕鬆使用
  3. 跨平台
  4. 應用範圍廣,ex. 網站、應用程式、機器學習、數據分析、爬蟲等
Python 的缺點
  1. 高階語言,執行速度比其他語言慢,同樣地,程式碼也比其他語言少好幾倍
  2. 底層的處理沒辦法自己改
  3. 注重縮排,一定要用 4 個空白鍵縮排,沒照此規則會出現錯誤

※ 推薦書籍:(適合剛入門、還沒有基礎的初學者)
(1) 深入淺出Python
(2) Python零基礎學程式設計與運算思維:王者歸來
(3) 精通 Python:運用簡單的套件進行現代運算

※ 推薦線上課程:
(1) Python – 輕鬆學會寫程式
(2) Python 資料分析 – 入門實戰
(3) Python基礎課程和網路爬蟲入門實戰

ps. 不管是書還是線上課程,選一個自己能看得下去的,然後認真地讀完書 /上完課 + 仔細地跟著裡面的實作練習,都可以大大增加功力!

延伸文章 1:Python 是什麼?Python 可以做什麼?新手必看 Python 入門初心者懶人包
延伸文章 2:Selenium 是什麼?用 Python Selenium 自動爬網頁抓報表,初學者必看的簡單教學


C++

C++

C++ 這個命名應該不難理解它是 C 語言的加強版,最初設計主要目的就是將 C 語言實現物件導向,隨後也不斷增加新特性,融合新技術與原有技術,成為使用非常廣泛的電腦程式設計語言之一。

C 的程式基本上都可以在 C++ 直接使用。

初學者如果想從 C++ 入門,需要很大的信心,因為 C++ 複雜且不是那麼好學,學習過程中容易因卡關又一直找不到 error 或解法而感到失落。ps. 這是我在大學基礎必修課一開始學 C++ 時的感悟 XD。

C++ 的優點
  1. 可以比 C 處理更多類型
  2. 結構嚴謹,功能強大
  3. 安全性高
  4. 不需要複雜的程式設計環境
C++ 的缺點
  1. 非常複雜,是當今主流程式語言中最複雜之一
  2. 當程式有誤時不容易除錯

C#

C#

C# (C sharp)繼承 C 和 C++ 的強大功能但去掉了一些它們的複雜特性,是微軟以物件導向、.NET Framework 為根基推出的高階程式語言,此種設計讓開發者可以快速進行專案開發,且效能佳。

C# 的優點
  1. 因微軟支援,周邊服務強大
  2. 可移植性高,尤其對已熟悉 C 和 C++ 的程式設計師
  3. 語法體系更進階,可以更快速進行程式開發
C# 的缺點
  1. 語法不精簡,沒有考慮程式碼量
  2. 屬於一個產品,只求穩定,不求先進

程式語言的基礎邏輯相通

不過,回歸程式語言的本質,其實基礎邏輯幾乎都是相通的,比如變數、迴圈、物件導向、繼承等。

寫程式與其說像在解數學問題,更像在使用一個非母語的語言跟電腦溝通,就像是不同人種之間需要不同語言溝通。

只不過程式語言沒有人類語言那麼複雜,中文、英文、日文、德文 … 各有各種不同的文法和語構,還有一大堆例外情形。

除了極少數程式語言特有的設計以外,絕大部份比較常見的程式語言(如排行榜裡的程式)要學習的概念近乎相似,所以認認真真學會其中一種,再轉換到另一種不需費力太多,甚至完全不費吹灰之力。

程式新手

學程式應具備的心態是什麼?

學寫程式並不難,可是需要大量的練習與實作,不斷嘗試並從錯誤中修正、增加知識與經驗。

在學習之前,建議初學者先培養好以下 3 個正確的觀念與心態:

一定要好好理解程式運作邏輯

無論學習什麼技能,都從「模仿」開始,就像小朋友學說話會先模仿聲調用詞、學寫字會先臨摹字帖等,學寫程式也一樣,要先參考別人怎麼寫、怎麼設計邏輯。

寫程式有點像在「破關」,起初不知道該怎麼辦,只能各種嘗試,常覺得很挫折、很「卡」,需要不厭其煩 Google 搜尋「秘笈」並模擬破關過程,從錯誤中學習,做過幾次後就會變得熟練,能快速反應。

不過,很多人寫程式只是簡單的把自己找到的答案(code)複製 / 貼上,並沒有好好思考為什麼要這麼寫,非常可惜又白白浪費一次練習機會。

此外,同樣的產出可能有許多不同的寫法,如果沒有融會貫通,往後只要遇到一點點變形或客製化,就很容易束手無措,所以理解整個程式碼的邏輯架構與運作非常重要!

理解程式邏輯

ps. 關於這個觀念更深入的探討,你可以參考這篇文章:當我們在學程式時,要學的到底是什麼?


大量實作,不斷 try and error

有些人在學習的過程中會越來越喜歡寫程式,有些人則覺得越來越無趣,反思自己是不是根本不適合。

為什麼會有這樣的差異呢?可能是因為「實作太少」。

什麼是實作?一個簡單的 App、一個能連接資料庫的動態網站、一個網路爬蟲工具等,都可以是實作。

想起我大學時剛開始學寫程式,課堂作業或參考書裡的範例很多都生硬無趣,比如用累加 1~10、輸出九九乘法表、星號(*)畫聖誕樹等,這類型題目雖然能幫助練習一些基礎,可是寫多了、寫久了真的超級無聊!

寫程式無聊

而人是視覺感官的動物,需要有互動才有動力與熱忱,所以不妨找一些進階一點的實作,模擬上戰場的感覺,比如開發一個簡單的「開心農場」遊戲等。

如果你已經會寫基本的程式,卻無法從中找到樂趣,也許應該再多做一些實作,從不斷 try and error 的過程中慢慢「打通任督二脈」,享受「挑戰成功」的喜悅,日益精進實力。

當你發現自己可以做出一個能幫助別人、也能讓別人用得開心的成品,你會瞬間獲得巨大的成就感,覺得自己向上提升一個 level,這股成就感會化成動力,讓你繼續學習更多、挑戰更多,並感到無比開心!

達成目標

面對學程式的「絕望沙漠」要有毅力與正確的方向

剛接觸程式,通常會感覺超級無敵困難,簡短的一行、小小的功能都要花好幾個小時才寫出來。

當你持續不斷地寫著寫著,克服一個接一個難關,信心也一步又一步地增加。

一段時間後,你會突然抓到寫程式的手感,發現好像沒有什麼難得倒自己,因為你正處於”Hand-Holding Honeymoon“,基本上已經可以稱得上 developer (開發者)了。(如下圖)

Hand-Holding Honeymoon
截自 Why Learning to Code is So Damn Hard – The Hand-Holding Honeymoon

隨著你的野心越來越大,想做的功能越來越複雜,就會面臨”desert of despair” (絕望沙漠)。

在這個階段,你會感覺自己好像學了很多新知,卻怎麼努力都無法更進一步,一股無力感油然而生,不禁開始懷疑自己:「我是不是學不會?」、「我已經到極限了?」、「我是不是沒天份?」…

當知識越深、技術越難,能挖掘到的資源本來就會變少,此時在搜尋引擎中「下關鍵字下得更精確」就顯得額外重要,鍛鍊資料蒐集的能力也是成為優秀開發者的必備條件之一

The Learn-to-Code Journey
截自 Why Learning to Code is So Damn Hard – The Learn-to-Code Journey

如果你仍深陷「沙漠」之中,或許要想到自己是不是以往太習慣依賴方便的「套件」,讓你「不知道背後發生什麼事情」,阻礙你思考整個流程。

呼應前面提到,模仿 code 時一定要好好理解其中的運作邏輯,你也該好好摸透所使用的這些「套件」,如同蓋房子需要打底、建模、工法編造 …,程式設計也需要熟悉不同面向的技能。

要是你完全不做客製化、每次的流程都雷同,那寫程式其實無比簡單。不過,「不客製化」是不可能的,你總會想要有一些特別或更彈性的功能,在基礎不紮實的前提下,很難繼續走下去。

另外,你也可以請有經驗的前輩指點,有時候當局者迷,不見得能找到自己目前的弱點、最缺乏什麼技能,或真正卡關的問題點,這時候前輩就能給你最有效的建議,加以導正,幫助你縮短學習時間。

而參加社群或同好會是不錯的選擇,有更多機會認識「活生生」的前輩,請教厲害的「神人」。

你必須不停調整自己,讓自己在沙漠中不迷失,朝著正確的方向,以足夠的毅力反覆實作與磨礪,絕對能夠征服這段黑暗又漫長的「絕望沙漠」!


結語

在這個資訊開放的時代,善用資源是每個人都須具備的,尤其網路世界的學習資源真的太豐富,有超多品質好、價格又低的學習寶藏值得我們深掘。

你能想像 8 歲小朋友就透過 youtube 影片自學寫 code 開發程式,這樣的案例越來越多嗎?

所以千萬不要懷疑,你一定也做得到,套一句我很喜歡的一位 Podcaster – 佐依 Zoey 常說的話:「你不需要很厲害才開始,而是開始了才會變很厲害」。

最後再次強調,一定要「實作」、「實作」、「再實作」,因為太重要了所以要說 3 次 XD,從「做中學」是最有效且進步最快的!


如果覺得這篇文章有幫助,請幫我拍手 5 下鼓勵我、支持我,讓我繼續有創作的動力!

如果有任何問題或想分享的資訊,歡迎在下方留言!

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *