軟體開發與交通阻塞的相似之處

2021-04-19 21:46:04 字數 2676 閱讀 3099

ken delong

解釋了他認為軟體開發「超級困難」的原因:

每個人都知道編寫軟體很難,但是我想**一下為什麼軟體開發這麼難。

軟體開發受本身四個特性之困,而這些特性也將其推到了

「複雜的自適應系統」

之境地,並且更將其逼入

混亂之困局(至少足夠接近)。這些特性是:

在高峰期時,公路上車流密集,也許大家的行駛速度都還不慢。突然,某個人想看看車外的風景,將時速降至30英里,而且只維持了幾秒鐘。這會帶來什麼後果?交通大堵塞。曾經經歷過堵得一輛接一輛的路況吧,卻沒想到突然可以時速70英里前進?之前的狀況,是因為出現了變化——有人想遊車河,非線性因素摻雜在一起,造成堵車。很多類似複雜系統都是可以自我維繫的,交通堵塞正是其中一例。最後還是暢通了,但是其恢復速度卻遠低於任何人的直覺。
乙個人減速——這並非偶然事件——卻造成全線大塞車!問題的關鍵在**?軟體既難而又危險,最微小的事情也有可能導致全盤皆輸。難道就這樣束手就擒麼?

要想在流量有限的高速公路上避免嚴重塞車,就得讓大家都把尾燈開啟,這樣可以讓整個交通系統的利用率保持在安全的水平,一些正常的變化也就不會被無限放大、造成問題。我們在處理生產系統伺服器的cpu佔用率問題時,採用了同樣的方式。我們會讓cpu的佔用率不超過30%,這樣就可以防止峰值流量對伺服器造成過大衝擊。
因此,系統中必須提供反饋機制,使得它可以應對變化,不至於因此而崩潰:

在敏捷中,可以調整乙個sprint接受的故事點數,以使sprint中的所有任務都能在sprint之內抵達

「完成」狀態

。這就是「尾燈效應」。

一文中提出的十項原則,可以視作敏捷軟體開發的調整和「尾燈」:

定義「完成」條件使用時間盒管理工作不要為任務估算新增鬆懈時間推遲決策減少週期時間讓處理管道短小而狹窄保持紀律減少任務切換防止長時間連續加班分離「嚴重程度」和「緊急程度」
jurgen詳細闡述了這十條原則,並提供了各自深入閱讀的參考資料。軟體開發之難,很大程度上因為其過程類似於複雜的自適應系統。敏捷,如果可以正確實施,將會提供穩定的反饋。

檢視英文原文:

若想使用擁塞作為比喻,我建議先定義其真正含義。擁塞等同於瓶頸。團隊構成上的問題,可能會造成有些人在忙著解決難題的時候,其他人卻處於空閒狀態。如果有這些情況發生,你應該考慮一下因素:

1) 團隊中人員的職責是不是劃分得太明確了?如果有瓶頸產生,是不是因為在跨職能方面做得不夠?趕緊多做點培訓,多進行知識分享吧。

2) 有多少任務需要其他任務作為前置條件?如果因為前置任務沒有完成,導致有些人的工作限於停滯,是否有其他的任務可供這些人上手開始工作?對於團隊和專案來說,功能特性切分成任務的方式合理麼?是不是可以用另外的方式進行劃分、組織開發?

3) 簡單之極……為任務的開發準備足夠的時間了麼?現實一點,如果總是發現瓶頸(擁塞),也許是因為過於低估了某些型別的任務的完成時間,或者在做規劃時沒有考慮到不同的開發速度(要注意,「速度慢」的開發者之所以慢,可能是因為他們對**質量的要求比較高,所以要全面考慮問題)

最後一點,也是我最想在infoq上反覆強調的……

4) 團隊的工作時間是不是太長了?有人陷入停滯,是不是因為他們覺得自己應該每週工作70個小時?相反地,總是成為瓶頸的程式設計師,是不是也是把所有時間都投入工作的那位?倘若果真如此,這個人就像乙個正在形成的火藥桶。如果它現在還沒有爆發,將來一定會(強制對他的**進行複查絕對不可取!)。

作者amr elssamadisy引用了flemming funch的部落格

,對於complex和complicated之間的不同進行了分析:

我們每天都會用「complicated」和「complex」,不相區分。要討論複雜性(complexity)就變得困難了,比如說**自然界中的複雜性。

可以說我們需要複雜性的科學定義,可是科學卻給出了至少32種不同的詮釋,每種都不一樣。要是我們能擺脫迷惑的困擾,就可以發現下面這種可行的說法:

構成上的複雜性(complicated),是指某項事物包含了很多錯綜關聯在一起的組成部分,很難搞清楚各個部分之間的關係。即使能搞清楚,也不能保證這些部分是以合理的方式組合在一起的。

系統上的複雜性(complex),是指某項事物作為乙個系統出現,它所展示的系統屬性並不明顯。這與一些部分的簡單疊加之和有所不同,更難以理解。構成的部分不一定很多,但是組合在一起之後的結果卻難以搞得很明白,在某些方面以乙個整體的方式呈現。

一架空客380具有構成上的複雜性(complicated)。一條水母具有系統上的複雜性(complex)。巴黎地鐵網路具備構成上的複雜性(complicated),人們使用它的方式具有系統上的複雜性(complex)。你的骨骼框架具備構成上的複雜性(complicated),作為人的你具有系統上的複雜性(complex)。一棟建築物是具有構成上的複雜性(complicated),而乙個城市具有系統上的複雜性(complex)。

中國政策與吃火鍋的相似之處

吃火鍋和中國政策?乙個是定語從句乙個是復合名詞,它們之間到底存在什麼相似之處呢?其實這個問題如果放在前幾天的話,我想破頭也想不明白的。但是昨天的我卻把這兩個詞看似不相關的詞靈光一閃的奇蹟般的給關聯起來了。故事一 吃火鍋 昨天我去朋友家聚會,由於天冷,晚上就在朋友家吃火鍋。火鍋沸騰,大家的肚子都餓了,...

網頁設計與西方建築的發展歷程有何相似之處

歷史總是驚人的相似。西方建築和網頁設計同為工程與藝術的綜合體,兩者的發展歷程如此之相似,和以下四個因素有著不可分割的關係 都為使用者提供了乙個場所 都借助工程學構來構建他們 科技的進步是他們的發展瓶頸 儘管如此,它們仍然是藝術的一種展現形式 程式設計客棧 在這些設定之下,你可以清晰地看到建築和網頁設...

軟體開發與UML的關係

今天,我們上 統一建模語言uml 課上老師給我們講解了軟體開發與uml之間的關係 uml常用於建立軟體系統的模型,適用於系統開發的不同階段。uml的應用貫穿於系統開發的不同階段。1.需 求分析。可以使用用例來捕獲使用者的需求。用例圖從使用者的角度來描述系統的功能。通過用例建模,描述對系統感興趣的外部...