Friday, October 3, 2008

十年磨一劍,開發功力需要實戰累積

程式人的養成並非一朝一夕。若以為「熟讀唐詩三百首,不會作詩也會吟」,絕對難成大器。


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

程式開發可快速上手,是開發工具給的錯覺
已經記不得究竟是那本書籍開此風氣之先,但根據這篇文章的作者,在文章中表示,他在Amazon上搜尋具有此種形式的書名,在搜尋結果的前兩百筆中,高達96%的書是和電腦技術相關。

這實在是一個相當獨特而且有趣的現象。此類書籍大行其道,代表市場接受度高。為什麼唯獨電腦技術,特別是程式語言的學習者,這麼迫切地想要在極短的時間內學習完一樣事物呢?又是什麼樣的原因,使得人們也同樣期待在這麼短的時間內,得以將程式語言學習完成?

許多程式語言具備了易懂難精的本質。程式人或許可以在相對短的時間內了解、學會該語言的主要語法,並且讀懂典型的程式碼,但這不代表已經確切地體會、掌握了該語言的核心及精髓。

有些程式語言本身的設計,即試圖降低入門時的學習曲線及門檻,好讓新手程式人們也能輕易上手。而現代整合開發工具越來越先進,所打造的應用程式框 架及現有元件更是日益完備,使得新手程式人只消撰寫極少量的程式碼,所得的應用程式便可產生極為炫目的效果。在許多開發工具的助陣之下,即使是剛入門的程 式人,只需要拖拉幾個元件並略加設定,便能輕易地完成一個小型的資料庫應用程式,而且資料的新增、修改、刪除、查詢功能一應俱全。

這樣的情況,讓許多程式人以及管理者產生錯覺,誤以為程式語言的學習、程式人的養成,以及軟體的開發,可以如此速成。那麼,這些在若干天之內便教會讀者某種程式語言或技術的書籍,它們的心態及動機,便也就不言可喻了,能夠大行其道也就不那麼難以理解。

教育訓練中心的培訓方式,也使人們以為速成不難
除此之外,「軟體工程師」或「程式設計師」這樣子的職務,在現今的職場中,即使稱不上薪資優沃,卻也是一份需求大過於供給的工作。這吸引了許多原先在校園中並不是修讀資訊相關科系的人們,競向轉職投入這一個領域之中。

於是,許多教育訓練單位及機構,便推出各種滿足此種就職需求的課程,有的甚至是以取得各式證照為目標。而這類的課程,也促使了許多人意外地成為了 程式人,而且對他們來說,能在越短的時間內完成投入職場的準備,越快找到合適的工作,是不可動搖的第一目標。在這樣的前提下,能夠「速成」,何樂而不為?

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

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

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

許多程式人厭倦煩悶的程式碼撰寫工作,他們期待著早日「晉升」,成為系統設計師、系統分析師、甚至管理職務,以便擺脫工人一般的角色。

然而,這麼一來,對撰寫程式碼容易感到厭倦,就難以成為一名優秀的程式人。二來,系統設計、系統分析之類的角色,都是建立在具有優秀的程式設計基礎之上,而優秀的程式設計能力,除了透過持續、大量的程式撰寫工作之外,大概也沒有其他的方式可以達成。

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

例如,在書本裡頭、在課堂上,多半是教導你如何達成你想要的功能。對於各種可能會遭遇到的異常情況,該如何處理,以及程式撰寫時可能會意外犯下的錯誤,與這些錯誤可能會有的癥兆,只能透過實戰經驗一一磨練。

從錯誤中學到教訓是程式人最大的資產之一
一名有經驗的程式人,他身上最大的資產之一,在於犯過很多的錯誤,使得他在撰寫程式的同時,知道如何預先避開可能會犯的過失,同時在一模一樣的錯誤再度發生時,能夠很快地透過顯於外的癥兆,明白究竟是發生了什麼樣的失誤,進而得以快速解決。

過去的程式碼,就像一面鏡子一樣映照出自己過去所犯下的錯誤。
程式人透過審視自己舊有的程式碼,更容易察覺曾經產生的缺失。
在實戰中,程式人會親身體驗到自己拙劣不成熟的程式碼所帶來的苦果,並且在反省後,力圖改善。這樣的感受格外深刻,因此也就永誌難忘。

所有書中告訴你的良好寫作形式,都會在親身犯過錯誤之後,有了更深一層的體會。所以越是大量地撰寫程式碼,也就越能印證書中所言,越能自行發掘出書中沒有告訴你的事情。

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

程式設計素養與能力的訓練,一定需要長期且大量的實戰
十年磨一劍,並非指程式人必須訓練十年之久方能派上用場,而是想強調:程式人的養成並非一朝一夕之功。對於自我的要求及訓練,必須放到更長的時間軸上來看,而不能從速成的眼光限制了自己不斷成長的可能性。

另外一方面,我更想強調:程式設計的訓練,絕對是需要以長期且大量的實戰為基礎的。倘若只是紙上談兵,或者以為「熟讀唐詩三百首,不會作詩也會吟」,只需要大量的閱讀書籍,程式設計功力自然有所提升,那麼絕對難以有所大成。

賈島的〈劍客〉,說的是「十年磨一劍,霜刃未曾試」,磨劍磨了十年,卻未曾真正的於實戰中試過。程式人的十年磨一劍,卻是要天天試劍,才能讓劍的鋒芒越用越利。

No comments: