顯示具有 專案管理 標籤的文章。 顯示所有文章
顯示具有 專案管理 標籤的文章。 顯示所有文章

2010年6月29日 星期二

寫出好程式的好習慣

在寫程式時,哪些習慣必須建立呢?以下列出我認為一個好的程式設計師應該養成的好習慣。

1 Test Driven Development

第一名的,就是我非常推的 TDD了。TDD不只是先寫測試再寫程式這麼簡單的規定而已,背後還包涵了一些情境。

首先,在寫測試程式時,其實就必須先要了解需求。不知道需求,當然寫不出測試。

其二,寫測試時式時,其實我就會開始想「要怎麼讓客戶端呼叫我的程式」,方法是要建立在 instance上呢?還是實作成類別的靜態方法。此時,我們就必須從由使用者的觀點來看,客戶端應該如何使用我們的程式。

其三,寫測試程式時,也會想到客戶端如何與我的程式互動?由兩者的互動關係,進而衍生出 dependent objects,dependency injections, IoC 等。而撰寫測試時,也需要開始建立  mocking object。

最後,TDD將修正我們所寫的類別,不再自行建立物件,而改由客戶端傳入,因此可得到較佳的相依性。好處是物件的生命週期可規劃在IoC一致處理,避免物件到處都是。

2 善用 Static analysis 工具

Visual Studio 中有個 Calculate Code Metrics工具,可計算程式的可維護性指數。此可維護性指數是由循環複雜度、繼承深度、類別結合程度、程式碼行數等四者組合而成。每次重構後,我也習慣來這裡看看可維護性指數是否增加了。如果可維護性指數小於10,那就代表完全沒辦法維護,這樣的程式是連當初的作者也會看不懂的。

FxCopCode analysis 又是另一種常用的功能。它將常見的程式規則寫成 coding rule 並進行分析。分析完後產生如同編譯的錯誤或警告,讓開發人員可以得到提醒並進行修正。

3 使用開發輔助工具

使用良好的開發輔助工具,會讓我們寫程式時事半功倍。Visual Studio 已經內建了許多工具,如 Refactor,Code Snippet等。第三方工具如 CodeRush, ReSharper 等更提供強大的功能,幫助我在搜尋、重構、程式碼分析等地方。

不得不提一下ReSharperCode Analysis功能,可直接在編輯區中背景地指出程式哪裡需要改進。就好像請了一個超強的大師,在身邊耳提面命,不斷地提出修正。久而久之,程式功力當然會進步。

image

4 不要太多的預設計 (Big Design Up Front)

在開發程式時,僅需要符合當下的需求就好。不要預想未來「可能」的需求為何?效能問題?應用程式架構怎樣分才能符合「未來」的需求。

要知道未來不見得發生這些預想的事。做這些預設計不但浪費時間,並可能造成未來程式難以重構,成本自然增加不少。

之前我也犯下不少這樣的錯誤。其中一項頗令我汗顏。當時我將某網站設計成三層式(3-tier)的架構,其中應用程式層(application tier)使用了 remoting的分散式架構。當時想:未來系統一定拆開到不同的伺服器,以符合高擴展性的需求,這些設計未來一定會用到。結果,開發兩年後,不但沒有發生,更糟的是網站還交給另給一組人維護。因為我做了多餘的設計,而這個設計已過了5年還沒發生當時預想的狀況,新進人員都會問當時為何這樣設計?造成交接、維護上的困擾。

5 奧坎剃刀原則 (Occam’s razor)

Occam’s razor 說明了下面的原則:
     假如一個問題有很多種解決辦法,選最簡單的那個

造成系統複雜的原因,其實還可再細分成兩種類型:本質複雜及意外複雜。

本質複雜(essential complexity)

本質上的複雜,是該問題本質上就比較複雜,我們應該採取科學上的方法讓它變簡單。常見科學方法,再分成兩種。

一個是將大而複雜的問題,拆解成多個簡單的小問題,進而一個個解決並得到整體行為。例如微積分,有限元素法。專案管理中的WBS 也是採用了這類的方法。這類方法有個缺點:小問題的總體行為等同於原大問題的行為嗎?

另一種是承認該大而複雜的問題難以拆解成小而簡單的問題。因此使用統計學的方法來統計大而複雜問題的行為。缺點是相當費時秏力,方法不正確,有時反而會得到相反的結果。

意外複雜(accidental complexity)

問題本質性的複雜外,有時候(也是常常)是我們採取的解決方法錯了,反而使得問題更複雜,稱為意外複雜。例如上述我所犯的預設計問題。此時,正確的方法則是將這些意外複雜因素移除掉。

本質複雜與意外複雜有時難以分辨,相當依賴設計人員的經驗。經典常見的意外複雜原因,如下。

  • 我們實作了自己的 Web/Persistence/Messaging/Caching 的framework, 因為找不到比較好用的!!
  • 買整個工具包,即使我們只用到10%。
  • 為了效能,我們將所有的商業邏輯寫到 Stored procedure。(常見吧!)
  • 我們不寫單元測試,因為我們已經花了很多時間在 debug。(真是天才)

這些理由看起來頭頭是道,似乎解決了問題,卻都使用問題更意外複雜。

6 學新的技術

為何要發明新技術?新技術往往是用來解決以前難以解決的問題,進而使用更簡單的方式來解決。以下是一些新的技術,您學會了嗎?
•Reflection
•Regular expressions
•Dependency injection
•Lambda expressions
Extension methods

雖然使用新技術解決問題往往更加容易,但並非一定要採用這些新技術才能解決問題。因此許多「上班族」不願花時間學習,只願使用已經習慣的舊技術來解決。這樣的心態,稱為舒適區(Comfort zone)。這裡不適合討論心理學,話題就此打住。

7 獨立思考

並非所有新技術都能存活下來,故並非所有新技術都值得學習。那要如何分辨呢?

相同的道理,網路上的訊息已經多到「知識爆炸」也難以形容,但我們還是要學習/吸取新知。那要學習哪些知識呢?使用什麼方式學習較有效率呢?

答案就是獨立思考,不要隨廣告/行銷等手法矇騙。要常常想這樣做,比較快嗎?比較有效率嗎?沒有其他方法了嗎?沒有其他觀點了嗎?

結論

寫著寫著,就跳脫程式寫作的範圍了。要如何寫出好程式,其實與個人的思考習慣有密切關係。希望這一篇能對大家有幫助。

後記:感謝保哥提醒,應為 Extension Methods

2009年8月25日 星期二

軟體專案的成功率

根據 CHAOS Summary 2009 的報告 (2009 Aug),軟體專案是否成功的比例如下

 

Percentage

succeeding

32%

challenged

44%

failed

24%

 

succeeding: 如期,如質,如預算

challenged:雖然完成了,但時程不如預期,或超支、或刪減需求、或品質不佳等

failed:取消專案,或雖然做完了,卻從不使用。

記得多年前,failed 是 25%, 而 chanllenged 是 51% 吧!總體成功率是上升了,但仍然沒有太大的變化。

2009年7月7日 星期二

軟體專案最重要的技術

在執行軟體專案的過程中,什麼技術是最重要的呢?

UI 的呈現技術嗎?此大類可包括 asp.net WebForm, MVC, Ajax, Silverlight, …等。
商業邏輯實作嗎?此類可包括 enterprise services, transaction, workflow, bpel, BizTalk, ADO.NET Data Service, Web Service, WCF, … 這類真的寫不完,etc.
資料存取技術嗎?此類可包括 Sql server, Oracle, ADO.NET,LINQ to SQL,… 等

每一個技術都需要 study,也有過時的時候。正因為有過時的時候,就不會是「最重要的技術」了。

那我心中最重要的技術是什麼呢?還是回到人類最基本的技巧:溝通。

不會溝通,就沒有辦法與同事共同開發專案,沒辦法良好地表達自己的意見,發表新技術,導入新的SOP。
我曾經有一次經驗,在與客戶討價還價要不要實作一個小功能。討論了20分鐘,決定放棄己見。後來實作加測試這個小功能也是20分鐘左右。

又另一個例子。公司同事利用小技巧,預填了未來的工時,以規避「每日填工時」的困擾,等到一段時間後,再一次調整。這樣的行為,我認為工時會填的不正確,有誰能很精準的在星期五時想起星期一做了哪些事情呢?光這個事情,我又花了兩小時來溝通。

溝通的成本,真的比想像中來得高很多。而且溝通的技巧,不只是在專案上,在朋友、家人都可以用到,不會過時。

所以,溝通技巧,是我認為是「軟體專案最重要的技術」,是最值的投資的事了。

2009年7月3日 星期五

[Project 2003]如何設定專案在儲存時,自動發佈專案計劃

問題

審核完工時後,我常常只會儲存專案,忘了「共同作業/發佈/專案計劃」。有沒有更簡單的做法?

解答

設定此專案在儲存時,自動發佈專案計劃

步驟

1. 以Project 2003 打開專案,執行「共同作業/共同作業選項」

image

2. 視需要勾選「新增及變更的工作分派」、「專案摘要」、「包含完整專案計劃」後,按確定鍵。

3. 儲存專案

image

2007年4月23日 星期一

Production 與 development 環境建置

在公司內,已經建好了 Project server 2003 的正式環境。但是,卻一直缺乏一個與正式環境類似的開發/測試環境。 今天,狠下心來,結果竟然成功了。 過程其實很簡單。
  1. 建立一個虛擬伺服器 BpProjectServer
  2. 在BpProjectServer 上將全部的東西灌起來 (Single Mathine 配置)
  3. 將production 上的資料庫備份,還原到 BpProjectServer
  4. 將BpProjectServer 上的ProjectServer 資料庫中,MSProjectUser, MSProjectServerUser 刪除
  5. 在BpProjectServer (Server 等級),設定 MSProjectUser 可以使用ProjectServer 資料庫,並設其資料庫角色為 MSProjectRole
  6. 在BpProjectServer (Server 等級),設定 MSProjectServerUser 可以使用ProjectServer 資料庫,並設其資料庫角色為 MSProjectServerRole

然後,就完成了。

注意到,MSProjectServerUser, MSProjectUser的密碼,開發/測試環境必須保持與Production 環境相同。另外,WSS與SMTP也可能需要調整,避免誤會。

2007年4月2日 星期一

實際完成百比無法累加

在公司使用 Project時,發現有的專案經理所製作的 mpp 檔,在計算大綱任務時,無法自動計算。因此總是會出現 0%。 找了老半天,原因是:有此子任務的實獲值計算方法,是使用「完成百分比」,而非「實際完成百分比 」。 MS Project 在有些是,有些不是的狀況下,也不知道怎麼計算了。直接顯示 0%。 因此,解決的方法是:全選所有任務,執行「任務資訊」,選「進階」頁,將「盈餘分析方法」設為「實際完成百分比」。

Share with Facebook