軟體開發中的11個系統思維定律

發表於2010-12-16

“我會更加努力地工作”——一匹名叫Boxer的馬(出自喬治·奧威爾的《動物農莊》)

彼得·聖吉在其著作《第五項修煉》中提到的系統思維定律同樣適用於軟體開發。

1. 今日的問題源於昨日的解決方案(Today’s problems come from yesterday’s solutions)

當解決問題時,我們會感到很高興。我們經常不考慮後果。令人感到意外的是,我們提出的解決方案可能會產生反作用,並帶來新問題。

  • 作為對取得巨大成功的團隊的獎勵,公司決定為團隊中的少數骨幹成員發放獎金並晉升職位。團隊中的其他成員會感到不公平,並且會喪失積極性。最終使團隊成員之間的關係更加緊張,後續專案也就很難再取得成功。
  • 專案經理頻繁要求開發者修復一個新的軟體Bug,或者處理客戶的緊急需求,而開發者盡力滿足這些要求。但是,過於頻繁地分散精力會妨礙他們完成迭代過程中的主要任務。因此,專案進展很慢。

2. 用力越大,系統的反作用力也越大(The harder you push, the harder the system pushes back)

當事情的進展結果並非如我們所願時,我們會固執地堅持自己的方法。我們沒有時間來停下來思維並尋找更好的替代方案,而是“義無反顧”地向前衝。有時候雖然解決了問題,但往往又發現深陷於其他問題之中。

  • 當一個系統遠未完成時,經理通常會不斷催促員工加班加點地工作,並且要求按時完成。系統bug數量的持續增加及整體質量的急劇下降,導致更多的延誤。因此,需要做更多的工作來部署軟體系統。
  • 為了滿足新系統的要求,開發者勇敢的對原有的系統架構進行擴充套件,但死板陳舊的方法已經不能滿足這些新需求。他們忙於做這件事,以至於沒有時間停下來仔細分析並且改變方法,從而導致系統質量下降。

3. 福兮禍之所伏(Behavior grows better before it grows worse)

短期的解決方案,會給我們帶來短暫的休息和狀況的暫時改善,但是不會從根本上解決問題。這些問題終究會使情況變得更糟。

  • 公司為顧客提供豐厚的優惠並投入巨資宣傳,讓很多人購買軟體 。但是,顧客購買之後很不滿意,因為軟體無法使用也不可靠。
  • 如果開發小組能夠按時完成系統開發,管理層承諾,如果開發團隊能夠按時完成系統開發,公司會提供鉅額的獎金。一個團隊開始努力的工作,但很快他們就意識到這是不可能實現的。於是開發者變得悲觀並喪失動力。

4. 最容易出去的方法往往會導致返回來(The easy way out usually leads back in)

在生活中學到的一些解決方案能夠幫助我們輕易地並且更早的地獲得成功。我們總是試圖把它們強加到任何情形上,而忽略了特殊的背景以及相關人員。

  • 開發者還沒有準備好接受結對程式設計或者測試驅動開發這樣的實踐時,敏捷教練強行實現完全的極限程式設計。這會給任何敏捷方法帶來壓力、衝突以及負面影響。
  • 開發者把設計模式應用到任何地方,這是徒勞的,而且這會讓系統變得複雜。

5. 治療帶來的結果可能會比疾病導致後果更嚴重(The cure can be worse than the disease)

有些熟知的方法可能會更危險,比如在程式設計的時候喝啤酒,來減輕不切實際的任務期限帶來的壓力。

  • 由於不信任全職開發者,一家公司僱傭了大量的承包商來開發核心功能。結果,系統不具有概念完整性,自己公司的開發者看不懂,並且無法做出修改。所以,公司員工也不瞭解相關領域的知識、解釋以及概念。
  • 開發者會走捷徑,拷貝相似功能的程式碼來趕進度,並且爭取儘快發行第一個版本。他們一開始進展迅速,但是程式碼最終會變成大泥球(比喻系統結構不清晰)。

6. 欲速則不達(Faster is slower)

當我們看到成功的曙光,我們會全力以赴,不再小心謹慎。然而,最優增長速率通常會比可能的最快增長速率要慢得多。

  • 經理們往往為已經成功的專案增加很多人手,但總體進展就會變慢,因為交流所用的花費增加,以及團隊成員之間失去默契。
  • 在沒有對程式碼進行合理重構及改善的情況下,開發者快速的為系統新增新的功能,會使系統變得難懂,而且難以修改。

7. 在時間和空間上,因果並不密切相關(Cause and effect are not closely related in time and space)

我們善於為出現的困難尋找原因,即使這些原因很牽強,並且遠非是真正的根本原因。

  • 為了按時完成系統,開發團隊不再接受來自客戶的需求改變。因此,客戶對發行的軟體不滿意。
  • 實時系統歷經坎坷之後,管理層迫使開發者同意,並且在給系統做出任何修改之前撰寫詳細的技術說明。結果開發者失去了為系統做出任何改進的動力,並且開始拖延。

8. 微小的改變可以產生明顯的效果,但這種槓桿效應最大的地方往往也最不明顯(Small changes can produce big results-but the areas of highest leverage are often the least obvious)

像改變公司政策、願景或者廣告用語這樣顯而易見並且關係重大的解決方案往往不起作用。相反,小而普通,但持續的改變卻會帶來大不相同的效果。

  • 開發者每天都與客戶進行交流,並且做出大部分決定。因此,能夠更好地理解客戶的需求、做出更好的決定並且給出最優的解決方案。
  • 開發者為系統的每項功能設計自動化單元測試。因此,設計更靈活、人們更自信、系統在每此修改之後都能得到完全的測試。

9. 魚與熊掌可以兼得,但不是同時兼得(You can have your cake and eat it too – but not at once)

我們經常會面對刻板的“非此即彼”選擇。如果我們改變一下自己的觀點及系統規則,這些選擇有時並不會使我們進退兩難。

  • 經驗豐富的專案經理知道增加系統特性的數量與削減時間和開支不可兼得。然而,如果我們完善一下想法、尋找合適的人才並且避免過度開發,這也是可能做到的。
  • 開發者認為他們應該要麼採用事務指令碼,要麼採用域模型體系架構模式。然而,複合域中的高效能解決方案可以將兩者結合,以得到最佳效能。

10. 把一頭大象分兩半不會得到兩頭大象(Dividing an elephant in half does not produce two small elephants)

無法整體瞭解系統,往往會做出次優決定。

  • 專案經理往往通過生成的程式碼量和迭代過程中實現的功能數來評估開發者。而開發者往往會生成大量無用程式碼。
  • 管理層承諾,每發現一處系統bug,測試者將得到5美元。測試者對跟開發者合作不再感興趣,並且不再試圖消除產生bug的根本因素。團隊之間良好而且高效的關係不復存在。

11. 無可非議(There is no blame)

我們喜歡歸咎於客觀條件,或對別人指指點點,甚至對此深信不疑。但是,我們自己以及問題的原因都是系統的一部分。

  • 今天早上團隊沒有釋出系統完全是喬的過錯。即使專案經理親切地為其提供了免費的啤酒、T恤以及披薩,他也沒能在一晚上的時間內修復所有的缺陷。
  • 人們不會使用一個公司優秀的Web 2.0社會化應用,使用者喜歡簡單實用的東西,並且不會感激你辛勤工作的成果。

然後呢?

以上11條系統思維定律表明,我們提出的所有解決方案都會產生一定的後果,有時非常嚴重並出乎意料。我們周圍的系統本就那樣,我們不應苛責它們,而是要從中學習。要掌握系統思維方式並控制這些系統,我們需要做到如下幾點:

  • 1. 要明白我們是在跟什麼樣的系統打交道,是人或是軟體;
  • 2. 有意識地學習相互關係、因果鏈;
  • 3. 把系統看做一個整體,並且視其為其他系統的一部分。

系統思維方面有很多挑戰,通過獲取並且利用有關係統工作方式的知識,我們可以戰勝其中的很多挑戰。但是,大部分嚴峻挑戰是我們人類與之相沖突的本性。我們的激情、感情以及本能可以輕易改變我們理智、條理分明的思維方式。掌握系統思維方式的第一步就是要學習如何跟自己合作。

後話

在軟體開發過程中,你有(或缺乏)哪些系統思維的使用經驗?

編者注:原文作者Andriy Solovey從事軟體開發已有15年,做過開發人員、軟體經理和系統架構師。關注構建優質、可靠和可用的軟體。《如何使用搜尋技巧來成為一名高效的程式設計師》就是他所寫。

 

原文作者:Andriy Solovey   編譯:伯樂翻譯組 – 朱勇

相關文章