追求神乎其技的程式設計之道(番外篇)

我的學習過程

還記得小時候我和我弟上過一個奇特的數學補習班,叫做「功文數學」。他們的「教學」方法非常特別,不像一般的教室會有一個老師在講台上教課,而是每個人會拿到一疊數學題目,每一面都有數個計算問題,像是「10 x 2 = ?」這樣的問題。每次去功文的任務就是把那一疊題目寫完,寫得越快的人就可以越早回家。那些題目說來沒什麼意思,從頭到尾全都是計算問題,難度從最基本的加減乘除,一直到微積分都有。每次寫完題目後,會有個類似老師的角色,拿出解答本幫你對答案,打上成績。如果在那老師能應付的範圍內,他可能還會跟你說說哪裡犯錯了,下次多加油之類的,但如果到了國高中程度的問題時,老師的作用就只剩對答案而已了。

我之所以說這個補習班很奇妙,原因就在於這個教學過程中,講求的是大量的計算和自我學習的能力。我從加減乘除開始,一路這樣寫到了微積分,寫到後來那邊的老師也沒辦法批改了,乾脆把解答本拿給我們看,讓我們自己看解答學。起初我還覺得這個補習班挺不錯的,只要我做得越快就能越早回家,對小孩子來說是個很好的誘因。而且因為大量的訓練,讓我的計算能力變得非常好,國小國中時的數學考試我都不用準備也能很快寫完交卷。但後來我開始覺得不太對勁,很多題目我雖然知道怎麼算,但我其實不懂為什麼要這麼算,或是這麼算的意義是什麼。可是台灣的考試也不管這個,反正你只要能得到答案,根本沒人在意過程是怎樣。

功文數學的這套方法對訓練計算能力而言很有幫助,因為計算就是需要大量的練習才能變快變好。但問題是,計算能力再好,也是只能算已經定義清楚的問題(也就是考卷上的問題),而無法發現新問題並定義問題,更糟的是還會讓人習慣在沒有完全理解背後的概念時只學得方法快速得到答案。

在我高中開始參加程式比賽後,我用了我熟悉的這套方法訓練自己的程式能力,自己一個人大量的找題目練習。每天從早練到晚,即使沒有人教我也覺得很正常,因為我從小就是這樣自學起來的。這樣練了一年後,我能飛快的寫程式和解題,看到熟悉的題型就能馬上開始敲鍵盤,但同時我也開始覺得寫程式變成一種機械化的過程:看題,解題,寫程式,看題,解題,寫程式…。跟我從小做數學似乎沒兩樣。

我開始覺得無趣。即使我程式寫得再快再好,也只是解出一個別人設計好的問題而已。

心中的聲音不斷的說:「為什麼我要做別人早就知道答案的問題?

我想要做沒有人做過的事,看到沒有人看到的問題,再親手解決這些問題。

當我開始這麼想的時候,我正在一邊學著做科展。科展全名是科學展覽,意味著要做點跟科學有關的事來展覽。以前的文章提過,我高三時夢想著要讓電腦自己寫程式,我覺得這是一件沒人做過的事,非常酷,所以我就一直專注在這件事上(其實當時就有很多人在做這種研究了,只是我不知道而已)。但從一開始到我被選上去美國參加國際科展時,我都一直不覺得這件事科學在哪,頂多說是一個工程(或工藝)作品。但選上代表後是有些好處的,台大的歐陽明教授給了我一些指引,讓我知道「科學方法」得測量和量化這個作品的結果,才有客觀的數據可以知道它的作用,進而跟其他相似作品比較好壞,也因此我才開始對「做研究」這件事有點概念。(到這時我才想起來,小時候雖然有做一些物理化學實驗,但從沒人跟我說過這些實驗是有一套標準的方法和流程的,當然也沒人跟我說這件事的價值所在。)

雖然做科展挺有趣的,但同時我也對科學感到失望 – 因為我意識到科學方法沒辦法幫助我們發明新東西,只能用來評估和檢驗已知事物的好壞。至於所謂的創新科學研究,也是得先提出一個假設(hypothesis),然後再用這套標準方法去驗證它是否成立。但到底要假設什麼事情呢?科學可沒辦法告訴你。

上大學後,我看到當時處在黃金時代的MIT Media Lab所產出的許多創新研究成果,也開始接觸到設計(design)這個領域。我發現Media Lab的人大多有跨領域的背景,像是設計師+電機工程師、或是音樂家+軟體工程師,他們常看到別人看不到的問題,並提出簡單又優雅的解決方法。我以前一直以為做設計的人講求的是美術天份,但後來深入了解後才發現這是個大誤會。設計的目的是解決問題,跟程式設計師其實沒兩樣,只是用的工具是紙筆或模型罷了。(但一個好的設計通常也都很「美」就是了)

雖然如此,設計師和工程師也有很大的不同。設計師對四周環境和日常生活很敏感,常常得在生活中注意各種細節的不完美之處。但工程師成天泡在電腦中,而且很善於使用其實很難用的介面和程式(像Linux、vi、command line、還有各種程式語言),甚至引以為傲,日子久了也就不覺得這些東西有什麼問題。泡在程式碼中的工程師也一樣,如果習慣了和前人或其他人的大便碼相處,久了也就不覺得臭了。

發現這些現象後,我開始學著跳脫出原本習慣的一切,開始注意生活周遭的各種細節,思考為什麼這個東西當初要這樣設計、這樣做有什麼好處和壞處、有沒有更好的方式之類的問題。之後,當我習慣觀察細節後,慢慢察覺到我習慣用的軟體、工具、環境、程式語言,處處都是設計後的結果,而且充滿可以改進和創新的空間。這些東西都不是沒來由的產物,而是經過某些人思考過後的結果,甚至是經過好幾輪的演化結果。可惜平常在學習或教學的時候,很少人會提到這些歷史淵源和演化過程,以至於這些設計都變成理所當然的存在。但如果我們能仔細觀察平常的事物,進一步思考就會發現很多設計都是為了因應當初時空環境的限制,而這些限制現在不一定存在了,所以我們就會有發揮的空間。

眼光拉遠後,能看到的問題更多了。到了這個階段,能力強的人會覺得能解決的問題也很多。但上天給每個人的時間是一樣多的,這時重要的事情反而又變成:「找出最重要、最根本的問題來解決,而不要被眾多的小問題和小機會所分心,才能產生最大的影響力」。

回顧我的學習過程,我會覺得每一個階段都是一塊基石,一塊塊往上疊以後才會具備該有的能力和經驗做下一階段的事情。舉例來說,要是我一開始沒投入程式比賽的練習累積足夠的實作能力,之後我就沒辦法隨心所欲的寫出我想寫的程式,也沒辦法參加科展體會做沒人做過的事有多麼有趣。之後我可能就會一昧沉浸在鑽研各種流行技術中,或是眼高手低說得一嘴好主意但卻做不出什麼來。

雖然學習是一步一步往上走的,但過程中每件事都有反面的效應,讓我不知道是不是做別的選擇會更好。像是我覺得功文數學浪費了我太多時間在數學計算上,而限制了我在其他方面的發展,但同時它也讓我養成靠自己學習的習慣;參加程式競賽也有類似的效應,雖然增強了我的程式能力,但也讓我錯過正常的高中生活和課程(雖然說到目前為止沒有覺得有什麼負面影響)。

無論如何,我相信在成長的過程中適當的大量練習是必要的。異數(Outliers: The Story of Success)一書的作者Gladwell說要精通一件事情至少需要一萬小時的練習,我相信這是真的。我在高中為了比賽所做的練習起碼就超過五千小時,上大學後輕易就超過一萬小時,但其實我也不覺得我真的精通了什麼。經過大量的練習,本來很難的技巧或技術都會變成一種本能,可以很自然的使用它來從事更高階的應用或是建構更複雜的技術。沒有這些基礎,也就很難站在更高的地方看得更遠想得更多,我也不會走在現在的道路上。

29 thoughts on “追求神乎其技的程式設計之道(番外篇)

  1. Pingback: Tweets that mention 追求神乎其技的程式設計之道(番外篇) | vgod’s blog -- Topsy.com

  2. 很多人都明白练习的重要,却怀疑所费时间与收获的比例,只有那些坚持到最后的人才明白这收获可以有多大,谢谢你

  3. 文章最後的結論,”大量練習”,在”我比別人更認真”這本書裡,也是一直被提及,有相似的結論。

  4. 個人覺得階段論(…”回顧我的學習過程,我會覺得每一個階段都是一塊基石,一塊塊往上疊以後才會具備該有的能力和經驗做下一階段的事情。”…)說得很好,也適用於像我這樣起步有點太晚的人:不論作什麼事,我們能作的就是一步一步往前走,繼續累積。

    至於起初累積的方法是否正確,我的想法是,如果稍微往未來看,就會發現那只是形式上的差異而已。就好像歐美語系的人看中文字,一開始會覺得記了一大堆符號很浪費時間,但對於習慣了這樣大量基本元素的我們而言,方塊字就只是比拼音文字更好用的詞彙而已。重要的是尋找自己可以接受的方法,不要讓學習的熱情被燃燒殆盡。

  5. 很多启发。
    “练习一万小时成天才”,现在看到这句话出现的地方越来越多了

  6. 先懂才大量練習,還是先大量練習再理解比較好?
    再來,對於programming,思考也算練習嗎?

    (我習慣於一個人看書思考到我能夠懂為止才去做練習
    但相較於其他同學,我的學習速度如烏龜般緩慢,
    同時,這也讓我實作的時間變少很多。)

    • 根據我的經驗,思考和實作是兩件不同事情,分別都需要大量的練習。
      我的作法是雙管齊下,邊看書邊找題目練習,剛看懂一個topic可以先針對那個topic相關的問題做練習。不要等整本書都看完了才想練習,那樣沒辦法得到即時的回饋,也不知道是不是真的懂了。
      練習時也是要找出有效率的方法練習的,一昧埋頭苦幹但卻不懂自己在做什麼會支持不久而且效果也會有限。

  7. 这篇文章好。

    跨领域的人确实更容易看到事物之间的联系,然后再把那些点连成线。很多时候我们也都会忽略自己已经掌握的东西,而放大了自己没有掌握的东西的作用,所以很多程序员会觉得写程序没用,想要去做产品设计,但实际上写程序的能力对产品设计确实有很大帮助,不过是不自觉罢了。

    • 剛看了您blog上的「開發與研發」,深有同感。
      之前我也有想寫這個主題的文章,但看了您的大作後我覺得只要跟別人推薦您的文章就好了。:)

      • 呵呵,不敢当 🙂

        我一开始觉得可以写好那个,但后来写的过程中才发现自己的积累和认识还不够,其中不乏有肤浅的观点。我本来就是想要抛砖引玉的,如果您能写一篇相关的文章,那就太好了,十分期待。

        有一点我比较确信:如果想要创造东西,那就需要深入了解它的大部分细节,就不可能不涉及到程序之外的很多东西。还有就是,我觉得国外好多写代码的人兴趣都会广泛,比如音乐、设计、写作等,都会有比较深入的了解,但是大陆这边的相对来说就比较单一,没有那么“cool”.

        希望有机会可以和您深入交流 🙂

        • 非常同意你的觀點。我也相信創新不是沒來由的靈機一動,而是要有大量的知識和深刻的理解後才能看出方向和機會。我看過很多沒有技術背景的人覺得他們有很好的點子,但其實只是因為他們對這個領域了解不夠深不夠廣,所以看不出本質的異同。相反地只著重在技術面的人,也容易過度執著於技術上沒有新意,而忽略創新的應用或設計之可能性。

          有機會我也很想和您多多交流 🙂

  8. Pingback: 貓居。C'FrCo » Blog Archive » 日誌│努力只為了夢想 - 一隻貓,一台電腦,走遍世界

  9. 您好 🙂

    從 “追求神乎其技的程式設計之道(十一)- 抽象化與命名”這篇文章追到這來,才發現原來是曾經高一同學的您所寫的,多年之後,我竟然也誤入歧途(?)寫起code來,人生實在是意外性十足。實在是很服你的熱情和毅力,至少是現階段的我所遠遠不及,祝福你異地求學一切順心 🙂

  10. 可是如果没有那些前人设计的结果,我们所能做的也就是从头开始罢了。真正能创造出新东西的人还是很少的吧。

  11. 從2008年一口氣看到今年,真有種說不出的感覺。
    本來以為這是歷史,沒想到是正在創造歷史!
    越來越期待北北基聯測完的日子了!
    不過,先讀書去~

  12. 在高中时候,我一直在想一个问题:“既然我们高中三年的目标就是上大学,那为什么还要设立音乐与美术之类的课程呢?”当我上了大学我突然明白,学习那么多的科目无非就是让我们掌握发现与解决问题的能力。音乐也好数学也罢都是用自己的探索去解决所遇到的科目问题。夜读博主的这篇文章,突然感觉到,能把自己心目中所想的行文流水的写出来实属高手啊!祝VGOD MIT学习愉快哦^^

  13. 看了博主的這一系列下來,發現博主是個很勤奮努力的人。但同時我認為博主也應該很有天分。因為搞編程競賽時後的一系列算法和問題,就像之前提到的大都是數學問題,需要進行抽象建模再挑選經驗中高效的方法求解。數學這一關我認為是很有難度的,涉及到很多方面的並非高中生就可以完全掌握的數學知識像微積分,概率論等。而博主在歷程回憶中只提到隻字片語,看來是對此並沒有太多印象,便早已溶於思維之內了。
    另外雖然提到高中畢業是稀裡糊塗的,也挂了很多門課程,但是寫起文章仍能行雲流水,很難想像博主是每天全部時間泡在電腦前coding的人,相信那些課程只要略微看看便可以成為全能型geek了~

    當然來此留言的主要目的是希望博主回憶并講述一下編程和數學之間的關係~ 看來跑題太遠了……

  14. 很感謝您分享這系列的文章 我看過這一系列大概三四次了吧 每次都還是會有不同的收穫 從第一次看覺得很熱血 到 後幾次慢慢可以理解您想要表達的意思 也從這些文章中看到還有很多要學的東西 總之 謝謝您分享這一系列的文章 內容很豐富也很實用

  15. 你好!我是今年高一的學生,是女孩子。
    我的社團是資訊研究社,所以懂了非常非常基礎的東西,其實我根本沒在做題目,然後電腦老師叫我去參加資訊比賽(………)
    然後我就開始查相關資料,結果發現了這篇文章!
    我本來打算暑假沒事再讀一下老師給的書,看完你的文章,我覺得我想要去IOI!
    我知道現在才開始看書好像已經比別人晚了好久好久,但是我剛剛才發現,我的那股衝動。
    雖然好像從來沒有女生拿過獎牌,也很少女生進決賽,但是我要試試看。
    雖然我的數學快要被當了(嗚嗚嗚)。
    但是我一定要試試看。

    謝謝你,和你的這篇文章。

  16. (哈哈其實我剛剛發過了但好像不見了)

    你好,我是高一的學生,是女孩子。
    我的社團是資訊研究社。
    我在那裡只學會了很基礎的東西,我根本就沒在做題目,結果前幾天電腦老師叫我去比資訊比賽(……………)
    然後我就開始查資料,結果查到這篇文章。
    我本來打算暑假閒閒沒事做再來看老師借我的書,結果看完這篇文章之後,我決定要認真讀了。
    我覺得我想去IOI。
    雖然沒有女孩子拿過獎牌,雖然好像很少女孩子能進決賽。雖然我知道我已經落後別人很久很久了。
    但我想試試看。
    雖然我的數學快要被當了(嗚嗚嗚)。
    但是我還是要試試看。
    因為我好不容易有了想做一件事的衝動。

    --我要去IOI!!!

    謝謝你,還有你的文章。

    P.S.有沒有什麼建議可以給我呢?(笑)

    • (不好意思, 留言有時會被spam filter擋下, 我得人工批准才會顯現出來..)

      我從來不覺得性別會是學習的障礙,我高中在參加IOI時也認識很多優秀的女同學。跟我同年就有個女生是備取的國手,後一年有另一個女生選上國手。

      有熱血和決心就衝吧,青春時有這種為了一件事用盡全力的感覺是很好的。

      加油!

留言給我吧!