論軟件體系架構之質量屬性
馬旺旺
(石家庄鐵道大學,河北省石家庄市,050000)
摘 要:軟件架構(及軟件架構設計師)重點關注的是質量屬性。文章從常見的六個質量屬性,即可用性、可修改性、性能、安全性、可測試性、易用性寫起,使讀者對其有初步的認識和了解。解決了在具體的軟件開發環境中的質量屬性是什么,怎么用,如何用好的問題。只用遵循質量屬性的原則,才能有好的設計思想,才能開發出好的軟件產品。
關鍵詞:質量屬性;架構;軟件;開發
On the quality attribute of software architecture
Ma Wangwang
(Shijiazhuang Tiedao University,Shijiazhuang City, Hebei Province,050000)
Abstract:Software architecture (and software architect) focuses on quality attributes. This article starts from six common quality attributes, namely, usability, modifiability, performance, safety, testability and ease of use, so that readers can have a preliminary understanding of them. It solves the problem of what is the quality attribute in the specific software development environment, how to use it, and how to use it well. Only by following the principle of quality attribute can we have good design ideas and develop good software products.
Key words:Quality attribute; Framework; Software; Development
0 引言
為了了解軟件的質量是否滿足要求,我們必須定義軟件的質量屬性(Quality Attributes)。同時質量屬性也是影響軟件架構的重要因素。軟件架構主要由需求決定,需求有功能性的和非功能性的,其中非功能性的需求主要就是指質量屬性。wikipedia上列出了大概80種不同的質量屬性,下面我們討論一下其中最常見的屬性。
1 可用性
可用性是指系統正常工作的時間所占的比例。可用性會遇到系統錯誤,惡意攻擊,高負載等問題的影響。
在實際軟件開發過程中,"HA"(High Availability)是一個經常被提及的性能屬性。"DU"(Data Unavailable)和"DL"(Data Lost)都是非常嚴重的可用性問題。
可用性面臨的主要問題有:
(1)物理層失效:比如數據庫服務器宕機,停電, 網絡欠費被中國電信斷網。
(2)惡意攻擊:例如DOS(Deny of Service)攻擊。
(3)軟件的設計問題或BUG:比如錯誤的資源控制鎖導致某個資源長期被占用,各種core dump, out of memery, out of stack。
(4)升級或日常維護。
針對這些問題,為了增加可用性,需要考慮:
(1)如何設計故障轉移(failover),一般可以使用冗余來消除系統中的單點故障。可以是各種冷熱備份,分布式系統。
(2)如何設計在線升級。由於存儲設備有兩個同時工作的單元構成,所以升級的過程簡單說就是先升級第一個單元,然后再升級第二個單元。聽上去非常簡單,然而實際的升級過程非常復雜,在升級之前,會做非常多的健康檢查,比如檢查兩個單元是不是都在正常工作,有沒有壞的磁盤,存儲設備的版本是不是滿足要求。特別是由於存儲設備的軟硬件型號復雜,還要考慮各種不同的運行環境,各種軟件BUG,健康檢查非常非常的復雜。
(3)如何設計異常處理。異常處理是一個很大的話題,為了支持高可用性,我們應該如何處理異常呢?舉個例子,一個網站要處理用戶的訂單,然而由於數據庫服務器的故障,雖然前端的服務一切正常,可是訂單無法處理。你會怎么處理這個數據庫服務器異常的情況呢?大多數的程序員會在捕獲異常的時候寫日志,把異常狀記錄下來,然后在客戶端的UI上顯示一段誰也看不懂的異常代碼。這樣的異常處理其實跟沒做差不多,甚至更糟。那么把異常代碼翻譯成用戶可以看懂的語言是不是會好一點呢?也許會,如果你告訴用戶因為你的數據庫故障,請明天再來,可想而知用戶會多么失望!好的異常處理是把用戶的訂單請求記錄下來,發給人工處理,或者等待數據庫恢復后自動處理,並告訴用戶訂單已經處理,並有可能遲延,請求得到用戶的諒解。
(4)如何應對不穩定的網絡連接。
2 可修改性
可修改性是有關變更的成本問題。它提出了兩個關注點:
(1)可以修改什么?
可以修改系統的任何方面 ,最常見的就是系統計算的功能、系統存在平台(硬件、操作系統和中間件等 )、系統運行的環境(它必須與之互操作的系統,它用於與其他部分進行通信的協議,等等)、系統所展示的質量屬性(其性能、可靠性、甚至包括將來的可修改性)以及其容量(所支持的用戶數量、同時發生的操作的數量,等等)。
(2)何時進行變更以及由誰進行變更?
最常見的就是修改源代碼。也就是說,開發人員必須修改代碼,對修改后的代碼進行測試,然后將其部署在新版中。然而,現在不僅僅是何時變更的問題,而且還有由誰進行變更的問題。
3 性能
性能是指軟件及時提供相應服務的能力。具體而言,性能包括速度、吞吐量和持續高速性三方面的要求:
(1)速度往往通過平均響應時間來度量;
(2)吞吐量通過單位時間處理的交易數來度量;
(3)持續高速性是指保持高度處理速度的能力。
在C++性能優化的培訓中,有一道算法,要求大家試着用最快的方式實現。因為C++中的指針操作按數組索引訪問要快,於是當時最快的一個解決方案是用了一大推復雜指針訪問來實現算法。然而這樣的代碼很難維護,而且容易出錯。所以為提高性能就犧牲了可維護性。
一般而言,計算機提供了許多的資源,包括CPU,內存,硬盤等等,提高性能的核心就是充分利用這些資源。要保證對資源的使用是正確和有效的。
隨着軟件的發展,現在的程序員可以更高效的實現功能需求。一方面編程語言和方法在不斷進步,另一方面大量的可重復使用的組件,服務,開源的庫使得想在實現同樣的功能的時間和需要的開發人員的數量比以前極大的縮小了。whatsapp以區區55人的團隊開發出價值190億美元,擁有4.5億用戶的軟件產品,這在以前是難以想象的。所以軟件架構設計者應該把軟件的開發效率看成是更重要的性能指標。
4 安全性
安全性指軟件同時兼顧向合法用戶提供服務,以及阻止非授權使用軟件及資源的能力。
安全性既屬於技術問題又屬於管理問題。一般地,如果黑客為非法入侵花費的代價(考慮時間、費用、風險等多種因素)高於得到的好處,那么這樣的系統就可以認為是安全的。
當今社會網絡安全問題尤為突出,客戶隱私泄露問題,賬戶資金被盜刷,軟件存儲的客戶數據被黑客惡意攻擊,各種安全問題層出不窮。安全問題是所有互聯網企業都繞不開的問題,只有保證自己的產品足夠“安全”,才能贏得客戶的信賴。
5 可測試性
可測試性顧名思義就是指軟件是否容易測試。
什么樣的軟件是不可測試的呢?舉個例子來說,開發一個數據可視化的組件,就是把數據以圖表的形式展現出來。有一種數據可視化的類型使用力導向的算法(force-directed)把數據以網絡拓撲圖的形式展現出來,該算法使用一些隨機的參數來模擬節點的初始位置,並通過迭代計算生成最終layout的結果。也就是說每次的layout結果都是不一樣的。測試團隊對這樣的算法很不滿意,他們認為這樣的實現是無法測試的,因為當時我們的測試主要以比對圖形為基礎,也就是生成一個正確的圖形為基准,每次測試都會把輸出的圖形和基准圖形進行比較,如果不一致則認為出錯或者要修改基准。隨機算法雖然從功能上講並沒有錯誤,但是在這樣的測試方法下是無法滿足可測試性的要求的。最后,開發團隊修改了算法,使得每次的初始位置未固定位置來解決這個問題。
6 易用性
可用性針對的是系統,可用性,顧名思義,是系統能不能使用,當一個系統可以上線時,說明其具有了一定的可用性。而易用性針對的是用戶,描述的是系統好不好用,這兩個概念有一定的區別,可用性是能不能用,易用性是好不好用。
針對淘寶網為例,以一次完整的購物流程為背景,我們分析了在淘寶網中的一些易用性的體現,主要場景如下圖所示:
在本場景中,新用戶下載淘寶app時,第一次打開應用,淘寶app會出現新手指引,教會用戶如何購物,極大方便了用戶,使用戶可以簡單上手,開啟自己的購物之旅。
在用戶登錄時,淘寶網從用戶的角度出發,在登錄頁面免去了之前輸入用戶名密碼的操作,而是選擇使用二維碼掃描登錄,極大化簡了了用戶登陸時輸入用戶名密碼的過程,同時在滿足了易用性的前提下,使用手機淘寶掃描二維碼登錄,使得用戶的安全性得以顯著提升,極大減少了用戶淘寶賬號被盜、造成財物損失的風險。同時,手機提示信息的確認登陸頁面再次提醒用戶登錄信息,完備了用戶的安全性。淘寶網將易用性和安全性結合起來,給了用戶很良好的登陸體驗。
7 總結
軟件質量屬性的每一個方面都有很多的內容,我們只能淺嘗而止,而且仍然有許多重要的質量屬性我們還沒有涉及到。軟件設計時應該將“設備相關程序”與“設備無關程序”分開,將“功能模塊”與“用戶界面”分開。現在你是否也知道了常人是怎么評價軟件的?沒錯,作為軟件的用戶我們只關心“好不好用”,它包含在這些專業指標之中,是其綜合作用的結果。
參考文獻:
[1] naughty,軟件中的質量屬性(一),https://my.oschina.net/taogang/blog/224658
[2] naughty,軟件中的質量屬性(二),https://my.oschina.net/taogang/blog/225513
[3] iteye_2272,軟件的質量屬性及其說明,https://blog.csdn.net/iteye_2272/article/details/82099106
[4] 程序猿胖子,質量屬性-可修改性,https://www.jianshu.com/p/5f02292a90e5
[5] 顧北清歌寒,軟件質量屬性——易用性課堂討論問題總結,
https://www.cnblogs.com/wang-jx/p/10627642.html
[6] lanny-軟件工程專家,軟件質量屬性和質量要素,https://blog.csdn.net/lanny2008/article/details/39931081
[7] 巴斯、克萊門茨,軟件架構實踐第二版,清華大學出版社