Thursday, November 6, 2008

十年磨一劍

十年磨一劍

在一篇名為 “Teach Yourself Programming in Ten Years(花十年的時間學習程式設計)的文章(作者Peter Norvig)點出了許多程式員急於速成程式設計的現象。相信許多人看到這篇文章的標題,都會露出會心的一笑,因為相較於坊間許多標榜在幾天甚至幾小時之內可以學成某一程式語言或特定軟體技術的書籍而言,這篇文章標題中的「十年」,無疑的突顯出極大的對比。

已經記不得究竟是那本書籍開此風氣之先,但根據這篇文章的作者在文章中表示,他在Amazon上搜尋具有此種形式的書名,在搜尋結果的前兩百筆中,高達96%的書是和電腦技術相關。這實在是一個相當獨特而且有趣的現象。此類書籍大行其道,代表市場接受度高。為什麼唯獨電腦技術,特別是程式語言的學習者,這麼迫切的想要在極短的時間內學習完一樣事物呢?又是什麼樣的原因,使得人們也同樣期待在這麼短的時間內得以將它們學習完成?

許多程式語言本身即具備了易懂難精的本質。或許你可以在相對短的時 間內了解、學會該語言的主要語法,並且讀懂典型的程式碼,但這不代表你確切的體會、掌握了該語言的核心及精髓。有些程式語言本身的設計,即試圖降低入門時 的學習曲線高度及門檻,好讓新手程式員們也能輕易上手。而現代整合開發工具愈來愈先進,所打造的應用程式框架及現有元件更是日益完備,使得新手程式員只消 自行撰寫極少量的程式碼,所得的應用程式便可產生極為炫目的效果。在許多開發工具的助陣之下,即使是剛入門的程式員,只需要拖拉幾個元件並略加設定,便能 輕易的完成一個小型的資料庫應用程式,而且資料的新增、修改、刪除、查詢功能一應俱全。這樣的情況,讓許多程式員以及管理者產生錯覺,誤以為程式語言的學 習、程式員的養成、以及軟體的開發,其實都不過是可以如此速成的事情。那麼,這些在若干天之內便教會其讀者學好某種程式語言或技術的書籍,其心態及動機, 便也就不言可喻了,其大行其道也就不那麼的難以理解了。

除此之外,「軟體工程師」或「程式設計師」這樣子的職務,在現今的 職場中,即使稱不上薪資優沃,但卻也是一份需求大過於供給的工作。這吸引了許多原先在校園中並不是修讀資訊相關科系的人們,競向轉職試著投入這一個領域之 中。於是,許多教育訓練單位及機構,便推出各種滿足此種就職需求的課程,有的甚至是以取得各式證照為目標。而這類的課程,也促使了許多人意外的成為了程式 員,而且對他們來說,能在愈短的時間內完成投入職場的準備,愈快找到合適的工作,是不可動搖的第一目標。在這樣的前提下,能夠「速成」,何樂而不為?

而上述的兩個例子,所呈現的便是社會上對於程式設計的某種觀感,有許多人甚至認為,程式設計是小道,而且速成不難。

程式設計真是一門可以如此速成的技藝嗎?相反的,我認為程式設計是一門需要投入大量的時間才能有所成的領域,而一名優秀程式員的養成更是需要十分漫長的時間,絕非許多人所想像的,透過速成的方式便可以達成。唐朝詩人賈島的《劍客》裡說「十年磨一劍」,用十年的光陰來磨出一名程式員,似乎也差不多。

不論你是在學校中修讀程式設計及電腦科學課程,或者是憑藉著書籍或 課程自修入門,程式設計在本質上是一種全然需要在實戰中累積經驗和技巧的功夫,閱讀(甚至是少量且走馬看花般的閱讀)以及課程,不過只是踏進這個領域的敲 門磚,書本中及課程上所告訴你的,都必須透過一次又一次的實作,才能不斷的從中有所體會。

許多程式員厭倦煩悶的撰寫程式碼的工作,他們期待著早日「晉昇」成 為系統設計師、系統分析師、甚至管理職務,以便擺脫像工人一般的角色。一來,對撰寫程式碼容易感到厭倦,就難以成為一名優秀的程式員。二來,系統設計、系 統分析之類的角色,都是建立在有優秀的程式設計基礎之上,而優秀的程式設計能力,除了透過持續、大量的程式撰寫工作之外,大概也沒有其他的方式可以達成。

大量的程式碼撰寫實作就像是蹲馬步的功夫,有時看起來很單調、枯燥,甚至沒有什麼學問在裡頭。大家都討厭反覆無聊的動作,但馬步蹲久了,下盤自然穩固了,也會更明白使力出力的法門。而這些都不是單靠老師點撥提示,或自修讀書就能夠輕易體會的。

例如,在書本裡頭、在課堂上,多半是教導你如何達成你想要的功能。 對於各種可能會遭遇到的異常情況、該如何處理,以及程式撰寫時可能會犯下的意外錯誤與這些錯誤可能會有的癥兆,只能透過實戰來一一的磨練。一名有經驗的程 式員,最大的資產之一在於他犯過更多的錯誤,使得他在撰寫程式的同時,知道如何預先的避開可能會犯的錯誤,同時在同樣的錯誤再度發生時,能夠很快的透過錯 誤顯於外的癥兆,明白究竟是發生了什麼樣的錯誤,進而得以快速的解決。

過去的程式碼,就像鏡子一樣的映照出自己過去所犯下的錯誤。程式員 透過審視自己舊有的程式碼,更容易察覺自己所犯下的缺失。在實戰中,程式員會親身體驗到自己拙劣不成熟的程式碼所帶來的苦果,並且在反省後力圖改善。這樣 的感受格外深刻,因此也就永誌難忘。所有書中告訴你的良好寫作形式,都會在親身犯過錯誤後,有了更深一層的體會。愈是大量撰寫程式碼,也就愈能印證書中所 言,也愈能自行發掘出書中所未能告訴你的事情。

在長期大量的實作下,程式員才能更深刻從自己最初的笨拙設計中,體 會良好設計的重要性,也才能更明白如何透過好的設計優雅的解決問題。也只有在長期大量的實作下,程式員才能培養出洞察重覆需求的能力,撰寫出可重覆運用的 程式碼,藉以提昇開發的效率。更只有在長期大量的實作下,才能夠將程式架構及程式碼的各種可能變化了然而心,面對可能會有的各種改變,預測出其動向,並預 先做出反應。

本文標題訂為「十年磨一劍」並非指程式員必須訓練十年之久方能派上 用場,而是想強調,程式員的養成並非一朝一夕之功,程式員對於自我的要求及訓練必須放到更長的時間軸上來看,而不能從速成的眼光限制了自己不斷成長的可能 性。另外一方面,我更想強調,程式設計的訓練絕對是需要以長期且大量的實戰為基礎的,倘若只是紙上談兵,或者以為「熟讀唐詩三百首,不會作詩也會吟」,只 需要大量的閱讀書籍,程式設計功力自然有所提昇,那麼絕對難以有所大成。

賈島的《劍客》,說的是「十年磨一劍,霜刃未曾試」,磨劍磨了十年,卻未曾真正的於實戰中試過。程式員的十年磨一劍,卻是要天天試劍,讓劍的鋒芒愈試愈利。

No comments: