我想大家都不反對,在剛開始學習寫程式的時候,最依賴的兩樣的東西,就是書 (book) 和範例程式 (sample code),範例程式在學習程式的道路上一定是不可或缺的重要工具,它帶給你觀念與方法,讓你可以用相同的模式來做到相同的功能,古人云:依樣畫葫蘆,就是這樣的方法。只是,如果只是知其然而不知其所以然,反而會是一種自傷的行為。
筆者並不反對初學者多看範例程式碼,也不否認範例程式碼的重要性,但範例程式碼最終的目的,只是教你特定的需求要怎麼達成而已。可以簡單評估一下,若自己有下列症狀之一,那很有可能已經陷入範例程式碼誤用的情況。
1. 只想抄範例程式,而不自己構思。
2. 買書時只想買有一堆範例程式的書,卻不想看觀念多於程式的書。
3. 當需求一改,就寫不出程式了,即便需求和範例程式的符合程度有九成以上。
4. 用了很多次範例程式,卻不知道它在做什麼以及為什麼這麼做。
何謂誤用範例程式碼?很簡單,知其然但不知其所以然也。
很多學習技術的初心者(熟手也有可能)在使用範例程式時,也許是時程壓力,也許是範例本身過於複雜,也許是本身基礎知識不太夠,也許是 ... 人最常犯的一個毛病:懶,不會特別去細讀範例程式要表達的是什麼,只會把範例程式直接拿到自己的程式中去套用,反正改改變數就能 work 了,殊不知是在自己的程式中埋下地雷,其原因有幾種:
1. 範例程式只是告訴你特定功能要怎麼做,它的功能就僅止於呈現特定功能而已。
2. 範例程式可能是由虛擬碼 (pusedo code) 撰寫,或只表達作者要表達的概念而已。
3. 範例程式只符合作者當下的環境,未必能符合你的環境。
4. 範例程式通常是沒有經過調校的。
最有名的範例程式誤用(筆者知道的),是數年前 VB6 當紅時,有一個 VB6 的入門書系列相當受歡迎,當時筆者也有看他的書,寫的是真的不錯,範例也容易懂,但是在當時的討論區,卻出現了不少初學者發問,而且問的都是相同的程式碼,一對照之下才知道是該系列其中一本書的範例,而發問幾乎都是:我改了某某變數後原本的東西變不能用了,或是把它拿到我的程式中卻不能 work。
這就是知其然但不知其所以然,只知道要改某些變數,卻不了解範例程式本身的架構以及方法,導致環境一發生變化時,原本寫好的程式全部掛掉不能使用,有如被雙面刃自傷般,到處求救。
不過,若能善用範例程式碼的話,它可是幫助你學習很多前人知識與技術的寶物,範例程式碼除了教你特定的作法或技術以外,其程式碼的結構與命名技巧也是可以學習的,尤其是大型範例如 PetShop 3.0,Stock Trader,Fitch and Matter Stocks,Duwamish 7.1,Fabrikam 3.0 等等,這些大型應用程式都是完整可執行的應用程式,其程式碼與元件結構幾近真實商業環境,並且內含的程式標準以及程式寫作結構(如 Coding Standards 或 SQL 的下法)可以讓學習的人充份的學習到相當程度的應用程式開發概念與技術(不過想看懂這些範例,自己也有夠底子才行)。
筆者其實最想傳達的概念是,在閱讀範例程式時,不要一昧的只想著要解決現在的問題,而是要深入去思考為什麼作者要這樣寫,它的方法,結構以及流程等等,這樣範例程式碼才能真正的發揮它的效益,也才能讓看的人獲得更多,如果只是隨便看一看就拿到程式中用,那可能就要有以後會踩到自己埋的地雷的心理準備 ...
PS: 本文有一部份取自 "範例程式碼,是最佳的兩面刃" 一文。