你是專業程式設計師嗎?(上)

朱仲傑  2006/10/12

 

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

但業界的確有權威的標準,來判定你到底是不是專業的程式設計師。最簡單的方式,就是參加一些有時限的程式設計比賽,例如正在舉辦的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 。短短一行程式碼就解決的問題,為什麼要用迴圈寫成好幾行呢?當數字大時,使用數學功式的程式執行的速度絕對比用迴圈還快上很多!

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

 

文章來源  企業應用

 

 

你是專業程式設計師嗎?(下)

朱仲傑  2006/10/13

 

專業領域能力

除了態度之外,就是你如何去發揮、結合其它領域的專業知識。我以前教授青輔會電腦第二專長訓練班,來上課的學生都不是資工電腦相關本科系的(所以學電腦才是第二專長嘛),他們想學好程式設計,但大部份的人心中都有個疑惑:「我寫程式贏得過本科系的人嗎?」我鼓勵他們說:「單比寫程式,也許你們不一定贏得了,但你們在其它領域的專業知識,則是他們欠缺的!」我常說,學資工其實是最沒有用的,因為除了電腦之外,其它領域什麼也不會。寫一個股票系統不需要太高深的程式設計技巧,可是其中的分析、統計確需要專業的相關知識。就拿我來說好了,也許我很會寫程式,但我沒辦法寫出一個股票系統,因為我在那個領域裡完全不懂。這就是我想要表達的本科系無用論,所以本科系的人不需要太驕傲,而非本科系的人也不需要太悲觀,各自發揮你們在各個領域的專長,並深化你想要的domain know how,你就可以成為一位出色且專業的程式設計師。

那我該怎麼做才能達到在程式領域及某個特定的領域兼具的專業呢?程式領域的專業你可以用不斷的練習來達成,例如到討論區中幫別的解決問題或是研究別人的解法,也可以到TopCoder (http://www.topcoder.com)這樣的網站上去挑戰磨練你的技巧,像Google Code Jam就是你驗收成果的好時機。至於其它領域的專業呢?透過學校上課或是工作專案裡來學習,這方面倒是沒有什麼固定快速的學習方式。

創新

有人叫我大師、達人、高手(但照前面的定義來看,我還真不怎麼專業。)從開始學習BASIC語言(有行號的那種),一路走來Quick BASIC、Visual Basic、ASP到Java,算一算已經快二十年了,能夠支持我這樣一路走來最主要的動力是「熱情」,這點跟上次來台灣的兩位大師的觀點一樣:對寫程式的熱愛、對技術的熱情

要保持熱情並不容易,因為有很多外在的因素會迫使你放棄,例如經濟的壓力,在台灣,技術人員的薪水高不到哪去;無日無夜無條件的加班,對體力上可說是很大的考驗。台灣在硬體方面是世界首屈一指的,不論是代工組裝的品質、ODM、OEM ,甚至外型設計也屢獲大獎。可是為什麼在軟體的創新研發上,能在國際上叫得出名字的就只有那幾家?我們程式設計的功力比較差嗎?並不會啊!創新的能力我想是最主要的因素。

創造力或許是天生的,但學校教育的培養也相當重要。無奈的是,不論教改前或教改後,教育的目標還是沒有變:考上好的大學、好的研究所,你就能出人頭地。「把書讀好就對了,其它什麼事都不用管。」這一直是台灣許多父母的觀念,不好好念書幾乎就和不孝劃上等號了。從小「補、補、補」的教育,讓我們的創造力逐漸消失。反觀影響電腦界最深遠的兩個人--Microsoft的Bill Gates跟Apple的Steve Jobs--就是個最好的例子,他們都沒念完大學。你看過他們相關的傳記就知道,他們年輕時幹過多少在台灣社會下不被允許或不可能做的事。讀書固然重要,但重點在於能否激發創意的實現,否則就變成了死讀書、讀死書、然後讀書死。

如果你還是學生又想當專業的程式設計師,那恭喜你,你還有許多時間可以好好的改變你自己。如果你已經是個程式設計師,改變雖然需要勇氣和承擔很大的風險,但不改變你就永遠只是個程式設計師,要變專業成為頂尖的話,改變乃是不得不然的路。

文章來源  企業應用

 

Hiro 發表在 痞客邦 PIXNET 留言(0) 人氣()