l

2012年3月26日 星期一

Quality Attribute Scenarios(5):Modifiability

March 24 09:56~11:56

螢幕快照 2012-03-24 下午8.37.42

今天早上原本打算去爬新店的獅頭山,無奈下雨只好待在家裡。難得獲得一個空檔,翻出Software Architecture in Practice, 2nd這本書,重拾停了一個多月沒寫的QAS系列。這次輪到介紹modifiability(可修改性)的意義,下回再談modifiability general scenarios。

在談論軟體設計或是軟體架構品質屬性的時候,modifiability是經常被提到的一種品質屬性。依據字面上的解釋,modifiability指的是修改一個軟體系統的容易程度,或是參考書中的說法:「可修改性是指修改的成本(Modifiability is about the cost of change.)」。以下是書中提到兩個與修改的成本有關的議題:

  • 可以改什麼:如果鄉民們有看過Mobile01的汽車討論區,可以發現上面有很多討論「改車」的帖子,內容包含有改換大尺寸的輪框或是輪胎、改換高級汽車音響、改排氣管、改車燈、加裝倒車雷達、增強改汽車隔音效果、加裝GPS與行車紀錄器等等。總地來講,一輛汽車可以改的東西還真是多啊,可能改到最後連它媽媽都不認得這是自己的小孩了(連原廠的人都不認得這是自家的車子…XD)。如果是軟體哩,軟體可以改的東西也很多,例如:
    • 功能:軟體最常修改的東西就是軟體的功能(function)。通常是因為客戶的需求改變,或是開發團隊更加了解客戶真正的需求,因而需要修改軟體。
    • 平台:軟體也可能因為執行平台(platform)的改變而需要加以修改。例如,Windows 8作業系統為了要支援ARM這種非Intel的CPU,因此就必須加以修改。或是Node.js原本只可以跑在Linux-based的作業系統,如果要在Windows上執行必須要先安裝Cygwin。為了讓Node.js可以在Windows原生環境下執行,就必須要加以修改原本的軟體。
    • 環境:軟體執行的環境(environment)是指其他和自己軟體互動的系統,例如原本鄉民們的軟體只支援微軟的MS SQL資料庫,老闆或是客戶為了省成本於是要求你將後端的資料庫改成可以支援MySQL或是PostgreSQL。再舉的例子,假設鄉民們的Java程式使用com4j去存取Windows WMI的資料,有一天突然發現這個com4j在64-bit的Windows上無法很穩定的執行,因此被迫改用JACOB,此時鄉民們就必須要因為執行環境的改變而去修改自己的程式。
    • 品質:這裡的品質就是指performance、reliability、security這一類的非功能需求。例如你寫了一個遊戲,在最高檔的Intel i7電腦上可以跑得很好,但是在比較慢的Intel i3電腦上玩起由遊戲來畫面便會lag。為了讓買不起i7的貧窮鄉民們也可以玩這個遊戲,因此你就要想辦法提高程式的執行效率,讓這款遊戲在Intel i3電腦上也可以跑得很順。
    • 容量:例如鄉民們開發了一個網路訂車票系統,在平日這個系統運作很正常,但是到了連續假日或是農曆新年假期,系統就會被瞬間大量湧入的訂票需求給塞爆。為了提高系統的容量(capacity),鄉民們就必須去修改系統以便可以承擔更大量的同時上線人數與訂票交易量。
  • 何時修改,由誰修改:在一般的情況下,談到modifiability鄉民們的腦中想到的大概都是由開發人員去修改程式碼,但實際上談到modifiability應該要同時考慮「何時修改」以及「由誰修改」這兩個條件。
    • 何時修改:修改軟體(改變一個軟體的功能或是行為)的時間點包含以下幾種:
      • 實作時(implementation time)藉由修改程式碼來改變系統的功能,這也是ㄧ般普羅大眾所最為熟知的修改方式。
      • 編譯程式時(compile time)透過調整編譯條件來達成,例如使用C語言的#ifdef與#ifnedf等前置處理器條件來編譯出不同功能的軟體。
      • 建構系統時(build time)藉由選擇不同的函式庫來改變系統的功能。例如當建構測試用的軟體版本時,軟體系統會使用含支援除錯資料以及包含輸出測試訊息的函式庫以方便測試與除錯,但是當建構正式釋出版本的軟體時,則使用不含除錯資料與去除輸出測試訊息的函式庫以增加系統執行效率。
      • 系統設定時(confiuration time or setup time)藉由調整系統設定參數來改變系統的行為。例如,改變thread pool或是連線資料庫的connection pool大小以調整系統的performance與capacity。
      • 執行時(execution time)藉由調整程式啟動參數或是程式啟動後修改系統參數來改變程式的行為。
    • 由誰修改:修改系統功能的人也不限定一定是開發人員,也可以是使用者或是系統管理人員

***

以上就是modifiability的內涵,看完本篇之後如果有人問鄉民如何判斷一個系統是否容易修改,鄉民們就可以大聲地回答:請參考搞笑談軟工第X集 可由「改什麼內容」與「何時修改,由誰修改」這兩點來判斷。更具體的說,一旦鄉民們知道要修改什麼,修改的工作就必須要被設計、實作、測試、與部署。上述這些工作都需要花費時間與金錢,因此藉由評估與測量這些工作所花費的成本,便可判定每一次修改的難易度。

***

友藏內心獨白:有一陣子沒寫這麼紮實的文章了。

沒有留言:

張貼留言