想學寫程式該如何入門?初學者怎麼選擇程式語言?零基礎也能自學程式的3個基本觀念
在這個資訊科技爆炸性發展的時代,人們生活已離不開網路與各種電子產品,尤其手機幾乎像是身體的一部分器官,每天不滑不行!
這些電子產品背後是由一個個軟體程式串連運作,讓『學寫程式』越來越被視為重要,許多國家紛紛將程式設計納入學校必備課程。
而身為軟體工程師的我,常常被一些沒有資訊或電腦科學相關背景的朋友問到:
「沒有基礎但想學程式,不知道該從哪裡開始?」、
「怎麼選擇適合自己的程式語言來學習?」、
「什麼適合初學者?寫 code 會很難嗎?」、
「完全沒有技術背景也可以學嗎?」...
你也有類似的煩惱嗎?如果答案是"Yes",一定要好好看完這篇文章,尤其新手!
對新手來說,要先找到『為什麼想學』,再思考『自己適合什麼』,選擇恰當的學習方式與工具,並建立正確的心態,才能保持學寫程式的熱情與動力。
學寫程式的目的是什麼?
很多人想學寫程式的動機其實很單純,也許「只是想了解寫程式是怎麼一回事」、「想做個自動化的小工具」或「想幫助自己的工作更有效率」…。
你為什麼想學寫程式呢?
只是單純想學但沒有特定目標?還是想做出一個東西(比如 App、網站)?
(1) 無特別目標,純粹想學
如果你只是純粹想學,覺得以後可能會用到,先學起來鍛鍊一下腦袋,培養邏輯思考,也許可以從使用較廣泛的幾個程式語言下手。
如下圖,C、Java 從 2002 年以來穩居前 2 名,隨後是 C++,而 Python 近年來竄升,普及程度自 2022 年已達第 1 名。
截圖自 TIOBE – Top 10 程式語言趨勢圖 (點擊圖片可放大較清楚)(2) 有特定目標,想做出成品
如果設定好目標,網路上有許多免費資源可以幫助學習,想學得有系統或深入一點,也有許多付費課程可以去上。
針對不同目標,簡單介紹如下:
1. 想做 App
想做 App 就要先決定選 Android 還是 iOS,這兩者大不相同。
Android 主要是寫 Java 來開發。
而 iOS 大多是寫 Swift 語言,且只能在 Apple 自己的裝置運行,所以還需要一台 Mac 才能進行。
2. 想做 UI 或平面設計
如果你想走網頁平面設計,學習脈絡大概會是 HTML ➜ CSS ➜ JavaScript,先嘗試把圖層轉成 HTML,設計 CSS 將格式與功能分開,再寫 JavaScript 讓網頁增加互動性。
如果接下來要走前端(Front-end),就把 JavaScript 學到底、用到底。
或者,也越來越多人用 Python 來做,但 Python 是解釋型程式語言而非編譯型,假如你設計比較複雜的東西,會感覺到它的執行速度相對 JavaScript 較慢。
3. 想架設網站
若不需要有太複雜的客製化,那你不一定要會寫程式,有許多功能強大又好操作的軟體可以利用,比如 WordPress、Wix、Weekbly …。
尤其 WordPress 的用戶量很大,有非常多功能完整的擴充外掛工具分享,可以方便快速地安裝使用,不必自己開發,只要學會用這些工具就行了。
但想扎實的從底層學習則另當別論,同樣舉 WordPress 為例,它是由 PHP 語言開發的,搭配網頁設計一定要用到的 HTML、CSS、JavaScript 等,這些程式語言都是網站前端開發的基本元素。
倘若再加上後端(Back-end)開發,就還有資料庫和 Web Server 要考慮與學習。
4. 現有工具已無法滿足需求,想做一些客製化
舉例,許多人在工作上很常用到 Microsoft Office 工具,尤其做資料處理絕大多數會用到 Excel,遇到有些比較複雜的處理流程,會需要用到 Excel VBA 這個程式工具,就要學習一些語法。
不過,Excel VBA 還是有些限制,有的人雖然已經用得爐火純青,仍覺得不夠彈性,他們需要更強大的資料處理與分析工具。ps. 這是我最近最常被問到的問題!
這時候可以考慮 Python,因為它的一些 compilers (編譯器)視覺化界面對使用者很友善、很好閱覽,方便做資料處理與分析的人使用。
如何選擇適合自己的程式語言學習?
絕大多數新手學習程式最常問要從哪個程式語言學起,但我認為「怎麼找到合適的教材與工具」以及「遇到難題時,怎麼找到資源幫助解決」才是最首要考慮的,而非「如何挑選第一個程式語言」。
(1) 找到合適的教材與工具
有的人喜歡從文字學習、有的人喜歡從影片,有的人喜歡理論式學習、有的人則喜歡實務操作,每個人的學習喜好不同,適合的學習方式也不同。
你一定要找到自己喜歡、恰當的方法,以及能幫助你有效學習的教材與工具,這樣比較容易繼續學下去。
(2) 找到資源幫助解決難題
每個人擁有的資源不同,如果你的身邊有工程師好友,跟他學同樣的程式語言是最方便快速的,遇到卡關想放棄的時候,拜託他稍微指點,你也許一下子就能茅塞頓開,突破瓶頸。
尤其,對新手來說,剛開始最容易遇到環境安裝問題,如果一直解不了,真的會超級崩潰想放棄,但這對工程師朋友來說可能只是 a piece of cake,因為這種小事就放棄學習程式很不值得!
另外,大部分的第一手資料都是英文,所以看懂英文也很重要,如果你的英文能力不錯,可以找到非常多很棒的國外網站或線上課程,享用更豐富詳盡的資源。
而如何準確下關鍵字讓 Google 搜尋到真正有幫助的資料,是你值得琢磨的能力之一。
(3) 前 5 熱門程式語言比較
如果你做了一些功課,仍決定不了要選哪個程式語言開始學習,絕大多數人會從熱門且普及度高的前幾名中挑選,這些程式的學習需求量大,資源也相對較多、較完整,你可以參考如下:
截圖自 TIOBE – 2023 程式語言流行度排名前 5 名 (點擊圖片可放大較清楚)
以下簡單介紹與比較前 5 名熱門的程式語言,希望幫助程式新手能快速大致瞭解,做出選擇:
Python
Python 是一種直譯式、物件導向、功能強大的程式語言,其設計宗旨力求程式的結構清晰、明瞭,所以特別強調程式碼的可讀性與簡潔的語法。
相比於 C 或 Java,Python 讓開發者能以更少的代碼表達想法。
由於 AI 和 Big Data 相關概念與技術日益盛行,使得 Python 從 2018 年崛起,甚至直奔第 1 名,是近期熱門程度上升幅度最高的語言。
如果你只是想先嘗試寫程式、體驗寫程式的感覺,Python 是我最推薦給什麼都還不懂也不會的入門初學者,因為:
- 程式碼簡潔又容易閱讀,不用經過編譯(compile)就可以執行程式,對初學者較友善。
- 簡單易學但又功能強大,不但能編寫網站、桌面應用程式、開發遊戲 ...等,還是機器學習、深度學習 ...等資料科學應用的重要程式語言。
➤ Python 的優點
- 容易撰寫,非常直觀
- 功能強大,有許多函式庫可以輕鬆使用
- 跨平台
- 應用範圍廣,ex. 網站、應用程式、機器學習、數據分析、爬蟲等
➤ Python 的缺點
- 高階語言,執行速度比其他語言慢,同樣地,程式碼也比其他語言少好幾倍
- 底層的處理沒辦法自己改
- 注重縮排,一定要用 4 個空白鍵縮排,沒按照這個規則會出現錯誤
※ 推薦書籍:(適合剛入門、還沒有基礎的初學者)
※ 推薦線上課程:
不管是書還是線上課程,選一個自己能看得下去的,然後認真地讀完書、上完課,仔細地跟著裡面的實作練習,都可以大大增加功力!
C 語言
C 是一個歷史悠久且非常通用的程式語言,能用很簡單的方式編譯,所以速度快、容量小、移植方便,大多在硬體上使用。
C 語言把很多底層操作交給使用者處理,不像 Java 或 Python 會處理好很多底層的東西,所以初學者會需要學習多一些底層相關知識,也需要撰寫多一些程式碼。
不過,換個角度,它也因此較彈性、靈活、高效。
所以,非常適合想要學到更多有關電腦軟硬體底層相關知識和技術的人。
➤ C 的優點
- 靈活方便、簡潔緊湊
- 數據類型豐富、表達力強、可移植性高
- 允許直接訪問物理地址對硬體進行操作
- 能夠跨平台使用
➤ C 的缺點
- 官方無大型函式庫,都要親手寫或下載別人寫的 code
- 當程式有誤時不容易 debug (除錯)
- 處理字串很麻煩
※ 推薦書籍:(適合剛入門、還沒有基礎的初學者)
※ 如果你的英文程度還不錯,推薦 C 語言入門的線上課程:
同樣的話,不管是書還是線上課程,選一個自己能看得下去的,然後認真地讀完書、上完課,仔細地跟著裡面的實作練習,都可以大大增加功力!
C++
從 C++ 這個命名應該不難理解它是 C 語言的加強版,最初設計主要目的就是將 C 語言實現物件導向,隨後也不斷增加新特性,融合新技術與原有技術,成為使用非常廣泛的電腦程式設計語言之一。
C 的程式基本上都可以在 C++ 直接使用。
初學者如果想從 C++ 入門,需要很大的信心,因為 C++ 複雜且不是那麼好學,學習過程中容易因卡關又一直找不到 error 或解法而感到失落。ps. 這是我在大學基礎必修課一開始學 C++ 時的體悟!
➤ C++ 的優點
- 可以比 C 處理更多類型
- 結構嚴謹,功能強大
- 安全性高
- 不需要複雜的程式設計環境
➤ C++ 的缺點
- 非常複雜,是當今主流程式語言中最複雜之一
- 當程式有誤時不容易除錯
C#
C# (C sharp)繼承 C 和 C++ 的強大功能但去掉了一些它們的複雜特性,是微軟以物件導向、.NET Framework 為根基推出的高階程式語言,這種設計讓開發者可以快速進行專案開發,且效能佳。
➤ C# 的優點
- 因微軟支援,周邊服務強大
- 可移植性高,尤其對已熟悉 C 和 C++ 的程式設計師
- 語法體系更進階,可以更快速進行程式開發
➤ C# 的缺點
- 語法不精簡,沒有考慮程式碼量
- 屬於一個產品,只求穩定,不求先進
Java
Java 的設計初衷就是跨平台,而這也是它最大的特點,其結構與風格十分接近 C++,採用 C++ 物件導向的特性,但改善許多 C++ 的缺點,所以熟悉 C++ 的人,學起來會特別輕鬆。
Java 的靈活性和多功能性,讓應用程式能夠「一次編寫,隨處運行」,解決跨平台、跨裝置的麻煩,使其應用廣泛,可以說無所不在,舉例如下:
- 用戶超過 20 億的 Android 作業系統主要就是用 Java 開發。
- 許多金融業在處理程式交易、撰寫相關文件、資料處理專案也用 Java 來設計系統前台和後台,如電子交易系統、ATM 等。
- Facebook、Google 等大型科技公司逐漸朝物聯網佈局,絕大多數物聯網應用程式以 Java 撰寫。
- 有名的大數據平台 Hadoop 以 Java 為框架編程。(ps. 雖然 Hadoop 是著名的大數據平台,但目前大數據處理的主流是用 Python, 不過只要 Hadoop 猶存,Java 依然不可取代。)
➤ Java 的優點
- 跨平台、相容性高
- 應用廣泛
- 安全性高
➤ Java 的缺點
- 執行速度緩慢(為了改善 C++ 且更具便利性所導致)
- 編譯過程繁瑣
- 停止更新免費版本
※ 推薦書籍:(適合剛入門、還沒有基礎的初學者)
※ 推薦線上課程:
- 【Java 程式語言】從 0 到 1
- 從零開始學 JAVA 程式設計
- Java 17 Masterclass: Start Coding in 2023 (如果英文程度還不錯,也推薦這門課)
同樣的話,不管是書還是線上課程,選一個自己能看得下去的,然後認真地讀完書、上完課,仔細地跟著裡面的實作練習,都可以大大增加功力!
(4) 程式語言的基礎邏輯相通
回歸程式語言的本質,其實基礎邏輯幾乎都是相通的,比如變數、迴圈、物件導向、繼承等。
寫程式與其說像在解數學問題,更像在使用一個非母語的語言跟電腦溝通,就像是不同人種之間需要不同語言溝通。
只不過程式語言沒有人類語言那麼複雜,不像中文、英文、日文、德文 … 各有各種不同的文法和語構,還有一大堆例外情形。
除了極少數程式語言特有的設計以外,絕大部份比較常見的程式語言(如排行榜裡的程式)要學習的概念近乎相似,所以認認真真學會其中一種,再轉換到另一種不需費力太多,甚至完全不費吹灰之力。
學程式應具備什麼的基本觀念與心態?
學寫程式並不難,可是需要大量的練習與實作,不斷嘗試並從錯誤中修正、增加知識與經驗。
在學習之前,建議初學者先培養好以下 3 個正確的觀念與心態:
(1) 一定要好好理解程式運作邏輯
無論學習什麼技能,都從「模仿」開始,就像小朋友學說話會先模仿聲調用詞、學寫字會先臨摹字帖等,學寫程式也一樣,要先參考別人怎麼寫、怎麼設計邏輯。
寫程式有點像在「破關」,起初不知道該怎麼辦,只能各種嘗試,常覺得很挫折、很「卡」,需要不厭其煩 Google 搜尋「秘笈」並模擬破關過程,從錯誤中學習,做過幾次後就會變得熟練,能快速反應。
不過,很多人寫程式只是簡單的把自己找到的答案(code)複製 / 貼上,並沒有好好思考為什麼要這麼寫,非常可惜又白白浪費一次練習機會。
此外,同樣的產出可能有許多不同的寫法,如果沒有融會貫通,往後只要遇到一點點變形或客製化,就很容易束手無措,所以理解整個程式碼的邏輯架構與運作非常重要!
ps. 關於這個觀念更深入的探討,你可以參考這篇文章:當我們在學程式時,要學的到底是什麼?
(2) 大量實作,不斷 try and error
有些人在學習的過程中會越來越喜歡寫程式,有些人則覺得越來越無趣,反思自己是不是根本不適合。
為什麼會有這樣的差異呢?可能是因為「實作太少」。
什麼是實作?一個簡單的 App、一個能連接資料庫的動態網站、一個網路爬蟲工具等,都可以是實作。
想起我大學時剛開始學寫程式,課堂作業或參考書裡的範例很多都生硬無趣,比如累加 1~10、輸出九九乘法表、星號(*)畫聖誕樹等,這類型題目雖然能幫助練習一些基礎,可是寫多了、寫久了真的超級無聊!
而人是視覺感官的動物,需要有互動才有動力與熱忱,所以不妨找一些進階一點的實作,模擬上戰場的感覺,比如開發一個簡單的打彈珠或開心農場遊戲等。
如果你已經會寫基本的程式,卻無法從中找到樂趣,也許應該再多做一些實作,從不斷 try and error 的過程中慢慢「打通任督二脈」,享受「挑戰成功」的喜悅,日益精進實力。
當你發現自己可以做出一個能幫助別人、也能讓別人用得開心的成品,你會瞬間獲得巨大成就感,覺得自己向上提升一個 level,這股成就感會化成動力,讓你繼續學習更多、挑戰更多,並感到無比開心!
(3) 面對學程式的「絕望沙漠」要有毅力與正確的方向
剛接觸程式,通常會感覺超級無敵困難,簡短的一行、小小的功能都要花好幾個小時才寫出來。
當你持續不斷地寫著寫著,克服一個接一個難關,信心也一步又一步地增加。
一段時間後,你會突然抓到寫程式的手感,發現好像沒有什麼難得倒自己,因為你正處於『Hand-Holding Honeymoon』,基本上已經可以稱得上 developer (開發者)了。
參考自 Why Learning to Code is So Damn Hard
隨著你的野心越來越大,想做的功能越來越複雜,就會面臨『desert of despair』(絕望沙漠)。
在這個階段,你會感覺自己好像學了很多新知,卻怎麼努力都無法更進一步,一股無力感油然而生,不禁開始懷疑自己:「我是不是學不會?」、「我已經到極限了?」、「我是不是沒天份?」…
當知識越深、技術越難,能挖掘到的資源本來就會變少,此時在搜尋引擎中「下關鍵字下得更精確」就顯得額外重要,鍛鍊資料蒐集的能力也是成為優秀開發者的必備條件之一。
參考自 Why Learning to Code is So Damn Hard
如果你仍深陷沙漠之中,或許要想到自己是不是以往太習慣依賴方便的套件,讓你不知道背後發生什麼事情,阻礙你思考整個流程。
呼應前面提到,模仿 code 時一定要好好理解其中的運作邏輯,好好摸透所使用的這些套件,如同蓋房子需要打底、建模、工法編造 …,程式設計也需要熟悉不同面向的技能。
要是你完全不做客製化、每次的流程都雷同,那寫程式其實無比簡單。
不過,不客製化是不可能的,你總會想要有一些特別或更彈性的功能,在基礎不紮實的前提下,很難繼續走下去。
另外,你也可以請有經驗的前輩指點,有時候當局者迷,不見得能找到自己目前的弱點、最缺乏什麼技能,或真正卡關的問題點,這時候前輩就能給你最有效的建議,加以導正,幫助你縮短學習時間。
而參加社群或同好會是不錯的選擇,有更多機會認識活生生的前輩,請教厲害的神人。
你必須不停調整自己,讓自己在沙漠中不迷失,朝著正確的方向,以足夠的毅力反覆實作與磨礪,絕對能夠征服這段黑暗又漫長的「絕望沙漠」!
結語
在這個資訊開放的時代,善用資源是每個人都須具備的,尤其網路世界的學習資源真的太豐富,有超多品質好、價格又低的學習寶藏值得我們深掘。
你能想像 8 歲小朋友就透過 YouTube 影片自學寫 code 開發程式,這樣的案例越來越多嗎?
所以千萬不要懷疑,你一定也做得到,套一句我很喜歡的一位 Podcaster – 佐依 Zoey 常說的話:「你不需要很厲害才開始,而是開始了才會變很厲害」。
最後再次強調,一定要「實作」、「實作」、「再實作」,因為太重要了所以要說 3 次,從「做中學」是最有效且進步最快的!
歡迎在下方留言,跟我一起學習與討論喔!
或者,email 寫信與我切磋&分享知識。
Email:jes.igoamazing@gmail.com
如果喜歡我的內容,也歡迎追蹤我的 IG,可以隨時掌握新資訊。
IG:https://www.instagram.com/jeslyn_cool/
留言
張貼留言