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

(本來沒有想寫這麼長的,哪知道一下手後欲罷不能…。看來這系列文章會變成長連載了。)

資訊奧林匹亞與程式競賽

在升上高中前,我因緣際會透過一個國中的同班同學認識了他的哥哥YJL。YJL比我大三年,我要進中一中時他剛好畢業,很巧的是他很會寫程式,一直都是中一中的資訊能力競賽代表隊成員。剛認識他時,他就demo給我看他用QBASIC自己寫的橫向捲軸射擊遊戲,當時看得我目瞪口呆,我完全沒法想像QBASIC竟然能寫出這麼順暢且華麗的遊戲。這個demo如果不說,我一定會以為這是市面上在賣的商業遊戲(我那時還以為一定要學C才能寫出這種遊戲)。

透過YJL我也得知原來高中還有資訊能力競賽和奧林匹亞這種比賽,聽他述說跟全國的高手一起比賽寫程式時,讓我不知不覺也熱血沸騰起來。我把他高中時留下的各種參考資料全帶回家,並透過他認識了更多還在中一中的強者學長們,就這樣在踏進高中校門的同時也決定了我這三年的方向。

這裡我先介紹一下對於高中生最重要的資訊比賽。高中的學科能力競賽是教育部主辦的比賽,包括數學、物理、化學、生物、地球科學、資訊,每間高中通常會先辦個校內初賽來選出代表選手,再由這些選手參加各區域的能力競賽,最後各區的前N名(每科的人數不同)才能參加全國競賽。以資訊科來說,我記得是校內取6名,中區再取6名進全國決賽。到了全國決賽能拿到前10名,還能直接保送進資訊奧林匹亞的培訓營,不用再另外參加培訓營的入營考。至於資訊奧林匹亞(International Olympiad in Informatics, IOI)則是國際性的資訊比賽,參加的人是從每個國家挑選出來的頂尖高中生,每年輪流由一個參賽國舉辦,選手要進行兩天每次連續五個小時的頭腦比賽,其中只有一半的人可以得到獎牌。

這些比賽和一般的程式比賽其實很不一樣。這種比賽比的是解決問題的能力,不是比賽軟體實做的能力。題目比較像數學問題,只是除了紙筆外,還得用某種程式語言實做出能解出正確答案的程式,也就是說參賽者必須想出問題的解法(演算法),再透過自己擅長的程式語言寫進電腦,讓電腦執行後輸出問題的答案。這種解題比賽主要考驗的是運用資料結構和演算法以有效率的方法解決問題,並寫出正確程式的能力。大學有個類似的比賽是ACM ICPC,問題類型和IOI很類似,但比賽的模式和方法則有很大差異,有興趣的人可以自行尋找相關資料。雖然IOI是給高中生參加的比賽,但IOI題目的水準其實非常高,如果你能輕易解出IOI的問題,那… 我跟你打賭去Google面試也有99%的機率會通過。順便一提,Google Code Jam就是一個開放給所有人參加的解題比賽,題目類型就跟IOI和ACM ICPC差不多,前一百名就有獎金,還能免費去Google Mountain View總部玩一玩喔。

參加比賽是一個評估自己實力的好方法,沒在比賽會場上較勁過,真的很難體會解題與寫程式能力的差距可以有多麼巨大。一個頂尖的程式設計師和一個普通的程式設計師,其生產力是很輕易的能有十倍甚至百倍以上的差距,而寫出來的程式碼品質及效率也是同樣會有如此巨大的落差。

透過良性的競爭,高中這段時間也成了我進步最快的一個時期…..

(待續)

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

  1. “原來我就是差在比較晚接觸程式設計…” 很多人會這樣想,
    我想說的是, 學程設與解題永遠不嫌晚.
    像我大一才學程設, 計概差點被當;
    大三比賽就能拿第一, 所以有心學程設的朋友, 千萬別灰心.
    (即便如此, 還是被台灣最大間的IC設計公司羞辱了一頓)

    • 我大學前兩年都在遊蕩啦,現在要申請美國讀博士生才想起發奮用功……還有一年的時間可以努力,我知足了,盡自己最大的努力,做到怎樣變怎樣!總好過渾渾噩噩的狀態!

  2. Michael:
    我同意你說的,不管學什麼永遠都不嫌晚
    只要有強烈的動機和熱情支持著,並且用了正確的方法
    不管什麼時候學都是能有一番成果的
    (事實上,高中全心投入這個領域也讓我犧牲了很多東西….)

  3. vgod 大大
    請問讀”introduction to algorithms”和”Fundamentals of Data Strucures in C”
    兩本書需要具備哪些數學知識?

  4. geekzyc:
    這兩本書不太需要什麼特別的數學知識,有國中程度的數學就很足夠了。
    (因為我高一看的也是這兩本,記得沒有遇到什麼超出國中程度的數學)

  5. 大大,請問你覺得除了”Fundamentals of Data Strucures in C”之外,
    還有其他資料結構好書嗎?

  6. geekzyc:
    Fundamentals of Data Strucures in C是資料結構的聖經級參考書,一本抵十本。如果能把這本全部讀通,其實也非常足夠了。

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

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

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

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

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

  12. 我們是同道中人,也是從高中開始參加信息學奧林匹克(資訊奧林匹亞與程式競賽),進入了國家集訓隊(全國前20名),只是被淘汰,無緣IOI了。真的很崇拜您。

  13. Pingback: 高中

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

  15. 我是在大陆的一个游客,是通过Goole搜索到你的博客,我是因为在找一款图形化的编程语言而找到你的,一口气读完你在中一到大学的经历,你对电脑的痴迷还比我疯狂得多,说起你的图形化编程语言,因为我是在工厂的自动化设备的编程工作,用的是PLC(可编程控制器),现在也在使用图形化的编程软件,只是这套软件只能够是专用的,不能编写电脑的执行代码,查找了很久,也没有一款好用的、规范的用于电脑程式的编程软件,我在我工作用于编写PLC程式的软件,里面所涉及的编程理念或者对于你有所帮助,他是符合IEC6113-3的编程语言(PLC编程语言的国际标准),他可以支持中文变量,使用图形的连接来编写数据执行的流程,支持函数、FB 、数组等,虽然我有一定的工业编程的基础,也不用2天就可以使用他来编写我的程式,比我以前的程式直观、方便、易于模块化编程。若有兴趣的可以到此软件的网站下载使用,相信以你的知识,也很快上手。网址
    http://www.mitsubishielectric-automation.cn/download/dwn_idx_softwareDetail.asp?sid=18
    软件的序列号:570-986818410

  16. Pingback: 好文: 追求神乎其技的程式設計之道 | 當代科技 TechNow.com.hk

  17. vgod大大您好,我讀了您二篇的 追求神乎其技的程式設計之道 ,
    我發現我也是很喜歡寫程式的!
    看了前面幾位前輩在2008年問您的問題:
    Fundamentals of Data Strucures in C 這本書您說是非常好的
    那Fundamentals of Data Strucures in C++ 這本也可以嗎?
    我想要買一本來念,希望vgod能給我這個後輩一些建議 謝謝!

    • 我沒看過in C++那本,但我的建議是,如果想要熟悉資料結構, 還是從C著手比較好
      因為C++已經提供更豐富的資料結構(STL)可以用,會讓人失去實作這些基礎資料結構的機會

  18. 謝謝vgod ! , 我這邊還有一個小問題 ,
    vgod當初是直接讀原文版的嗎?
    有沒有遇到什麼阻礙呢,我現在有在讀一些英文的文章
    當作看原文書的練習,但還是有許多字不會,我有點擔心這樣直接看原文會不會不太好
    ((vgod 謝謝您願意撥時間回付我的問題

    • 我是看原文的
      剛開始的過程, 一定會有些字不會, 如果不影響理解整體的意思不妨先跳過, 不用執著於看懂每一個字. 之後慢慢進步, 就可以看得越來越快了

  19. 請問版主大大
    小弟現在看的是”演算法:使用C++虛擬碼”(中譯本)這本書
    但我看很多人都推薦看原文書
    像是Introduction to Algorithms
    理由是中譯本翻得不好讓人看不懂

    可是小弟我現在閱讀”演算法:使用C++虛擬碼”這本書並沒有理解上的困難
    如果我志再參加IOI的話
    是否也要翻Introduction to Algorithms這本書呢??
    感覺不翻就差別人一截…
    可是我的英文程度普通怕看不懂..

  20. 請問一下,我是大學才接觸程式以前高職學的是硬體電路版電晶體等等…上了大學同學們不知道怎麼回事,個個形同鬼神一樣的思考邏輯,我真的有心想學好程式,更有心想進入版主說的追求神乎其盡的境界,我該從哪一本書開始下手學習比較好?
    Java,C,C++,C#,還是VB?

    上面的留言有提到Fundamentals of Data Strucures in C版主推薦新手來閱讀嗎?

Leave a Reply

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

*