iThome 網站首載:程式設計的心之谷
宮崎駿《心之谷》是個闡述自我成長過程的動畫卡通,男主角天澤聖司想成為頂尖的小提琴工匠,決定先前往義大利克雷默那見習以提昇技藝,女主角月島雯在還摸不清未來的方向下,決定先依自己寫作的興趣,在兩個月內創作一部小說,卻在這個過程中體驗到「光是想寫是不夠的,要學的東西還有很多很多!...」
- 光是想寫是不夠的
現在有些程式語言的設計都試圖降低入門門檻,就算是完全的程式設計新手也能輕易上手,相關開發工具功能越來越完備,有些應用程式框架元件與架構,亦可讓程式設計新手在極短時間內使用極少程式碼,完成略具規模的酷炫網站,許多程式設計新手可輕易地從這類語言技術取得成就感,因而產生了「我覺得程式設計很有趣」、「我覺得自己還蠻適合寫程式的」、「我想走程式設計這條路」...有多少開發者當初是懷抱著這樣的感覺步入程式設計之路呢?
只是想寫就夠了嗎?《心之谷》女主角月島雯以貓男爵為題材,它的眼睛鑲嵌著兩顆寶石,為此月島雯搜集各種寶石知識,試圖作為寫作依據與增加內容豐富度,然而寫下去之後才發現,自己欠缺的東西還有好多。
因為那些降低了學習門檻的技術帶給你的成就感,於是產生了「我想寫程式」的感覺就夠了嗎?在享受過那些低學習門檻技術帶來的滿足之後,你逐漸感到自身能力的不足,並注意到那些被封裝在簡單外衣內的細節,驟然面對龐大資訊,你試圖如同接上消防水管般地吸收資訊,卻開始發現有太多需要趕上的東西,在試圖吸收一切的同時,甚至有些事物正在快速演化,你疲於奔命地跟上每個新事物,甚至開始感到焦慮、挫折,有些現實性的問題,也讓你開始懷疑自己是否適合這條路,或者期待早日換轉為系統分析或管理角色,擺脫世俗認知中的程式工人角色。
如果想把程式設計當作未來方向,只是想寫是不夠的,要讓它更上層樓。別再從那些7天內學會XXX、24小時學會OOO的書籍中學習東西,也別再去從那些拖拖拉拉或10分鐘內就可開發ZZZ的技術中獲得滿足。拆開技術的簡單外衣之後,該瞭解的是它想解決的本質問題,要觸類旁通的不是那些求新求變的表象技術,而是一開始接觸的本質問題所連結的相關知識領域。
- 粗獷直率而且不夠完美
有些研究學者指出,一萬個小時的練習或十年的訓練,是成為任何領域專家的最基本要求,無論是作曲、繪畫、寫作、鋼琴演奏、棋奕、網球等都是如此;《異數》書中談到Bill Joy與彼頭四等在有所成就前,都練習超過一萬個小時;據說莫札特六歲就會作曲,但在21歲那年才寫出經典之作,這中間已不斷創作協奏曲長達十年。
一萬個小時的練習代表什麼?代表在這過程中,他們曾不斷地試圖完成某些事物、犯下錯誤、修正錯誤,並且不斷地吸收相關知識,以求在重複的練習中獲得持續改進。《異數》書中提到「從成熟作曲家的標準來看,莫札特早期的作品實在沒有過人之處」;《心之谷》中的爺爺對月島雯作品提出的感想:「粗獷直率而且不夠完美,跟聖司的小提琴一樣...」。
一萬個小時不代表你要練習十年之後,才能走上程式設計之路,而是指要不斷面對自己不夠完美的作品。在程式設計這條路上,可以的話把自己當個學徒,努力往工匠甚至大師的方向前進,找個十年反覆練習的對象,讓它像面鏡子般映照出自己過去所犯下的錯誤,也許是使用《學徒模式》書中提到的「拋棄式玩具」,反覆練習讓你不至於拋掉以往知識,並可帶著新的知識與經驗,看出以往不成熟下使用的拙劣手法與犯下的錯誤。唯有不斷地親身練習,在檢視出錯誤之後才會有格外深刻的體會。
在這十年、一萬個小時的練習中,練習的對象也很重要。從他人拙劣的程式碼中學習不到什麼,以開放原始碼為對象是個不錯的選擇。不斷用已熟悉語言或新學到的語言來反覆練習演算法或資料結構,也可啟發許多有趣的想法。《學徒模式》書中提到有趣練習的內容之一是查閱一些老書:「因為它們寫作的時間都夠早,注重資訊科學的基礎而不是最新最炫的框架」。
- 不要慌張,再下功夫
Peter Norvig在〈Teach Yourself Programming in Ten Years〉裏頭談到:「沒有書會教你在幾天內學會貝多芬、量子物理、甚至是幫狗美容。」,點出了現代人學習程式設計的急躁心態。在用讀卡紙打洞進行運算的年代,必須把一堆打洞的讀卡紙交給電腦操作員,如果程式出錯了,就得把卡片抱回去,重新在一堆洞裏找出錯誤、重新打卡或上膠帶,可以想像當時的設計程式,真的需要的是耐心與細心;時至今日,越來越快速的電腦、越來越簡單的語言、越來越方便的工具,使得一堆人覺得可以快速「學會」程式設計,耐心與細心似乎不再是學習程式設計的必要元素。
工具的易用使得越來越多人能夠投入創造,這些人創造出更多的知識,而知識又帶領更多人創造更易用的工具,結果使得創造活動以越來越高的 倍數成長,從而知識也以爆炸性的速度膨脹,學習速度似乎怎麼都跟不上資訊成長的速度,許多人躁進的心態也就因而產生,不稍多時就想取得成就,不待多時就想看到成果,商業的知識供應者亦從善如流似地標榜著速成、無痛、不需成本等標語,推銷他們的學習媒介與管道,如此的學習價值觀,使得一些跟不上腳步的人開始慌張,當初設想的目標似乎並沒有因此靠近,反而漸行漸遠。
在學習的過程中,你總是會看到走在前面的人,也偶有自己停滯不前的沉陷感,你開始感到自己平庸,感覺自己不會再有任何的突破,抬頭觀望走在前頭的人,甚至大師的背影,有種無論如何都追趕不上的感覺。英國中世紀作家Geoffrey Chaucer曾經抱怨過:「生命如此短暫,學藝如此漫長」。
學習的過程中,有時就是得忍受混沌不明的狀態,《學徒模式》書中提到,甚至有時得自己跳到深水區中「整合已擁有的技能,重複練習以進入下一個層次」,你無需在意周遭變化快速的龐大資訊,只需按部就班地吸收現階段必要的知識,你無需在意他人走得多快多遠,只需確定自己沒有停下腳步,時時都以穩定的步調在這條道路上前進。
- 確信自始至終樂在其中
往前仰望大師的遙遠背影時,我們總是期望有那麼一個捷徑能夠迎頭趕上,事實上並不存在這個捷徑,大師們花費的時間是我們尚未付出的、他 們花費的精神是我們尚未投入的、中間歷經的苦惱是我們未曾體會的、而得到的經驗在他們願意轉換為知識之前,更是我們無法習得的,我們看到的只是 他們的背影顯現出的光煇,卻看不到他們往前看時面對的迷霧,我們走的只是他們開拓過的大道,而不是他們正在努力開拓的道路。
最重要的也許是回想初衷,想想自己為何走上這條路,確信自己一路上享受了不少樂趣。Peter Novig提到程式設計領域獲致成功的訣竅,第一個就指出「對程式設計有興趣,因為樂趣而寫程式。確信自始至終都能樂在其中,這樣你才願意把自己十年的光陰/一萬個小時投入其中」。