2008年10月4日 星期六

[軟體工程] 十年磨一劍 (by 王建興)

.......  
 早上看到 王公建興 ㄉ MSN 暱稱寫 "十年磨一劍" ... 就收到 iTHome 電子報 ... 
覺得寫得很棒 ... 收藏在此 ... :D 

 看完讓我想到 [拳霸風雲] 裡的一段話
  「練習一千日,你仍是生手。但練習一萬日,你就能成為大師。」 要成為專業的大師 (Master),基本功是很重要的! 

 ....... 作者簡介: 王建興 清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動 式代理人,專長則是Internet應用系統的開發。 曾參與過的開發專案性質十分廣泛而且不同,從ERP、PC Game到P2P網路電話都在他的涉獵範圍之內。 
十年磨一劍,開發功力需要實戰累積 2008-10-03   

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

   程式開發可快速上手,是開發工具給的錯覺 已經記不得究竟是那本書籍開此風氣之先,但根據這篇文章的作者,在文章中表示,他在 Amazon上搜尋具有此種形式的書名,在搜尋結果的前兩百筆中,高達96%的書是和電腦 技術相關。
   這實在是一個相當獨特而且有趣的現象。此類書籍大行其道,代表市場接受度高。為什麼 唯獨電腦技術,特別是程式語言的學習者,這麼迫切地想要在極短的時間內學習完一樣 事物呢?又是什麼樣的原因,使得人們也同樣期待在這麼短的時間內,得以將程式語言 學習完成?   許多程式語言具備了易懂難精的本質。程式人或許可以在相對短的時間內了解、學會該語言 的主要語法,並且讀懂典型的程式碼,但這不代表已經確切地體會、掌握了該語言的核心 及精髓。
   有些程式語言本身的設計,即試圖降低入門時的學習曲線及門檻,好讓新手程式人們也能 輕易上手。而現代整合開發工具越來越先進,所打造的應用程式框架及現有元件更是日益 完備,使得新手程式人只消撰寫極少量的程式碼,所得的應用程式便可產生極為炫目的效果。 在許多開發工具的助陣之下,即使是剛入門的程式人,只需要拖拉幾個元件並略加設定, 便能輕易地完成一個小型的資料庫應用程式,而且資料的新增、修改、刪除、查詢功能 一應俱全。   這樣的情況,讓許多程式人以及管理者產生錯覺,誤以為程式語言的學習、程式人的養成, 以及軟體的開發,可以如此速成。那麼,這些在若干天之內便教會讀者某種程式語言或技術 的書籍,它們的心態及動機,便也就不言可喻了,能夠大行其道也就不那麼難以理解。
   教育訓練中心的培訓方式,也使人們以為速成不難 除此之外,「軟體工程師」或「程式設計師」這樣子的職務,在現今的職場中,即使稱不上 薪資優沃,卻也是一份需求大過於供給的工作。這吸引了許多原先在校園中並不是修讀資訊 相關科系的人們,競向轉職投入這一個領域之中。
   於是,許多教育訓練單位及機構,便推出各種滿足此種就職需求的課程,有的甚至是以取得 各式證照為目標。而這類的課程,也促使了許多人意外地成為了程式人,而且對他們來說, 能在越短的時間內完成投入職場的準備,越快找到合適的工作,是不可動搖的第一目標。 在這樣的前提下,能夠「速成」,何樂而不為?
   上述的兩個例子,所呈現的便是社會上對於程式設計的某種觀感,有許多人甚至認為, 程式設計是小道,而且速成不難。
   用「十年磨一劍」來形容程式人的養成,才是貼切的 程式設計真是一門可以如此速成的技藝嗎?我反倒認為程式設計是一門需要投入時間, 才能有所成的領域。而一名優秀程式人的養成,更是需要十分漫長的時間,絕非許多人 所想像的,能夠透過速成的方式達成。唐朝詩人賈島的〈劍客〉裡說「十年磨一劍」, 用十年的光陰來磨出一名程式人,似乎也差不多。

   不論你是在學校中修讀程式設計及電腦科學課程,或者是憑藉著書籍或課程自修入門, 在本質上程式設計是一種全然需要在實戰中累積經驗和技巧的功夫,閱讀(甚至是少量 且走馬看花般的閱讀)以及課程,不過只是踏進這個領域的敲門磚,書本中及課程上 所告訴你的,都必須透過一次又一次的實作,才能不斷地從中有所體會。
   許多程式人厭倦煩悶的程式碼撰寫工作,他們期待著早日「晉升」,成為系統設計師、 系統分析師、甚至管理職務,以便擺脫工人一般的角色。   然而,這麼一來,對撰寫程式碼容易感到厭倦,就難以成為一名優秀的程式人。二來, 系統設計、系統分析之類的角色,都是建立在具有優秀的程式設計基礎之上,而優秀的 程式設計能力,除了透過持續、大量的程式撰寫工作之外,大概也沒有其他的方式可以達成。
   大量的程式碼撰寫實作,就像是蹲馬步的功夫,有時看起來很單調、枯燥,甚至沒有什麼 學問在裡頭。每個人都討厭反覆無聊的動作,但馬步蹲久了,下盤自然穩固了,也會更明白 使力出力的法門。而這些都不是單靠老師點撥提示,或自修讀書就能夠輕易體會的。
   例如,在書本裡頭、在課堂上,多半是教導你如何達成你想要的功能。對於各種可能會遭遇到 的異常情況,該如何處理,以及程式撰寫時可能會意外犯下的錯誤,與這些錯誤可能會有的 癥兆,只能透過實戰經驗一一磨練。
   從錯誤中學到教訓是程式人最大的資產之一 一名有經驗的程式人,他身上最大的資產之一,在於犯過很多的錯誤,使得他在撰寫程式的 同時,知道如何預先避開可能會犯的過失,同時在一模一樣的錯誤再度發生時,能夠很快地 透過顯於外的癥兆,明白究竟是發生了什麼樣的失誤,進而得以快速解決。
   過去的程式碼,就像一面鏡子一樣映照出自己過去所犯下的錯誤。 程式人透過審視自己舊有的程式碼,更容易察覺曾經產生的缺失。 在實戰中,程式人會親身體驗到自己拙劣不成熟的程式碼所帶來的苦果,並且在反省後, 力圖改善。這樣的感受格外深刻,因此也就永誌難忘。
   所有書中告訴你的良好寫作形式,都會在親身犯過錯誤之後,有了更深一層的體會。所以越是 大量地撰寫程式碼,也就越能印證書中所言,越能自行發掘出書中沒有告訴你的事情。
   在長期大量的實作下,程式人才能更深刻地從自己最初的笨拙設計中,體會良好設計的重要性, 也才能更明白如何透過好的設計,優雅地解決問題。也只有在長期大量的實作下,程式人才能 培養出洞察重複需求的能力,撰寫出可重複運用的程式碼,藉以提升開發的效率。甚至, 只有在長期大量的實作下,才能夠將程式架構及程式碼的各種可能變化,了然而心, 面對可能會有的各種改變,預測出動向,並預先反應。
   程式設計素養與能力的訓練,一定需要長期且大量的實戰 十年磨一劍,並非指程式人必須訓練十年之久方能派上用場,而是想強調: 程式人的養成並非一朝一夕之功。對於自我的要求及訓練,必須放到更長的時間軸上來看, 而不能從速成的眼光限制了自己不斷成長的可能性。
   另外一方面,我更想強調:程式設計的訓練,絕對是需要以長期且大量的實戰為基礎的。 倘若只是紙上談兵,或者以為「熟讀唐詩三百首,不會作詩也會吟」,只需要大量的閱讀書籍, 程式設計功力自然有所提升,那麼絕對難以有所大成。
   賈島的〈劍客〉,說的是「十年磨一劍,霜刃未曾試」,磨劍磨了十年,卻未曾真正的於 實戰中試過。程式人的十年磨一劍,卻是要天天試劍,才能讓劍的鋒芒越用越利。

 --- 原文網址 --- 
 另外,建興2008八月譯的新書 Thinking in Java 4/e中文版 快去買吧~~~

沒有留言:

張貼留言