許多程式設計者或許都有參加過程式設計競賽的經驗,但不見得都能得到名次甚至奪冠,在這一回中,我想要分享一些過去參加程式設計競賽的經驗及觀察。

事實上,雖然這類的競賽都可以歸類為「程式設計競賽」,而比賽的方式,主要也都是以設計程式為主軸,但各種不同的程式設計競賽還是有十分明顯的分別。以我的經驗來說,大抵上可以分為三類:(1)解題式程式設計競賽(2)開發式程式設計競賽(3)創意式程式設計競賽。正因為競賽的類型不同,競賽的目標自然也就不一樣,贏得競賽的方式當然有所差異。

講求速度的解題式程式設計競賽
解題式的程式設計競賽,最具代表性的例子,便是ACM-ICPC(Association for Computing Machinery - International Collegiate Programming Contest)。這競賽是由ACM主辦,而參賽者則是來自於全球各地的大專院校。比賽分成三階段︰校級、區域級和全球決賽。能參加全球決賽,都是這類型競賽的超級好手。

ACM-ICPC競賽進行的方式是這樣子的︰比賽進行時,會給定若干道難度各有高度的題目,讓一個或多個參賽者進行解題,而題目都是圍繞在解決一個特定的演算問題。參賽的隊伍共同使用一部電腦來解題,當然比賽期間不能與外界聯絡。那麼,如何決定那個隊伍才是獲勝者呢?很簡單,在固定限制時間內解出最多題目者,便是贏家。

想要解決在這類型競賽中的題目,必須充份的運算許多演算法和資料結構中的知識,當然,那只是基礎,你還是得針對題目設計專門的解法。每個題目都有用以檢驗程式結果是否正確的案例,得通過所有的測試案例才算解決,而且程式的執行時間還不能超過限制,所以必須挑選執行速度夠快的程式語言,例如C/C++。

除了ACM-ICPC之外,也有一些線上網站舉辦類似的競賽,例如TopCoder。比賽的規則或許略有不同,但主題精神都是一樣的:以演算解題為主、解題時間要快、程式執行時間也得夠快。

許多知名的軟體公司,例如Google,十分重視這類型的競賽,甚至在雇用軟體工程師時,也將這類型競賽的經驗和成績視為關鍵的指標。

強調實務能力的開發式程式設計競賽
開發式的競賽相較於解題式的競賽,「演算解題」的成份就低了許多。在演算解題的競賽中,參賽者要寫下的程式碼數量並不會很多,通常關鍵是演算法的技巧,還有解題的方式。但在開發式的競賽中,參賽者或參賽隊伍,通常必須完成一項軟體產品,參賽期間必須要寫下的程式碼數量就會多出許多。

開發式的程式競賽進行方式,一般來說是這樣子的。由主辦單位制定一個標準的題目,而在這題目則會是一個完整的軟體產品,因此,題目中會明確地規範這個軟體產品必須具備的功能規格。參賽隊伍的目標,便是在限定的參賽時間內完成所有的功能規格。同樣的,檢驗產品是否完成所有產品規格的方式,也是以通過主辦單位所設計的測試案例為標準。

有些競賽甚至會要求參賽隊伍,必須仿照軟體公司,提交開發軟體時所需的文件、產品說明書,以及進行產品銷售時的簡報。基本上,便像是在模擬開發一個實際產品時,會涉及到的所有環節。因此,你會發現,這類型的競賽其重心和解題式的競賽並不相同,它並不會那麼強調演算解題的份量,當然,在完成產品的過程中,或多或少會需要用到一些演算解題的成份,但是,並不會占據太多的比重。這類型競賽比較強調實務上開發軟體需要的其他能力,例如,在比賽過程中可能會有需求的變更或是加強,此時,便考驗參賽團隊所設計的軟體架構,是否能很快速因應需求的變更或是擴充。此外,需要完成的功能也很多,開發生產力是否能跟上比賽的節奏及要求,也會是一個關鍵。

有趣的是,有些比賽會將參賽隊伍擺到一個封閉的環境中,在參賽期間不能與外界聯絡,主辦單位提供無限量的食宿,參賽者可以自行調節需要的睡眠及休息時間,十分地模擬現實的開發生活中可能會遇到的情境。

別出心裁,方能獲勝的創意式程式設計競賽
第三種程式設計競賽的類型,便是「創意式程式設計競賽」。在這類型的程式設計競賽中,通常主辦單位只會給定一個應用領域做為方向,而參賽者或參賽隊伍可自擬題目,並且自訂規格。當題目、規格全部自訂時,各個參賽隊伍之間要一較高下的會是什麼呢?如果參加過類似的競賽,你會發現,這類型的比賽並不會要求你的程式,通過什麼指定的測試案例(每個隊伍做的東西都不同了,又那來制式的測試案例做為驗證的基準呢?),甚至一直到比賽結束了,也不會有測試人員或評審仔仔細細把你的程式,重頭到尾測過一次,因為這並不是這類型比賽的重點。

這類型比賽的重點,通常會擺在「創意」,也就是說,主辦單位希望在一個大的應用範圍下,讓參賽選手發揮巧思,構思出一個好的題目,規畫出新穎、有趣、甚至實用的功能。

通常這類型的比賽,都是主辦單位(例如政府機關或公司)為了推廣某種應用領域或技術(好比雲端技術、Android平臺),希望透過競賽的形式,讓參賽隊伍激盪、發展出各種創新應用。因此,評比參賽隊伍的標準,「創意」便會放在十分核心的位置。當然,其他特性,諸如:實用、能否商業化等等,也都可能是評比的指標。

從這三類的程式設計競賽的說明,相信你能明白,即使同樣都是程式設計競賽,但從比賽進行的方式到比賽評比的重點,它們之間都有很大的分別。對於想要參加競賽的人來說,你必須明白你所參加的競賽的類型,你才會知道應該將參賽的重心擺在那邊。

如果那是一個「開發式的競賽」,那麼忠實地完成題目中所規畫的所有功能,便是第一要務。若你所參加的是「創意式的競賽」,那麼參賽時,便要把設定一個好的題目、設計有意思的功能,視為最高指導原則。當你向評審展示介紹你的參賽作品時,更是需要把焦點放在介紹作品的創意之所在。

參與比賽能夠帶來的價值
從這三種程式設計競賽的類型,我們不難觀察出來,這三種競賽的目標,正是我們開發軟體的過程中會涉及的諸般面向。

我們在開發軟體時,可能會需要發展足夠高效、解決演算難度高問題的程式碼。而在產品規畫完成、規格已定的時候,我們需要以高生產力、以穩定的步調,開發出符合產品規格、品質完善之程式的能力。而對軟體開發產業而言,產品本身是否足夠創新、實用,得以解決人們所遭遇到的問題,或者開拓出人們的新需求,更是決定軟體產品成敗的第一要素。各類型的競賽,其訴求不同,但其中所需要的,都是我們開發軟體時的必備能力。

我十分建議,程式設計者可利用工作或學業之餘,多多參加程式設計競賽,因為通過競賽的過程,能更積極、有效地鍛練自己在開發軟體時所需的各種能力。當然,競賽後奪得的獎金或獎品,也是不錯的實質回饋,名次頭銜也能為自己日後的工作經驗加分。

專欄作者

熱門新聞

Advertisement