2011年10月16日 星期日

程式的境界

每每提到這類的主題,總是會去酸一下現今的教育,也許應該精確一點的說︰「台灣的教育」。它讓現在身為小主官的我,老是找不到合適的新人能夠幫助到現在及未來的程式開發工作。找來的新人往往讓我花費數倍的力氣,但是卻得不到對等的回報,這裡的回報,指的是新人程式能力的成長。

不斷的修改表達方式及訓練內容,但是所傳遞出去的知識十有八九就像打在棉花上,沒有有反應。回頭思考自己學習程式的歷程,看著一路走來的每一個成長階段,我才發現原來,程式和很多領域的知識一樣,是有境界的。

 一開始的自己,靠著「我要寫個遊戲來玩」的念頭,一遍一遍看著家中唯一一本程式書,沒有電腦可以練習。但是靠著不斷重複的看,對於有哪些指令以及程式的結構有了印象,在後來擁有開發環境之後,上手的速度很快,前面幾章的內容很快就掌握了。

另外就是當時我常常去試電腦作業系統裡的功能,也試著重灌過不少次。在設定中,在重灌裡,甚至是拿修改軟體去調整遊戲裡的金錢、生命值,其實都不知不覺得讓自己擁有了「我能夠控制這台電腦」的信心。知道了什麼是記憶體、什麼是設定檔。當然,更重要的是,我知道漂亮介面之後,其實骨子裡和在 DOS 裡能作到的功能是一樣的,雖然到如今我還是不知道是如何辦到的。

對於電腦有一定程度的興趣,願意動手去修改設定,不怕重灌,具有要控制電腦的「野心」。是我認為的第一層境界。

頭幾本程式的書裡頭是沒有附光碟的,所以每一個範例程式,都必須要看著書一個一個字母慢慢輸入,我沒有上過輸入法的訓練班,現在的盲打能力,都是靠當時輸入程式練就的。因為對於英文及指令都不夠熟悉,一行程式需要讓眼睛來回於書本和螢幕之間許多次,不知不覺之間,就試著去記憶程式指令的拼法,去記憶程式的語意而不是程式的每一個單字,甚至試圖記下一片斷,多行的程式碼,為的其實就是能夠少低頭看書上的程式範例而已。

因為純粹的看書自學,所以只有靠自己體會書上文字,否則會看不懂接下來的章節。所以總是回頭看過每一行程式,確定已經學會這章節要教的東西。而為了少寫程式,所以會試著了解一整段程式,對於程式的了解,就不單單是死背程式碼。一開始總有的失手的時候,所以常會有漏打,導致程式無法執行的狀況,花數小時去檢查每一行程式,為的就是找出哪裡打錯了。這是在沒有 IDE 的環境下,得靠自己除錯的年代。

為了不花那麼多時間在找錯誤,促使我對於測試程式的重視,以及程式寫作技巧上的精進。能夠讓程式少寫一行達到一樣的功能,能夠讓寫出的程式碼錯誤再少一點,是當時努力的方向。

確實的學習每一個觀念,確保自己是「真的了解」而不是「照著範例打出來而已」,很清楚自己為麼這麼寫(或範例為什麼這麼寫),會思考要怎麼善用現在會的,寫出更精簡,更不容易出錯的程式。這是第二層境界。

慢慢的,所謂的「入門書」的內容已經不能滿足要求,往往止於基本語法的使用,而無法滿足心中所想的功能。所以開始試著翻出自己層經學過的所有東西,把想要的功能抽出已經知道如何撰寫部分開始製作,不斷的修改、調整,再反復加上一點一點的小功能,最後達到心中所想的。在當時完全沒有考慮程式碼到底有沒有結構,只知道「把功能作出來」這件事情。

如果所有的功能,都是在「入門書」所學到的知識能拼出來的,那麼對於學習程式而言的人就太美好了,但是顯然這個世界會少了許多強大的程式。當入門書內的基本知識不能滿足需求時,我知道是該離開跟著我數年的程式入門書,去外頭看看。

在當時網際的網路並不發達,沒有那麼多範例程式可以抄,所以除了幾本專門介紹範例的書可以參考之外,得開始找程式的說明文件,找找看有沒有可以使用的函數或是模組。也許得拜早期的入門書寫得比較偏技術文件,也可能是 macromedia 寫的說明文件很清楚。在我第一個面對的程式 flash acrionscript 2 ,沒有遇到很大的問題。

具備自我學習的能力,能由 API 由得到撰寫程式需要的資訊。開始把需求轉化成數個小片斷,敢於超脫書本上的知識與範例,開始嘗試、創造自己的程式。這是境界的第三層。

程式寫多了,慢慢開始抓到一些感覺,由於看過不同作者寫的入門書,也表示曾經看過不同的程式撰寫風格。慢慢的可以由程式碼中看到作者是如何思考及轉化問題,將不同家的想法吸收,漸漸可以在作者說明將要示範的例子時,猜到作者要如何製作。猜對的次數一多,信心也跟著累積起來。

信心帶來兩個影響,其一是開始試著去猜生活中所看到的程式,去觀察運作的方式,試著去猜想程式的寫法,和自己所學的印證,有時候會認為自己能寫得更好,而更多數的時候則是驚訝於看到從來沒有想到過的解法。對於未來面對各種不同的問題,想法和思考彈性也有所提升。

另一點是開始感受到設計程式者的想法,大部分的程式來自同一個源頭,而更多是相互學習進步,也因此函數的命名方式,變數的使用,程式的運作也有會無形的相似之處。不同的程式語言之間的共通之處也慢慢能夠掌握。當自己將一個程式語言的設計想法,應用到另一個程式語言裡,可以獲得極大的成就感。

不是學習單一的程式語言,而是學習「程式」,知識技巧的來源不光是來自書本及文件,而是可以由其它人作品得到新的想法。這是第四層。

隨著撰寫程式時間變久,撰寫的程式越來越多,所面臨到的維護、協作問題也跟著浮現。以往單純的「拼出功能」將會對未來的維護造成大問題,就是「Write Only」的其中一種情形,必須改變程式的寫法,要單純、好懂,讓接手擴充和維護的人可以不需要花太多時間就能進入狀況,早一點找到要修改的地方。

撰寫說明文件其實是很不容易的事情,除了詳細的程度不好拿捏,也很難跟著上修改的變動。所以大多數採用的方式是將程式切細,雖然沒有像某些狂熱分子要求只能寫半頁的行數,但是至少較短行數的函數,相對而言比較容易讓人閱讀。而變數的命名方式,也需要思考後才決定,避免造成其它閱讀人的過多負擔。

我認為開始思考程式的後續維護,是一個重要的態度轉變。所以將它列為第五層。
和「用完即丟」的程式相比,這種需要維護,甚至是演進的程式,才能夠磨練程式撰寫的技巧。

沒想到一個回憶讓我打了這麼多字,剩下的部分就留到後續的文章補上…

沒有留言:

張貼留言