追求神乎其技的程式設計之道(八)

追求神乎其技的程式設計之道系列:

第八集終於寫完了…。雖然我寒假過得很輕鬆悠閒,但不知道為什麼人就是會在很閒的時候不做平常一直說沒空做的事,然後硬是要在很多作業和工作時開始寫blog….。雖然開學後又開始變忙了,但我到目前還是每個禮拜都跑去滑雪,這樣看來這一系列最後突然會變成追求神乎其技的滑雪之道也說不一定XD

前言夠多了,本集將繼續我在高三時朦朧無知的學習故事…。

Intel ISEF國際科展

第五集裡提到我一直以來都夢想著讓電腦學會自己寫程式。就在我把這個想法的雛型用基因演算法實做出來後,沒想到竟然真的看到了一點結果,電腦真的能透過基因演算法來產生出一個能夠正確運作的程式!

在高三時,已經取得保送資格的我對學校的課業時在沒什麼興趣,於是我想閒著也是閒著,乾脆就把這個點子拿去參加科展看看,這樣一來我就又有理由可以請公假了(笑)。當時似乎是因為已經來不及報名全國科展了,所以我就跑去報名了國際科展,但那時我其實完全不知道這兩種科展有什麼差別。後來查了一下才知道,原來台灣的國際科展除了是一種比賽外,主要的目的其實是要選出代表去參加其他國家(如美國、法國、加拿大…)的科展活動;而一般的全國科展就是一個區域至全國性的展覽兼比賽,在全國選出前幾名後就結束了。

2001年時,那時科教館還在建中對面,那也是我第一次踏進科教館的大門。在展場內把自己的海報貼上看板後,我就到處逛逛欣賞別人的作品。因為資訊科在高中不是正式科目,參加的人比起其他科來說少了許多,但其中還是有些非常驚人的作品出現。當時有個建中的學弟Eric,他寫了一個用類神經網路辨識並動態追蹤影像中人眼位置的程式,於是他就用了個普通的攝影機加上這程式,就變成可以用眼睛控制滑鼠游標的神奇裝置。

除了Eric的作品外,其他的作品看起來大多只是某種現有產品或課本上習題的複製品,並沒有什麼令人特別印象深刻的東西出現。說起來這其實也不奇怪,因為在高中階段要自己學好一個程式語言其實並不容易,在基礎還未打穩前,即使有再多創意也無法發揮出來。而很可惜的是,很多人上了大學終於學會寫程式後,創意和熱情也被磨損的差不多了;而畢業後雖然已經有了基本功力,但卻只能照著老闆開的規格刻畫死板的功能與介面,與其說是程式設計師不如說是程式工匠。

我覺得台灣人的能力並不差,但社會中卻瀰漫著一股抄襲與仿冒的氣息,從最近的酪梨壽司事件(相關抄襲事件還可參考MMDays的整理),可以看出抄襲風氣在台灣並不只是小時候在學校抄抄作業而已;媒體工作者在報導中任意抄襲及轉載是種不尊重自己專業的表現,不但隱含著一種應付了事的心態,更代表著這些人對於自己的工作沒有熱情,更沒有著一點堅持。如果要說我在美國看到這邊和台灣有什麼最大的不同,我想關鍵的差異就在對自己的工作有沒有熱情和堅持而已了。

在評審的過程中,有兩個教授一起來聽我介紹我的作品。因為我沒有任何參加科展的經驗,也沒做什麼講稿或準備就去了,一切只能靠臨場發揮,還好教授們還蠻喜歡我的作品,一來一往的討論之下才讓我不至於太緊張而說不出話來。

自己的介紹結束後,終於鬆了一口氣,教授們對我的作品似乎感到非常新奇和有興趣,後來還問了我「如果再給你兩個月,你能做出更好的結果嗎?」這問題聽起來像是要給我個機會再繼續深入研究下去,難道是意味著要選我當代表嗎?當時我對於得獎其實是沒什麼興趣和期望的,只是想看看別人對這個東西的意見,但如果有人喜歡當然是很棒的事情。這問題無非是給我挑戰的機會,我腦中還有很多改進的想法,如果有更多時間,一定還能做出更棒的結果。所以,我就毫不猶豫的就回答了:「可以,當然可以!」

到了頒獎典禮時,司儀一一宣佈每個學科的獲獎人以及之後要代表台灣去哪個國家參展,同時也頒發一些企業贊助的特別獎。我原本一直以為Eric的作品應該是穩拿第一的,畢竟相較之下我的作品並不夠成熟和完整,甚至連個能稱上科學實驗後的結果都沒有。但這個新奇的點子威力還是很大,我完全沒預料到無心插柳參加科展竟然讓我拿到了Intel頒發的電腦科學最佳獎,並且還選上了美國代表,之後可以代表台灣去美國參加Intel主辦的國際科學暨工程展(ISEF, International Science and Engineering Fair)。

程式設計之內功心法

得獎當然很開心,這是對於我這個想法和努力的肯定,但隨之而來的也是一股很大的壓力。我得代表台灣站出去,到美國跟來自世界各地的教授、學者、參展代表用英文介紹我的作品,那不能像在台灣這樣輕輕鬆鬆跟教授聊聊天就好,我要用不熟悉的語言跟不熟悉的外國人介紹我這個只花一兩個月做出來的雛型作品… 光想到這個背都涼了。

選上科展代表跟選上奧林匹亞國手是完全不同的感覺。奧林匹亞對我來說是個已經努力很久的目標,我很清楚自己的實力有多少,我對自己花了將近一年所打下的基礎很有信心,而且我對比賽本身已經非常了解,出國比賽不過就是做我已經很擅長的事情而已,一點都不需要害怕和擔心;但選上科展代表真的完全是意料之外的事情,我自覺還沒有花足夠的功夫在這問題上研究,就像一個腳底有油漆還到處亂跑的小鬼,糊里糊塗的鬼畫符被長輩當成畢卡索的作品一樣。

驚恐之餘,我還是警覺到我得開始做很多事來讓我能充滿信心出國去參展。我得趕快把英文練好,至少要能流利的跟人介紹作品,還要能回答各種問題;我還得了解Intel ISEF到底在幹麼,參展代表要做些什麼事;最重要的是還得繼續在這個作品上做更多研究,看能不能在兩個月內做出更好的結果。

參加科展讓我意外領悟到一些事,我發現我高一開始花了一年多投入資訊比賽所得到的並不只是那塊獎牌與一堆獎狀,在練習的過程中,我把台中圖書館所能借到的演算法和資料結構的書全都看過了,就連冼鏡光當初在微電腦傳真雜誌上的專欄也被我從圖書館地下室的陳年庫藏中挖出來,一本一本的影印裝訂起來。我收集了我所能找到的所有大大小小資訊比賽歷年來的題目,加上當時ACM Online Judge上做過的四百多題,我當時參加比賽幾乎都是看完題目馬上就能想完所有可行的演算法和所搭配的資料結構,並用直覺挑出能最快寫出來且又最有效率的解法。除了解決問題的方法外,我也能輕易的把任何想法寫成程式碼,只要能把過程講出來,就能毫不猶豫寫出code來。

這個花了一年多練出來的功夫,讓我到今天都受用無窮。這種感覺就像唸完九陽真經後內力大幅提昇,之後不管再練什麼武功都是易如反掌。在高中時,我改以Linux作為我主要的工作環境,同時也幫中一中架起BBS,並自己架了web server、mail server來玩玩。這些系統底層的功夫乍看之下跟寫程式沒什麼關係,但我後來發現要做各種能在現實生活中應用的軟體系統,總是會碰到這些現有系統的細節問題。

我以前在大學時常觀察別人的project會碰到什麼阻礙,而開發不順利的原因幾乎都是被一些瑣碎的細節所絆住而導致嚴重的進度落後。這些細節都是些小事,甚至跟寫程式沒有直接相關,但總是會讓人陷於泥沼之中。舉一個簡單的例子,假設要在Linux上寫程式需要用到某個library,動手前得先安裝一下。這個看似簡單的安裝其實牽扯到許多瑣碎的細節,像是:distro有沒有提供package可以直接透過網路安裝? 沒有的話就要自己編譯,那就得知道如何用configure、make等工具;編譯中可能還會發生缺少其他相依的工具或package的情形,這時還要能從錯誤訊息中看出到底少了什麼東西,並且想辦法先安裝起來…。這些事情跟寫程式的理念其實一點關係都沒有,但很殘酷的是,有許多人都會被這種細節所絆倒而中途放棄。

紮實的內功和熟悉系統底層的基本武功帶給我非常有效率的實做能力,我可以在想出新的idea的同時馬上勾勒出實做上大大小小的細節;我可以很快設計出核心的高效率演算法,也知道系統各部份的功能有什麼現有的library或系統可以利用,這兩種能力讓我能快速完成prototype。我只怕沒有夠好的點子,完全不會擔心是不是真的能做得出來。

不久前有位數字先生開了一個程式速成班,號稱能在4堂課內教會web程式的開發,只要帶著點子過去就能在上完課後開始創業。我覺得學寫程式本身其實不用很久,我也曾教過一個12歲的小朋友寫程式,兩個禮拜總共約十小時就足夠讓他掌握基本的程式邏輯概念,包括變數、迴圈、if、陣列、抽象化..。但認真說起來這些東西只是基礎內功,有了內功後自己還是要花很多時間去學相關的底層武功,像是要做web程式還得摸熟web server的架設和管理、UINX的shell和系統管理、各種相關網路傳輸協定、資料庫的使用和管理、前端的HTML和CSS設計….。光web程式所牽扯到的實做細節就多如牛毛,如果要在完全沒有穩固基礎的情況下同時學這麼多東西,只要一旦出現問題,一個對系統從上到下每個環節都不熟悉的人是完全沒辦法鎖定問題發生點的。而debug的基本概念就是要先鎖定問題發生的地方,要做到這件事的先決條件就是要很有信心的先排除一些不可能的地方,再做些假設並驗證假設是否成立來判斷可能問題。如果對每個環節都沒有充分的經驗,我不覺得這樣的人有能力清楚的定位出問題所在,更別提是否能獨力完成一個像樣的完整系統。

每個人都聽過成功是一分的天才加上九十九分的努力,如果說天才是能想出絕妙idea的能力,那我覺得還有個關鍵是,要在有點子前先做過夠多的努力打好基礎,等到靈光一現時才能把握住機會馬上實現它。如果等到一分的天才出現時,才準備開始做九十九分的努力,那很容易就會被許多基礎能力不足所帶來的挫折感和障礙所壓垮。

(待續)

31 thoughts on “追求神乎其技的程式設計之道(八)

  1. 「不但隱含著一種應付了事的心態,更代表著這些人對於自己的工作沒有熱情,更沒有著一點堅持。如果要說我在美國看到這邊和台灣有什麼最大的不同,我想關鍵的差異就在對自己的工作有沒有熱情和堅持而已了。」
    個人對這句深表認同。另一方面,我們的教育澆熄了我們的熱情,人們不再想「我想要什麼」。如果真說有,那只有「賺錢」兩個字。說貼切些,台灣人沒有夢。難得有夢者,又害怕去實現。

    會一種技術來解決已知問題是一回事,能解決未知問題又是另一回事。學校告訴我們,只要會解題考題就是好學生。雖然葉教授不乏唬爛成分,但有一句話說的很好。大意思「當你生在這個環境,長在這個環境,你的修為就只能到達這個程度。想要跳脫環境的珈瑣不是那麼容易,也只有少數萬中選一能做到。」

    • 我是来自大陆的。这里的环境也是这样。而且还要背负沉重的住房贷款,各种税收。人生感觉充满无奈,总感觉。但是偶尔也有一阵清风吹来。清醒大脑,让我没忘记追求。
      不是有句话这样说嘛!天行道,君子当自强不想。勉之,励之。

  2. 版大好:

    已經偷偷收看這個系列很久了:p 今天看到您過去的努力, 真的非常感動 … 我也是正在學習的苦學生, 很希望能夠多了解一下您曾經付出的努力, 然後看看能不能效法一下 :p 我可不可以跟您通一封信, 請教您一些問題? (一封信就可以了, 我知道版大你忙 _<)

    我沒有在這裡看到您的email, 所以我留了我的email. 如果可以的話, 我能拜託您寄一封短信給我 (完全沒有內容都可以的 ^^), 好讓我知道我的信該寄去哪裡嗎?

    謝謝您! 謝謝! ^^

  3. 這一系列看下來收穫頗多,只是高中大學的美好時光已經被我浪費掉了,比較難像以前那樣有大量充足的時間可以練基本功。

    不過每次只要看到這系列有新文,馬上又熱血起來。

  4. 找到了, 謝謝版大!! ^0^ (感激不能用言語盡表) 我這就立即寫信去了 ^^* 謝謝, 謝謝!!!

    版大好親切喔~ 貴為MIT 卻這麼和氣, 好感動好敬佩 >//< 我不可能像您一樣強, 但是我會盡量努力!

    謝謝!! ^^*

  5. 我在思考著,據說國外有 Programmer 的年紀都不小(沒有實證,這句話僅供參考)。

    無論如何,國內的環境裡,似乎年紀大一點就得另找門路,環抱著熱情,也讓很多人感嘆自己若年輕一點就讀到這篇文章,或許會非常振奮。

    而我,則是天真的想著,無論什麼時間,只要熱情仍在,年紀應不成問題。

  6. 在美國的確很多programmer是樂於一輩子都當programmer的,而且美國的公司也比較多有這種升遷管道可以讓人一直扮演專業開發者的角色,而不是往上升就一定要變成管理職位。相較之下台灣的公司沒有這種管道,工程師做久如果想升遷就會變成管理職不需要也不能寫程式,如果不升遷就不會有相對的待遇提昇,說起來真是蠻可悲的。

    我同意年齡不會是問題,我看過很多年紀一大把還是很喜歡寫程式的人,但在台灣的環境下要如何一直保有熱情則是比較令人擔心的…。

    • of course. 台灣軟體業又不如美國,以現實生活而言 經理的薪水通常比programmer 高, 再加上中國人喜當官的文化,自然軟體產業發展不起來

    • 同時, 在台灣多數的公司都從事代工, 這種工作是一種勞力導向的工作,毫無知識及技術而言, 但無奈環境如此, 多數的學生畢業後都到大公司工作, TSMC , Foxcoon , AUO , … 這些公司都是勞力導向的公司, 而多數的公司都是從事硬體制造生財,視員工為耗材,軟體慘業怎麼會起的來 ?
      再加上台灣的軟體公司通常不是很重視”軟體工程”,如軟體測試,SQA,更無論 CMMI 只是用來”取得政府標案”而用的”養活公司”的一種手段, 試問軟體的發展怎麼會成熟 ? 如何會有良性的循環使得公司及員工雙贏呢 ?

  7. 我也覺得裝東西之類的問題是一個很大的障礙
    有時候人都會看到自己不會的東西就會想要逃避或是問別人
    但是被問的人可能也有很多自己要做的事

    所以最好的做法就是google, wiki, 看原始檔
    像有時候把錯誤資訊打到google就知道問題在哪了
    不然就是看原始檔 雖然這比較煩

    我覺得這也不算是努力吧 比較像是一種熱情
    可以說是學東西的熱情或是了解世界上所有程式的熱情吧

    像很多常用的東西原始檔可以看 就可以學到很多技巧
    比如說如果你在做Firefox套件 你就可以看Firefox原始檔 就會發現很多Firefox的UI code
    都是用JavaScript寫的 如果要什麼功能 就直接抄那些達成這些功能的code就好了
    這也算是實作的一種一般的解決方法

    發文要付code
    Firefox原始檔:
    ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/3.0.7/source/firefox-3.0.7-source.tar.bz2

  8. 你真的一直很有愛耶!一直做自己愛的事情真的很重要….尤其是終於看到它成型的那一瞬間,就算明明歪七扭八,卻還是覺得很過癮,停不下來。

  9. vgod大大你好

    能夠看到您這些文章實在是太棒了,讓我的志向更堅定了!

    不過我想問個問題,小弟我今年高一,從國三開始學C

    但是解ACM題的時候,總是覺得C的程式碼要比C++的程式碼長上許多

    我是否應該繼續堅持C呢?還是可以兼學其他類型的程式語言…

    (大大如果能夠抽空回答,實在感激不盡

  10. Hi Frank,

    高一就在寫ACM,真是厲害:D
    如果是要練習解題,建議你習慣用C寫吧,這有助你熟悉各種基礎資料結構和演算法的實做,如果太早開始依賴C++的STL和現成的演算法,以後就很難有機會打好基礎了。
    等你已經非常熟悉後,而且真的需要在意coding速度時(像是比賽時),再換成C++也不遲:D
    你同時還是可以學其他語言,不同語言適用不同的場合,早點有這種概念也是很重要的。

  11. 非常感謝您的回答

    題外話:

    雖然說是ACM,不過也只有最高三星程度- -“〈數學程度有些不足

    社團課老師拿出來的題目都是資訊競賽題,每題不是解不出來就是只會一半……

  12. Pingback: 網站製作學習誌 » [Web] 連結分享

  13. 好好看啊!
    雖然都看不懂但還是覺得好好看XD(謎)
    好期待下一次的連載喔,請務必記得還要繼續寫喔!^^

  14. 加油加油找時間更新喔!^O^
    努力爬了一下文,覺得有好多內容都好有意思~
    真高興能發現這個部落格>v<
    有個好玩的東西不知道您有沒有玩過~
    剛才拿關鍵字搜尋了一下部落格,沒找到結果~
    所以想說也許您沒玩過~在這推薦一下!^_^
    http://fantasticcontraption.com/
    這是一個朋友推薦給我的遊戲,可以花腦筋想出各種解法~真的很有趣!
    我寄給家人朋友之後連我舅舅都回信說他有玩喔!XD(笑)
    這個還有舉辦比賽~我朋友說還有教授把它當作業耶XD
    如果您沒玩過請務必抽空去玩玩看!^o^

  15. 上面一篇沒有正常顯示Q_Q
    原文重打XD

    哇你果然已經玩過了!囧
    結果反而讓我發現一個沒玩過的遊戲XDDD
    而且還是十幾年前的…XD(倒)
    那我就收下了^v^(耶~)

  16. Pingback: 追求神乎其技的程式設計之道(九) | vgod’s blog

  17. 看完您這一系列文章真是讓人覺得熱血沸騰
    又想起當年初接觸電腦時令人興奮的感覺~
    不過差別可能在於~您是扎扎實實的往技術的點鑽了下去
    而我可能還在一直想說哪顆cpu跑多快能怎樣吧XD
    話說起來也慚愧~本身應該跟您一樣年紀~念完了電機系和碩士班
    自己的程式能力還是相等於一般的初學者一樣
    以至於都已經到要找工作的階段了~還沒有很扎實的基礎功
    工作中不知道還有沒有機會或是時間好好的打好自己的基本功
    若是要打好基礎功的話~VGOD大是否建議就是演算法和資料結構好好的K
    然後輔以一些題目來練習這樣嗎?
    那OS和COMPUTER ORGANIZATION有需要嗎?
    說真的~都不知道自己現在已經半僵化的腦袋有沒有機會重新快速運轉起來呢 XD

    • 打好基礎功沒什麼別的方法,就是大量的練習。資料結構和演算法是想寫好程式必備的底子,至於其他跟電腦底層相關的技術,跟寫程式本身不一定有很大關係,但可以幫助你了解資訊是怎麼在系統中流動和轉換的,有了這些知識不管要做哪一層的抽象設計都能得心應手,如果想成為真正的高手就得把這些東西全部觸類旁通連結起來才行。

  18. Pingback: 追求神乎其技的程式設計之道(十一)- 抽象化與命名 | vgod’s blog

  19. 版大您好!偶然在国内看到转发您的文章,于是挖到了这里。很快被您的文笔折服。看到您的文章,感觉启发很多。以前的一些困惑也在这里得到解决。这里的文章太好了。谢谢,版大了。希望能早日看到版大出书,好拜读一下。

  20. Pingback: 加拿大科學展覽 -部落格熱搜- 加拿大科學展覽

留言給我吧!