2010年3月17日 星期三

[轉貼]你是專業程式設計師嗎?(上)

偶然看到的,寫的很好!剛好可以反省一下自己的態度。
今年也來參加 google code jam 好了,好像很有趣。

------------------------------------------------------------------


你是「專業」的程式設計師嗎?什麼是專業?我自己的定義是「使用自己所擅長的程式語言,快速且正確地解決問題的程式設計師。」這句話裡有兩個重要的關鍵字:「快速」與「正確」。正確是絕對必要的,如果最後的結果不正確,那不管是用了什麼最新的技術,或是到底多短的時間就完成等,其它的因素都是白廢的。至於怎樣才叫快速?這個比較沒有量化的標準,而且快速還可以再細分成:你寫程式的速度和寫出的程式的執行效能。

但業界的確有權威的標準,來判定你到底是不是專業的程式設計師。最簡單的方式,就是參加一些有時限的程式設計比賽,例如正在舉辦的Google Code Jam 2006。Google Code Jam分成了三個關卡,每個關卡都要你在有限的時間內,解決幾個問題(詳情請看 Google網站 )。問題有難易度之分,相對所分配到的分數也不同,而你所得到的分數會依據你解題的速度、正確度與效能給分。只要在時限內達成要求,就代表你至少有一定程度了。

筆者不幸在第一關就慘遭淘汰。經過一番自我檢討,在今年的比賽裡,我犯了幾個嚴重的錯誤。第一,我沒有詳細的閱讀比賽規則、看錯比賽時限、不熟悉比賽程式介面。我把第一、二關時間看錯,第一關是要在60分鐘內解決兩個問題(兩個問題滿分分別是250分和750分),第二關的時間75分鐘。而計時是從登入後就開始計算,我在chat room晃了一下才找到自己的比賽區,賽前又沒有去熟練比賽程式操作介面,摸索也用掉了一些時間,所以當我真正認真讀題目寫程式時,時間只剩不到50分鐘。

第二個錯誤是我太自以為是。我原本認為沒什麼好怕的,寫程式我熟練得很。可是 這個比賽的目的,其實不是要你對於一個程式語言的語法到底有多熟練,而是如何去找出、設計出正確的解題方法 ,至於用到的語法都只是最基本的條件判斷式、迴圈,外加基本的API等等。解題的方式說穿了很簡單,只要動動腦筋,運用一些幾何、數學的基本常識或功式,依題目的需求,組合成正確的解答即可。所以你必需具備的反而是幾何、數學的基本能力,而不是程式語言到底有多熟練。

要在時限內正確的解決問題並不容易,尤其是在做專案時。有句玩笑話說,專案的Deadline就是訂出來讓人delay用的。如果時限已到,問題還沒有辦法100%解決呢?那你就要用你專業的判斷,配合當下的環境,把能得到最好結果的答案給交出去。程式比賽時間是無法延長的,專案的話就有許多談判的空間,如果你交出去的答案夠水準,在客戶面前談判的籌碼自然就多一些。Google Code Jam其中一個題目的滿分是250分。要拿到滿分很難,但按照給分的條件,就算你的解法沒有100%的正確,還是會有一定分數。所以別浪費時間在仔細的檢查為什麼程式沒有辦法100%通過測試,只要有80%以上,就趕快交卷(submit),馬上去解另外一題來拿分數。

我犯的第三個錯就是浪費時間在程式檢查上,5個test case我只過了四個,我花了很多時間來找這個bug,結果不但沒有時間解第二題,連第一題也忘了submit(沒sumbit就是0分了)。我在莫名奇妙中結束了這屆的Google Code Jam,千金難買早知道啊。

想法才是效能的關鍵

在google code jam中,解題的速度很重要,程式執行的效能也不可缺。效能固然和花掉的CPU時間有關,但這個時間會依硬體效能的提升有些改變,我認為,程式設計人員在設計你的解法/演算法(algorithm)時的想法和態度,才是決定程式執行效能的關鍵。

舉個簡單的例子,請你設計一個程式,可以計算a加到b的總合(例如1加到100),你會怎麼寫?很直覺的,這種重覆性的工作,可以交給迴圈來解決。是的,用迴圈是可以正確的解決這個問題,但我認為這是最不專業的解法。我們就算數學不好,也聽過高斯小時候的故事;話說高斯從小就非常的聰明且頑皮,有一天上課時,老師為了讓他不搗蛋,出了一個難題給他,要他計算1加到100的總合。老師以為可以讓高斯安靜一下子,沒想到高斯沒幾分鐘就把答案算出來了。後來推導出所謂等差數列的功式,也就是首項加末項乘以項數再除以二,以這個例子來說就是(a+b)*(b-a+1)/2 。短短一行程式碼就解決的問題,為什麼要用迴圈寫成好幾行呢?當數字大時,使用數學功式的程式執行的速度絕對比用迴圈還快上很多!


寫程式的態度應該是,

把你所學會的所有知識中,找出最好的解決方法,而不是程式正確會跑就好 。如果還有更好的方法是你還不會的,那就趕緊把它學會,日後好運用在你的程式裡。你也許會不以為然的說,解決這種小問題,幹嘛要計較這麼多。我不想在這討論程式該不該做最佳化的問題,網路上已經有太多類似的爭辯,不知大家有沒有聽過「格局決定結局,態度決定高度」這句話?設計程式的思維和邏輯也不是一朝一夕就能養成或是改變的,你想要成為頂尖專業的程式設計師,就要養成良好的思維習慣。(待續)

沒有留言:

張貼留言