阻礙改善設計的常見觀念

2021-09-05 03:13:32 字數 3752 閱讀 8796

既然軟體設計如此重要,那麼忽視它就是一種戰略短視行為。軟體工程師最重要的工作內容理應是進行真正的、創造性的軟體設計,而不是只忙於簡單地修補漏洞。漏洞是得補,但得補得有藝術、有深度,而不是頭痛冶頭、腳痛冶腳地補。那種沒有深度的修補方式注定是在為將來埋下更大的定時炸彈,也可以預見未來的軟體維護工作將愈加的困難。

重視軟體設計的首要條件是相關人員(包括軟體工程師、專案管理者等)真正明白什麼是軟體設計,造成忽視軟體設計這種現象的原因正是相關人員不明白什麼是軟體設計,而不是知道什麼是卻故意不重視它。為此,做好軟體設計的關鍵要素是人 —— 專案組擁有掌握軟體設計方法和設計思想的軟體工徎師,以及專案團隊是在理解和倡導軟體設計之重要性這類管理者的領導之下。

軟體開發似乎總是容易進入混亂狀態,而要從這種混亂狀態中走出,應當通過逐步改善設計的方式,而不該是等待那種一次性的「顛覆性時刻」的到來。之所以出現不少專案安於現狀,受盡煎熬卻無意通過改變走出困境,是因為存在幾種常見的觀念,這些觀念阻礙著專案組去改善設計。

測試可以成為替罪羊或測試是救命稻草?

測試是軟體質量保證非常重要的乙個手段,是驗證軟體功能是否與需求相一致的必需方法,但是千萬不能將其當作是軟體質量的唯一保證方法,更不應當讓測試成了軟體缺陷的「替罪羊」或質量的「救命稻草」。

現實工作中存在這麼一種現象,只要軟體發現了新的缺陷,就有人會指責測試部門「為什麼沒有測出這個問題?」。理論上測試部門應當對最終的產品質量負責,因為它們是質量衛士,但實際上要做到這一點並不容易。原因在於測試部門無論如何努力工作,他們不可能構造出所有的異常測試用例,對於大型系統和分布式系統更是如此,這也是為什麼軟體行業存在「測試只能證明失敗」這種觀點的原因。提出「別讓測試成了替罪羊」這種觀點的目的不在於為測試工程師沒有通過測試找出缺陷進行責任開脫,而在於提醒軟體開發工程師應更多地從設計的角度去審視「這種缺陷能否通過設計避免?」,或者思考「是不是現在的設計注定了會出現這麼多的缺陷,真正有效、徹底的解決方法應當是重新設計(或稱之為重構)!」。

作為開發軟體工程師,應當明白,如果軟體設計沒有做好,測試工程師也很難單方面保證最終的軟體質量。最終的軟體質量一定**於開發工程師所做出的優良設計,以及測試工程師別出心裁的測試用例設計。設計沒有做好卻將測試當作「救命稻草」是件很可怕的事,不光專案最終做不好,參與其中的每乙個人都將揹負沉重的包袱。對於軟體工程師來說,在這種專案上工作很可能是在浪費時間。試想一想,乙個根基不好的建築,我們將其裝修得再好也不能說這一建築質量就好,而軟體設計如果建築的根基、測試如同裝修。千萬不要將質量保證的口號變成「測試,測試,再測試!」,而應當是「設計,設計,再測試!」。

乙個設計很糟糕的軟體,開發工程師可以試著想一想,如果自己是一名測試工程師,是否能通過設計出完善的測試用例去保障軟體的最終質量呢?如果自己覺得也不行,那說明只能通過改進設計去嘗試著改變這一問題的答案。

資源永遠不足?

或許讀者也深深地認同軟體設計的重要性,但一定有人其內心深出會發出這樣的聲音 —— 「可是我們沒有這麼多的時間去做設計啊!人員本來就不足!」,這種想法說到底就是提出資源不足。

對於提出時間不足的讀者,有一點筆者需要提醒的是,請確保你的專案組的確存在具備設計能力的人,否則時間不足不是最為緊迫的乙個原因。在此姑且假設專案組存在這類人,否則獲得這類人應當是專案組的當務之急。

人的慾望是無限的,但資源卻是有限的。時間是有限的、人員是有限的、開發裝置是有限的等等,當然歸根結底都是因為專案資金是有限的。專案也很有可能因為資源不足的因素而進入混亂狀態,但是走出這些混亂狀態的途徑不應是一味的要求投入更多的資源,而應當考慮在現有資源配置條件下嘗試著「亂中求冶」。進入混亂相信有資源缺乏的客觀因素,但也很有可能是人為造成的(筆者認為這是絕大多數情形),比如不良設計就會造成軟體專案成為乙個資源「黑洞」,在這種情形下無論投入多少資源可能都是於事無補(推倒重來是乙個特例),誰能保證資源投入多了設計就一定好了呢?另忘了資源與行事方式是正交的!如果行事方式不對,投入更多的資源那將意味著更大的浪費。相反,在相同的資源配置條件下,如果每次嘗試著「扣」出一點資源來進行設計改進,時間長了就會出現量變到質變的飛躍,從而有可能最終走出困境。

對於乙個已經投入使用的軟體,當缺陷已讓專案組覺得負擔沉重時,請不要幻想有一天上司對你說「接下來的半年我們不再增加新的功能,而是專門改進設計以提高質量」。即使有人說了,那很有可能是指其它的意思,或許想表達「因為我們的軟體質量太差了,客戶都不願意用了,只能等***一點他們才再考慮使用」。等到這種時候再去考慮改進設計,團隊的壓力反而大了,為什麼不平時多花一點努力去做一些微小的改進呢?在投入更多的資源時一定要確保專案組對資源的使用是正確的,如果只是簡單地增加時間或人力而在思路或方法上並沒有改變那很有可能意味著這種資源的投入是一種盲從。

資源不足不應成為阻礙改善設計的永遠藉口,也不應指望對系統進行一次性的顛覆改進。「亂中求冶」的方法其實能有效地控制風險,也給了專案組更大的自由空 間。一件事情如果是在「非做好不可」這種壓力下進行的,那很容易出現「瓦倫達心態」,那結果很有可能是做不好,因為很有可能瓶頸在於團隊的能力,而能力是 在短期內無法獲得突破性提公升的。而「亂中求冶」的方法不同的是,可以有選擇性地讓能力更強的人去做改進工作,這樣團隊能力的不足與「非做好不可」情形相比 不會太明顯。當然,「亂中求冶」的方法也有一定的***。本來資源已不足了還得抽出一些資源來做改進之事,這會讓專案組在短期內承擔更多的工作量。但是, 這也是考驗專案組的機會。專案組應當清楚地認識到,這種短期的壓力是有回報的,它意味著專案在朝更好的方向發展,也意味著會擁有乙個更好的將來。另外,亂 中求冶能為專案組提供一種持續鍛鍊能力的機會。如何在混亂中找到問題的根結並通過設計進行解決是很具挑戰性的,每克服乙個困難,專案組的能力可能就獲得了 一定的提公升,而且這類提公升將隨著時間的推移產生放大效應。除了軟體設計質量的提高,亂中求冶還可以幫助打造團隊的文化,一種積極面對混亂的創造性文化。

不改變就可以規避風險?

另一種阻礙專案組進行設計改進的思想**於風險控制意識,具有這種意識的人通常是擔心因為改變而增加了風險,且擔心過了頭。

風險與創造性似乎是一對矛盾,很多組織大力提倡創造性但卻嚴格控制風險。嚴格控制風險意味著很難獲得改變的機會,那創造性也很有可能被扼殺。風險應當有大小之分,如果嚴格控制所有的風險那意味著所有的風險都是一樣的,間接的否認風險有大小之別。控制風險固然重要,但應當有個度,對於小風險的事情應當倡導團隊去嘗試。什麼都不做、不去改變就沒有風險了嗎?處於混亂狀況的專案,其風險不會因為不去改變而消失,運用複雜度守恆定律去理解的話,現在不去改變那將意味著將來會有更大的風險。顯然,現在不改變可能短期不會暴露風險,但從長遠來看必暴無疑。支援不選擇承擔短期風險的原因很有可能是「過了兩年以後不知這個專案還做不做」,或者是「管它呢,過了幾年再說,到時也不管我的事了」。

過度的風險意識很多情形是**於專案管理者,就作者的工作經驗來看,大部分的軟體工程師都勇於去承擔一定的風險,因為那樣的工作對於他們來說才變得有趣且能學到更多的東西,也有不少工程師甚至為了學習技術而不顧風險的存在。作為管理者控制風險是對的,只是要注意方法和度。比如,在做設計改進之前是否可以考慮先引入單元測試的方法以防改出另乙個「噩夢」,等等。一定可控的風險,對於專案組的健康是有益的。別忘了除了控制風險,管理者很重要的乙個責任是培養團隊,乙個沒有一定風險存在的團隊,其工作一定很無趣,也無法激發團隊的工作激情和創造力。每個團隊或多或少都存在能力強的工程師,如果不給他們一點具有風險性的工作(這類工作通常更具挑戰性),那很有可能留不住這些人。

控制風險的一種有效方法就是運用前面提到的「亂中求冶」的思想,通過不斷的小改進可以做到讓團隊在一定的風險刺激之下,同時風險也不至於過大。這麼多的好處,為什麼不嘗試這種方法呢?反之,如果一定要等到整個組織從上到下都關注意(設計)質量改進,那時壓力一定很大,風險也一定很高,實在是應當避免出現這種讓團隊沒有退路的境況。

最後,管理者擔心改變的風險很有可能是對團隊的能力不信任,或者團隊的能力真的讓人不信任。但能力是通過改變和犯錯積累的,就這個角度來說,也應當放手讓團隊去做一些小小的嘗試,因為只有這樣團隊的能力才有可能提高。因為不信任團隊而害怕改變所帶來的風險,或許是在為自己製造乙個悖論。

WMS倉庫管理系統常見的問題以及改善方案

wms倉儲管理在第三方物流企業的整體業務當中發揮著非常重要的作用。在如今,具備強大的倉儲管理能力是企業能夠在眾多競爭者當中突出重圍的重要支援力量。第三方物流企業應該如何改善倉庫管理問題?倉儲管理業務是第三方物流企業核心工作,因此眾多的物流企業紛紛選擇了專業的wms系統來管理倉儲業務。wms系統是管理...

常見的設計模式

常見的設計模式分為三類 建立型 結構型 行為型 單例模式 public class singleton public static singleton getinstance return thesingleton 簡單工廠模式 簡單工廠模式是a類想呼叫b類,不直接new b類,直接new出來耦合性...

常見的設計模式

單例模式 永遠只有這乙個例項物件,不管執行什麼操作。1 懶漢式 當呼叫方法時,才能獲取所需單例物件,單例物件才能被建立。2 餓漢式 初始類時,單例物件建立。實現單例條件 1.私有的建構函式 2.私有的靜態全域性變數 3.公有的靜態方法 工廠模式 sessionfactory.opensession ...