2021年8月29日

如何自學寫程式,從零開始的開發之路 - 初階篇

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

邁向職業之路

每個人開始寫程式的理由不太一樣,有些人是因為科系,有些人是因為工作,而有些人則是因為個人興趣。

當我們認真學習程式一段時間後,大概就可以知道自己適不適合寫程式了。也許會發現,自己其實對寫程式沒有擁有自己想像中的熱誠,或者是發現,自己其實並不擅長寫程式。

而這樣的認知,並不是一件壞事。人們如果可以更早的了解自己的能力跟興趣,對未來長期的發展是有很大助益的。

相反地,那些可以撐過程式開發入門階段的人,願意花很多時間跟程式相處,不排斥學習相關知識的人,或多或少代表未來這些人會想要朝著這個方向前進,更明確的說,作為一份職業。

基礎知識及領域知識

在前一篇入門篇中,我提到了基礎知識的重要性,而這篇除了要強調基礎知識的重要性以外,也要強調是各別領域的專業知識。電腦科學領域中共通的基礎知識,可以幫助我們打底,但是隨著未來的發展方向不同,各專業領域所需要的基礎知識也會有所差別,而這些專業知識,很多都不是程式語言本身的範疇。

舉例來說,我們可以用C++來撰寫一個網站伺服器(Web Server),負責監聽來自客戶端(Client)的請求,並回傳適當的結果。但是「網站伺服器」這個概念,並不在C++這個程式語言的範疇中,我們只是用選擇運用C++來實現這個概念而已。我們當然也可以選擇其他語言來實作網站伺服器,例如Golang、Java,所以學習C++跟學習網站伺服器,也就是專業領域知識,可以說是完全獨立的事情。

讓我們延伸入門篇提到的概念,程式語言作為一種用來跟電腦溝通的方式,同時它也是我們用來實現人類想法的「工具」。也就是說,一開始我們學習的事情是,如何跟電腦溝通,接下來我們要學習的事情就是,我們要拿電腦來做什麼事情,我們要指揮電腦做什麼,這些事情就是所謂的專業領域知識。

舉例來說,如果想要往網站或APP開發的方向前進,不論是前端、後端、APP開發等,必須得學習資料庫系統、計算機網路等相關知識。這樣我們才知道怎麼伺服器是如何跟瀏覽器溝通的、才知道如何正確地操作資料庫,才有辦法利用程式語言妥善地完成工作。這些領域專業知識,並不會是學完JavaScript、PHP這些語言語法本身就會的。

又例如如果想要往資料工程、人工智慧、機器學習等領域發展,就要學習相關的數學知識和演算法。想要成為一個厲害的資料科學家,不能只會寫Python,還必須要能夠理解複雜的數學運算、推理,和能夠閱讀高深的論文才行。

參與實際專案、尋找成就感來源

利用學習到的知識來完成某些事情,可以獲得成就感,而這些成就感可以帶來學習的動力跟心態上的滿足,讓我們可以繼續往下學習更深的知識,如果能創造這樣的正向循環,對學習將會是很大的幫助。

反過來說,如果只是不斷地學習知識,卻無法從中獲得樂趣或成就感的話,容易覺得乏味,而沒有將知識套用在實際情況、解決現實中的需要,心裡也會不斷懷疑這些知識的用處,難以繼續維持學習的動力。

因此創造成就感及尋找成就感來源,是一項很重要的課題。

以學生來說,實習或專題是很好的機會。透過學校課程專題的安排,不論是自己實作,或是跟組員分工合作,活用之前累積下來的知識,將專案完成,可以獲得很大的成就感。

去實習的話,在實習的單位,實際參與開發工作,或許只是修改一個小bug,或是完成一個小功能,但這些結果如果成功上線,讓真正的使用者使用的話,並獲得正面的回饋,一定可以獲得滿滿的成就感。

如果不是學生,也可以試著開始自己的side project,或是參與別人或社群中的專案,讓自己有機會完成一些事情。

其實寫程式跟很多產業比起來,是相對容易獲得成就感的,因為只要有一台電腦,有一個文字編輯器,就可以開始寫程式了。

建立自學的能力、養成終身學習的心態

程式開發這條路,在入門階段有非常多的學習資源,但是隨著能力的提升,這些初階的資源,漸漸地難以符合需求了。

另一方面,程式開發是一個變化相當快速的產業,新的語言、新的框架、新的系統、新的演算法,每幾年就翻一輪,如果沒有自學能力的話,很容易就會跟不上大家。

我們需要自學的事情,大概可以分成兩類,一種是大家都遇過的問題、已經成熟的解法;另一種則是正在發酵、發展中的最新資訊。

第一種雖然大家都遇過,但是可能沒有被任何系統化的整理起來,因此只能零散地獲得答案,需要靠自己去搜尋各方資訊,利用自己的知識拼湊起來。

第二種則是最新的資訊,這種東西因為還成熟,資訊量太少,沒有人可以問,討論的人也不多,所以也無法系統化的學習。

如果沒有建立起自學能力,遇到上面兩種問題,只能等待有緣人伸手幫你了。那該如何建立自學能力呢?當然大家第一句話一定都會說,英文。

為什麼英文能力很重要?除了技術文件都是以英文為主,英文資訊也是更新最快的,在Google上搜尋到的答案也大部分都是英文,雖然簡體中文的資訊也不少,但是就資訊品質來說,還是英文資訊來的高。因此如果讀不懂英文,無法第一手接收新知,只能依靠別人翻譯過的二手資訊,這樣造成的資訊落差,漸漸地就會跟別人拉開距離了。

除了英文能力以外,也要建立自己的資訊管道來源,有些人喜歡透過閱讀獲得資訊,那就可以觀察新書的排行版,看看現在熱門的話題是什麼,看看哪些作者是業界的大神,可以把他們的著作多找來看看。也可以追蹤自己喜歡的網站或是部落客,他們會定時發布最新技術資訊,讓你可以獲得新知。

其實英文一樣只是一種工具,重要的還是建立起終身學習的心態,如前面所說,程式開發,或說軟體工程,是一個還不斷地在發展中的產業,變化相當快速,我們可以快速地透過各種資源入門,但是後續要走多久,只能靠自己努力了。

小結論

終身學習這件事真的是軟體工程師的宿命,即便你不想改變,但整個世界都會逼著你改變。

以前大家都自建機房,聘請大量MIS來管理這些機器,但是現在雲端運算資源俯拾即是,AWS、GCP、AZURE任你選,不但更有彈性也更便宜,漸漸地大家都轉換過去使用這些雲端服務了,工程師也只好被迫去學習這些服務的使用方式了。

當時我還在學校的時候,老師只教了VM,但現在Container生態系已經發展到看不到盡頭了。

但是當然,也有些東西是不變的,比如網站伺服器(Web Server),再怎麼複雜,宏觀來看都是基於Client-Server架構延伸而來的,只是中間多了很多層級。程式語言再怎麼進化,再怎麼用語法糖包裝,大部分時候都只是一些基礎的概念的組合變化。

所以有了基礎知識,搭配專業知識,配合不斷的學習,才有辦法在程式開發這條路走得久遠。

程式開發之路系列文

程式開發之路 - 入門篇

程式開發之路 - 初階篇(本篇)