應用於軟件開發的孫子兵法

已發表: 2022-03-11

如果你在軟件行業工作,你可能聽說過分而之的設計範式,它基本上包括遞歸地將一個問題分成兩個或多個子問題( divide ),直到這些變得簡單到可以直接解決(征服)。

您可能不知道的是,這種範式起源於一種古老的政治策略(該名稱源自拉丁語中的divide et impera ),該策略表明可以通過鼓勵下屬或臣民之間的異議來維持對他們的控制。

這種策略在歷史上被無數的政治家和軍事領導人使用過,例如朱利葉斯·凱撒(他在高盧戰爭期間使用它來擊敗軍事強大的高盧人)和拿破崙(法國砲兵專家會分裂敵軍,因此沒有哪個部分更強大比他自己的部隊,然後破壞他們的通訊,阻礙敵人協調和執行攻擊的努力)。

戰爭的藝術:應用於發展的古老原則

然而,分而治之的規則並不是唯一可以應用於軟件開發的政治策略。 雖然政治和戰爭與軟件開發關係不大,但就像政治家和將軍一樣,開發人員必須領導下屬,協調團隊之間的努力,找到解決問題的最佳策略,並管理資源。

孫子的原則和教義在政治、商業、體育和軟件開發中都有實際應用。

孫子的原則和教義在政治、商業、體育和軟件開發中都有實際應用。
鳴叫

《孫子兵法》是公元前五世紀的古代軍事論著,出自中國古代軍事家孫子之手,其理論對東西方哲學產生了深遠的影響。

儘管年代久遠,但它仍然被列入東亞許多軍事學校的教學大綱,並被西方一些軍事院校列為推薦讀物。 本書分為 13 章,每一章專門討論戰爭的不同方面。

然而,除了戰爭之外,孫子的原則和教義在政治、商業、體育以及軟件開發(信不信由你)中也有實際應用。 事實上,你可能只是在日常生活中應用其中一些原則,甚至不知道它們的起源。

下面詳細介紹,您將找到《孫子兵法》中解釋的基本戰術和技巧的簡要列表。 它們可能適用於您在軟件行業或許多其他行業中的工作。

時間在任何活動中都至關重要

第二章第 2 款

實戰時,若勝利遙遙無期,則人的兵器遲鈍,熱情消退。

這個原則可以應用於軟件開發,作為描述開發週期長度與開發人員士氣之間關係的規則。

如果一組開發人員在同一個項目上工作了幾個月,沒有明確的目標或結束,他們可能會感到沮喪,他們的生產力可能會下降。

軟件開發是一項智力活動,因此動機是生產力的主要燃料。 每天工作而沒有意識到你的工作正在產生真正的結果可能會非常令人沮喪。

正如一些敏捷方法論所指出的,開發路線圖應該分為幾個目標和里程碑,團隊可能能夠在短時間內實現這些目標和里程碑,它們會給他們一種進步和成就感。

第二章第 18 段

那麼,在戰爭中,讓你的偉大目標是勝利,而不是漫長的戰役。

這句話可以用兩種方式解釋:

首先,它可以被視為 UNIX 哲學的先驅:編寫只做一件事並做好的程序。 開發軟件時,必須始終牢記程序的主要目標、程序提供的關鍵功能或解決的最大問題,並確保正確實施。

有時您可能會受到啟發並想到要添加一個非常酷的功能,但不要忘記具有許多不常用功能的應用程序有一個貶義的名稱:膨脹軟件。

其次,該聲明也可以被視為精益軟件開發原則之一的先驅:盡可能快地交付

您越早交付沒有重大缺陷的軟件,您就越早從客戶那裡獲得反饋,並且您將能夠將更改合併到下一次迭代中。

另一方面,如果您交付的軟件無法正常工作,您將錯過寶貴的反饋,因為客戶將沒有機會對其進行正確測試。 在您的下一次迭代取決於客戶反饋的情況下,這將使下一階段的開發更加困難或不可能。

沒有領導,沒有結果

第三章第 11 段

現在將軍是國家的堡壘; 壁壘全,國強; 如果堡壘有缺陷,國家就會軟弱。

這句話描述了經理在開發團隊中的重要性:一個項目的成功取決於所有相關人員的力量,而經理是項目的堡壘。 責任從高層開始。

儘管開發人員經常單獨工作(每個人都坐在電腦後面,與同事的交流有限),但這並不意味著他們不需要良好的領導力。 項目經理負責使團隊保持正常運轉,確保有效的溝通和爭議解決,而領導者顯然會定義項目的優先級(以及其他任務),因此不應低估他們的作用。 如果出現問題,他們也不應承擔責任。 想像一下,如果一個軍事領導人的部隊未能在戰場上履行職責,會發生什麼?

一個團隊即使在開發職位上有幾個壞蘋果,也可以生產出出色的軟件,但如果項目經理是壞蘋果,無論團隊有多少搖滾明星開發人員,這都不太可能發生。

第六章第 28 段

不要重複使你獲得一次勝利的策略,而要讓你的方法受制於無限多變的情況。

有時,在開始一個項目時,很想使用我們在以前成功的項目中使用的相同技術集(相同的編程語言、相同的庫、相同的服務器等)。 但是,除非新項目的要求與以前的要求完全相同,否則這可能是錯誤的方法。

在編程中,就像在大多數領域一樣,靈丹妙藥(一種能夠治愈所有疾病的假設療法)並不存在。 沒有一種單一的技術組合可以用來解決所有問題。 每種技術都有其優點和缺點。

當然,學習一門新的編程語言或使用未知的 API 一開始可能會很昂貴,但從長遠來看,軟件的質量會更好,你會成為更好的開發人員。

第十三章第 27 段

因此,只有開明的君主和明智的將軍才會利用軍隊的最高智慧進行間諜活動,從而取得巨大的成就。 間諜是戰爭中最重要的元素,因為他們取決於軍隊的行動能力。

這句話可以解釋為在維護階段使用監控工具和日誌庫的重要性。

儘管有時客戶可能不這麼認為,但當您獲得穩定且經過全面測試的版本時,開發並沒有結束。 軟件總是在不斷發展,無論是通過修復錯誤、添加新功能還是提高效率。

沒有比讓間諜在生產環境中監視軟件、檢查哪些功能使用最多、最常見的錯誤和最長的操作更能了解要進行哪些更改的信息來源了。

錯誤報告、日誌條目和使用數據是檢測錯誤、識別瓶頸和其他問題的基礎,因為在受控測試環境中並不總是能夠重現相同的條件。

團隊合作和動機

第十章第 24 段

進而不求名,退而不避罪,以保民侍君為目的,人為國寶。

基本上,這就是中國古代版的“團隊中沒有我” 。 與他人合作比追求個人利益更重要。

軟件開發是一項複雜的活動,需要開發人員作為一個團隊有效地工作。 一個好的開發人員不是修復最多的錯誤、實現最多的功能或提前完成任務的人; 優秀的開發人員是幫助團隊實現目標的人。

聲稱自己所做的一切都是功勞,不承認自己的錯誤或將錯誤歸咎於他人,或者稱自己為代碼忍者,可能會愚弄一些沒有經驗的經理,甚至可能會加薪,但你會成為團隊中適得其反的成員。

第七章第 21 段

在你採取行動之前要深思熟慮。

這句話表明了團隊開發會議的重要性,例如敏捷方法提出的那些會議。

在團隊中工作時,重要的是在實施之前討論任何重大變化。 無論您是團隊負責人,還是對該主題最有經驗的人,您都應該始終與團隊的其他成員交談,或者至少通知他們。

請記住,其他開發人員可以讓您深入了解軟件的不熟悉部分。 這意味著他們可以比預期更快地開始實施更改,因為他們可以完全了解所述更改的影響。

第十章第 25 段

視你的士兵為你的孩子,他們會跟隨你進入最深的山谷; 視他們為自己心愛的兒子,他們會站在你身邊直到死。

這句話表明了激勵的重要性,這是管理者和團隊領導有時會忘記的管理原則。 有動力的開發人員會編寫更好的代碼、更快地工作、更少的錯誤並更願意投入額外的時間。

管理者必須通過對下屬真正感興趣、傾聽他們的意見、關心他們的工作與生活平衡、建立積極的工作環境和關心他們的職業道路來產生動力。

此外,您不應將動機與報酬混淆。 最近的研究表明,金錢並不能激勵大多數工人,金錢主要有助於吸引和留住員工,但不能讓他們對工作感到滿意。 因此,加薪和晉升不應被視為激勵工具。

外箱思考

第五章第 7、8 和 9 段

音符不超過五個,但這五個音符的組合產生的旋律比以往任何時候都多。

原色不超過五種,但它們結合起來產生的色調比以往任何時候都多。

基本口味不超過五種,但它們的組合產生的味道比以往任何時候都多。

編程的好處之一是可能性是無窮無盡的。 您基本上可以在任何您想要的地方進行開發(至少,只要不是 NP 完全問題)。

移動應用程序、網站、遊戲、桌面應用程序……如果您了解編程,所有這些都觸手可及。

第三章第 1 款

在實際的兵法中,最好的辦法是把敵人的國家完整而完整; 粉碎和摧毀它並不是那麼好。 所以,俘虜整支軍隊也比摧毀它好,俘獲一個團、一個支隊或一個連,總比摧毀它們好。

在處理具有大型代碼庫的項目時,通常會發現使用不良做法或使用已棄用的庫實現的模塊或代碼部分。 儘管擦除(或銷毀)此代碼可能很誘人,但出於以下幾個原因,它可能不是最好的主意:

  • 遺留代碼不一定是壞的,有時它是在考慮其他方法和技術時編寫的好代碼。 但是,僅僅因為它是舊的並不意味著它不起作用。

  • 您可能會浪費時間修復仍然有效的代碼,而不是專注於修復其他更關鍵的代碼部分。

  • 除非您真的確定自己在做什麼,否則替換一段有效的代碼意味著您有引入新錯誤或錯誤的風險。

這並不意味著“如果它沒有壞,就不要修復它”這句話是一個好策略,而是每個項目都有優先級、目標和時間限制。 因此,如果您發現可以改進的代碼,請與團隊其他成員或項目經理討論,以確定何時進行優化。

第八章第 3 段

有路不可走,軍隊不可攻,城不可圍,陣地不可爭,君命不可聽。

即使它沒有直接說出來,我們也可以將此原則解釋為避免反模式的警告。

儘管使用反模式可能會解決短期問題,但您應該記住,從長遠來看,它會適得其反。 因此,無論您節省了多少時間,修復了多少錯誤或對您來說有多方便,都不要使用它們。

儘管如此,有時您可能會想使用反模式來解決緊急任務,向自己保證當您有更多時間時會實施適當的修復,但請記住墨菲定律之一:所有快速修復都會成為永久性更改。

結論

雖然開發軟件不同於指揮士兵打仗或領導一個國家,但他們必須解決的問題需要團隊合作、良好的領導能力、效率和長期的解決方案。

然而,《孫子兵法》並不是唯一一本包含可應用於軟件開發的原則的書。 尼科洛·馬基雅維利的《王子》就是一個例子。

事實上,這裡列出了仍然相關的馬基雅維利的名言。 嘗試猜測軟件開發領域的相應​​原則。

  1. 獅子不能保護自己免受陷阱,狐狸不能保護自己免受狼的傷害。 因此,一個人必須是識別陷阱的狐狸,以及嚇唬狼的獅子。
  2. 永遠不要試圖用武力來贏得欺騙可以贏得的東西。
  3. 從來沒有任何偉大的成就沒有危險。
  4. 渴望不斷成功的人必須與時俱進地改變自己的行為。
  5. 一般來說,男人更多地從外表而不是現實來判斷。 人皆有眼,唯獨少有洞察力。
  6. 想要被服從的人必須知道如何指揮。
  7. 智慧包括知道如何區分麻煩的性質,以及選擇較小的邪惡。
  8. 沒有避免戰爭; 它只能推遲到你的敵人的優勢。
  9. 大自然造就了少數勇敢的人; 工業和培訓使許多。
相關: DevOps 到底是什麼?