軟件工程思惟到底有多重要

最近聽音頻學習,聽到一篇有關軟件工程思惟的文章,挺想分享給你們,以做討論。
下文轉載自 「獲得 APP」 萬維鋼精英日課第三季:《計算機思惟 4:工程的複雜》。程序員

這一講咱們要說一個特別厲害的技能,叫作「軟件工程」。以我之見,軟件工程,能夠說是工程管理和綜合治理手段的極限。我但願你能從這一講體會一下如何治理最複雜的系統。編程

可能你是一個產品經理,主導開發過一款APP。可能你是個企業家,管理一個幾萬人的大工廠。可能你是個土木工程師,設計過一座跨海大橋。你很是厲害,我們中國有不少這樣的厲害人物。中國是手機 APP 開發大國,中國有不少超大型企業,中國有全世界最長的跨海大橋 ——但是爲何中國就沒有屬於本身的計算機操做系統呢?爲啥國產芯片不行呢?安全

由於那些事兒,跟現代軟件工程相比,還只能算是簡單的事兒。服務器

程序員、CEO、計算機科學家,若是是拍一個超級英雄電影的話,這些人均可以是前臺的英雄人物。可是躲在幕後操縱世界的,則將是一位、或者幾位,軟件工程大師。有句話叫「在計算機科學裏,軟件工程這一部分,對計算機科學家來講太難了。」數據結構

不瞭解軟件工程,你就不知道什麼叫「大」,什麼叫「複雜」。編程語言

1.小和大

編程是個很是適合自學成才的項目。不少人不是科班出身,自學編程技術,也容易找到一個程序員的職位,甚至還能夠本身開發一個小軟件。ide

但僅限於軟件。好比你能夠本身寫一個電子郵件客戶端程序,或者寫一個視頻編輯工具。但是若是要開發一個超大型軟件,其中涉及到的學問,可就不是自學所能達到的了,那是須要在重大項目的實踐中去領悟和提升的。自學也許可讓你成爲一個優秀的俠客,而偉大的將帥,則只能用千萬士兵的鮮血鑄就。函數

這裏面的關鍵是一個尺度問題。大,是不同的 [1]。工具

計算機剛剛出來的時候,程序員都是身上有修士氣質的手藝人。編程者常常是孤獨的,能說天書同樣的語言,想法高深莫測,寫出來的代碼彷彿有一種暴力美學,他們的眼睛跟顯示器一塊兒在黑暗中閃閃發光。編程,是一項神祕的技能。學習

那時候的程序都是徹底自由的 —— 計算機很貴,而程序不要錢。程序員們就好像十九世紀的藝術家同樣,偶爾弄個俱樂部或者小做坊,彼此欣賞。

不過這個藝術時代並無持續多長時間,程序員們很快就陷入了極度的悲觀情緒之中。由於……錯誤。

寫代碼太容易出錯了!代碼越寫越長,出錯的頻率不成比例地增長。可能你今天費了很大力氣好不容易運行經過了,過了幾天、遇到一個沒想到的狀況,發現還有一個隱藏的錯誤。有個程序員甚至說,他意識到,也許他的餘生,都要在糾正本身的錯誤中度過……

程序員們終於明白,他們須要工程師思惟。

咱們以前講了一些計算機科學的思惟,而工程師思惟和科學家思惟至少有三個重大區別。

第一,科學家是尋找事物的規律,而工程師是去設計一個東西。科學家只要以爲這個規律有意思就能夠發表,而工程師得負責任。他得確保這個東西不但要有用,並且還得安全不出事,還得考慮成本,講究可行性,讓人用得上還用得起才行。

第二是對知識的態度。科學家面對知識,是把本身當成一個沒有利益攸關的旁觀者,感受看懂了、能總結出規律就行。而工程師,則是參與者。他不能僅僅「懂」這個知識,他是要拿來用的。

第三是對模型的使用。科學家喜歡簡化的模型,能抓住實質就行 —— 愛因斯坦有句名言說「什麼東西都要越簡單越好,要簡單到不能再簡單爲止」。而工程師必須考慮全部的細節,「魔鬼在細節中」是工程師的座右銘。

要把寫程序上升到工程的高度,跟之前那種興趣愛好式的編程可就徹底不一樣了。更進一步,軟件工程和傳統的工程也不同。

好比你要修個橋,工程過程當中哪裏犯個小錯誤,一般也就是小錯誤 —— 最多也就是讓大橋的質量降級。這座大橋總共有15個橋墩,其中第五個橋墩有個地方沒建好,這座橋大體上還能用。但軟件就不同了,程序中的一個小錯誤極可能就會致使整個系統的崩潰。

這是爲啥呢?由於軟件不但各處的關聯很是密集,並且是個「活」的東西。好比發射火箭,軟件是要控制火箭作動做的!哪一個動做不對,火箭當即失控。

因此軟件不可是個工程,並且比傳統工程可貴多。那怎麼應對這種複雜呢?

2.小思惟

早期的軟件開發者想出了不少工程化的辦法,起到了必定的效果。好比之前都是用匯編語言,後來發明了高級編程語言,程序員就不容易出錯……固然,這時候也不須要程序員個個都有修士的氣質了。

最重要的一個方法,是把經常使用、好用的代碼封裝起來,重複使用。若是這段代碼老是被用到,已經被你們測試過不少次了,證實沒有毛病,那就不要再改來改去搞定製了,咱們應該把它封裝成一個「庫函數」。庫函數具備標準化的輸入和輸出,程序員下次再用的時候只須要照顧好輸入輸出,而沒必要關心函數內部是什麼情形 —— 這就能大大下降出錯的機率和提升編程的效率。

封裝這個思想能夠用在軟件的各個方面。數據結構、面向對象的編程、文件系統,這些都是封裝和分層。這一層的編程不用考慮底下一層的邏輯。

操做系統的內核也是一個相似的智慧。操做系統把最經常使用的操做計算機的動做,都事先在內核中預備好,而內核通過千錘百煉,不容易出錯。等到別人寫應用軟件的時候,用到相關的動做,就只要調用內核就行,而沒必要本身直接操做計算機。這就至關於把專業的事兒交給專業的人,也就不那麼容易出錯了。

全部這些思想都要求對軟件開發有個宏觀的設計,而不僅是吭哧吭哧寫代碼。而後你還得考慮多我的一塊兒開發一個軟件的情形,好比最起碼得有個版本控制之類。

到這一步,軟件業纔算正式成了一個行業。在上世紀五十年代,就已經有公司專門開發軟件賣錢。

……惋惜這些還遠遠不夠。

軟件業從一開始就不是一個作事漂亮的行業。項目老是再延期。好不容易交付了,軟件賣出去以後又老是被人發現各類毛病和錯誤。客戶不滿意,但是若是真要搞什麼售後服務,到現場去給人解決問題,那幾乎就是不可完成的任務……並且還有黑客攻擊、還有計算機病毒!

我很早之前聽過一個笑話,說一個軟件工程師嘲笑一個汽車工程師,說「若是汽車行業像計算機行業同樣發展,如今汽車應該一毛錢一輛。」可是汽車工程師不覺得然,說「但是誰會要一輛動不動就拋錨的汽車呢?」

而早期的軟件公司,對此只有兩個不是辦法的辦法。一個辦法是儘可能去找那些經驗豐富、頭腦聰明的高水平程序員……一個辦法是銷售軟件的時候乾脆附帶一個免責聲明:若是由於這個軟件的毛病給您形成了損失,咱們概不負責。

社會對計算機的美好幻想被打破了,軟件行業陷入了危機。

3.大思惟

軟件工程的問題不是你每一年能培養多少高水平程序員的問題,而是複雜性問題。

小軟件和大軟件的根本區別在於尺度。之前一個小軟件只有幾千行代碼,如今一個大軟件要有幾百萬行代碼。之前的軟件是給一我的用,如今是多個用戶共同使用一個軟件。更重要的一點是,之前的軟件是一我的或者幾我的開發的,如今則是大型團隊一塊兒開發。

計算機思想家弗瑞德里克·布魯克斯(Fred Brooks),曾經在上世紀六十年代末率領IBM公司300人的團隊開發操做系統。他作完這件事以後頗有感觸,爲此專門寫了一本書,叫《人月神話》[2]。

布魯克斯提出兩個感慨。

第一個感慨是,1我的幹12個月的活,絕對不是12我的在1個月內能幹完的。項目用的程序員越多,平均每一個人出活的速度就越慢。因此你規劃項目的時候不要算什麼「人月」。

第二個感慨是,你這個團隊作出來的軟件的結構,每每和你這個團隊的人員組織管理結構高度類似。因此軟件工程不但要管項目,還要管人。

布魯克斯這本書出來,人們才充分認識到軟件工程的難度。現代軟件工程要求,軟件產品必須達到下面這五個目標,稱之爲「DRUSS」 ——

  • Dependable,可信賴,讓顧客真能期望上你這個軟件;
  • Reliable,得可靠,不能總出毛病;
  • Usable,軟件是給人用的,得讓人可以上手;
  • Safe,用的時候不能出安全事故;
  • Secure,它得不容易被黑客攻擊才行。

現代主流操做系統,包括 Windows, Mac 和 Linux,各自都有接近一億行代碼,並且大體實現了這五個方面的要求。而即使是這三個能夠說是最成熟的軟件系統,其中仍然還有大量的毛病。

那怎麼才能得到這種大型軟件工程的能力呢?咱們前面說的辦法都仍是小軟件思惟,剩下的,就只有一些經驗之談,而沒有什麼特別系統的行動指南了。

好比說,在系統安全方面,軟件開發的首要原則是默認不給用戶受權。若是非要受權用戶接觸一個什麼東西,就必須得有顯性的受權;每一個程序進程只能擁有最有限的受權,等等。軟件工程就是由這些原則、工做中遇到的規律、前輩傳下來的經驗組成的。

技術進步能解決必定的問題,好比更多的分層封裝,搞虛擬機,客戶端和服務器,高級編程語言,交互式開發環境,可視化的控制和數據流,更好的操做系統等等……可是技術解決不了全部的問題。

1987 年的時候,布魯克斯寫了一篇文章叫《沒有銀彈》[3],又提出一個洞見:軟件工程的根本問題,是人的問題。主導軟件開發的這我的,必須得可以理解高度複雜的東西才行。

寫程序是永遠在更新的技術,軟件分爲不少層,會出現各類毛病,你得確保產品知足 DRUSS 五方面的要求,你得操不少的心……你得能駕馭複雜。

像這樣的人才,都是絕對的帥才。這就比如帶兵打仗,你不用說指揮十萬人打仗,你能把十萬人安全帶到戰場,不譁變、不鬧事、都能吃飽飯就不錯了。

布魯克斯有句名言是這麼說的 ——

「好的判斷來自經驗,而經驗來自壞的判斷。」(Good judgement comes from experience, and experience comes from bad judgement.)

正所謂一將功成萬骨枯,駕馭大型軟件工程的能力,只能經過大型軟件工程培養出來。

咱們前面講《生命視角》的時候說過,有些創新能力難複製 —— 由於它是長出來的。咱們中國有不少軟件開發者,可是咱們缺乏操做系統這種級別的大型軟件開發積累。咱們有幾代程序員試煉出來的庫函數嗎?咱們有 Windows 3.1,Windows 95 的種子嗎?咱們有前輩開發者總結出來的原則、規律和教訓嗎?咱們有本身的標準和規範嗎?軟件天天都在更新,但軟件工程的背後,是一棵經年累月長出來的大樹。

咱們這一講正好遇上最近美國要封鎖華爲公司,而華爲正在搞本身的手機操做系統。在軟件工程上另起爐竈是一個幾乎不可想象的任務,可是若是真有那樣的機會,那就是如今。

我們倒要讓美國人看看,中國公司有沒有駕馭複雜的能力。

註釋:

[1] 精英日課第一季,《一個大尺度的話題》。
[2] Frederick Phillips "Fred" Brooks, Jr,1999 年圖靈獎得主。《人月神話》(The Mythical Man-Month: Essays on Software Engineering,1975)是軟件工程的名著。
[3] Frederick Brooks, No Silver Bullet – Essence and Accident in Software Engineering, 1987.
相關文章
相關標籤/搜索