- 精益軟件度量——實踐者的觀察與思考
- 張松
- 2286字
- 2019-01-01 23:46:33
第1章 度量謎題
“我們所能擁有的最美好的經歷是感受到神秘,它是觸發所有真正藝術和科學起源的基本情感。”
艾爾伯特·愛因斯坦(1879—1955)
按照IEEE的定義,“軟件工程是將系統化、規則,以及可控的體系方法,應用于軟件設計、開發、操作和維護;換言之,即工程理念在軟件中的貫徹。”看上去很美,不是嗎?當我們看到一個又一個軟件開發組織,特別是大型的組織,特別是擁有輝煌歷史的組織,把過程可控作為主要的管理目標時,一次又一次地驚訝于人們是如此容易被誤導,而我自己在開發管理的日常工作中,軟件工程那些條條框框所帶來的虛假的安全感,也曾使我一次又一次地迷失于其中。反思之后,我現在不得不重新審視軟件開發的目標和軟件工程方法的目的。
可控應該只是我們在軟件開發管理中期望優化的屬性之一,而不是全部。退一步講,奧運會的口號或許比IEEE 的定義更好地詮釋了我們的目標——“更快,更高,更強”,還有一句俗話——“多、快、好、省”,我感覺也比IEEE的那句話更全面。但是為什么人們的注意力都放在了可控性上呢?雖然可控的生產過程可以幫助管理人員更有針對性地優化和改進。不過在向“多、快、好、省”的方向前進的過程中,管理層和項目管理人員的避險本能,在相當程度上扭曲了我們的注意力,有意無意地遺失了原始的目標。
風險源于不確定性。然而軟件之所以“軟”,就是由其生命周期中所面對的變化和不確定所決定的;從另一個角度講,不確定性又是與創新如影隨行。跟其他行業相比,軟件領域的創新之活躍也不能不說與此密切相關,反過來說,那些非常確定、穩定的東西或許就不應該用軟件來實現,既然要開發軟件,就要正視其固有的變化性,利用其變化性取得優勢。
Roger Martin在他的著作《The Design of Business: Why Design Thinking is the Next Competitive Advantage》把知識的演進用一個知識漏斗(Knowledge Funnel)生動形象地描述了出來。這個漏斗總是從一個問題開始,需要經過謎題(Mystery)、啟發(Heuristic)和算法(Algorithm)3個階段,如圖1-1所示。

圖1-1 知識漏斗
Roger Martin認為,復雜問題的解決總是從謎題階段開始。探索一個神秘的問題,可能會有無限種可能的方式。以我們的交通工具為例,人類一直在孜孜以求地獲取更快更好的交通工具。那么如果說“更好的交通工具”是一個謎題,經過了幾千年的摸索,在工業革命之前,交通工具這個謎題曾經己經被降解成一系列的啟發式的問題。其中的兩個可能是:更好的馬車和更好的帆船。相對于謎題,啟發式問題是將探索的領域縮小到一個更加可控、可管理的大小。當有了這兩個啟發式的問題之后,人們就傾向于不再去考慮“更好的交通工具”這么一個沒邊兒的問題,目標就變成了“如何制作更精致的馬車,讓馬車更輕便、更結實”,“如何制作更大的帆船和有效的風帆,讓帆船載貨量更大,速度更快”。問題的解決聚焦在了產品的升級和演進,這兩個問題又被進一步降解成了一系列的算法化問題。算法化的問題指的是己經有固定的公式、模式來解決的問題。對于馬車和帆船的例子來講,馬車和帆船的制作就是一個算法化的問題,經過訓練的工匠能夠依據固定的流程和工藝,順利地重復制作多個產品。
不過世界并沒有就此止步。到了工業革命之后,伴隨著技術約束的突破,“更好的馬車”和“更好的帆船”,這兩個啟發性的問題己經不再合理。我們需要重新回到“更好的交通工具”這個命題,將其降解成了另外一系列問題,“更好的汽車”、“更好的輪船”、“更好的飛機”……而那些醉心于舊的啟發性和算法性問題的人們或是行業,逐漸被時代所淘汰。我們可以看到,隨著時間的變化、場景的轉換(陸地、海洋,還有天空、太空)、科技的突破,我們要解決的基本謎題可能會降解出不同的啟發式問題。
回到軟件開發這個謎題上來,Gerald M .Weinberg在他的《質量·軟件·管理—系統思路》中寫到“雖然人類的大腦或多或少存在些許的差別,然而都有一定的限制;隨著程序規模的不斷增加,軟件的復雜度也將至少以平方的速度增加。”Weinberg稱其為自然軟件動力學。Weinberg認為“軟件工程學的歷史過程,也就是人類試圖通過建立簡化方法,降低隨著問題規模的擴大而提高的問題復雜度,從而不斷對規模/復雜度動力提出挑戰的歷史過程。如果沒有這種追求,也就不需要軟件工程專業了。”
軟件開發這個謎題,就像其他復雜而又會隨著時間和場景不斷轉移重心的謎題一樣,我們似乎也有無數種的方式來做到一定程度的簡化,在某種程度上或是在某個方面上解決了這個問題。IEEE對軟件工程的定義,“系統化、規則,并且可控”就是對這個謎題在一個維度(可控性)上簡化而得出的一個啟發式問題。
Roger在書中提出了兩種思考問題的方式:分析性思維和啟發性思維。分析性思維的驅動力是標準化,消除個體的判斷所帶來的偏見和差異,而啟發性思維的驅動力是發現和創新。這兩種思路在具體實現上體現出的區別在于,分析性思維傾向于可靠性,而啟發性思維傾向于有效性。
IEEE的這個定義,因為并不直接關注更好地開發軟件本身,明顯帶著可靠性的傾向,對于有效性則顯得缺乏應有的關注。我猜測這應該是1965年到1985年軟件危機的產物。那個時代,計算機行業剛剛擺脫萌芽期,硬件能力大幅提升,人們開始在各種領域嘗試用計算機軟件來解決愈來愈復雜的問題。大型軟件項目紛紛出現,可又紛紛失敗,軟件開發就像怪獸,失去了控制,主要的表現是大幅地超時和超預算,又或是軟件的質量極不靠譜。為了解決這個謎題,可靠性似乎是理所當然的,也是最迫切的切入點。
度量體系給人的直觀感受就是可以提高開發過程和開發結果的可靠性,但可靠和成功,這兩者真的是等價的嗎?度量本身似乎就是一個分析性思維的產物,但這并不妨礙我們回歸問題本身,同時利用分析性和啟發性思維,判斷到底哪些要素跟“成功”更相關,并嘗試用一個度量體系來幫助我們在動蕩的環境中捕捉和把控這些要素。