我自己認為,程式當然有比較需要天分的部分,像是演算法。
比較簡單的演算法、資料結構還可以理解,像是排序、最小路徑、Stack、Heap 這些常見的東西,都還可以理解。但是在深入往下探討,什麼 NP、NP-Complete 我是從來沒有搞懂過。
這就是為什麼我後來也放棄繼續唸研究所,因為資訊相關科系,研究所都是偏數理的,尤其是AI、資料相關的,非常仰賴數理能力,我自認沒興趣也沒能力,就沒有繼續往下走了,選擇直接就業。
寫程式需要天分嗎?
回歸正題,所以說,你需要是一個天才,才有辦法寫程式嗎?
撇除我前面提到的那些偏數學理論的複雜概念,我認為其實大部分人都可以透過努力,搭配正確的練習,達到一般程度,甚至中上程度的 programmer 的。
我自己脫離學習階段有點久了,記得大一的時候,剛開始在練習課本上的案例時,也是有點挫折。後來我就把課本上每個範例的程式碼,一行一行的敲上 IDE,遇到問題就反覆測試,自己上網找答案、自己讀懂錯誤訊息 debug,幾乎把整本將近一千頁的原文書上的範例全部做完。
在大量練習後,課堂上不論是作業、還是考試成績,我在班上都是前幾名的。
有些人可能高中、甚至國中,就有接觸程式語言了,這些人可能是社團,可能甚至參加過學校的培訓,也可能是奧林匹亞的選手,入門的課程對他們來說都太簡單了。大部分人,應該都跟我一樣,是上大學後才接觸真正的程式語言的。
也許這些人之中有真正的天才,但更多時候,他們只是比你更早接觸而已。
為什麼寫程式這麼卡?
程式在撰寫的過程,需要在腦中把很多資訊編織在一起,如果沒有累積一定程度的刻意練習,初期一定是覺得是相當困難的。但其實這種東西就是熟能生巧,多寫是一定有幫助的。
就像你在學英文的時候,如果對方用英文問你微積分,你要同時想要怎麼解這題,又要想怎麼把內容翻譯成英文,當然是做不到。光是說普通的英文就卡了,更別提要講這麼複雜的英文,對吧?
當你在練習寫程式的時候,你一方面要想出解法,一方面又要把你的想法翻譯成程式語言,自然是很卡手、挫折的。
當你透過大量練習,習慣程式的用法、習慣把想法翻譯成程式後,就不會那麼的卡手了。
所以如果你覺得身邊的朋友好像都是程式天才,距離他們很遠,其實我覺得也不用這麼難過,只要你能理解,寫程式也是需要熟練度,那你就不需要這麼擔心比不上其他人,他們就只是比你們早學而已,比你們熟練而已。
比天分更重要的是興趣
比起天分,我反而覺得興趣才是更重要的。
當你哪邊寫錯的時候,編譯器總是會毫不留情地噴錯誤給你,EQ 差一點的人,被編譯氣嘴個幾次,可能就直接氣到放棄寫程式了。上完大一程式設計後,就直接篤定自己不適合寫程式。
但有興趣的人,反而會很有耐心的去解讀這些錯誤訊息。其實程式語言某種程度上有趣的地方是,這些錯誤的反面,就是答案本身。寫程式寫到後來,沒有錯誤訊息反而困擾呢。
初期在寫程式的時候,你只能做課本上那些愚蠢又無聊的題目。別說是課本了,我甚至覺得 leetcode 的題目也很無聊XD一天到晚在找出陣列中的數字和,什麼找到連續的幾個數字,真的是很無聊。
所以你必須要對程式語言本身有熱情,對於電腦的運作原理本身有興趣,否則一天到晚練習這些無聊的題目,真的不想放棄也難。
通常要等到開始工作或做專案,開始用程式解決現實的問題,開始做出實際的例子後,才會感受到寫程式帶來的成就感。可惜很多人撐不到這邊,就被一些無聊的錯誤擊退了
結論
是的,做任何事情有天分,都會比較容易。但是更多時候所謂的有天分只是比你更早接觸而已。想要學會寫程式其實更需要的是練習,不應該總是悲觀地認為自己沒天分,我認為這只是一種逃避。
再來,跟其他任何事情一樣,一件事情要做的久,背後都需要興趣的支撐。興趣不足以支撐大量的練習,這恐怕才是程式寫不好的最大原因。