Archive for the ‘software engineering’ Category

Why Automate Test?

Wednesday, April 15th, 2009

Test Driven Development, 係以測試來驅動程式既設計, 目的係為了提高軟件既質素.

好多人覺得測試對軟件方面只在於用戶接受測試 (UAT), 因為只要通過 UAT, 公司就可以袋袋平安. 不過, UAT 通常都浪費人手, 而且該次 UAT 只計對於該次既軟件需求, 當需求需要更改, 所有既測試都要人手重頭做過, 浪費人力物力.

自動化軟件測試既好處係可以減省人手及時間, 以及提高軟件既質素及完整度.

以下係一個由 NUnit 提供既自動化測試例子:

// 一個 object oriented 既 Account class
namespace bank
{
  public class Account
  {
    private float balance;
    public void Deposit(float amount)
    {
      balance+=amount;
    }

    public void Withdraw(float amount)
    {
      balance-=amount;
    }

    public void TransferFunds(Account destination, float amount)
    {
    }

    public float Balance
    {
      get{ return balance;}
    }
  }
}
namespace bank
{
  using NUnit.Framework;

  [TestFixture]
  public class AccountTest
  {
    // 自動化測試來測試 TransferFunds Method
    [Test]
    public void TransferFunds()
    {
      Account source = new Account();
      source.Deposit(200.00F);
      Account destination = new Account();
      destination.Deposit(150.00F);

      source.TransferFunds(destination, 100.00F);
      Assert.AreEqual(250.00F, destination.Balance);
      Assert.AreEqual(100.00F, source.Balance);
    }
  }
}

以上只係其中一個例子用來測試軟件既完成度, 在現實上, Test Case 除左要測驗一般情況外, 仲要測試錯誤情況出來既結果, 保証軟件質素, 所以正常使用既情況係唔會得一個 Test Case 咁少.

要實行 Test Driven Development, 通常要有一個良好既 Object Oriented Design 以及 Design for Test, 如果沒有這兩個設計既技巧, 那測試既質素有可能會受影響.

愈多 Test Case 未必代表軟件的準確率愈高, 正常情況 Test Case 既數量應該多過 Use Case 既數量, 而且會因應不同既考慮點而增加一定的測試數量, 以我所知, 在某些大學既科目中, 有計算要有多少 Test Case 既試題 (因為我都有睇過), 用作驗證是否足夠全面地測試每一行代碼.

在測試失敗時, 有問題既地方除了可能係軟件本身外, 自動化測試部份亦有可能會有錯誤, 錯誤既多少在乎實現 Test Case 既人對軟件測試既知識同經驗所得.

雖然軟件在有測試既環境下推出, 但有時都有可能會在軟件發現有 bug 既情況, 當遇到這個情況下, Programmer / Tester 應該用 Test Case 去模擬問題既環境, 當得出相同既結果後才可以更改軟件, 因為未能模擬出相同環境下更改軟件, 失敗後亦未知是軟件問題定 Test Case 問題, 所以 Programmer 應該先更改 Test Case 後才更改軟件, 而更改軟件途中, Programmer 亦可透過測試來避免 side effect 出現, 所以不段發現問題環境才能提高軟件既完整性, 以及提高軟件人員對軟件既信心.

測試, 除了要滿足軟件既完整性, 亦要滿足不段改變既需求, 世界變, 軟件同測試不變就只會不進則退, 所以為新既需求而更改軟件及擴充其功能既環境下, 自動化測試係必須的.

一年前我工作既地方, 因為無自動化測試, 軟件無 Design for Test, 要用到硬件 及 3rd Party 提供既模擬程式下, 人手測試既時間應該超過一個月, 除了測試一個月既時間外, 測試既人手通常都要兩至三人, 而且大部份都係重複既輸入工作, 以及已改幾句 code 而重做半小時既測試結果既慘況下, 自動化測試變成我寫軟件生活既其中一個有興趣深入研究既地方.

97 Things Every Software Architect Should Know

Sunday, March 29th, 2009

近期睇緊 97 Things Every Software Architect Should Know 既 post, 入面有好多被公認 Software Architect 要知既事情, 我想如果要做到專業既話, 入面每一樣野都應該深入了解下!!!

除此之外, 仲有 Other Things Software Architect Should Know, 部份只有標題, 不過都理解到那些標題要深入研究的話係有難道的.

Why Open Source?

Monday, November 17th, 2008

前排同朋友傾, 佢話曾經有做銀行既 client 質疑 Open Source 既 Security, 怕寫果個人係 Cracker, 因而唔安全, 所以唔 prefer 用 Open Source. 我覺得個 Client 完全唔合邏輯, 係正常情況下, 比起相信一個人 (唔理係咪自己公司既人), 我會相信由唔同國家既 developer 共同參與, 觀察, 開發, 試驗過既 Open Source 安全 d, 我覺得就算係自己公司既人, 都有可能會係一個 Cracker, 而因為 Open Source 有多人參與, Crack 唔出樣.

用 Open Source 既原因, 主要係集眾人既力量來提高軟件質素, 如果有 bug, 只要 1 個人 debug 就可以解決, 提高了可重用性, 亦可以提高軟件既完整性.

而減低成本方面, 我相信都有一定效果, 當然市場上有人已經提過, 請識用 Open Source 既人其實佢既人工都會高左, 但對公司黎講應該可以減低成本.

使用方面, 其實大多都係得幾類, 一係工具, 而且可以應用在不同領域; 一係已標準化程序, 就功能更加完善. 所以使用 Open Source 係利多於弊.

Domain Distilled

Saturday, September 27th, 2008

DDD Charpter 15 講述 Distilled Domain, 入面既野有大部份都以前讀果科 Outsourcing 既理念差唔多, 都係講 Core Competence.

Core Competence 係指企業核心能力, 亦都係企業不可代替既競爭力, 等同於 Sony 既電子細小化技術, Mac 既圖象技術一樣, 每間公司能夠待續成長就要有一個 Core Competence!! 而 Distilled Domain 就係個 Core, 經多次程式員同 Domain Expert 討論及詳細理解過後既精華所在, 但如果一個 Core Domain 得不到質量管理, 最後都係發揮唔到佢競爭優勢.

Domain-Driven, 因為要解決既問題多數係 Domain Problem, 所以如果 Software Developer 未能理解該 Domain, 其實對軟件既質素長遠都有影響. 而當一個不良既設計存在於一個運行緊既系統內, 作為 Software Developer 係咪真係可以說服到管理層 (通常係 Project Manager) 去追求質素而去面對一個有可能存在既風險呢?

因為自己對軟件設計有追求及自己不段既進步, 面對住以前寫過既部份質素無咁好既設計(或者係 Code)因為已經運行當中而無法提高品質, 可以做既就係在一個新既系統未設計之前, 盡量去理解 Domain Problem 同 Business Needs 而去做一個精練既設計, 加上軟件架構同良好既編程習慣, 令跟隨者能易於管理及因需要而重構, 自己又能隨著經驗增加而設計出更高質素既 Domain 及周邊工具, 咁先可以有較地提高生產力.

一個好既 Domain Design 亦都好需要一個良好既 Utility 支持, 等同於 Core Competence 入面, 除左 Core 之外, Non-Core 但 Essential 係避免 Outsource 一樣, Utility 亦十分重要, 亦需要得到內部廣泛使用及質量管理 (e.g. Test-Driven Design), 不會抄襲而注重重用, 咁先可以真真正正提高效率, 質素及生產力, 呢幾個理念亦係我對軟件設計既堅持.

Programming with Domain-Driven Concept

Wednesday, September 24th, 2008

之前買果本 Domain-Driven Design 都睇到第 15 章, 基本既理念大致上有:

    Factory
    Repository
    Specification
    Domain Model with Aggregation

而宜家寫既 Code 大部份都會跟呢個方向做, 雖然有時都無寫 Factory 黎生產 Object, 但自己就將 Repository Inherent DAO, 咁加埋 Spring.net 既 NHibernate Template 就可以更快地寫好一個 Program, 而 Validation 呢部份就用 Specification 黎做, 配合埋 Shared Kernel 就可以支援唔同既 Bounded Context.