為了更好的體系化軟體工程相關技術,第一篇文檔先整體視角回顧整個軟體工程核心的關鍵時間點,後續再逐漸展開。
軟體工程發展簡史
1.【1930~1946】 計算機理論奠基時代
計算機出現之前,就已經有很多數學家為計算機軟體的出現打下了堅實的數學理論基礎,最著名的是“阿蘭. 圖靈”,在 20 世紀三、 四十年代就建立立了“圖靈機”理論, 從理論上解決了計算機軟體和核心——“計算複雜性”以及“算法表示”問題。
通用圖靈機等于向我們展示這樣一個過程:程式和其輸入可以先儲存到存儲帶上,圖靈機就按程式一步一步運作直到給出結果,結果也儲存在存儲帶上。
“圖靈”機
圖靈機理論是計算機最重要核心的理論
- 它證明了通用計算理論,肯定了計算機實作的可能性,同時它給出了計算機應有的主要架構。
- 引入了讀寫與算法與程式語言的概念,極大的突破了過去的計算機器的設計理念。
- 闡述了計算機的極限計算能力就是通用圖靈機的計算能力,很多問題可以轉化到圖靈機這個簡單的模型來考慮。
我們可以隐約看到現代計算機主要構成(其實就是馮諾依曼理論的主要構成),存儲器(相當于存儲帶),中央處理器(控制器及其狀态,并且其字母表可以僅有0和1兩個符号),1O系統(相當于存儲帶的預先輸入);
如果說圖靈(Alan Turing)奠定了計算機的理論基礎,那麼馮·諾依曼(John Von Neumann)是将圖靈的理論物化成為實際的實體實體,成為計算機體系結構的奠基者,被稱為“計算機之父”。
馮·諾依曼與馮·諾依曼機
“馮·諾依曼機”,該架構由算術和邏輯單元 (ALU)、控制單元和臨時存儲器寄存器組成,它們共同構成了中央處理器 (CPU)。CPU 連接配接到記憶體單元,該記憶體單元包含将要由CPU處理和操作的所有資料。CPU還連接配接到輸入和輸出裝置,以根據需要更改資料,并檢索運作程式的結果。
自 1945 年馮諾依曼提出這一架構以來,直到今天,它基本上仍是當今大多數通用計算機的運作方式,幾乎沒有改變。
2.【1946~1955】計算機誕生之初的無“軟體”概念階段
1946年2月14日,美國賓夕法尼亞大學制成世界上第一台通用電子數字計算機ENIAC,即電子數字積分電腦,簡稱“埃尼阿克”。發明者莫克利和艾克特均為美國人,其初衷也是美國奧伯丁武器試驗場為了滿足計算彈道需要而研制的。
埃尼阿克
“埃尼阿克/ENIAC”的發明,标志着資訊時代的開始。
之後不久,繼任者EDVAC采用二進制和馮·諾伊曼結構,成為真正意義上的電子計算機。
從此産生了一個新的職業:程式員。但早期,受限于計算機性能,當時的程式主要處理科學計算問題。早期程式員更準确的稱呼是“Computer”(計算師)而不是“Programmer”,彼時主流程式語言是彙編,一種面向機器的低級語言。
打孔紙和彙編語言
機器語言通常稱為“第一代語言”,其後又産生了“彙編語言”,即“第二代語言”。
彙編語言實際上就是機器語言,差別就是彙編語言中用一些符号代替0 和1 的序列, 僅僅是便于記憶。
3.【1955~1970】進階程式設計語言的興起和軟體危機爆發
随着計算機硬體性能的提升,進階程式設計語言開始興起,Fortran是世界上最早出現的進階程式設計語言,它的出現改變了傳統的人與計算機的互動方式,将人們從繁瑣的勞動中解放出來,将大部分精力投入進階的思考中去,是以Fortran的出現具有劃時代的意義。之後的許多語言都受到它的影響。
進階語言fortan
此時也随之開始出現了“軟體”的概念。但當時的程式編碼随意,整個軟體看起來像是一碗意大利面一樣雜亂無章。
- 早期的軟體工程師,他們多是經過訓練的數學家和電子工程師,硬體通常用來執行一個單一的程式,而這個程式又是為一個特定的目的而編制的。
- 早期當通用硬體成為平常事情的時候,軟體的通用性卻是很有限的。大多數軟體是由使用該軟體的個人或機構研制的,軟體往往帶有強烈的個人色彩。
- 早期的軟體開發也沒有什麼系統的方法可以遵循,軟體設計是在某個人的頭腦中完成的一個隐藏的過程。而且, 除了源代碼往往沒有軟體說明書等文檔。
随着軟體系統的規模越來越龐大,軟體産品的品質越來越差,生産效率越來越低,維護的難度越來越大,進而導緻了“軟體危機”。
1968年北大西洋公約組織的計算機科學家在聯邦德國召開的國際學術會議_上第一次提出了“軟體危機”(software crisis)這個名詞。
概括來說, 軟體危機包含兩方面問題:
- 如何開發軟體,以滿足不斷增長,日趨複雜的需求;
- 如何維護數量不斷膨脹的軟體産品。
4.【1970~1990】軟體工程的誕生
1968年,NATO (北約)的科技委員會召集了近50名一流的程式設計人員、計算機科學家和工業界巨頭,讨論和制定擺脫“軟體危機”的對策。在那次會議上第一次提出了軟體工程(software engineering)這個概念。軟體工程是一門研究如何用系統化、規範、數量化等工程原則和方法去進行軟體的開發和維護的學科。
軟體工程包括兩方面内容:軟體開發技術和軟體項目管理。軟體開發技術包括軟體開發方法學、軟體工具和軟體工程環境。軟體項目管理包括軟體度量、項目估算、進度控制、人員組織、配置管理、項目計劃等。
此後軟體工程理論開始蓬勃發展,提出了許多軟體開發模型,比如瀑布模型、增量開發、螺旋模型、靈活開發等。
瀑布模型
增量開發
螺旋模型
靈活開發
這個階段的軟體是面向過程開發的單機軟體。
5.【1990~1999】面向對象和Web的誕生
面向對象的誕生是程式設計史最重要的裡程碑事件,它提出了一種全新的軟體設計思想和開發模型,從此面向對象分析(OOA)、面向對象設計(OOD)、面向對象編碼(OOP)成為軟體工程師的口頭禅。随之而來的是面向對象模組化語言(以UML為代表)、軟體複用、基于元件的軟體開發等新的方法和領域。與之相應的是從企業管理的角度提出的軟體過程管理。
面向對象分析
另外值得注意的是,1991 年 8 月 6 日,第一個網站上線。該站點由 Tim Berners - Lee 建立,網站詳細介紹了網際網路(W3)項目。它最初是在歐洲核研究組織 CERN 的 NeXT 計算機上運作的。
第一個靜态頁面
該網站的誕生開啟了Web1.0時代。此時,Web Page還隻是文檔,由網頁編輯和平面設計師編寫産生,并不需要軟體工程師開發。
6.【1999~2005】Web軟體開發興起(全棧開發,單體架構時代)
随着網際網路的普及和網速的提升,傳統單機軟體逐漸發展為基于Web的應用。Web Page從靜态變為動态,開始需要程式員介入。
特别是三大主流動态網站技術橫空出世!.php => PHP,.jsp => Java Web, .asp => ASP
他們都是在伺服器(Server)端生成動态計算和生成的Html頁面(Pages) ,然後将整個頁面發送給前端。
此階段主要特點是靜态頁面逐漸轉為動态頁面,其中比較出名的一些架構比如:
struts架構
此階段的工程師皆為全棧開發工程師,頁面由服務端生成,頁面内可以通過腳本直接操作後端服務邏輯。
架構上此階段主要是單體架構(Monolithic Architecture): 系統中主要的過程調用都是程序内調用,不會發生程序間通信。 如下所示是單體架構常見的分層模式。
單體架構
分層架構
7.【2005~2012】Web2.0時代(AJAX技術興起,前後端分離,SOA架構時代)
随着網際網路進一步普及和基礎設施進一步完善,Web應用從單純浏覽和擷取資訊,向使用者生産内容(User Generated Content)轉變,網際網路進入Web2.0時代。AJAX技術的興起,解耦了Web軟體的展現層和業務邏輯層,并最終促使Web軟體的前後端分離,從此Web全棧開發工程師,分解為前端工程師和後端工程師兩種職業。前端工程師深入軟體可視化互動領域,後端工程師擺脫掉展現層的包袱後,開始重新思考服務端的軟體架構,SOA(Service-Oriented Architecture,面向服務架構)思想開始盛行。
web1.0~3.0主要特點
前端架構演變
前端架構經曆了從單體,到前後端分離,再到微服務,最終發展到現在的微前端的過程如下圖所示
微前端的思路是把微服務的架構引入到前端,其核心都是要能夠以業務為單元建構端到端的垂直架構,使得單個的團隊能夠獨立自主的進行相關的開發,同時又具備相當的靈活性,按需求來組成傳遞應用。
SOA(Service-Oriented Architecture,面向服務的架構)是一種在計算機環境中設計、開發、部署和管理離散模型的方法。SOA不是一種新鮮事物,它是在企業内部IT系統重複建構以及效率低下的背景下提出的。在SOA模型中,所有的功能都被定義成了獨立的服務,所有的服務通過服務總線(ESB)或流程管理器來連接配接。這種松散耦合的結構使得能夠以最小的代價整合已經存在的各種異構系統,當然,由于需要實作對各種異構系統的适配(通常使用ESB來完成不同系統之間的協定轉換及資料格式轉換),是以,其本身也會引入更多的複雜性。
單體架構
面向服務的架構
8.【2012~2018】移動網際網路時代(B/S→多端/S)
進入移動網際網路時代,Web軟體的B/S結構,轉變為多端/S(PC浏覽器,移動浏覽器,Android,IOS,小程式)。原來前後端一對一變成多對一,服務端“元件化”能力被重視,微服務架構提出并開始盛行。
SOA是一種思想,ESB是SOA的中心化實作,微服務是SOA的去中心實作
ESB由于其複雜性逐漸淡出主流圈,微服務成為主流,場景的微服務下的架構圖
微服務架構