過早最佳化是萬惡的根源

已經半年沒寫blog了,中文寫作能力好像有點退化。趁著剛看完xdite的文章「給尚未大學畢業的朋友的幾個人生建議 – 挑戰未來篇」後,心中還有不少想法時,趕快整理分享一下。

從小到大,我一直對這世界的「教育系統」(也就是學校)有著複雜且矛盾的情緒。學校該教的是理論知識?還是可以在工作時馬上派得用場的實務技術?我一直覺得比這些更重要的是要培養學生的思考能力和自學能力,但台灣的學校走的卻是相反的方向(灌輸知識)。更矛盾的點在於,如果學生經由學校培養出了強大的自學能力,那還需要繼續待在學校學習嗎?

我和xdite的想法有很大的共鳴,她說的三件不要做的事「可以不要念大學」、「不要做研發替代役」、「熱情比什麼都重要」,我也多次跟不同人給過同樣的建議。以我自身的情況,我相信我即使不念大學也能靠寫程式在一些中小公司混得不錯,甚至不到20歲就自己接案或開公司都有可能。但和xdite不同的是,我完全不後悔花了10年從大學一路唸到博士。

我國中就自己學會寫程式,從大一時就在一些公司兼差寫程式,所以我很早就知道這不是需要上大學才能學會的事,而且我甚至已經能靠這個技能賺不少錢。我也在高中時就知道大學(尤其是台大)不教實務技術,教授不會教我最新的程式語言和framework,或是如何把程式寫得更漂亮、把軟體架構設計得更有彈性和效率。但偏偏我有興趣的都是這些事,既然早知如此,為什麼我還要念完大學,甚至繼續念了碩士,最後還出國念了博士呢?

資訊界的大師Knuth有一句名言:「premature optimization is the root of all evil」(過早最佳化是萬惡的根源)。

名言之所以是名言,就是因為這句話可以應用到很多地方,甚至包括人生的選擇上。

雖然我很早就發現自己最有興趣並且最擅長的事是寫程式,但我並不想老是寫別人想要的那幾種程式,而把自己侷限在這個小世界裡,而放棄探索其他的可能性。我不是說我想探索醫學法律或政治這種完全無關的領域,而是我想知道我在資訊這個領域可以走到多深或是可以從這裡擴展得多廣,甚至是跟其他領域結合起來創造全新的火花。如果我在高中就決定我想要全職接案寫程式,那我一輩子的成就可能就是寫過一千個有不同外皮的論壇和購物網站了。

反過來想,如果我放棄念大學,會失去什麼?

第一,紮實的理論基礎。很多人覺得大學教的東西和產業脫節,就是因為大學偏重理論而不重實務,導致畢業後沒有適合工作的技能,所以覺得上大學沒用。雖然我大學的課幾乎都沒去上,但該學的資訊基礎科目我還是有學,只是我是用自己的方法學而已。學習任何學問都一樣,基礎永遠是最重要的,不懂事物背後的道理,就不可能靈活運用甚至加以改進和創新。

我在高中參加程式比賽時就知道自己不夠聰明,不是念純理論的料,但我還是想要知道每天用的作業系統、網路、操作介面、程式語言背後運作的原理和機制。而念大學是「當時」*唯一能讓我有系統學會所有基礎知識的最快方法,即使我不聽課,我也有作業可以練功,還有周遭的同學可以討論。我不是個滿足把東西做出來就好的人,我會一直想要加以改進或是找出完全不同的方法來讓事物變得更好,所以學會這些理論和知識是一個不可或缺的基石。

在軟體業有個陷阱。因為「新技術」出來的太快,很多人以為要進步就要一直追逐最新的東西(包括各種軟體工具/程式語言/framework/library/design pattern),不然就會被時代淘汰。但其實這些技術背後的理論和思想數十年來幾乎沒有多大進步。如果理解這些思想,就能看穿這些技術背後的本質其實都是互通的。看穿這點後要學各種「新技術」其實都不費吹灰之力,甚至才能站得更高變成創造新工具和新思想的人。

這個陷阱的反面是,一直忙著學習「新技術」,會讓人一直以為自己有在進步和學習,但其實學到的都是換湯不換藥的東西。每天忙著追逐新出爐的技術,等於畫地自限把自己的極限設定在這些技術上頭,豈不可惜。

換個例子說,如果人類只是滿足於學會各種騎快馬的技術,那汽車和飛機就永遠不會被發明出來了。

第二,眼界。在我之前一篇文章「我為什麼要念博士」也提過,打開眼界是我在台大最大的收穫。從MIT畢業後,我甚至覺得我的眼界又再被打開了一次。一個人會做什麼事,完全取決於他看到的、聽到的、體驗到的生活經驗。就像大學生老是做選課網站和團購網站一樣,因為那就是一般大學生的生活。

學校的好處在於各種人和各種課程都有。每個同學都有不同的夢想和目標,更難得的是這些夢想還沒被社會的現實壓力摧殘過。多元化的課程也可以讓人想學什麼就學什麼,一切只是看自身的意願而已。在學校裡聽著各種夢想和經驗,讓我會想嘗試各種不同的機會,挑戰自己的極限。我的人生道路常常大轉彎,雖然每次剛要轉彎時都不知道接下來要面對的是什麼,但每次都發現離開自己的舒適圈後都可以邁向新的高峰。這就是眼界帶來的威力。如果不知道一山還有一山高,我就不會有勇氣離開目前的山頭去登上更高的山,進而避免自己做出過早最佳化的錯誤決定。

很多人說大學教的東西沒用,但我一直覺得,大學教的東西不是沒用,只是看你會不會用。而決定你會不會用的關鍵,就在於你的「眼界」。我每次想要突破自己的舒適圈時,都會遇到新的挑戰,而以前沒學好的「基礎知識」就會在這時跑出來咬我幾口,強迫我把它學好才能繼續前進。如果你老是覺得做的事很無趣,用不到大學的知識,那很有可能只是你鑽得不夠深,想得不夠多而已。

第三,練功時間。xdite說不要白天做完全沒興趣的工作,晚上才自己偷偷練功,這點我完全同意。但我覺得既然要練功,為什麼不在學校就開始全職練呢?念大學的時間可能是這輩子最自由的時間了,以資訊系為例,喜歡學各種程式語言可以每個作業都用不同語言寫,喜歡做網站也可以把每個作業都用不同framework做成網頁介面。這其實就是訓練自己把理論和實務技術結合的最好時機,也是可以容忍自己不斷犯錯和嘗試新事物的天堂。(到美國念資訊博士班更好,學校/教授會出錢讓你練自己想練的武功。)

全職工作是練好一項功夫的好方法,問題是工作是領別人的錢幫別人做事,很多時候自己沒有選擇想練什麼武功的自由,過十年很可能就還是只會一種武功。尤其是職業的工程師,已經熟練特定的語言和工具,在工作時就會傾向一直用自己最熟悉的工具來做,因為這樣才能最有效率的生產出客戶要的東西。在這種壓力下,只能把自己本來就會的技術練得更熟練,而沒有辦法利用工作時間去學一個本來完全不熟的技術或理論。以做網站為例,一個已經用PHP做了一百個網站的工程師,能跟老闆/客戶說「我覺得node.js很有趣,能讓我一邊學一邊用來做新專案嗎?」

說到底,一個喜歡追求進步的人無論放在什麼地方都會不斷要求自己。只是拿別人的錢就得多一份無奈和妥協,學習的自由也會被多剝奪一些。很多人在大學裡放空實在很可惜,因為我覺得大學其實是一個精神時光屋,如果能在裡面全心投入鍛鍊和學習各種知識和技能,出來後都能是超級賽亞人。但如果你在裡面放空四年,出來後只會感覺像坐了十年牢一樣空虛和無趣。當然,如果是一開始就念了自己沒興趣的科系,那… 別浪費時間,趁早轉系或乾脆暫時休學吧。

整體來說,我覺得念大學對我的幫助很大,但同時我也覺得不是每個人都應該念大學。不是每個人都當吳寶春這篇文章的比喻很不錯,

如果以蓋大樓來形容這個概念,把砌磚作為一種技能,把蓋大樓作為一種知識,我想可以這麼講 如果你早就知道你喜歡砌磚,很會砌磚,就直接去砌磚吧。如果你的夢想是蓋大樓,你要學的東西還很多,那讀大學是你最好的途徑。 不是每個人都要蓋大樓,靠砌磚就可以賺錢了,砌的好還可以賺很多錢,大家搶著要。

我很喜歡砌磚,但如果我因此而過早專注在提昇自己的砌磚技術,我就永遠不會知道自己真正的夢想是蓋大樓了。

*註: 之所以說「當時」(2001年)念大學是有系統的學會這些知識的最好方法,是因為現在狀況有些改變了。MIT, Harvard, Berkely聯手開了edX; Stanford出了UdacityCoursera; 高中前的知識有Khan Academy。世界的教育系統正在慢慢被改變,對於現在還沒念大學的人來說,這些新選擇值得花點時間好好研究一下。在台灣有學位不等於有能力,學位的價值不斷被稀釋,或許台灣正是適合推行這些新系統的最好場所。

35 thoughts on “過早最佳化是萬惡的根源

  1. 「過早最佳化是萬惡的根源」的比喻很有趣。

    勸人勿盲目追逐「新技術」的片段及例子似乎有點失當,既有優良的思想以符合時代需求的外觀出現,不就是許多「新技術」的本質嗎?

    倘若從未「學完」「所有」的既有思想,那麼學習「新技術」不就是瞭解這些思想的過程?

    人們能愚笨到一直重覆學習性質相似的「新技術」?

    這應該是為了加強說明在大學學習基礎理論的重要,卻又未給出怎麼樣的「新技術們」對應到了怎麼樣的理論思想?

    • 學習新技術沒有錯,但新技術不見得是新思想,這是需要小心分辨的。如果沒有看出背後的本質,很容易就走了冤枉路學了一些很快被淘汰的技術。

  2. 嗯,電腦科學及人工智能,同醫學、法律和政治,俱有既深且廣的關係。

    期待日後 vgod 可以自由往這些方向拓展,庶幾不失為 delayed binding 之道。:-)

    • 哈 好個delayed binding!

      這讓我想起, 電腦科學其實可以用一個字來解釋完畢 — abstraction。

      希望在我有限的能力和時間中,能一直拓展視野和悟出這些不同領域間背後的關係。

      • 嗯,我想在“抽象”的基础上,再加上“通信”。

        我在想,是不是不同学科之间抽象出来的共同部分,就是哲学了呢?vgod 你怎么看啊?

  3. 全職接案寫程式並沒有你想的那麼嚴重,因為短期專案開發其實你有很多機會選擇使用新的技術、概念,只要你克服的了自己的惰性,下一個沒有指定技術的專案使用 node.js 也未嘗不可(不過也的確,人都很容易屈服惰性 XD)

    認同教育是為了培養學生的思考能力和自學能力,但目前這樣的期望在從排名在中間、後面的學校變成了奢望(不知道你有沒有遇過那種上課只唸課文的教授,那種念到他自己覺得無聊打瞌睡的),既然現況如此,也許將一定比例的學校轉為技職體系反而對整個社會有著比較大的幫助,而不是像現在這樣培養了大量對未來茫然的大學與研究所畢業生 😉

  4. xdite 說得也不完全是錯的
    只能說他自己沒有唸過,沒有這種眼界,有什麼立場給年輕人這種建議呢?

    • 說的好,同樣的道理,一個不需要當兵的人在那邊叫人家不要服國防役是啥鬼,她當過兵嗎?

  5. Pingback: 被迫才是进步的原动力 | IT News - 发布最新IT信息

  6. Pingback: 9 Way to be Myself :: 1028 就是有人跳下去會死啊 XD

  7. Pingback: 被迫才是进步的原动力 | 艾艾时代

  8. 要說這篇文章有什麼問題,那就是這句話很沒說服力……

    “我在高中參加程式比賽時就知道自己不夠聰明”

  9. 高等教育可以讓人的視野更開闊,
    讓你站得更高讓你看到週圍更多相關或不相關的事物,
    而你要做的是如何用你學到的基本功夫去串聯或互聯這些事物。
    比如你學會了電視技術,你也看過3D電影,你也懂最新手機原理,
    這時你會想:
    可不可以用裸視方式讓電視成為不用戴3D眼鏡的電視?
    ⋯⋯更多
    http://www.facebook.com/wiso168

  10. Pingback: reggaeton beats

  11. 我是一個大學老師,我很認同您的說法,我想轉載您的文章給我的學生們看,是否可以?

  12. Pingback: 被迫才是進步的原動力 | SYSU 全人類補完計画

  13. 有些人會說,早知道就怎樣怎樣, 或早知道就不要怎樣怎樣。
    但如果早知道,你就也不是現在的你了,
    有人說念大學是浪費時間的事,出社會學經驗才是王道,有人認為念書是基礎,
    其實只是看事情的角度不一樣而已。人生可以走的路本來就有很多條,
    雖然聽別人的建議,或許可以不要走一些所謂的冤枉路,
    但走過,跌過受過的教訓,跟只是聽別人說說,畢竟是不一樣的感受。
    每個人都可以選擇自己想走的路,因為他會帶你走往不同的結局。

  14. 研發(R&D) = 研究(Research) x 發展(Develop)

    或許R需要自由, D需要一定程度的被迫吧

    R和D需要的情境不盡相同, 人想跳出習慣, 發明全新的工具, 就需要自由, 但要把工具運用到熟達, 則需要一定的職場壓力

    這是我對@vgod和@xdite兩位三篇文章的綜合心得

  15. 先不論能力的好於壞
    就是要走捷徑, 還是選擇融會貫通…
    只要努力都可以有很好的成就
    有時成就真的就是如表面一般…

    我很認同 vgod 的想法,
    但問題在於 “時間可不可以重來”
    並不是每個人都能擁有很好的學習環境,
    或是浪費了許多時間在其他地方
    而迫使得去走捷徑,
    這也是這些人要在社會上競爭
    所剩下的籌碼

  16. Pingback: 過早最佳化是萬惡的根源 | DoBest.Us

  17. Pingback: halitosis

  18. Pingback: 過早最佳化是萬惡的根源| vgod's blog - 熱點新聞網

  19. Pingback: 永遠向前 | Born to be remarkable

  20. Pingback: 程式自學十年心得:想吃這行飯,學好演算法與資料結構才能讓你站穩腳步 | 发头条

  21. Pingback: 轉載-[心得] 十年程式自學之路 « 2017universiade.0800.WS

Leave a Reply

Your email address will not be published. Required fields are marked *

*