[寫程式] 其實我是氣宗的。

一些都從這裡開始

話說這兩個星期在 PTT 的 Soft_Job 版上,有一串很有趣的討論串:

[請益] 覺得自己能力不足,我真的適合寫程式嗎?

主要一開始是一位已經寫了些程式的高中生對自己是不是真的會寫程式這件事感到懷疑,認為自己是不是只是會 Google 已,沒想到之後引發了不少的討論,各方面的觀點都有,而我自己也跳下去寫了一篇

不過之前寫的那一篇比較像是針對原 PO 的問題提出一些實質上的建議,但沒有我自己對於這個議題,以及常常在吵的「該不該唸大學」的問題的看法,所以這次來寫一篇比較完整的好了。

華山派的劍宗與氣宗之爭

其實整件事在我看來,就如同笑傲江湖裡華山派的劍宗與氣宗之爭,有的人認為既然是華山劍派,自然是以劍法為主,把華山劍法的套路練熟才是正途。但也有人認為,只要基本的內功練得好,學什麼劍法都快,只要內力到了,飛花摘葉俱可傷人。

另一方面,某些人則說什麼劍宗氣宗這些都是屁,管你內功好不好,華山劍法熟不熟,最重要的是好像令狐沖一樣,知道每一樣武器的特性,掌握了對方所使用的武術的要訣,講究的是能夠見招拆招,克敵致勝,這才是王道。

把上述的情境換到寫程式這件事情上,就是有人認為出來寫程式混口飯吃,會用你需要的程式語言/函式庫/框架,知道怎麼樣組合出可以動的東西才是重點,也有人認為演算法、計算機概論、資料結構等等基本功才是重點,但也有好些人主張,了解 Domain Knolwedge 才是最重要的。

程式有趣的地方就在於你不懂也可以寫得出來

雖然有些不了解的人可能覺得寫程式很難,但其實寫程式的進入障礙非常的低,任何人只要有一台可以上網的電腦,基本上就俱備了可以寫程式的環境了。就算你沒有錢去上課,書局、網路上也一堆書本和資料給你參考學習,只要你不懼怕英文,要入門寫程並不困難。

然後寫程式這件事有趣的地方就在於因為我們現在有高階的程式語言,有好用的函式庫,有幫你幾乎做掉一切的 Framework,一切都愈包愈上層,所以你不懂啥是 HTTP、或是 List 與 Array 之間各種操作的時間複雜度的差別也沒關係。

反正隨手抓一本網頁程式的書,照著上面做一遍,大概也可以做出一個可以動的網站出來。如果不是個死背書的,再稍微應用一下所學,東修西改的,大概也能湊合出來自己想要實作的東西。

我覺得這正是寫程式這件事的魅力所在--我們可以很容易就創造出自己想要的東西。

但另一方面,真要深究起來,寫程式這又是一門很深的學問--往比較底層看,你可能要了解什麼是 Compiler,什麼是 VM、什麼是記憶體管理,你在寫的程式到底實際上是怎麼執行的,為什麼你用的程式語言提供了各式各樣不同的資料結構,List 和 Array 與 Hashtable 有什麼差別,為什麼我們可以送資料到另一台伺服器上……等等。

往比較高的層次看,則可以研究各式各樣的編程典範,例如 OO 和 Functional Proramming,以及如何有效率的組織自己的程式,又或者是研究 Desgin Pattern 等等。

而上面這些光是其中一項就可以研究很久了……但我自己是則是覺得,上面演算法什麼的這些就像是內功一樣,是基本功,而你用的程式語言/函式庫/框架則是劍法。你不會內功,照樣可以練劍,練得熟了一樣可以上場打架,也能夠打贏。

在我自己看來,其實原 PO 的問題就像是自己照著劍譜練,已經練到了小有所成,並且也懂得臨機應變來變化自己的劍招,但卻還沒有扎實地練過內功,所以懷疑自己是不是只會花拳繡腿而已。

但其實我是氣宗的

至於我自己呢……其實在寫程式這方面我自己是氣宗的,雖然岳不群真的有夠賤的。XD

如同我在另外一篇所說的,寫程式有趣的地方就在於進入門檻很低,而且你就算一堆東西都不懂還是可以東拼西湊出一個可以動的東西。

但這件事也常常有陷阱的--對,你的東西可以動,但可能速度很差,因為你用了不該用的資料結構和演算法,或者是你的程式架構像坨屎導致將來維護困難等等。

我自己是覺得練一些基本功對於寫程式是絕對有幫助的。

舉例而言,我曾經接手到一支程式,他用了 java.util.HashMap 來存放理論上須要循序處理,並且 key 值還可能是重覆的資料,只因為原本寫程式的人認為這個物件可以存兩個欄位的值,很方便。

可是如果你練過一點資料結構的內功,就會知道 Hash Table 的特性就是他是沒有順序性以及 key 值是唯一的,之前這程式沒出問題只單純運氣好,沒遇到會讓你爆炸的資料而已。

而只要你懂一些 Von Neumann 架構和 Calling Stack / Pointer 等等的基礎知識,你就不會覺得 Java 裡物件的參數傳遞有什麼特別,只會覺得「毫無反應,就是個 Pointer 而已」,並且當你在 Java 裡看到 void swap(int x, int y) 這樣的函式的時候,也可以立刻就反應過來這個函式絕對不可能幫你把 x 和 y 做交換的動作,所以一定有哪裡搞錯了。

同樣的,如果你了解了各種 Garabge Collection 的演算法的基本特性,即便你不知道演算法的細節,你也不會在寫 Java 的時候去擔心有沒有 Circular Reference 造成物件無法回收的問題,因為你知道 Java 使用的是 Mark and Sweep 演算法變型,所以你只要確保你讓那一群物件變成孤島就好了。

所以說,就某方面而言我自己是氣宗的,我自己是覺得有了這些基本功,對寫程式的時候其實是相當有幫助的。

功夫練得深不深暫且不說,但有基本的演算法概念的時候,至少在你知道你的程式很要求速度的時候,你不會去抄你程設課本上的泡泡排序法來用。XD

所以我推薦想寫程式的人去讀大學相關科系

因為我自己是氣宗的,所以我真的推薦對於寫程式有興趣的人好好去唸個大學相關科系。

並不是說上面這些基本功沒辦法自學,但大學的好處就是課都幫你排得好好了,幫你把整個知識體系的學習都規劃好了,而且還有老師帶你入門,對於這種基本功的學習可以說是事半功倍,那為什麼不好好把握這個機會呢?

回響