檔案狀態:    住戶編號:2337586
 K.C. 的日記本
快速選單
到我的日記本
看他的最新日記
加入我的收藏
瀏覽我的收藏
我的付出 《前一篇 回他的日記本 後一篇》 了解與熟悉的重要性
 切換閱讀模式  回應  給他日記貼紙   給他愛的鼓勵  檢舉
篇名: 如何寫出有用的程式?
作者: K.C. 日期: 2011.04.04  天氣:  心情:


程式作業生命週期太短

在資工系的大學生寫的程式,通常都是寫完交完就算了的程式,在這種情況下寫出來的程式,都是寫完丟就算了,程式的生命週期在交上作業的那一瞬間就結束了,相較於我自己寫的遊戲,我不停地重新檢視自己的程式,差別就在於,一個程式如果一直改,它設計不良的地方就可以被看得出來,好的程式設計應該是要經得起修改,但是大學因為作業交完就算了,可能再也沒有人會再看它第二眼,所以寫出來的程式常常都是硬寫出來的,規劃、維護什麼的都不需要,但是在現實世界中,程式其實是寫完那一刻它的生命週期才正要開始,寫完了程式,交到客戶手裡,客戶發現bug、或是有新的需求,這時再改程式,初而復始,直到程式不再被使用,程式的生命週期才正式結束,學校和現實的落差就在這裡,程式作業的超短生命週期讓它寫作的風格、設計都不受到重視,反正能交能跑就好,所以學生往往在遇到真實的程式會用寫作業的方法寫,下場當然是很慘

程式的規模太小

除了生命周期短,規模小也是另一個原因,通常作業都是幾百行甚至幾十行可以打發的程式,然而在真實世界中,程式往往是用萬行在算的,像我寫的遊戲就有上萬行的程式、甚至上十萬,而且還是好幾個程式,ServerClient、地圖編輯器等等,程式小,不經規劃和設計,硬寫也一樣可以寫出來,但是當程式一大,不經過適當的規劃、分析、與設計,下場就會很慘,那重寫無數次的遊戲只是例子之一,我曾經接過一個Case,錯估了程式的複雜程度,打算隨便寫就可以寫出來,後來發現複雜程度預估錯誤,所以加上了之前沒想到的部份,結果就非常慘,程式改這裡,那裡會跑出bug,而且你無法確定,這個bug到底是誰的,是什麼東西引起的,因為設計不良,疊床架屋,一堆模組之間有亂七八糟纏在一起的關係,造成一點點修改就牽一髮動全身,整個程式陷入無限的debug 迴圈中,我發現這樣子下去不行,程式肯定寫不出來,所以就整個砍掉重寫,讓他們之間的關係,也就是藕合度降到最低,這才順利將程式寫出來,因為每個模組和其它程式的關聯都很少,所以可以很輕易地確定這個模組是正確的,而且關係少了,出了bug誰和這模組有關,也很容易找出來,這些經驗都是要程式大到一定規模才能會遇到的,在大學的作業通常規模都太小,學生自然不懂得設計,小程式硬寫也寫出來,何來的設計,而就算是畢業專題,通常也是寫完就算了,就算稍大一點硬寫也一樣寫出來,所以沒有實務經驗是理所當然的

但是我有遇過有門課教授出程式作業的方式我相當認同,而且可以改善以上兩點問題,他的作業一開始是簡單的功能,然後後面出的作業都是要求原本的功能加上另外的功能,如此一來,越到後來的作業規模會越大,程式也經過一再的檢驗,學生在這過程中可以學到程式如何重復利用,如果學生用硬寫的方式,很快就會吃到我上面所說的苦頭,越到後來程式越來越大,硬寫的程式以前的程式難以擴充,除錯也困難,生命週期長了,學生也能從中學到寫出較容易維護的方式,就算不知道,在以後看見了設計相關的概念,就會突然發現原來設計就是這麼一回事,在此我個人建議資工大學的課程,可以考慮用這樣的方式,設計每次增加一個小要求的大程式,如此一來可以解決上面提到的問題

寫的程式太少

不止是生命週期和規模的問題,以資工四年的程式作業來看,如果學生寫的程式就只有作業真的是太少了,個人其實也不是很喜歡寫作業,因為不是很有趣,並不是因為太簡單,難度不是問題,而是因為你覺得有沒有興趣,如果你對會計有興趣,或許可以自己寫一個財務報表的計算程式,如果你對物理有興趣,或許可以寫個簡單的物理模擬程式,如果你對數學有興趣,或許你可以寫一個尋找超大質數或計算圓周率的程式,如果你對遊戲有興趣,就寫遊戲,其實有太多程式都不難,而且都很有趣,像是鍵盤記錄器,聽起來很神奇,其實就只是一個掛在windows下的hook攔劫keyboard event而已,而木馬其實也只是利用socket等連線,一個指令一個動作,你傳什麼給我,我就做什麼的程式而已,有太多有趣的程式都比作業好玩,而實際上又會用到,如果學生只單純的寫作業,可能什麼是Win32API永遠都不會用,而Open sourcelibrary又要怎麼樣用,學校通常也不會教你,debugger怎麼用? 也很少有人會教你,資料怎麼找? 也沒人會教你,文件怎麼看? 沒人教你,所以除了程式的作業以外,學會如何寫有用程式的不二法門就是多寫,沒有人規定你要寫什麼好,對什麼有興趣就寫什麼,在這個過程中你找資料、問問題、解決的每個問題,都是你學到的經驗,而且課堂上通常都不會教你

不會找資料

我們從小到大的教育似乎範圍都只在教課書上,但事實上在實際的應用上很常需要自己找資料,現在有了網路、有了Google,即使找資料已經是這麼簡單的事情,但是很學生還是不會找,舉個例子,當你手上有一個函數的名字,fopen,它是拿來做什麼? 你要如何使用它? 很多學生可能想都沒想過要找資料,甚至有些人用Yahoo!奇摩搜尋引擎來找資料,不好意思,找資料請用Google,最簡單的方式就是fopen直接貼到google裡搜尋,通常你要的答案就會在那裡,但是有時候不是這麼簡單可以找到資料,例如可能跑出來的是PHPfopen而不是C語言的fopen,那你可能得這樣下關鍵字』C語言 fopen』,而這還算是好找的例子,有時候你想找你以前某個看過的東西,但是想不起來是什麼名字,關鍵字也不知道要下什麼,這時你可能要透過聯想的方式,想一下應該找什麼會出現包含那個名字的網頁,再透過那個頁面再找你要的資料,有時甚至要這樣轉兩三次,很多人或許以為寫程式的能力就只有寫,但其實在背後有很多其它的能力支撐,而資工系的學生可能很多都只會翻教課書,遇到問題或是想知道的東西不懂得找資料的技巧,當然所知範圍只限於課本的話,不用談寫出有用的程式

不會閱讀

其實寫程式聽起來好像就只有寫而已,其實在背後需要大量的閱讀,當你拿到一份library的文件,要如何閱讀,當然這部份還扯到英文的能力,中文的資料是有,但是通常都已經慢最新的東西許多,如果最新的東西都要等人翻譯你才能使用,早就已經落後好久,更新的東西又出來了,因此英文我認為是讀資工系必備的能力之一,當然我一開始看英文資料也很痛苦,不懂的單字一堆,可能一開始大部份時間都在查單字,但是同樣一個單字,查一次、查兩次、查三次,查久了就自然記起來了,而且很多同學可能有錯誤的讀法,喜歡一字一句讀,事實上很多資料只有某部份的東西是你要的,一字一句讀很快地會讓你失去耐心,大部份時間都花在查字點上,進度可能只有一頁,這樣的方式理所當然會看不懂,正確的讀法,應該是要快速的描過一次,大概知道哪裡有什麼,像是工具書,或是說明文件等用來查的東西更是需要這樣,不懂的單字其實可以不用急著查,先猜猜看,猜不到就算了,大概看懂就好,有時你發現你不懂的單字一次兩次多次地出現,這時表示這個字很重要或是很常用的術語,此時再查這個字也不遲


不會問問題

比起查資料,問問題最好當作最後一個手段,因為你會問的問題通常別人都已經問過了,先問問Google吧,當你找了該找的地方發現沒有你要的問題,這時才考慮問問題,雖然說問問題聽起來好像沒什麼,但是不會問問題一樣是很多同學的通病之一,有時同學問我問題,我聽了半天都聽不懂他到底想問什麼,原因出在於可能自己都沒有把問題先整理過,這是很重要的步驟,多例如像程式出現bug,想要貼上網問,有些人就全部的程式一口氣貼上去,事實上程式可能只有一小部份有問題,這樣做讓回答問題的人很煩腦,必須看完整個無關的程式,降低回答的意願,最好的方法是先把想問的問題整理出來,以程式片段來看,就是把無關的部份刪去,然後只剩下可以重現出那問題的程式片段,如此一來回答問題的人可以很快找到問題所在,而且這樣做有個好處,就是常常在整理問題的過程中,就發現問題在哪裡,其實其中就包含了推導的過程,很多同學常常不懂怎麼問問題,當然也不知道怎麼解決問題賽,什麼華麗的詞藻就丟進馬桶裡沖掉吧。

 
標籤:
瀏覽次數:29    人氣指數:1429    累積鼓勵:70
 切換閱讀模式  回應  給他日記貼紙   給他愛的鼓勵 檢舉
給本文愛的鼓勵:  最新愛的鼓勵
我的付出 《前一篇 回他的日記本 後一篇》 了解與熟悉的重要性
 
住戶回應
 
時間:2011-04-23 03:54
他, 35歲,新北市,學生
*給你留了一則留言*
  
 
時間:2011-04-16 03:56
她, 41歲,亞洲其他,其他
*給你留了一則留言*
  


給我們一個讚!