論文進度報告(2010/6/20)
論文進度報告(2010/6/20)
本週的進度報告很準時,這可能是最近大有進展、多到值得拿出來一說的樣子,那就一件一件地慢慢來聊聊吧。
越畫越複雜的Sequence Diagram
繼上週說的Sequence Diagram (循序圖),這次已經把該階段的作業完成。原本規劃是要畫4個流程,但後來畫到內嵌登入時,發現許多傳送參數與執行程序都可以重複使用,於是就把兩者和一。目前完成了「建立新增標註的過程」、「接受建議並修改標註」、「內嵌&手動登入」三種Sequence Diagram,詳細請看KALS Wiki。
其中,第三張登入的複雜度,甚至已經分割成14張圖來表示,而且我還已經省略了View元件的初始化細節。這是由於KALS在初始化時需要經過很多步驟,登入取得參數、建立Domain與Webpage物件等工作都會在此時完成。換句話說,畫完此圖之後,大致上程式最根本的問題就差不多釐清,接下來就是程式寫作上的問題了。
多虧了Sequence Diagram的大整理,讓我回頭把Model跟Controller修了不少東西。一想到之後程式實作時,這些項目可能還會再改,我就沒有急著將之更新到KALS Wiki。事後也的確陸陸續續地修改了很多次。
KALS的程式實作計畫
完成了Sequence Diagram之後,接下來就可以開始進行程式實作了。但這次我也遵循著「工欲善其事、必先利其器」的態度,先來摸熟撰寫程式的各種工具。
KALS系統本身是採用PHP+PostgreSQL,使用CodeIgniter框架來撰寫。
PHP是大家耳熟能詳的網頁伺服器端程式語言,就普及性及開放性來說,我認為是時下首選。
PostgreSQL則是開放原始碼當中性能最強大的資料庫。儘管不如MySQL知名,但同樣能夠跨平台、更靈活的授權條款,而效能上也更為強大,其中全文檢索也是我垂涎已久的功能之一。儘管後來研究他全文檢索功能時,發現MySQL也有提供類似的功能。但我不喜歡MySQL編碼與無法商業用途的限制,所以仍堅持以PostgreSQL來實作KALS系統。
以上兩個其實都是很基本的程式語言與資料庫而已,但如果要讓自己的程式設計等級更上一層,就必須熟悉「框架」與「IDE」才行。
CodeIgniter Framework (框架)
CodeIgniter (簡稱CI)可能對學校剛出來的程式初學者來說比較陌生,但Ruby on Rails這名字沒聽過的話,你對網頁程式設計業界的了解程度可能不太夠喔。CodeIgniter是類似Ruby on Rails的框架,基於MVC架構,強調簡單、具有邏輯的結構、並提供豐富的函式庫。此外,CI背後有著EllisLab公司的支援,以確保這個開放原始碼計畫跟得上時代,而各種語言(包括正體中文喔!)的使用手冊也十分完備,在各種PHP Framework的效能評比中,CI也是數一數二的強喔!
雖然我沒有用過Ruby來寫程式,但看一看介紹,感覺上CodeIgniter就像是PHP版的Ruby on Rails差不多。事實上,CodeIgniter並不是學起來很「簡單」,而是撰寫程式時會讓它看起來很「簡潔」的一種框架。由於他有著許多固有的系統邏輯,除了MVC主要概念之外,還有libraray、helper、config等等各種細節需要去熟悉。就算是強大的資料庫控管功能Active Record Class,也跟PHP單純的mysql_query()有著不小的距離。要使用Framework,就必須先學習如何使用Framework,而這總是比純PHP還要複雜的一項額外作業。
另一個問題就是程式寫作的習慣。傳統的PHP是程序導向(procedure-oriented),到PHP4時逐漸有物件導向(Object-oriented)的功能,而PHP5時物件導向才大致完備。CodeIgniter則是用於PHP 4.3以上,相容PHP5的物件導向概念,這讓寫了兩年Java的我感到非常地不適應(還包括前一段講得那些架構,也都不太是單純的物件導向)。儘管CI這種方法是講求簡潔、快速,而我也承認Java純物件導向太過消磨程式設計師的耐性,但習慣這東西仍然不是一時能改得回來的。
更何況我學PHP時也是停留在程序導向的時代。當時function寫一堆,但遇到class裡面要用「$this」跟「->」就一整個不習慣。Java是使用「.」作為屬性或是方法的連接符號,而PHP是使用「->」;Java不太用「this」(儘管this有用處,但大多時候會省略),而PHP則是強制使用「$this」。而CI為了支援PHP 4.3,建構子仍然使用Class的名字,而非PHP的__constructor()之類的用法,這又跟我之前從書中所學有些不同。
請原諒我上面用了些程式設計師才看得懂的敘述來描述這些挫折,但我想這種無奈的感覺,大概也真的只有這個領域的人才能體會吧。總而言之,這一切的一切,都註定了我在實作前期必須要做好四處碰壁的心理準備。換句話說,不管怎麼寫,應該有八成都是錯誤的。
進階程式人員的利器:IDE
撰寫網頁程式的工具很多,有些人推崇使用具有所見即得功能的編輯器來快速設計網頁介面,包括Dreamweaver、NVU (這是開放原始碼的工具喔),但這是屬於前端介面的設計;有人也會用純文字編輯器Notepad++、EmEditor (雖然對我來說,Dreamweaver也同樣是純文字編輯器就是),但是面對高度複雜的大型專案來說,使用單純的純文字編輯器可能就難以發揮良好效益了。
為什麼純文字編輯器效益不足呢?我簡單地舉出幾個理由:
- 沒有自動完成(auto-complete)的辭典:如果你寫程式時需要努力地翻找許多函式庫的使用手冊,你才能知道各種功能的參數及輸出型態的話,那你應該試著找尋具備自動完成的工具。儘管努力是件好事,但效率也太低了。沒有辭典的配合,也很難避免手殘寫錯函式名稱的情況發生。
- 沒有DOM或程式架構的導覽器:HTML的Document Object Model或物件導向架構都是很有邏輯且方便的架構,但是在純文字編輯器當中是很難一目了然。我作過追蹤壓縮過的JavaScript程式碼的事情,那真是場惡夢,到最後也沒有什麼收穫。
- 追蹤專案中的程式:我以前使用EmEditor或是Dreamweaver的全文搜尋來找尋專案當中某個程式的方法,但我後來才知道,原來IDE早就能夠幫你把所有程式作連結、比較,這絕對比你搜尋字串還來得方便許多!
上述的功能都是現代整合開發環境IDE(Integrated Development Environment)中常見的基本功能。目前最知名的IDE應該是以Java為主要對象的Eclipse或是VB專用的Virtual Basic。其中,開放原始碼Eclipse具備的靈活架構,讓它可以整合PHP作為編輯對象,而具體呈現就是PHP開發工具計畫PDT。知名的PHP專用IDE商業軟體的Zend Studio也在5.5版本後推出了基於PDT的平台,可惜這是要付費的軟體,所以我並沒有使用。
一開始我安裝以Eclipse為基礎的PDT跟Apatana,雖然他們都是很強大的IDE工具,但很遺憾的卻跟CodeIgniter不太和。如前面所述,我猜想這可能是歸咎於CI的物件導向沒這麼正規的緣故。不過還好,另一個知名的IDE NetBeans,則可以透過PHP Documentor來提供CI的支援!
IDE for PHP: NetBeans
感謝昇陽公司,原本商業發行的NerBeans現在也成為開放原始碼IDE的選擇。NetBeans主要用於Java,但跟Eclipse一樣地可以擴充支援PHP。另外它還支援以PHP Documentor撰寫的註解,讓我們只需要增加幾行註解,就能夠讓NetBeans解讀CodeIgniter的架構!
上圖就是NetBeans在能夠剖析CI架構之後所提供的自動完成功能。當你輸入方法名稱開頭幾個字時,NetBeans已經幫你帶出了CI相關的方法,並且基於PHP Documentor的註解格式,提供了包涵用途、參數、資料型態、回傳資料等說明。
由於NetBeans與PHP Documentor搭配是如此良好,撰寫專業風格的註解不再只是讓人看了自我感覺良好的工具,而是真的可以派得上用場的實用資訊!因此我現在也是一邊參考PHP Documentor的寫法,一邊為複雜的程式加上註解。
當然,NetBeans的自動完成提示不僅包括PHP,連JavaScript(包括jQuery,只要NetBeans看得懂)、CSS、還有PHP Documentor的格式都能夠聰明地告訴你喔!在此讓我誇張地來形容一下從純文字編輯器跳到NetBeans的差異,就像是從費力地騎腳踏車變成開賓士輕鬆出遊的爽快啊!
滿頭包的程式實作
在畫完Sequence Diagram之後,我稍微地統計了一下Model、WebApp部份的View跟Controller,看看它總共需要幾支類別。答案是總共182支。而從三天前開始程式實作到現在,我確實地完成的程式,只有2支。
除了上述提到的理由之外,我也嘗試熟悉PHP Doucmentor並製作NetBeans的樣板,以加速後面的開發作業。這次我也試著應用從極致軟體開發eXtreme Programming學到的「單元測試」精神,利用CI內建的單元測試類別來撰寫對應的測試工具。
上圖是單元測試的結果畫面。單元測試是一種最簡單的測試方法,輸入程式運算出來的結果,以及你預期應該要有的結果,如果兩者相符(甚至是資料類型相符),那麼測試就Passed,否則就是Failed。而我把每支程式比較難以確定正確性的功能都設計對應的單元測試,只要單元測試All Passed,那麼我也就可以差不多確定這支程式沒有問題了!
儘管一開始困難重重,許多的不熟悉帶來了巨大的挫折感,但同時「學習新事物」的新鮮感卻也讓我對這種挫敗甘之如飴。與之前程式寫作的經驗比起來,我感覺到自己明顯地逐步成長中,而這種成長的體驗也是讓我擁有在這個世界上活著的依據。
就讓我繼續在困境中狼狽地掙扎、跟絕望快樂地相處、然後繼續走到走不動為止吧。
專案進度與報告投影片
這次的專案進度中,我加入了幾個查核點,包括「可展示系統完成」、「可開始配置實驗資料」、還有「預官入伍(1/17)」(汗)等。預定本階段系統實作(coding)的時間會到7/12(一)。那時候好像是有些學弟妹的口試時間,我想我還是會去聽聽他們口試的。詳細的專案進度,請看KALS Wiki吧!
而本週報告的投影片也非常精簡,這是顧及了學弟妹需要報告實驗分析結果所作的取捨,所以只是簡單地報告我大概作什麼事情,以及進度規劃而已。
(SkyDrive下載)
自從昨天寫程式寫到整個Windows XP終於壞到無法正常進入Explorer之後,我毅然決然地改用學校提供的Windows 7。在經過一整天的兵荒馬亂,到了今天晚上才把整個Windows 7設定大致抵定。儘管Windows 7的使用體驗也是有很多值得聊的,但我赫然發現這篇寫到現在已經破三千字了。想看一看我在用Windows 7時發生什麼事情的朋友,只好請你們去看看噗浪這一篇吧。
經過一個月枯燥乏味地畫圖,能開始撰寫程式之後,從上面這一長串就可以看得到我到底有多麼地為此感到開心。
本篇從昨天九點半寫到現在也四個多小時了,也差不多到此為止吧。下次有些進度再來跟大家聊聊囉!
(more...)
Comments