1. 程式人生 > >為什麽結構化編程、面向對象編程、軟件工程、架構設計最後沒有成為軟件領域的銀彈

為什麽結構化編程、面向對象編程、軟件工程、架構設計最後沒有成為軟件領域的銀彈

電子郵件 軟件質量 80年 說明 設計原則 世界 程序員 計算機基礎知識 bject

為什麽結構化編程、面向對象編程、軟件工程、架構設計最後沒有成為軟件領域的銀彈?

從計算機語言開始講,一步一步的概述和講解,最終會有一個結論,大家往後看,即可明白。

1.機器語言(1940年之前)

機器語言,直接使用二進制碼0和1來表示機器可以識別的指令和數據。

比如0100011111000010101,請問你知道是什麽意思嗎?反正我是不知道。

當然了,不可否認的是機器語言是最底層與CPU直接交互。

機器語言之所以沒有流行下來,原因三個方面:

(1)太難讀了;

(2)太難寫了;

(3)太難改了(萬一因為0和1之間位置偏差導致程序出錯,那真的會讓人哭死);

當然了,機器語言並非沒有優點,它的優點就是快,天下武功唯快不破。

2.匯編語言(20世紀40年代)

為了解決機器語言太難寫了、太難讀了、太難改了等三個缺點,於是,匯編語言應運而生。

例如:

機器語言:1000001001000111111

匯編語言:mov ax,bx

相比機器語言來說,匯編語言要清晰的多。比如mov是移動(move),ax和bx是寄存器的代號。

匯編語言解決了機器語言難讀難寫難改的缺點,當然了,它也有它的不足,比如我們必須精確地了解和熟悉計算機底層知識。

關於計算機知識的書,有一本比較通俗的讀物,但是也不算是通俗,那本書的名字叫做《計算機文化》

對於計算機的基礎知識描繪十分系統和詳細,建議大學生或者是開發經驗比較穩固但是計算機基礎知識欠缺的朋友可以看看,我就時不時翻閱一下,這本書,我對此的閱讀方法是:

(1)有選擇的閱讀,不要從頭開始翻(我第一次讀的時候,差點讀著就睡著了,因為覺得太過乏味,後來有選擇的看看,基本翻完了70%);

(2)你可以嘗試快速從頭開始翻,感興趣的可以花點時間仔細看看,不感興趣的,直接跳過;

總而言之,每個人都有每個人獨特的閱讀方式。

關於這本書的章節大概,我列出一下,大家可以做個參考。

一共十二章:

第一章 計算機和數字基礎知識

A部分:一切數字事物

B部分:數字設備

C部分:數字數據顯示

D部分:數字化處理

E部分:密碼安全

第二章 計算機硬件

A部分:個人計算機基礎知識

B部分:微處理和內存

C部分:存儲設備

D部分:輸入和輸出設備

E部分:硬件安全

第三章 計算機軟件

A部分:軟件基礎知識

B部分:辦公套件

C部分:軟件安裝和升級

D部分:購買軟件

E部分:安全軟件

第四章 操作系統和文件管理

A部分:操作系統基礎知識

B部分:現代操作系統

C部分:文件基礎知識

D部分:文件管理

E部分:備份安全

第五章 局域網

A部分:網絡構建基礎

B部分:有線和無線技術

C部分:網絡安裝

D部分:文件共享

E部分:無線安全

第六章 因特網

A部分:因特網技術

B部分:固定因特網接入

C部分:便攜式和移動因特網接入

D部分:因特網服務

E部分:因特網安全

第七章 Web和電子郵件

A部分:Web技術

B部分:搜索引擎

C部分:電子商務

D部分:電子郵件

E部分:Web和電子郵件安全

第八章 數字媒體

A部分:數字聲音

B部分:位圖圖形

C部分:矢量圖形和三維圖形

D部分:數字視頻

E部分:數字版權管理

第九章 計算機產業:歷史、職業和道德

A部分:計算機歷史

B部分:計算機產業和IT產業

C部分:計算機專業人員的職業

D部分:職業道德

E部分:工作區安全和人體工程學

第十章信息系統的分析與設計

A部分:信息系統

B部分:系統分析

C部分:系統設計

D部分:實現和可維護

E部分:企業數據安全

第十一章數據庫

A部分:文件和數據庫概念

B部分:數據管理工具

C部分:數據庫設計

D部分:SQL

E部分:數據庫安全

第十二章計算機編程

A部分:編程基礎知識

B部分:過程化編程

C部分:面向對象編程

D部分:說明性編程

E部分:安全編程

A、B、C、D、E部分還會再細分,至少四個小節,這本書按照我的那種讀法,兩周就可以讀完,不過每天平均可能至少要保持一個小時的閱讀。

匯編語言的優缺點:
優點:占用內存少、執行速度快、易讀懂。
缺點:可移植性差。

3.高級語言(20世紀50年代)

高級語言,它是在低級語言的基礎上,采用接近於人類自然語言的單詞和符號來表示一組低級語言程序,使編程變得更加簡單,易學,且寫出的程序可讀性強。

高級語言的優缺點:

優點:

  (1)高級語言接近算法語言,易學、易掌握,一般工程技術人員只要幾周時間的培訓就可以勝任程序員的工作;

  (2)高級語言為程序員提供了結構化程序設計的環境和工具,使得設計出來的程序可讀性好,可維護性強,可靠性高;

  (3)高級語言遠離機器語言,與具體的計算機硬件關系不大,因而所寫出來的程序可移植性好,重用率高;

缺點:有些高級語言寫出的程序執行效率並不高。

4.第一次軟件危機與結構化程序設計(20世紀60年代~20世紀70年代)

高級語言的出現,解放了程序員,但好景不長,隨著軟件的規模和復雜性的增加,20世紀60年代中期開始爆發了第一次軟件危機,典型的表現:

軟件質量低下、項目無法如期完成、項目嚴重超出預計支出等。

結構化程序設計概念,參考百度百科:

其概念最早由E.W.Dijikstra在1965年提出的,是軟件發展的一個重要的裏程碑。它的主要觀點是采用自頂向下、逐步求精及模塊化的程序設計方法;使用三種基本控制結構構造程序,任何程序都可由順序、選擇、循環三種基本控制結構構造。結構化程序設計主要強調的是程序的易讀性。

結構化程序設計的主要特點是拋棄goto語句,采取自頂向下、逐步細化、模塊化的指導思想。結構化程序設計本質上還是一種面向過程的設計思想。

通過結構化程序設計,將軟件的復雜度控制在一定範圍內,從而從整體上降低軟件開發的復雜度。結構化程序設計是20世紀70年代的軟件開發潮流。

5.第二次軟件危機與面向對象(20世紀80年代)

結構化編程的流行在一定程度上緩解了軟件危機,然而隨著硬件的快速發展,業務需求越來越復雜,以及編程應用領域越來越廣,第二次軟件危機開始到來。

第二次軟件危機的根本原因還是在於軟件生產力遠遠跟不上硬件和業務的發展。第一次軟件危機的根源在於軟件的邏輯變的非常復雜,而第二次軟件危機主要體現在軟件的“擴展”變得非常復雜。結構化程序設計雖然能夠緩解軟件邏輯的復雜性,但是對於業務變化帶來的軟件擴展卻無能為力,軟件領域迫切希望找到新的銀彈來解決軟件危機,在這個背景下,面向對象思想開始流行起來。

對於面向對象程序設計定義,引用百度百科:

面向對象程序設計(Object Oriented Programming)作為一種新方法,其本質是以建立模型體現出來的抽象思維過程和面向對象的方法。模型是用來反映現實世界中事物特征的。任何一個模型都不可能反映客觀事物的一切具體特征,只能對事物特征和變化規律的一種抽象,且在它所涉及的範圍內更普遍、更集中、更深刻地描述客體的特征。通過建立模型而達到的抽象是人們對客體認識的深化

面向對象程序設計思想,現在仍然也很流行,不過據說目前領域驅動設計在不少公司正在實施中,我對這個領域驅動設計不是特別明白,目前用的比較多還是面向對象程序設計,因為我使用的編程語言是Java,Java是一個面向對象的編程語言。

6.軟件架構

早在20世紀60年代,戴克斯特拉就涉及軟件架構這個概念,但是軟件架構真正的流行卻是在20世紀90年代開始的,由於在Rational和Microsoft內部的相關活動,軟件架構的概念開始越來越流行。

軟件架構的定義,引用百度百科:

軟件架構是一個系統的草圖。軟件架構描述的對象是直接構成系統的抽象組件。各個組件之間的連接則明確和相對細致地描述組件之間的通訊。在實現階段,這些抽象組件被細化為實際的組件,比如具體某個類或者對象。在面向對象領域中,組件之間的連接通常用接口來實現。 軟件體系結構是構建計算機軟件實踐的基礎。與建築師設定建築項目的設計原則和目標,作為繪圖員畫圖的基礎一樣,一個軟件架構師或者系統架構師陳述軟件構架以作為滿足不同客戶需求的實際系統設計方案的基礎。 軟件架構出現有其必然性,通常都是解決某種語言或者設計思想帶來的問題,比如軟件架構所解決的問題有三個(針對大規模系統而言) (1)系統規模大,內部耦合嚴重,開發效率低; (2)系統耦合嚴重,牽一發動全身,後續修改和擴展困難; (3)系統邏輯復雜,容易出現問題,出現問題後很難排查和修復; 綜合上述六個方面,我們可知,從機器語言、匯編語言、高級語言、面向結構程序設計、面向對象程序設計、軟件架構,可以理解為優秀的進化,也可以理解為基因突變,基因突變有好有壞,每一次基因突變取決於所處的環境,人如此,編程語言或者相關的程序設計或架構亦如此。這就是我最終的觀點和想法。 最後再針對這個問題:為什麽結構化編程、面向對象編程、軟件工程、架構設計最後沒有成為軟件領域的銀彈? 我的觀點是:所處的環境不用,適用範圍也就有了限制,一句話,物競天擇,適者生存。當然了,一句話概述還遠遠不夠。編程語言只是一個方面的體現。 同時還有軟件工程方法也同樣再變化,從最早期的瀑布模式、叠代、敏捷到現在先進的devops。從結構化編程、面向對象編程、軟件工程、架構設計最後沒有成為軟件領域的銀彈問題出發,你仔細想想,從多個方面考慮,以我個人的觀點歸納如下: (1)編程語言的體現,化繁為簡; (2)軟件工程的體現,從瀑布、叠代、螺旋、devops,追求的目標是快速、高效、能夠適應不斷的變化; (3)框架的變化,框架從過去的重量級到現在的輕量級,比如以java為例,過去的EJB,現在的Spring; (4)項目管理工具,從CVS到SVN再到Git,或者可以說在沒有CVS、SVN、Git之前手動合並代碼; (5)測試的變化,手動測試到自動化測試 (6)應用變化,單體應用到微服務。 諸如這樣的例子有很多,歡迎大家留言。 本文除了自己的看法之外,所參考文獻和資料如下: 《從0到架構師》之架構的歷史背景 《計算機文化》 百度百科

為什麽結構化編程、面向對象編程、軟件工程、架構設計最後沒有成為軟件領域的銀彈