2006年1月26日 星期四
[心得]我的程式設計學習路程
最近寫程式,開始有了一種害怕的感覺,越來越
覺得程式設計是多麼廣大精深,好像永遠學不完的樣
子!越來越覺得自己能力不足.....
記得什麼時候開始接觸程式語言呢?嚴格說來是
在高中二年級時後吧!記得當時是要參加高中數學科
展,我們需要一個程式來跑三角形內部連結等比例線
段的模擬。當然,要請懂寫程式的人來幫忙是不可能
的,只能自己寫Code,加上當時自己對程式設計有興
趣(沒錯,就是因為夢想寫個遊戲程式關係),就答
應擔下這個責任。
從此開始了我跟程式設計的邂逅。
一開始那個程式,現在看來相當簡單,只要有迴
圈、決策和圖形撰寫概念就可以寫出了,不過光是寫
該程式,就花了我一個月時間摸索,一個月時間撰寫
。等最後程式撰寫出來,科展也快開始了,於是就在
當年的中區科展我第一次展示自己的程式給那些評審
看。
記得當年評審曾給了一個評語:「你們的三角形
等比例線段研究十分透徹,但更讓我印象深刻的就是
那個程式模擬。」
就這樣,我投入程式的懷抱。之後我撰寫程式,
大多是出於興趣而寫,比方說簡單的球類彈跳模擬、
選單控制,甚至還完成一個小具規模的遊戲。
那個小具規模的遊戲,大約類似普文字通劇情遊
戲哪樣,也就是左邊一個框架裡面放著圖片,右邊一
個框架有著選單讓你選你現在要做什麼動作,下面一
個框架用文字捲動方式敘述現在劇情。
沒錯,這個小遊戲只需要簡單繪圖功能、locate
定位和printf列印、和結構化程式概念就可以寫出了
。不過這個程式也被我自認是高中寫程式的一個成果
。
到了大學,首先出現的衝擊就是, Windows的流
行開始!沒錯,當時各種電腦,全部開始邁向 Win95
、 Win98的時代,我記得我當時就為了升級到 Win95
,重灌電腦不曉得N百遍,最後甚至連26495─
OEM─0004782─75062都背了下來∼
那對程式設計有什麼影響呢?DOS下程式設計
和視窗程式設計有什麼不一樣呢?我只能說那真的要
經歷過才知道了∼硬要說的話,我只能說考量的東西
完全都不一樣了!
想想以前在DOS時代,主記憶體永遠只有 640
KB、這對稍微複雜一些的遊戲來說當然是不夠,於是
我們必須去撰寫一些記憶體管理、甚至必須透過 DOS
提供的中斷常式向硬體下一些低階命令。
現在到 Windwos,這些任務作業系統都會幫你做
好,取而代之的就是那些極端繁瑣而複雜的Win32 API
、我記得大一開始學這個,光開一個視窗,就必須寫
個數十行指令去登記、去呼叫。
當然之前學到的知識,對現在大有幫助,事實上
當時光是會迴圈和決策,就能唬遍班上所有同學,指
標、結構更是不用說,光要花時間去解釋這些你都會
看到同學們以程式強人的眼光看著你。
但繁瑣的 WinAPI 仍是一個高門檻,於是我在大
二時間的程式功力幾乎就停擺了,即便要寫個程式,
都要先開到 DOS底下開Borlac C++、寫著一些小程式
,如當時同學想知道某一個大數是否是質數,就來請
我寫個質數判斷程式等。
一直到大三情況才有所改變,原因是開始接觸所
謂的 RAD工具,當時一開始接觸的是 Borlad C++ Build
這個我到現在工作還在用的東西。
於是,在接近一年的中斷後,我再度踏入視窗程
式的領域,之所以如此原因就在,他把 Win API包裝
的實在太好了。
比方我要寫上述質數判斷程式大約只要十幾分鐘
,先拉個Edit輸入數值、再拉個按鈕,按鈕上點個兩
下,寫個大約三四行程式;當然,或許你要它執行效
率快一點,這樣你就要開始思考一些較複雜的演算法
。
但無論如何,在這編程過程中你完全不需要透過
API去呼叫一個視窗、不需要知道按鈕類別 TButton
是從哪個類別繼承過來或是何時釋放等。
可以說大大降低視窗程式設計的門檻!於是,我
再度投入程式設計的懷抱。
隨著大三上下也逐漸學到了資料結構、演算法這
些程式功力課程,也讓我越來越有種學不完的感覺。
在這裡必須說的是,很多人對這兩個理論性的東
西一直沒有實務性的認識,甚至常有用不上的感慨,
事實上只是遇到的問題不夠多罷了!比方說Tree結構
,我想我如果沒寫過初步的決策式人工智慧,我可能
永遠用不上這個架構。至於像演算法中的動態規劃,
更是提供解決一些程式問題的新的思路,一些本來要
指數運算時間的居然能在線性運算時間算出,對程式
效能有很大的突破空間。
但必須承認的是,除非遇到特殊專案,否則許多
資料結構和演算法都用不太上來,但這兩個工具仍必
須當做基本工具來使用!
隨著時間流逝,大四主要撰寫程式在於影像處理
方面,要學的是 BMP架構和Graphic類別的繼承。
研究所階段研究DSP、需要大量資料運算,更
需要重新研習相關的數學運算程式(如FFT)、並
需要深入了解 GDI繪圖函式。
在研究所階段也開始體悟到什麼是所謂 DirectX
,沒錯,又是為了遊戲XD。我從來沒放棄過寫遊戲程
式的夢想。不過我接觸 DirectX的方式不太一樣,我
當初僅是要使用它來更快速繪圖而已。
說到這不得不回頭說一下遊戲設計,仿間有太多
DirectX遊戲設計的書籍,許多初學者可能連C都不
太會寫就能對這個名詞琅琅上口。
這也當然啦∼現今許多遊戲要灌的時候就要你去
安裝新的 DirectX版本,這等於間接告訴那些想設計
遊戲的玩家他們有用到 DirectX的函式庫,這造成大
批學子,以為 DirectX=遊戲設計;注意這個等號,
於是啦∼哪些連C都不太懂得學子,一上來就嚷著說
要學 DirectX,認為那就是遊戲設計的全部,他們可
能買了許多相關的書籍,也跑了相當多的程式範例;
可是當他們要去修改時候,馬上被沉長的 Win API擊
退,最後弄得灰頭土臉。其實 DirectX只是提供了許
多遊戲設計時候需要的函式庫,更直接地對硬體下命
令來完成更有效率的繪圖、音效。
但是!要能應用到這些仍需要有深厚的 WinAPI
基礎!否則光是會用這些函式,卻前後連結不起來、
或是不知道什麼時候用它有什麼用呢?
又扯遠了。總之,為了能快速繪圖,我開始學習
DirectX提供的繪圖函式,可是總難入其門,而能將
之用得像 GDI函式一樣、甚至大多時候我會使用 BCB
提供的繪圖方法,這也不得不稱讚 BCB實在把那些複
雜的東西包裝得太好,這使人可以更簡單去做許多事
情。
但另一方面他也使用慣他的人更不容易踏入 Win
API 的門檻,甚至也讓許多人自認為「很懂視窗程式
設計」了!實際上我用這些包裝後的東西也開始有越
用越惶恐的感覺....
一直到現在,我工作了,工作內容有一大部分需
要用到程式設計,這也使得我為了飯碗不得不繼續增
強自己程式功力。
可是,越學習就越發現,程式設計怎麼這麼廣大
精深啊!
最近由於開始寫三國遊戲,需要做需多資料庫管
於是開始接觸到BDE、ADO元件,還需要學會資料庫處
理 SQL語法。為了要控制Word、Excel文件,需要學
習 COM的用法。
在公司要撰寫丟送封包的程式,需要學習Socket
函式、Select多工技巧,有的必需使用 BCB6.0 內建
的Indy元件。什麼ICMP協定、 ARP協定,以前都只有
聽過,現在不但要用相關的 Win API函式和了解相關
的檔案架構。有時候用到 Windows多工,還需要啟動
多執行緒(Muti-Thread)。
還有各式各樣的管理系統要寫,有的涉及到低階
系統設計,回過頭來要去查中斷函式並需要瞭解簡單
計算機硬體架構、作業系統一下Linux一下Windows。
更由於客戶要求程式能兼容於新作業系統Vista而需要
去看相關技術文件。
可以說,越深入學習,越覺得程式設計真是廣大
精深!尤其感覺到,以前會寫個九九乘法表被當作程
式設計基礎,能涉及到資料結構和演算法已經算很深
入;如果再扯到類別和多型,那程式幾乎已是看不太
懂。現在你忽然發現會上面那些工具還只是基礎!
接著你就會發現,一本像字典一樣厚的工具書,
被你翻了又翻、翻了又翻,Win API 函式庫永遠是查
不完、用不完,MSDN程式範例是看了又看、看不懂還
要看;閒暇時後偶爾逛逛delphi.ktop之類網站看別人
寫的程式是練基本功方式、有時候還得為了小問題大
傷腦筋。
越深入學習,越覺得自己功力不足。
有時在仿間書局閒逛,常看到「三十天學會程式
設計」、「九十天學會遊戲設計」之類標語的書。我
有時會想笑,但有時又不得不想想,這樣的書、這樣
的標語口號,是否就是要給那些所謂的「初學者」一
個「夢想」,讓他們認為學習途徑是可以很短的而不
至於一開始就退縮、一開始就被嚇跑。
或許就是這樣的「夢想」,使得那些入門的人獲
得一個前進的動力。不致於一開始就被沉長的程式碼
、複雜的技巧擊退。
當這些初學者逐漸摸索進來後,他們自然就會發
現這個領域的博大精深了;於是,立志堅定的人自然
就會繼續學習下去,永無止盡....
於是我在那些所謂初學者身上,彷彿能看見,高
中時代的自己....
那種努力編織著夢想、完全初生之犢不畏虎的熱
血、完全不知程式設計有多廣大精深的傻勁!就這樣
不斷往前衝刺....
或許這對現在有些畏懼的我,也是種激勵!我有
時也真的好想握住那些懷抱著設計遊戲夢想的熱血青
年,甚至擁抱他們,對他們說:
「加油!我們或許學習領域層次不同,但同樣有
著一份希望創造的熱血;在學習過程中我會提供給你
我的經驗,當我注視著問題以及你那份學習的渴望,
我也能學習到許多,且讓我們一起學習!」
在此祝福每一位:)!!
--
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言