軟件質量之路(1):軟件質量框架

轉載自IBM Developerworks

軟件質量的重要性是不言而喻的,但是當所有人都意識到它的重要性的時候,卻很少有人能夠清晰的描述出如何才能夠提高軟件質量。軟件質量框架的目的就在於提出一個評價的原型,幫助我們分析一種方法和技術是否能夠提高軟件質量。本系列文章分日構建、測試驅動開發、建立核心框架、面向組件的大規模軟件架構來進行深入的分析。

什麼纔是一個高質量的軟件?
在討論軟件質量原型之前,我們先回答第一個問題。一個軟件之所以被認定爲質量優秀,並不是因爲它獲得了一個省級或部級獎,而是它的內在具備了這樣一些特性:

滿足用戶的需求。這是最重要的一點,一個軟件如果不能夠滿足用戶的需要,設計的再好,採用的技術再先進,也沒有任何的意義。所以這一點非常的樸實,但卻是軟件質量的第一個評判標準。


合理進度、成本、功能關係。軟件開發中所有的管理都是圍繞着這幾個要素在做文章的,如何在特定的時間內,以特定的成本,開發出特定功能的軟件。三者之間存在一種微妙的平衡。在Planning XP一書中,專門有一個章節討論它們。一個高質量的軟件的開發過程中,項目成員一定能夠客觀的對待這三個因素,並通過有效的計劃、管理、控制,使得三者之間達成一種平衡,保證產出的最大化。


具備擴展性和靈活性,能夠適應一定程度的需求變化。當今的社會已經變成一種變化速度極快的設計了。變化就會對軟件產生衝擊,所以一個質量優秀的軟件,應該能夠在一定程度上適應這種變化,並保持軟件的穩定。


能夠有效的處理例外的情況。寫過軟件的人都知道,實現主體功能的工作量其實不大,真正的工作量都在處理各種例外。所以,一個軟件如果能夠足夠的強壯、足夠的魯棒,能夠承受各種的非法情況的衝擊,這個軟件就是高質量的。


保持成本和性能的平衡。性能往往來源於客戶的非功能需求,是軟件質量的一個重要的評價因素。但是性能問題在任何地方都存在,所以需要客觀的看待它。例如,一段性能不錯的代碼可能可讀性很差,這就需要進行平衡,如果這段代碼的性能是整個軟件的關鍵,那麼取高性能而捨棄可讀性,反之則取可讀性而捨棄高性能。一個優秀的軟件能夠保持成本和性能之間的平衡。


能夠可持續的發展。很少有軟件組織只開發一個軟件的,所以,一個優秀的軟件在開發完成後,可以形成知識沉澱,爲軟件組織的長期發展貢獻力量。這是一個優秀的軟件應該要能夠做到的。
軟件質量框架的組成

軟件質量框架不是理論,而是優秀軟件開發思想的一個應用,是對軟件開發過程的有效管理實踐。它以敏捷方法論爲基礎,並將先進的軟件開發技術融入其中。您可能在之前聽說過,學習過,嘗試過各種軟件技術,但是缺少一個統一整體的認識。所以,軟件質量框架的目的是將您原先在腦海中就存在的思路進一步的整理,將一副完整的圖像(big picture)展現在你面前。軟件質量框架偏重應用,所以不會涉及太多的理論,但是,它是基於理論的,所以,在需要理論支持的地方,我們會簡單的描述理論,並給出必要的鏈接,供有興趣的讀者進一步閱讀。

軟件質量框架並不複雜,它由幾個部分組成,第一部分是前提,說明了軟件框架的適用範圍,以及適合的環境,和方法學一樣,沒有泛之四海皆准的方法學,所以軟件質量框架也需要一個上下文環境。第二部分是價值觀,價值觀說明了軟件質量框架中強調的價值,在軟件框架的結構和實踐中,都將充分的的表現出一開始我們定義的價值。第三部分是結構。結構定義了軟件質量框架的組成部分,以及軟件質量框架和開發過程之間的關係。第四部分是文章中着墨最多的部分,即優秀實踐。優秀實踐通過具體、實際的分析、舉例,深入闡述了軟件質量框架的價值觀和結構。

在本文剩下的篇幅中,將會對前三個部分進行闡述,並對軟件質量開發的實踐進行簡單的描述。在剩餘的篇章中,將會針對這些實踐進行細緻的分析。

軟件質量框架的前提
平臺前提:由於軟件質量框架的實踐將會涉及具體的技術和代碼,所以我們首先爲軟件質量框架定義了平臺。軟件質量框架將會運行在J2EE平臺上,使用對象分析技術(並不一定是面向對象技術,我們可以採用以數據爲中心的技術)。

組織前提:執行軟件質量框架需要投入,需要付出,軟件質量框架最難的地方不是學習,而是執行。在一個組織中,需要評估應用軟件質量框架需要多少的投入,對目前的開發過程有多大的助益。一般來說,組織的規模越大、其開發過程和產品越複雜,就越適合採用軟件質量框架。

方法學前提:在敏捷方法學中,對規則和秩序有兩種不同的觀點,一種是強調規則和秩序,以XP爲代表,它對代碼都有要求;另一種則不那麼強調,以自適應軟件開發爲代表,它不要求程序員的具體行爲。軟件質量框架採用第一種觀點,要求組織中存在嚴謹的規則和秩序。

軟件質量框架的價值觀
明確具體:對軟件的管理必須是明確具體的。軟件開發是工程、也是藝術,需要緊密的協作和溝通,任何一個含糊的指令都可能導致軟件開發中出現錯誤,所以,在軟件開發中,任何一個指令都應該是相對明確的。爲什麼說是相對呢?是和成本相對,指令越明確,成本就越高。例如,你可以把需求文檔寫的非常的具體,但是你需要付出製作和維護的代價。所以我們的明確性是一個考慮成本前提下的特性。

明確具體要從綜合上考量。怎麼理解呢?例如,XP中的用戶故事是非常不精確的,按道理說它是不明確,也是不具體的。但是在整個開發週期中,將會有迭代、測試、現場用戶等多種手段使得用戶故事明確具體起來,所以從整體上看,它並不違反我們的價值觀。產品質量是一個系統工程,決不僅僅是QA部門的工作,。這個道理適用於製造業,也適用於軟件開發業。

容錯:軟件開發是人的工作,人是無法避免錯誤的。所以,軟件質量框架中允許犯錯。因爲不犯錯是天方夜譚。你就算做了這方面的強制規定也無法避免它的出現,反而會引發其它的問題,例如隱瞞錯誤,或爲了隱瞞錯誤而導致的額外成本。所以正確的態度是允許發生錯誤,並建立一套監測、管理、反饋、修改錯誤的體制。

規範:在前提中,我們已經提到了,規範是軟件質量框架的基本態度。所以,軟件質量框架中強調規範,並使用規範來推動框架的運作。

測試:軟件質量框架非常強調測試,測試是保證質量的必由之路。測試要儘可能的多,儘可能的頻繁、測試結果要儘可能快的反饋。這是軟件質量框架對測試的基本態度。測試是綜合性的,軟件開發過程中的所有工件,都需要伴隨着相應的測試工件。這是基於一個簡單的理念,如果你不能夠爲你的工作制定一個完成的標準,你又該如何開展你的工作呢?

軟件質量框架的結構



上圖表現了軟件質量框架的結構。處於結構核心的是技術架構和管理架構。軟件質量框架既不是方法學,也不是一個軟件,更像是兩者的結合體。技術架構和管理架構的融合體現了這一特性。軟件質量框架並不關心單個開發人員的效率,它關注的是開發團隊整體的效率。因此,管理架構在框架中的意義在於它定義了一套軟件管理的方法,能夠對開發人員及其他們的工作進行管理。從這一點來看,它的作用和軟件工程方法學是一樣的。但是,在現實中我們發現軟件組織在邁向軟件過程的途中往往因爲現實的困難而止步不前。其中一個主要的原因是在引入方法學的過程中生產效率降低了,而引起組織成員對變革的懷疑和不滿。

所以,除了管理架構之外,軟件質量框架還提供了一個技術架構,其目的是明確的定義如何應用組織中涉及的軟件技術,以及管理軟件技術的方法。技術架構是具體的代碼,相比起方法學來說,它更加的具體,更容易爲開發人員所理解。而技術架構存在的目的,一方面是進行技術積累,另一方面也是爲管理架構服務。

技術架構和管理架構的下一層是支撐框架。支撐框架包括代碼、組件、文檔,目的是爲技術架構和管理架構提供底層的支持。

處於結構最頂層的是業務架構。這個部分對於任何一個軟件組織來說都是不同的,因爲不同的軟件組織的業務不同。業務架構的目的是對業務進行建模和抽象,提取出可重用的部分,以提高軟件組織的生產率。本文中不涉及該部分的內容。

軟件質量框架的優秀實踐
一個開發團隊要提高效率,就需要思考目前的管理活動中有哪些要素是可以改進的:如何把一些事務性的操作變得自動化,從而節約人力;如何找到更好的方法,讓開發過程更爲合理,更注重軟件的質量;如何在團隊中傳播優秀的思想,讓團隊成員不斷的學習和進取,自發的改進過程。這些美好的願望幾乎是所有方法論和各種認證的共同心聲,但要完全做到可就太難了。在我們的文章中,提出了一些優秀的實踐,優秀實踐均是來源於軟件開發界中的一些新思路和新理論,它們能夠爲以上願望的達成起到正面的作用。在組織中引入用這些實踐決不是一個容易的過程,但它們確實非常的有效。不論是在成本控制上,還是在質量的改進上。

日創建:一個組織應當擁有一個有效的工作流程,這個工作流程能夠指導軟件開發的進行。這個流程應當是具體的、可操作的。隨意的計劃和從來不遵循的進度決不是一個有效的工作流程。日創建實踐提出了一種對開發過程進行精細管理的方法,它是量化軟件管理的基礎。有了日創建,你會發現計劃的制定和進度的監控是非常容易的一件事情。

測試驅動開發:軟件質量的根源來源於測試,測試做好了,軟件質量就會好。這是毫無疑問的。問題的關鍵在於怎麼做測試,才能保證測試的投入能夠帶來軟件質量的有效提升。測試驅動開發正是爲了解決這個問題而出現的。它不是一個完整的方法論,可以和任何一種開發流程進行融合。測試驅動開發不但能夠改善測試效果,還能夠改進軟件的設計。

建立核心框架:框架是一種具有高度重用性的軟件,這個特性決定了它非常適合成爲軟件組織積累知識的一種有效手段。傳統的知識積累的方法是文檔,但是文檔容易產生歧異,開發人員往往也不願意去閱讀和理解文檔。框架提供的是一種綜合的手段,包括文檔、模型和代碼。更容易理解,更重要的是,開發人員必須在日常的工作中使用框架,這使得他們對框架中的知識非常的熟悉,並根據工作的需要來改進框架。

面向組件編程:有效的組織在於有效的分工。體力活動容易進行分工,腦力勞動則比較難,而軟件開發似乎就更難了。所以,長久以來我們都習慣採用以功能塊爲單位的粗粒度劃分方式。面向組件編程採用更加細密的劃分方式,並以服務作爲組件之間相互依賴的契約,不但定義了組件和組件之間的關係,也規定了組件開發者、組件使用者、組件測試者的權利和義務。從而能夠進行軟件開發工作的分配、管理、QA等工作。

以上的幾個優秀實踐看起來似乎並沒有多大的關係,他們的提出者也大都不同。但是有一點卻是共同的,就是他們都能夠對軟件質量的改進起積極的作用。此外,他們爲軟件質量框架結構的實現提供了一個明確的實現方式。從軟件結構的角度來看,日創建和測試驅動開發似乎偏向於管理架構,而建立核心框架和麪向組件編程則偏向於技術架構。事實上,他們既包含了技術架構,也包含管理架構,彼此之間也有相互關聯。例如,面向組件編程在合理劃分組件之後,就需要一個有效的核心框架來集成組件,通過每個組件都需要採用測試驅動開發方法來保證質量,同時,日創建將會以組件爲單位來進行每日的創建,從而爲進度估算提供有效數據。

隨着軟件設計技術的發展,新的實踐將會出現,取代舊的實踐。因此,以上的實踐也會落伍,當可以肯定的是,以上的實踐和具體的技術並沒有直接的關係,更側重於開發思想,因此他們的生命力會很長。而隨着新技術的出現,他們更可能將新的技術融合如自身,呈現出一種嶄新的形態。例如,未來的一種可能性是UML2.0和MDA技術的普及,以上的幾個實踐從以代碼爲核心轉變爲以設計爲核心,而另一種可能性是隨着以AspectJ爲代表的AOP技術的普及和J2SE1.5中引入的元數據機制,面向組件編程將把Aspect作爲組件的一種,而測試驅動開發也會加入測試Aspect的相關內容,在日創建中也會增加相應的處理AOP的步驟。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章