溫故知新,跟著七牛雲CEO許式偉學架構,大廈地基之馮·諾依曼計算機體系
怎樣成長為優秀的軟體架構師?
讓我們來想象一下,如果把資訊世界看成一座大廈,把程式設計師看成這個世界的建築師,那麼,現在的你在負責什麼樣的工作呢?
當把程式設計師類比成建築師時,按照能力水平來分,我覺得大體可以分為三個層次:
- 搬磚師
- 工程師
- 架構師
軟體搬磚師之名對應到建築行業的建築工人,他們的程式設計能力和業務基本上停留在堆疊程式碼,按照要求去實現功能需求的層面。只要能讓程式跑起來,能正確地實現業務邏輯,就可以稱為“會程式設計”的人。有時候,我們也會看見程式設計師自稱為“碼農”、“搬磚的”,雖然二者的工種不同,但從基礎工作的相似度來說,確實有可類比的成分。
程式碼質量的評判可以有這樣一些基本維度:
- 可閱讀性(方便程式碼流轉)
- 可擴充套件性 / 可維護性(方便修改功能,新增新功能)
- 可測試性(質量管理)、可複用性(簡化後續功能開發的難度)
一些有追求的程式設計師會關注程式碼的質量。這一類致力於不斷提升軟體程式碼的工程質量的程式設計師,我們可以稱他們為軟體工程師。工程師不會簡單把寫程式碼看作一門工作,把任務交代過去就完事。他們會有“潔癖”,程式碼在他們眼裡是一種藝術,是自己生命的一部分。他們會把寫出來的程式碼改了又改,直到讓自己滿意為止。閱讀和維護軟體工程師寫的程式碼會有一種賞心悅目的感覺。
大部分商業軟體都是一項極其複雜的工程,它們遠比很多傳統的建築工程複雜得多,無論是涉及的人力、時間還是業務的變數都要多很多。人力上
但軟體卻不是這樣,它從誕生之初到其生命週期結束,自始至終都在迭代變化,從未停止。
所以,光靠把控軟體工程師的水平,依賴他們自覺保障的工程質量,是遠遠不夠的。軟體工程是一項非常複雜的系統工程,它需要依賴一個能夠掌控整個工程全域性的團隊,來規劃和引導整個系統的演變過程。這個團隊就是架構師
從根本目標來說,軟體架構師要對軟體工程的執行結果負責,這包括:
- 按時按質進行軟體的迭代和釋出
- 敏捷地響應需求變更
- 防範軟體質量風險(避免發生軟體質量事故)
- 降低迭代維護成本
那怎麼才能成長為優秀的軟體架構師?軟體架構師和軟體工程師最根本的差別又在哪裡?
關鍵在於四個字:掌控全域性。
掌控全域性,就是對系統的全貌瞭然於胸。從傳統的建築工程來說,建築架構師並不單單要會畫建築圖紙,而是要對地基構建、土質、材料、建築工藝等等所有有可能影響建築質量的因素都要了然於胸。
掌控全域性,並不是無所不能,不是成為全棧。怎麼做到掌控全域性?核心在於對知識脈絡的體系化梳理。這是架構能力構建和全面提升的關鍵。這種方法不單單是在軟體工程中適用。
與架構相關的圖書,大概有如下這些分類:
-
架構思維類。這類圖書通常從一些著名的架構理論講起,比如開閉原則、單一職責原則、依賴倒置原則、介面分離原則,等等。這種圖書的問題在於過度理論化。電腦科學歸根到底屬於工程技術類,實踐第一。
-
設計模式類。這一類圖書則一下子進入架構的區域性細節,每個模式的來龍去脈並不容易理解。就算理解了某個具體的模式,但是也很難真正做到活學活用,不知道還是不知道。
-
分散式系統架構設計類。這類圖書通常從服務端的通用問題如一致性、高可用、高併發挑戰等話題講起,講大型業務系統面臨的挑戰。這些知識是非常有價值的,但無法延伸到通用業務架構,對大部分企業的架構實踐並不具備真正的指導意義。
-
重構類。這類圖書主要講怎麼把壞程式碼一步步改進到好程式碼。我認為這是最實用的一類。但在沒有優秀架構師主導的情況下,大部分公司的程式碼不可避免地越變越壞,直到不堪重負最後不得不重寫。實際上,一個模組最初的地基是最重要的,基本決定了這座大廈能夠撐多久,而重構更多側重於大廈建成之後,在服務於人的前提下怎麼去修修補補,延長生命。
那麼,應該怎樣成長為優秀的軟體架構師?一靠匠心,二靠悟心
應用程式的基礎架構
無論是什麼樣的智慧電子裝置,手機也好,汽車也罷,它們都可以稱為“電腦”。所有的電腦都可以統一看作由“中央處理器 + 儲存 + 一系列的輸入輸出裝置”構成。
中央處理器,也就是我們平常說的CPU,負責按指令執行命令;儲存負責儲存資料,包括我們要執行的命令,也是以資料形式儲存在儲存中的。每次在開啟電腦的電源後,中央處理器都會從儲存的某個固定位置處開始讀入資料(也就是指令),並且按指令執行命令,執行完一條指令就會繼續執行下一條指令。電腦就這樣開始工作了。
為何電腦能夠完成這麼多複雜而多樣化的工作?
可程式設計性。大體來說,中央處理器(CPU)的指令分為如下這幾類:
- 計算類,也就是支援我們大家都熟知的各類數學運算,如加減乘除、sin/cos等等。
- I/O類,(從儲存讀寫資料)從輸入輸出裝置讀資料、寫資料。
- 指令跳轉類,在滿足特定條件下跳轉到新的當前程式執行位置。
雖然,CPU指令是一個很有限的指令集,但是CPU執行的指令序列(或者叫“程式”)並不是固定的,而是依賴儲存在儲存中的資料—— 由軟體工程師(或者叫“程式設計師”)編寫的軟體來決定。指令序列的可能性是無窮的,這也就意味著電腦能夠做的事情的可能性也是無窮的。
開放設計的外部裝置支援。雖然我們電腦可以連線非常非常多種類的外部裝置,比如鍵盤、印表機、螢幕、汽車馬達等等,但CPU並不理解這些裝置具體有什麼樣的能力,它只和這些裝置交換資料。它能夠做的是從某個編號的裝置(通常這個裝置編號被稱為“埠”)讀入一段資料,或者向裝置的埠寫入一段資料。例如,當你在鍵盤上按下了A的時候,CPU可以從鍵盤連線的埠讀到一段資料,通過這段資料來表達你按了“A”,可能CPU會向印表機連線的埠傳送一段資料,來驅動印表機列印特定的文字;還有可能CPU會向汽車馬達所在的埠傳送資料,來驅動馬達轉動,從而讓汽車按照預期來行駛。值得注意的是,CPU知道的是如何和這些裝置交換資料,但是並不理解資料代表什麼含義。 這些外部裝置的廠商在提供裝置硬體的同時,往往也需要提供和硬體匹配的軟體,來完成和CPU的協作,讓軟體工程師可以輕鬆使用這些裝置。
電腦的CPU是一個非常簡潔的模型,它只讀入和寫出資料,對資料進行計算。這也是為什麼我們往往把電腦也叫作“計算機”,這是因為 CPU這個計算機的大腦的確只會做“計算”。這個基礎的設計體系,我們很多人都知道,這就是馮·諾依曼計算機體系。1945年6 月,馮·諾依曼以“關於EDVAC的報告第一份草案(First Draft of a Report on the EDVAC)”為題起草的長達101頁的總結報告,定義了“馮·諾依曼體系結構”,他現在也被稱為計算機之父。
《EDVAC報告書的第一份草案》,一般簡稱為第一份草案,是由約翰·馮·諾伊曼所撰寫共101頁未完成檔案,於1945年6月30日,由ENIAC機密計劃的安全官赫爾曼·戈德斯坦所發表。內容包含了第一次公諸於世的使用儲存程式概念電腦的邏輯設計描述,即後來成為眾所熟知且頗具爭議的馮·諾伊曼結構。