範例程式碼,是最佳的兩面刃

我想大家都不反對,在剛開始學習寫程式的時候,最依賴的兩樣的東西,就是書 (book) 和範例程式 (sample code),範例程式在學習程式的道路上一定是不可或缺的重要工具,它帶給你觀念與方法,讓你可以用相同的模式來做到相同的功能,但範例程式碼最終的目的,只是教你特定的需求要怎麼達成而已,若不將它融會貫通的話,很容易就傷到自己。

我想大家都不反對,在剛開始學習寫程式的時候,最依賴的兩樣的東西,就是書 (book) 和範例程式 (sample code),範例程式在學習程式的道路上一定是不可或缺的重要工具,它帶給你觀念與方法,讓你可以用相同的模式來做到相同的功能,古人云:依樣畫葫蘆,就是這樣的方法。

筆者並不反對初學者多看範例程式碼,也不否認範例程式碼的重要性,但範例程式碼最終的目的,只是教你特定的需求要怎麼達成而已,例如這一段範例程式碼是教你如何使用 Gmail 送信:

(以上程式引自:http://www.dotblogs.com.tw/dotjum/archive/2008/03/13/1329.aspx)

而這段程式碼是教你怎麼在 Web 中把 DataGrid 中的資料輸出成 Excel:

 

(以上程式引自:http://www.dotblogs.com.tw/alonstar/archive/2009/07/17/9559.aspx)

如果今天把需求稍微改一下,例如:

  • 我想要透過公司的 Exchange Server 來寄信。
  • 我想要把 DataGrid 存成一個文字檔。

那以上兩段範例程式你要怎麼改才能達到目的?是知道要怎麼改呢?或是 ... 楞在那裡不知所措?如果你是後面的反應,那你就是誤用範例程式碼下的受害者。

何謂誤用範例程式碼?很簡單,知其然但不知其所以然也。

很多學習技術的初心者(熟手也有可能)在使用範例程式時,也許是時程壓力,也許是範例本身過於複雜,也許是本身基礎知識不太夠,也許是 ... 人最常犯的一個毛病:懶,不會特別去細讀範例程式要表達的是什麼,只會把範例程式直接拿到自己的程式中去套用,反正改改變數就能 work 了,殊不知是在自己的程式中埋下地雷,其原因有幾種:

  • 範例程式只是告訴你特定功能要怎麼做,它的功能就僅止於呈現特定功能而已。
  • 範例程式可能是由虛擬碼 (pusedo code) 撰寫,或只表達作者要表達的概念而已。
  • 範例程式只符合作者當下的環境,未必能符合你的環境。
  • 範例程式通常是沒有經過調校的。

最有名的範例程式誤用(筆者知道的),是數年前 VB6 當紅時,有一個 VB6 的入門書系列相當受歡迎,當時筆者也有看他的書,寫的是真的不錯,範例也容易懂,但是在當時的討論區,卻出現了不少初學者發問,而且問的都是相同的程式碼,一對照之下才知道是該系列其中一本書的範例,而發問幾乎都是:我改了某某變數後原本的東西變不能用了,或是把它拿到我的程式中卻不能 work。

這就是知其然但不知其所以然,只知道要改某些變數,卻不了解範例程式本身的架構以及方法,導致環境一發生變化時,原本寫好的程式全部掛掉不能使用,有如被雙面刃自傷般,到處求救。

不過,若能善用範例程式碼的話,它可是幫助你學習很多前人知識與技術的寶物,範例程式碼除了教你特定的作法或技術以外,其程式碼的結構與命名技巧也是可以學習的,尤其是大型範例如 PetShop 3.0Stock TraderFitch and Matter StocksDuwamish 7.1,Fabrikam 3.0 等等,這些大型應用程式都是完整可執行的應用程式,其程式碼與元件結構幾近真實商業環境,並且內含的程式標準以及程式寫作結構(如 Coding Standards 或 SQL 的下法)可以讓學習的人充份的學習到相當程度的應用程式開發概念與技術(不過想看懂這些範例,自己也有夠底子才行)。

筆者其實最想傳達的概念是,在閱讀範例程式時,不要一昧的只想著要解決現在的問題,而是要深入去思考為什麼作者要這樣寫,它的方法,結構以及流程等等,這樣範例程式碼才能真正的發揮它的效益,也才能讓看的人獲得更多,如果只是隨便看一看就拿到程式中用,那可能就要有以後會踩到自己埋的地雷的心理準備 ...