學習 ASP.NET MVC 2 - Project A s01.02
[策略]
現在大部分產業應該還是用"業務"行銷來獲利,套到搞程式設計的觀念就是:大部分的人是先學技術再來想辦法找這門技術能獲得怎樣的利潤,但是阿姆斯壯都登陸金星了,利潤打哪來連鄉民都知道,就是消費者阿,沒消費者要用因這門技術而產生的產品,那這門技術活著是有何意義呢,所以應該先探查消費者需求再來決定產品性質,再套到程式設計的觀念:認清自己想要甚麼,從做中學,不要因為學習而學習。這就是我稍微一點認真學 ASP.NET MVC 2 的理由,而學這個是在計劃中的 step 2。
[概觀]
ASP.NET MVC 2 的中文資源不多,比較著名的有 "The Will Will Web",或許是我比較丁丁,對應不上這位大內高手的次元,他的心得我是有看沒有懂。原文資源我目前只看 ASP.NET MVC Tutorials,也不太想再浪費更多時間去學習。大概看完有點的小心得,這個教學講得超級淺顯,我就奇怪我英文從沒及格過居然看得懂,他講一個開發的觀念連"語言層級"的基礎知識也教,真是教學文件中的證嚴法師。
回頭來思考 ASP.NET MVC 的價值定位在哪,我想是把 ASP.NET 給發揚光大。當然也可以用很笨很死的方式來開發 ASP.NET MVC,看了那教學大概知道要真正活用 ASP.NET MVC 才會慢慢爆發出它的小宇宙。物件導向、attribute、 單元測試...很多以前開發 ASP.NET 沒啥注意到的,在 ASP.NET MVC 就必須拿來活用。
在 ASP.NET MVC 的 view 層級跟開發 ASP.NET 的 UI 方式不一樣了,view 層級變成純粹在 render html,看來我一竅不通的 javascript 要去磨練了,想到要學 javascript 的話,我想直接去學 jQuery......對吼!突然想到怎麼沒看到教學文件中提到 session 與 viewstate。
[從做中學]
有經驗的都知道,學習(看書聽講)是一回事,實戰又是另外一回事;實戰是一回事,呈現專業又是另外一回事;呈現專業是一回事,商業化又是另外一回事。而且學習是件非常消耗時間的事,而真正與利潤有關的是"商業化",依照藍海策略的觀念,大幅降低高成本屬性甚至刪除,大幅提高別人沒注意的屬性或者創新屬性,故以"商業化"來誘導"實戰"是我的策略,然後"從做中學"就是我的軟體開發期間。
我這樣學 ASP.NET MVC 2 事實上風險很大,基礎可能會打不好,算是速攻型的。
[柳暗花明]
速讀完微軟網站上的 ASP.NET MVC tutorial 馬上開始實作專案,光是第一個 action 就折騰我好久,而我還一直本者我舊有的觀念以及以前在 ASP.NET 養成的壞習慣來解決問題,直到看了依些外國人寫的小抄(我由 The Will Will Web 得知)才恍然大悟,這對我以後要再對其他技術作"快攻"是很好的教訓:要先大概理解這門技術的運作流程與生命週期;"大概"就好(剛好我看的小抄都非常的"大概"),親身體驗比較實在。
在 view 層級往往需要因"需求"做特殊效果,我以為我 javascript 功力已退化到原始人的階段比較吃虧,而目前還在學 jQuery 的 Selectors,卻可以笨手笨腳地解決依些問題。反思自省,變化管理呈現畫面大量用 jQuery 倒無所謂,真正的商業邏輯、資料存取儘可能不要外露使用 jQuery,不然網路外面的人會把你的網站系統當自家廚房在用。
[單元測試]
本來想每作個 action(controller's) 就來做個 unit test,ASP.NET MVC 官網上的教學也有介紹到 unit testing,but... 殘念,那是陽春到讓人傻眼的單元測試,對於我這個嫩咖還真得跟他學單元測試咧,翻遍了全地球的網站(只差火星了),對於我的需求:在 VS2010 上做到真正的 unit testing,至少 mock 出 fake 物件,完成簡單的測試就可以了,結果還是沒實作成功;在 ASP.NET MVC 上作單元測試,國外的資料還真多,不過大部分都過保鮮期了,我想用的工具遇到 .net framework 4! 就死了,OK!呆救補,我反省了一下,我還是乖乖地去看 The Art of Unit Testing with Examples in .NET,基礎打好先。
(最近才偷學到在 .NET4 作 unit testing 要用 DynamicObject 去變化 fake object)
[經驗不足]
(擦汗)呼~終於 Project Completed (模仿魔獸爭霸 1 的 worker)。
就是因為經驗不足,前面 98% 的時間都在想辦法搞懂它的資料要怎樣去"流竄",一旦理解了就勢如破竹、殺敵如搗蒜。
期間碰到某個問題居然用了N種方法試圖去解決,花了超過一個禮拜的時間,真是失敗中的失敗,原因在於我沒在紙上鬼畫符,詳細的理解使用者操作流程。往後只要 action 稍有複雜,我便要"起轎"拿張計算紙來"逼明牌",供親友來簽阿樂。
其實電腦還真笨。程式是人在寫,但是電腦是死的,舉一電腦不會自動反三,有時寫著寫著就忘記了一句名言"電腦是個人才";一個 method 的傳入參數,是怎樣的環境去呼叫,不可能出現怎樣詭異的值,程式設計者都很清楚,可是電腦才不管你那麼多,偏偏有時都以人類的思維去想而忽略超過值域範圍的值以及 null 值。
其實電腦跑很快。或許有人以為時間是唯一值,但是在電腦的世界時間可以是無意義的,有在追"星際大爭霸"的美國電視劇就會知道;人類或許會以時間來辨別事物,但電腦可以在同一時間內完成很多事,所以在電腦的領域要拿時間來作 Unique Key 還需要動點手腳。
大概檢討一下,我仍不足處:
1. Design Pattern:我還需要更多物件導向的經驗與智慧。為啥?因為一套不好維護的系統,是在浪費資源、製造新問題。
2. javascript & jQuery:這個我還不熟哩;此外據我觀察沒另外包裝編譯混淆,會讓商業邏輯外流。為啥?因為之前爬股票期貨下單的網站,裡面寫的邏輯我都看得一清二楚,還不小心看到其中一家還有 bug 咧。
3. Html.xxxFor():我在 ASP.NET MVC 2 是一律用 strongly-typed 並解耦資料來源,在 view 我就會配合用這類的 helper,但在 ASP.NET MVC 2 內建的都是超基本的,照道理來講在 ASP.NET 有的在 ASP.NET MVC 2 就應該要有,如果在未來微軟帝國沒養人去寫,自己也是要慢慢地去包裝打造。(要錢的 javascript 去 render html 的原件商網路上一堆,支援 mvc 模式的原件商麟角鳳毛,或許這也是一種商機)
5."我不知道'我還不夠的地方'在哪":簡單說就是後知後覺;譬如我看到老外 MvcMembership 的專案有用到 ASP.NET MVC 2 的新技術 areas,才知道有這玩意兒。
[參考資料]
已過濾對 ASP.NET MVC 2 有用的參考資料,非常非常多 ASP.NET MVC 1 的觀念與小技巧在 ASP.NET MVC 2 都不適用了。
http://www.hemidemi.com/user/shengtai/bookmark/recent
您是我看過幾篇文章中最誠實的, 可以真實反映出這個新技術的問題, 看了太多歌功頌德, 累了.
小的寫慣了fat client PL SQL那種成千上萬行的package. 一堆function OR stored procedure call來call去. 現在再來看MVC. 有強型別的物件.好像還比PL SQL或PowerBuilder好用. 小弟反到是搞不太清楚web form那些viewstate跟網頁生命週期那些事物.