2021年8月20日

如何自學寫程式,從零開始的開發之路 - 入門篇 | 建立寫程式的基礎

本篇是《程式開發之路》系列文

第一步

學習電腦程式語言的第一步是:挑一個常見的程式語言。

可以參考TIOBE的熱門程式語言指數

在學校,因為目標比較不明確,教授也不希望這麼快讓學生定型,所以通常會使用比較通用的語言來做教學,例如C、C++或Java。

但在職場中,不同的領域會有不同的慣用語言。例如網頁開發,前端就是JavaScript、後端會是PHP、Java、Go等等;資料分析相關,會選擇用R、Python等;APP是Java、Swift等;韌體硬體相關多半會是C、C++等。

學習一個程式語言,其實是學習跟電腦的「溝通方式」,我們利用程式語言來指揮、操作電腦,來完成我們的需求。現在的電腦架構大致上已經固定了,如果用學習的角度來看,學習哪一個語言並不是那麼重要,重要的是學習觀念。用比較漂亮的話來說,只要有任何一個語言的扎實基礎,跳到另一個語言都是相對容易的。

但是選擇學習哪一個語言,說對未來就業沒有影響是騙人的,畢竟公司會偏好有特定語言經驗的人;而另一方面,人的學習時間也有限,當然會希望精準的學習。所以如果目標明確,可以選擇相關領域中,常用的語言來學習,效益會比較明顯。

回歸正題,挑了任何一個語言之後,要做什麼?我覺得首先要提升語法熟悉度。

語法熟悉度的重要性

每個人學習的方式不同,學習的工具也不同,但不論是講義、教科書,影片,還是網頁等各種形式,學習程式語言不外乎是從學習這些東西開始:變數、資料型別、迴圈、條件判斷、函式呼叫、類別定義⋯⋯等等。

這些東西有點像是學英文的時候的文法,透過這些文法,才有辦法組織成句子。

程式語言也是一樣,Programmer利用這些語法規則,來讓電腦理解意圖、並執行對應的動作。

因此如果想要把程式語言學得好,把這些語法弄熟是相當重要的。

但有一點是程式語言跟英文非常不一樣的地方,程式語言是一個非常需要精確、嚴謹的語言,不像英文,即便文法稍微有錯,外國人還是聽得懂或猜得到,但程式語言的語法一但有錯,或是使用的方式不對,程式要嘛直接罷工、要嘛直接給你錯誤的結果。

而這樣的精確性,其實也是很多初學者的挫折來源,但其實這樣的語法錯誤,都是最基本、也最好處理的錯誤,只要花點心力去熟悉一個語言,就可以大幅改善開發的體驗,也可以減少埋下bug的機會和debug的時間。

如何提升語法熟悉度

那要怎麼提升熟悉度?俗話說的好,程式語言是用寫的,不是用看的。所以動手嘗試是非常重要的。

但動手嘗試並不單單只是照著範例程式碼打在編輯器中,這樣是不夠的,你必須要去理解每一行程式碼的意義,去消化每一個關鍵字的意思。

比如說學習Java的時候,System.out.println("Hello world!");是一句再簡單不過的入門範例。但你有沒有試著去改變"Hello world!"的值,看看會有沒有真的印出不一樣的東西?有沒有明明知道把雙引號改成單引號會壞掉,還故意試試看?

或者在學習型別轉換的時候,有沒有實際嘗試看看效果?int test = "123",看看可不可以轉換?

也許你的教材,已經告訴你某些行為會出錯,但是如果實際去操作,會更有印象,不能只是就覺得自己理解了,就跳過了。

即便可能還不曉得背後的原理是什麼,但多嘗試不一樣的變化,會對這個語言掌握度變高。

有人說,現在的IDE都很方便,很多地方都能自動補完或者錯誤提醒,但是對於新手來說,我覺得強迫自己手動打一遍,讓身體記住這些東西,還是很重要的,必須要把這些知識內化成自己的,以後才有辦法在大腦中構造複雜的結構。

你會知道,語言可以做到什麼、不能做到什麼、還有做錯了什麼會發生什麼事,用這樣的方式打基礎,以後面對大型程式,比較不會驚慌失措。

我有一個職場前輩,他在學習一個新東西的時候,如果是一個很關鍵的步驟,即便他第一次就弄懂了,他還是會故意再全部重新來一遍,加深他自己的印象,這樣的精神,就是我覺得很值得效法的。

電腦科學的基礎知識

很多人在接觸第一個語言的時候,經常是沒有電腦科學的基礎的,因此通常都處於一個「知其然而不知其所以然」的狀態。

會看到程式神奇動了、編譯莫名的過了,但卻完全不知道發生什麼事了。

其實就像是現實世界有重力、加速度等自然法則,電腦世界也有自己的運作法則,開發者必須理解這些法則,才有辦法設計出好的程式。

如果是本科系,通常會從計算機概論開始,然後作業系統、計算機組織等,這些是跟程式語言的原理比較有直接相關的。

如果是自學的,就要自己想辦法去補足這方面的知識,可以參考相關科系的朋友,當初這些課程使用的教科書是什麼。

基礎知識為什麼重要?舉例來說,電腦,也就是計算機,是由資料計算(CPU)、資料儲存(記憶體、硬碟)兩個主要的元件組成的。如果不曉得這件事,要如何理解C++中pointer的概念?

如果不曉得作業系統在做排程的時候,有區分process跟thread,而thread之間的溝通方式也有很多種,那麼在撰寫多執行緒程式的時候,如何怎麼知道自己在幹嘛?

如果不曉得程式會從高階語言,被編譯或是直譯成機器語言,接著才能夠被執行,那麼如何理解PHP跟C++之間的效能差異來源?

這些一開始很枯燥的基礎知識,可能學習起來無聊,但卻是一切的基礎,相當重要,學會了這些,跟電腦溝通起來,會比較順暢。

小結論

對於剛入門的人而言,雖然可能枯燥乏味,雖然是老生常談,但是還是必須強調,打好基礎是相當重要的,這件事沒有捷徑,必須要穩紮穩打

我自己當初是從C++入門的,當時我從頭到尾把《C++ HOW TO PROGRAM 》這本原文書啃了至少一遍,範例原始碼也是自己嘗試了好幾次,到現十幾年後的今天,還是覺得很有幫助。

如果是學習其他程式語言,可以自己去google搜尋,一般來說建議看英文,例如“Java books recommends beginner"等關鍵字,如果不熟悉原文書,也可以搜尋"Java 學習 推薦 書",之類的,也可以把用英文找到的書名,去找找看有沒有對應的中文版。

而現在網路上資源很多,不一定要看書,只要找到自己覺得夠完整、正確的資源,把整套學習起來,然後弄熟就可以了。

程式開發之路系列文

程式開發之路 - 入門篇(本篇)

程式開發之路 - 初階篇