C.A.R.s - 學習程式語言三階段
作者:Jacky Chu
日期:2006/12/27

Pixar和Disney合做的新動畫電影-Cars,年中在台上映,不過因為小朋友還小,沒辦法進電影院看,也不能把他留在家裡自己跑去看,只好錯過這場電影。原本以為DVD要明年才會出,沒想到上個月底去過Cosco突然看到成堆的Cars DVD擺在那賣,二話不說買一塊回家,剛好小朋友也喜歡玩車車,它就順理成章成為我們一家三口每天必看的影片(沒看錯!是每天~~~小朋友就是愛看,只好每天看一遍 :S)

雖然說每天看一遍,不過劇情有些橋段還不是那麼清楚,因為小朋友坐不住嘛,看了一下就跑去玩車車,然後又再跑回來看。我也不用再多評論這部電影了,看家應該從各個媒體上都看過不少了。不知道是不是天天看的關係,比起以前的幾部,我還滿喜歡這部的,雖然劇情有點八股,不過還合理,最後麥坤(McQueen)去推冠軍(King)的那段,還滿感人的。總覺得這部片有兩個男主角(麥坤和拖線Mate),女主角戲份不多,都快成了女配角了。

我們家的小朋友正在枒枒學語的階段,每天都吵著要看這部車車故事,而且已經能記住片子裡的每個角色,還會學麥坤說「速度」、「喀巧」等…還有雖然看過幾十遍了,但每次看到麥坤去嚇牽引機的那段,還是都會嚇一跳,看他嚇一跳的表情真是可愛。看著他從出生到現在會走、開始學講話,短短一年半,變化真是大。觀察他學說話的階段,讓我想到程式語言(Programming Language)也是語言啊,小朋友學講話跟我們學寫程式,在道理上還有點類似,我分析了一下,大致上可以分成三個階段(Steps, Stages):複製(Copy)、組合(Assemble)和重構(Refactor),簡寫為C.A.R.s。覺得我有點硬凹?請聽我細說:

複製(Copy):
小朋友剛始學說話的第一階段,都是複訟大人說的最後幾個字,例如同一件事情問他"好還是不好"他會說"不好",但你再問他"不好還是好",他會改說"好"(當父母有許多的樂趣,其中之一就是"捉弄"小孩 :P)。在學寫程式初期,我們也是先看別人寫好的Code,合用的話就直接拿過來用,這樣的情況在以前JavaScript第一高峰期時(註)非常盛行,人家網頁上寫好的小時鐘、跑馬燈、一堆有的沒的特效等,大家第一件事就是直接Copy來用,不論是書或是教學網站也都是提供這樣的方式。只要不侵害別人的著作權,複製沒什麼不好,至少可以讓某項東西(技術)快速的普及化,用得人多了,自然就有高手願意再創作出更好的程式給大家用。

註:JavaScript第一高峰期指的是個人網頁(homepage)流行的年代,第二高峰期就是AJAX盛行的此時。

組合(Assemble):
小朋友很聰明的,當他單字和動詞愈學愈多後,他會慢慢的把它們給組合起來,從兩個字、三個字、五個字...一步步清楚地表答他想要說的話。像我們家小朋友喜歡看書,一開始時會拿車故事書走到你身邊,然後說「講」;然後一段時間後,他知道要加上受詞,話就變成了「講故事」;再來又多了主詞,變成「把拔講故事」,他的組合能力一步步的成型。前面說到JavaScript,你應該有這樣的經驗,就是直接把別人的程式碼貼到網頁裡,複雜一點的通常不見得能執行,因為可能分成了好幾段,要放在不同的位置;又或是跟別的JavaScript有衝突,需要調整一下,這時為了讓這些功能都能正常運作,你就會用你的組合能力,把它們一一都搞定。能夠組合不同的程式,表示你對於那些程式碼的結構有一定的了解,知道要怎麼拆解、合併它們,甚至知道加些程式碼來組合他們。到這,你已經具有基本的程式設計能力。

重構(Refactor):
隨著時間不斷的學習成長,小朋友已經會用他所學過的詞,正確的組合句子,來表答他想要說的話,也許句子還不是很通順,或是講了一長串,但只聽懂50%,但可以肯定的是,在他腦袋裡的詞,他都知道是什麼意思且知道用在哪裡。Copy來的程式有時你想做些變化,或是增加其它的功能,經過組合的階段,你已經了解程個程式的結構,加上程式語言的基本知識(語法),你會開始動手去修改這些程式,把它改成你要的樣子,或是除除bug,讓程式跑的更好。這樣的階段,我把它稱為重構(Refactor),就跟一般大家所討論的Refactoring是一樣的意思。

除了學習程式語言外,我們在學習大部份的事物也大都會經歷這三個階段,例如寫書法,一開始不也是先從臨摹別人的字嗎?最後成為某某字的大師或是自創新的字體。唱歌、跳舞、開車、吃飯…學習程式語言不難,跟中文、英文、日文…比起來,它算是單純多了,只要認真的去經歷/學習我說的這三個階段,就算不能保證你成為大師,至少你也會是個有解決問題能力的專業程式設計師。