在上一回中我們提到了,幾乎可以說是學習程式設計的過程中十分重要的「範例程式」。好的範例程式對於程式設計的學習者來說,會有十分大的助益。對於學習者來說,掌握閱讀範例程式的要點,便可以更輕易地加速學習的步調。而對於想要傳授技巧的人來說,若能編寫高品質的範例程式,也有利於學習者的吸收及理解。

一邊看著書本或文章上的文字,一邊閱讀著穿插的範例程式,已經成為大多數程式人學習程式相關技術的既定模式了。

範例程式碼俯拾可得,而且很多可實務應用
另外,隨著網路的發達,許多和程式設計技術相關的教學文章,都可以在眾多的網站上找到。這些程式設計教學,有的是長篇文章來介紹特定的主題,有些則是針對更特定、更細節性議題的短篇文章。當然,幾乎都會附上做為解說的範例程式,來協助讀者更快的深入議題核心。

在問答型的程式設計網站,例如StackOverflow.com上,也會有許多程式設計者提出他們的疑問,而知道問題答案的同好,便會予以解答,而解答的同時,也時常會附上用以解決問題的程式碼片段。透過程式碼來學習,可以說是最高效的方式。

不過,這類的教學用程式碼不僅可做為教學用途,事實上,許多用來展示特定技巧的範例程式碼,都可以直接或是經過小幅度的修改之後,套用於實際的程式開發工作之中。漸漸的,許多程式設計者都發現了這個天大的好處,於是,大家愛死範例程式了。

有時候,只要透過強而有力的搜尋引擎,輸入幾個關鍵字,很容易就可以找到足以解決自己問題的範例程式碼。接著,再想辦法把它們移到自己正在開發的程式中,問題時常就能頓時解決,而且,還不需要寫些什麼程式碼,彷彿得到從天而降的生產力一般。

因此,原本只是單純用來做為輔助技術解說的範例程式碼,慢慢的反倒成了眾程式設計者關心的重點所在。

許多程式設計者在面臨程式設計問題時,首先想到的反而是先找範例程式碼。一旦能夠找著,便想盡辦法想要直接套用到自己正在開發的專案中,形成了一種反客為主的現象。

範例程式原先存在的目的,是希望透過具體的程式碼實現,來輔助教學文章中文字描述的不足,經由程式設計者間共通的語言,實際地加以展現文字中所想要表達出來的精神。沒想到,反而形成了時常文字被忽略,讀者只看到範例程式碼、只想要快點使用範例程式碼的奇特景象。

只求片段式理解,會引發問題
這種奇特景象,用「本末倒置」來形容,或許過於沉重,而且也不甚精確。

好的範例程式通常本身即具有自我解說能力,也就是說,單憑範例程式的內容,便有可能足以說明透過程式碼想表達的觀念及想法。優秀的程式設計者,當然可以直接透過程式碼與程式碼作者對談,有如面對面溝通一般。但是任何程式語言,就和任何人類所使用的自然語言一樣,有其表達的極限,也都有它們適合表達的形態及場域。

此外,針對一個較大、較寬廣的主題,個別的範例程式碼便容易顯得過於片段。在面對一整個知識體系的理解時,只讀範例程式碼、不讀解說文字,往往容易流於片段、甚至是一知半解。

有多個範例程式碼來分別說明個別的主題,固然很好,但是,這中間必須透過文字來加以貫穿、銜接,才能理解整體的全貌。若少讀了那些解說的文字,便以為將各段範例程式碼拼湊起來,已得見全貌,但事實上,我們或許只是知其然,而不知其所以然。

直接套用範例程式碼而不理解,會無法應變
很多時候,我們以為看懂了範例程式想表達的一切(或者我們甚至看都不看!),而將範例程式直接運用在我們的程式開發專案中,程式執行的結果也貌似可行……

但是,因為我們少讀了一些文字,以致於一些細微處的變化並不了解。結果,之後程式在某些特定的情境下發生了問題,我們卻因為對細節不夠明白,使得我們對這問題也只能束手無策,像無頭蒼蠅一般的不知道如何追溯問題的源頭。

我們只能雙手一攤接著說:「我也不知道啊!我是照抄範例程式碼的呀!」殊不知,問題就是出現在「照抄」這兩個字上頭。這正是一個極大的副作用──只讀、甚至只用範例程式碼,卻不試著理解範例程式碼背後,做為知識主體的說明文字。

當範例程式碼的類型和內容愈來愈豐富,而品質也愈來愈好的今天,許多程式設計者都有愈來愈倚賴範例程式碼的情況。事實上,懂得運用範例程式碼,也的確能大大地助益對於陌生知識的了解,以及提高開發的生產力。問題發生在,當你對某個技術主題的本質一竅不通或是一知半解時,直接運用範例程式碼在開發專案中,只會造成重重的危機,同時埋下不定時的炸彈。

針對這樣的問題,正本清源之道該是,對於一個從未接觸過的技術主題或領域,你應該以說明的書籍或文章為主,搭配對應的範例程式碼來了解、學習,甚至是以範例程式碼為基礎,做一些小幅度的修改,成為探索該技術領域的一份藍圖。這個時候,該以文字為主、範例程式碼為輔,程式碼的作用旨在協助你能更具體的了解文字中所表達的意念。

要能活學活用,而不是硬抄硬套
而對於已經有著基礎認識的技術領域,當然,能同時詳讀說明文字是最為理想,但是,有時候對你而言,文字中所表達的重點,反而同時也會在範例程式碼中一併呈現。這個時候,直探範例程式碼的核心,反而事倍功半。

很多時候,我們依照對特定技術主題的既定認識,或者是翻查程式庫API手冊後的結果,寫下了一段程式碼,結果出了問題,不知如何處理。但是,找到了目的類似、試圖解決相同問題的範例程式碼,一眼便能看出自己所犯的錯誤為何,毋需等待任何文字的閱讀及理解,程式碼本身已足堪說明一切。

更有些時候,我們基於足夠扎實的基礎知識,既有已經存在的程式碼,並不會影響自己對知識的理解,因為我們已經具備的知識,允許自己直接運用這些程式碼。

我們會知道如何加以修改,使得它們能更貼切的滿足我們的需求,我們也會知道如何予以套用,而不會衍生出預期之外的各種大小副作用。

當面對使用這些程式碼之後因而導致的問題,我們也會有信心、有足夠的知識加以排除並且修復。這時候,我們可以有信心地略過一些說明文字,如此地運用這些範例程式碼。

範例程式碼是很好的工具,但是,你必須知道如何妥善地運用它,而不致於造成了誤用的情況。有些時候,我們會被範例程式碼表面上所帶來即時性的便利給迷惑,而忽略了該追求的是對技術本質的真正了解。只有不被它快速成效所迷惑的人,才能真正掌握它,並且從中得到益處。

專欄作者


熱門新聞

Advertisement