看到時報今年年初【喺香港搞全民寫code?你都戇撚鳩!】這篇文章,作者larrylo對於香港假若盲目鼓吹全民學寫程式,不以為然。文中引用經濟日報【全民學寫code拓IT業人才】這篇「經典」報導,那位城大電子工程學系助理教授兼城大AppsLab總監張澤松,豪言「由完全唔識寫到寫到類似Candy Crush的遊戲,只須兩、三個月」,由一個總監說出如此說話,可見香港人對編寫程式的難度和相關知識認知的疲乏。

張教授的偉論,筆者在月初【美國IT揼code起薪有幾錢?】也曾經提及。雖然如此,筆者對於香港推行全民學寫程式,卻是舉腳贊成的。擔心全民寫code會令業界水準下降從而拉低薪酬,有點杞人憂天。香港軟件工程人員薪酬偏低,問題不在supply一方,而是香港沒有對頂級軟件工程人員的demand。所以,當前的要務,不是限制人才的供應,而是把人才的渴求提升。舉個例,一個連loop都不懂得寫的求職者[1],應該得不到任何相關的工作吧?把關守好業界標準的,應該是負責面試應徵者的業內人吧,美國如此,香港亦然;如果應徵者說自己可以8個鐘頭寫一個Whatsapp,不把履歷表馬上丢掉,就是浪費自己的時間。而且「鬥賤鬥勤力」,在這個行業根本沒有絲毫作用;如果一個新人是掌握不到編寫程式的竅門,任憑這位新手如何勤力,在短時間內都只會是「有破壞無建設」,不可能不被掃地出門。

編寫程式,既需要嚴謹邏輯思維,也是一門藝術創作。對於不明就裡的路人甲,平常面對工作和生活上的問題,都不會講求邏輯去推敲解決的話,那麼對編寫程式箇中的嚴謹邏輯要求,當然無法理解;至於一般理科或工科背景出身的香港人,對一般邏輯推演技巧,掌握應該沒有問題;但是如果沒有親自嘗試過編寫程式,其中「條條大路通羅馬」的藝術奧妙,則難以言喻。同一個問題,可以有無數不同的解決方法,有人可能找到比較聰明快捷的方法解決問題;另一些看來平舖直敍平平無奇的方法,卻原來會令下一個接手的人較為容易明白,以後當程式需要作出改動的時候,也就減低了「一改就出錯」的風險。這種「咁又得咁都得」的選擇,一個個決定累積下來,就是彰顯了程式創作的個人風格。

香港的填鴨式教育制度,完全不鼓勵創作,學生爭先恐後的做背書大王。學習編寫程式的好處,就是不可能再以「死背爛背」去取得好成績,對訓練學生的思考,有正面幫助。編寫程式和學習數學最不同之處,就是編寫程式是一種創作。舉一個簡單例子:用者輸入一個數字N,我們的任務是計算1加2一直加到N的總和,再把答案顯示出來。解決這個問題,可以循規蹈矩,寫一個loop,由(1+2)計起,再以得出的結果(3)加上3,再以得出的結果(6)加上4,如此類推,一直加到N為止。另一個方法,就是利用已知的數學方程式,(1+2+3+…+N) = N(N+1)/2,直接把答案計算出來,而這樣運算的速度也會快一點;缺點卻是一旦有一些要求需要改動,譬如我們不再從1開始加起來,而是由M加到N,M和N都由用者提供;那麼用loop做的話,改動會比較簡單,把起始值由1改為變數M就可以了;用數學方程做的話,改動會比較多,而且改動後仍然會很「死」;下次如果有什麼需要再改動的話(譬如只加單數的數字),仍然需要把程式重頭編寫出來。

軟件能夠「循環再用」,是軟件開發的一個重要原則,英文叫software reuse。其他還有很有技巧和原則,很多和邏輯無太大關聯,反而和人的思考和工作習慣有關。以上那個看似簡單的問題,其實還有很多其他情況需要兼顧。譬如用者把N輸入成零、負數、或者小數,程式會彈出奇怪的答案嗎?或者用者不明所以,輸入了英文字母或其他符號,程式可以應付嗎?還是馬上「爆炸」?當一個程式不只是單單面對「評判」如城大張澤松教授一句「你識寫Whatsapp」說了算,而是面對千千萬萬個用家,那麼現實就是,程式需要應付到用家有意或無意遇到的情況。問題越複雜,不同的情況就越多,可能的漏洞就會以幾何級數增加;而這些漏洞,無論編寫程式時多麼仔細,總有一些會被忽略。所以,編寫程式的訓練,應該同時訓練把程式錯處找出來的思考訓練:一個課室分成兩組同學,一組負責編寫程式解決問題,另一組負責「千方百計」把程式可能會遇到的漏洞想出來,再把自己的想法引用到對方寫的程式,看看對方的程式是否「經得起考驗」。

這種叫test-driven development的軟件開發技巧,雖然在商業領域中能夠把這個理念貫徹執行的軟件開發部門不多,但是說明了學習編寫程式,並非如城大張澤松教授所言,覺得八個鐘頭可以寫好Whatsapp,幻想馬上變成事實,不需要任何客觀的驗証標準。不過,中國人喜歡吹牛皮的性格千年不變,全民除了學寫code外,香港人還應該多學一份踏實的精神,「明明唔識唔好講到自己識」,好不?

小學生早日掌握編寫程式的基本要訣,總比花時間練習那些TSA試題來得有用。一旦全民寫code成功推行,「最期待的畫面出現了」,有請張澤松教授責無旁貸,三個月內教識全港小學生寫「類似」Candy Crush的遊戲。「功在當代,利在千秋」,為了香港的未來,到時候張教授不要推辭哦。

Footnotes    (↵ returns to text)
  1. http://blog.codinghorror.com/why-cant-programmers-program/