看到這個題目,我想起了不少不少...........程序員
首先,我說明我爲何要寫這篇文章了。算法
一個緣由是逸可惜崢嶸歲月歲月稠,當初讀大學的時候,學習計算機技術的課程,我過多的走向了兩種極端的情況。一種狀況,我願意把他歸結於本末倒置,例如我學習《C++面向對象程序設計》的時候,更多的是研究C++的語法,卻忽略了面向對象的思想,到頭來,C++語法學會了,可是最重要的面向對象卻沒有理解,也不知道他可以真正的作些什麼。另外一個狀況,我把它理解爲目標很宏大,理解很困難,例如,我學習軟件過程的時候,開始,課程上就劈頭蓋腦的來一堆概念,然而,很難理解,最後也失去了學習該 課程的興趣,後來,隨着本身閱歷增加,經驗的增長, 發現這些知識是很是重要的,只是可是因爲知識的限制,沒有融會貫通罷了。數據庫
另一個緣由,咱們和他人討論寫的代碼時候,老是會從某某的口中聽到,你這源代碼寫的——耦合性太大了,但是,這老是一種不歡而散爭論,你憑什麼個人耦合性太大,是啊,憑什麼說個人耦合性,更可能是種感受,到底怎麼樣才能判斷高內聚低耦合,怎麼樣寫出來高內聚低耦合代碼了。編程
還有一 個緣由。和上面的緣由有點相似,在編程中接觸到的不少同事。或者一樣是編程的人。我發現他們的能力良莠不齊。可是,你會有這樣的感覺,有些人寫了兩三年的代碼會比一個寫十幾年代碼,更加的簡潔,更加的優雅。設計模式
總結一下上面的緣由就是,在咱們的編程實踐中,咱們須要找到一種思惟框架來幫助咱們設計和解釋咱們的程序。這個東西就是要討論的程序員思惟。安全
咱們下面篇幅就解決這三個問題。網絡
程序員思惟是什麼?
程序員思惟從哪裏來?
程序員思惟到哪裏去?
好吧,這是三個終極的問題。沒有標準答案,也沒有什麼不標準的答案。我只是試圖給出本身的一個思考的總結。app
再解釋程序員思惟是什麼問題這個問題是何時,咱們先用類比法看一下什麼是程序員思惟。框架
類比法,是個好方法啊,就像字典中的同義詞解析同樣。咱們就類比生活中的一些例子罷了,來解釋什麼是程序員思惟。有些人,說編程就像解題,一個題幹出出來了,咱們須要利用所掌握的知識,一步步,層次分明的解決出來。而編程了,則是根據客戶的一個需求,利用本身技能把其變成計算機軟件,來幫助解決現實生活中的問題。有些人,說編程就像操做機器,你像一個司機,你操做方向盤讓車向左走,他不會向右左。咱們編程也是一樣的道理,你輸入一條加法指令,計算機也不會幫你作減法。有些人,說編程就像做家,做家,是將冰冷冷文字賦予了生命,來賣錢。程序員,是將毫無生氣的一些指令,變成那好玩遊戲,哪方便的app。這些,都是很形象的類比。咱們這裏套用馬克思*韋伯在《新教理論與資本主義》中首次提出了一個概念可以很好的解釋上面列舉的事情的共性——工具理性。所謂「工具理性」,就是經過實踐的途徑確認工具(手段)的有用性,從而追求事物的最大功效,爲人的某種功利的實現服務。工具理性是經過精確計算功利的方法最有效達至目的的理性,是一種以工具崇拜和技術主義爲生存目標的價值觀,因此「工具理性」又叫「功效理性」或者說「效率理性」的定義。能夠將程序員思惟,定義爲是在理性思惟的框架下,利用相應工具,來解決相應實際的問題。dom
再回答程序員思惟從哪裏來,這個問題時候,咱們回顧了計算機語言歷史:
1940以前
第一個編程語言比現代的計算機還早誕生。首先,這種語言是種編碼(en:code)。 於1801年發明的提花織布機(或稱甲卡提花織布機,英文:en:Jacquard loom),運用打孔卡上的坑洞來表明縫紉織布機的手臂動做,以便自動化產生裝飾的圖案。 Ada Lovelace在1842年至1843年間花費了九個月,將意大利數學家Luigi Menabrea關於查爾斯·巴貝奇新發表機器分析機的回憶錄翻譯完成。她於那篇文章後面附加了一個用分析機計算伯努利數方法的細節,被部分歷史學家認爲是世界上第一個電腦程序。這個故事咱們上面也說過。 Herman Hollerith在觀察列車長對乘客票根在特定位置打洞的方式後,意識到他能夠把資訊編碼記載到打孔卡上,隨後根據這項發現使用打孔卡來編碼並紀錄1890年的人口統計資料。 第一個嚴格意義上的計算機程式碼是針對他們的應用面設計的。在20世紀的前十年主要是用十進制來算數,後來人們發現不僅是用文字,也能夠用數字來表現邏輯。舉例來講,阿隆佐·邱奇曾以公式化(formulaic)的方式表達λ演算。圖靈機是一種紙帶標記(tape-marking)機器(就像電話公司用的那種)操做方法抽象化後的集合。圖靈機這種透過有限數字(finite number)呈現機器的方式,奠基了程式如同馮·諾伊曼結構計算機中的資料同樣地儲存的基礎。但不一樣於λ演算,圖靈機的程式碼並無辦法成爲高階編程語言的基石,這是是由於它主要的用途是分析算法的複雜度。 就像許多歷史上的」第一次」同樣,第一個現代編程語言也很難界定。最一開始是由於硬件限制而限定了語言,打孔卡容許80行(column)的長度,但某幾行必須用來記錄卡片的順序。FORTRAN則歸入了一些與英文字詞相同的關鍵字,像是」IF」、」GOTO」(原字詞爲go to),以及」CONTINUE」。以後採用磁鼓(magnetic drum)做爲內存使用,也表明計算機程式也必須插入(interleave)到磁鼓的轉動(rotation)中。和現今比較起來,這也讓編程語言必須更加依賴硬件(hardware-dependent)。 對部分的人認爲必須在」編程語言」的狀態確立以前,根據能力(power)以及可讀性(human-readability)的程度來決定歷史上第一個編程語言是什麼語言。提花織布機和查爾斯·巴貝奇所製做的差分機(en:Difference Engine)都具有在大量限制下,簡單描述機器應執行行爲的語言。也有種並不是設計給人類運用的受限特定領域語言(en:domain-specific language),是將打孔卡運用到自動演奏鋼琴(en:player piano)上。
1940年代
最先被確認的現代化、電力啓動(electrically powered)的計算機約在1940年代被創造出來。程式設計師在有限的速度及內存容量限制之下,撰寫人工調整(hand tuned)過的組合語言程式。並且很快就發現到使用組合語言的這種撰寫方式須要花費大量的腦力(intellectual effort)並且很容易出錯(error-prone)。 Konrad Zuse於1948年發表了他所設計的Plankalkül編程語言的論文[1]。可是在他有生之年卻未能將該語言實做,而他本來的貢獻也被其餘的發展所孤立。 在這段期間被開發出來的重要語言包括有:
1943 – Plankalkül (Konrad Zuse)
1943 – ENIAC coding system
1949 – C-10
1950與1960年代
有三個現代編程語言於1950年代被設計出來,這三者所衍生的語言直到今日仍舊普遍地被採用:
Fortran (1955),名稱取自」FORmula TRANslator」(公式翻譯器),由約翰·巴科斯等人所發明;
LISP,名稱取自」LISt Processor」(列舉處理器),由約翰·麥卡錫等人所發明;
COBOL,名稱取自」COmmon Business Oriented Language」(通用商業導向語言),由被葛麗絲·霍普深入影響的Short Range Committee所發明。
另外一個1950年代晚期的里程碑是由美國與歐洲計算機學者針對」算法的新語言」所組成的委員會出版的ALGOL 60報告(名稱取自」ALGOrithmic Language」(算法語言))。這份報告強化了當時許多關於計算的想法,並提出了兩個語言上的創新功能:
巢狀區塊結構:能夠將有意義的程式碼片斷羣組成一個區塊(block),而非轉成分散且特定命名的程序。也就是咱們所熟悉的模塊化設計。
詞彙範圍(lexical scoping):區塊能夠有區塊外部沒法透過名稱存取,屬於區塊自己的變量、程序以及函式。就是咱們所熟悉的做用域。
另外一個創新則是關於語言的描述方式:一種名爲巴科斯-諾爾範式 (BNF)的數學化精確符號被用於描述語言的語法。以後的編程語言幾乎所有都採用相似BNF的方式來描述程式 語法中上下文無關的部份。BNF主要使用在了Algol 60的設計上面。而Algol 60對以後語言的設計上帶來了特殊的影響,在其餘部分的語言設計中這種設計思想很快的就被普遍採用。而且後續爲了開發Algol的擴充子集合,設計了一個名爲Burroughs(en:Burroughs large systems)的大型系統。而延續Algol的關鍵構想所產生的成果就是ALGOL 68:
語法跟語意變的更加正交(orthogonal)
採用匿名的歷程(routines)
採用高階(higher-order)功能的遞迴式輸入(typing)系統等等。
整個語言及語意的部分都透過爲了描述語言而特別設計的Van Wijngaarden grammar來進行正式的定義,而不只止於上下文無關的部份。Algol 68一些較少被使用到的語言功能(如同步與並列區塊)、語法捷徑的複雜系統,以及型態自動強制轉換(coercions),使得實做者興趣缺缺,也讓Algol 68得到了很難用(diffcult)的名聲。尼克勞斯·維爾特就乾脆離開該設計委員會,另外在開發出更簡單的Pascal語言。 在這段期間被開發出來的重要語言包括有:
1951 – Regional Assembly Language
1952 – Autocode
1954 – FORTRAN
1954 – IPL (LISP的先驅)
1955 – FLOW-MATIC (COBOL的先驅)
1957 – COMTRAN (COBOL的先驅)
1958 – LISP
1958 – ALGOL 58
1959 – FACT (COBOL的先驅)
1959 – COBOL
1962 – APL
1962 – Simula
1962 – SNOBOL
1963 – CPL (C的先驅)
1964 – BASIC
1964 – PL/I
1967 – BCPL (C的先驅)
1967-1978:確立了基礎範式
1960年代晚期至1970年代晚期的期間中,編程語言的發展也有了重大的成果。大多數如今所使用的主要語言範式都是在這段期間中發明的:
Simula,於1960年代晚期由奈加特與Dahl以Algol 60超集合的方式發展,同時也是第一個設計支援面向對象進行開發的編程語言。
C,於1969至1973年間由貝爾實驗室的研究人員丹尼斯·裏奇與肯·湯普遜所開發,是一種早期的系統程式設計(en:system programming)語言。
Smalltalk,於1970年代中期所開發,是一個徹底從零開始(ground-up)設計的面向對象編程語言。
Prolog,於1972年由Colmerauer、Roussel,以及Kowalski所設計,是第一個邏輯程式語言。
ML,於1973年由羅賓·米爾納所發明,是一個基於Lisp所建構的多型(polymorphic)型態系統,同時也是靜態型別函數編程語言的先驅。
這些語言都各自演展出本身的家族分支,現今多數現代編程語言的祖先均可以追朔他們其中至少一個以上。 在1960年代以及1970年代中結構化程式設計的優勢也帶來許多的爭議,特別是在程式開發的過程當中徹底不使用GOTO。這項爭議跟語言自己的設計很是有關係:某些語言並無包含GOTO,這也強迫程式設計師必須結構化地編寫程式。儘管這個爭議在當時吵翻了天,但幾乎全部的程式設計師都贊成就算語言自己有提供GOTO的功能,在除了少數罕見的狀況下去使用GOTO是種不良的程序風格。結果是以後世代的編程語言設計者發覺到結構化編程語言的爭議實在既乏味又使人眼花撩亂。 在這段期間被開發出來的重要語言包括有:
1968 – Logo
1970 – Pascal
1970 – Forth
1972 – C語言
1972 – Smalltalk
1972 – Prolog
1973 – ML
1975 – Scheme
1978 – SQL (起先只是一種查詢語言,擴充以後也具有了程式結構)
1980年代:加強、模組、效能
1980年代的編程語言與以前相較顯得更爲強大。C++合併了面向對象以及系統程式設計。美國政府標準化一種名爲Ada的系統編程語言並提供給國防承包商使用。日本以及其餘地方運用了大量的資金對採用邏輯編程語言結構的第五代語言進行研究。函數編程語言社羣則把焦點轉移到標準化ML及Lisp身上。這些活動都不是在開發新的範式,而是在將上個世代發明的構想進一步發揚光大。 然而,在語言設計上有個重大的新趨勢,就是研究運用模組或大型組織化的程式單元來進行大型系統的開發。Modula、Ada,以及ML都在1980年代發展出值得注意的模組化系統。模組化系統常拘泥於採用泛型程式設計結構:
泛型存在(generics being)
本質(essence)
參數化模組(parameterized modules)
儘管沒有出現新的主要編程語言範式,許多研究人員仍就擴充以前語言的構想並將它們運用到新的內容上。舉例來講,Argus以及Emerald系統的語言配合面嚮對象語言運用到分散式系統上。 1980年代的編程語言實際狀況也有所進展。計算機系統結構中RISC假定硬件應當爲編譯器設計,而並不是爲人類設計。藉由中央處理器速度增快的幫助,編譯技術也愈來愈進展神速,RISC的進展對高階語言編譯技術發展來不小的貢獻。 在這段期間被開發出來的重要語言包括有:
1980 – Ada
1983 – C++ (就像有類別的C)
1984 – Common Lisp
1985 – Eiffel
1986 – Erlang
1987 – Perl
1988 – Tcl
1989 – FL (Backus)
1990年代:互聯網時代
1990年代未見到有什麼重大的創新,大多都是之前構想的重組或變化。這段期間主要在推進的哲學思想是提高程式設計師的生產力。許多」快速應用程式開發」 (RAD) 語言也應運而生,這些語言大多都有相應的集成開發環境、垃圾回收等機制,且大可能是先前語言的衍生語言。這類型的語言也大可能是面向對象的編程語言,包含有Object Pascal、Visual Basic,以及C#。Java則是更加保守的語言,也具有垃圾回收機制。與其餘相似語言相比,也受到更多的觀注。新的腳本語言則比RAD語言更新更好。這種語言並不是直接從其餘語言衍生,並且新的語法更加開放地(liberal)與功能契合。雖然腳本語言比RAD語言來的更有生產力,但大多會有由於小程式較爲簡單,可是大型程式則難以使用腳本語言撰寫並維護的顧慮[來源請求]。儘管如此,腳本語言仍是網絡層面的應用上大放異彩。 在這段期間被開發出來的重要語言包括有:
1990 – Haskell
1991 – Python
1991 – Visual Basic
1993 – Ruby
1993 – Lua
1994 – CLOS (part of ANSI Common Lisp)
1995 – Java
1995 – Delphi (Object Pascal)
1995 – JavaScript
1995 – PHP
1997 – REBOL
1999 – D
現今的趨勢
編程語言持續在學術及企業兩個層面中發展進化,目前的一些趨勢包含有:
在語言中增長安全性與可靠性驗證機制:額外的堆棧檢查、資訊流(information flow)控制,以及靜態執行緒安全。提供模組化的替代機制:混入(en:mixin)、委派(en:delegates),以及觀點導向。元件導向(component-oriented)軟件開發元編程、反射或是存取抽象語法樹(en:Abstract syntax tree)更重視分散式及移動式的應用。
與數據庫的整合,包含XML及關聯式數據庫。支援使用Unicode編寫程式,因此源代碼不會受到ASCII字符集的限制,而可使用像是非拉丁語系的腳本或延伸標點符號。
圖形化使用者接口所使用的XML(XUL、XAML)。在這段期間被開發出來的重要語言包括有:
2001 – C#
2001 – Visual Basic .NET
2002 – F#
2003 – Scala
2003 – Factor
2006 – Windows PowerShell
2007 – Clojure
2009 – Go
從這些編程語言簡史和人們平常需求,咱們能夠回答這個問題了。全部的程序員思惟都是來自於需求兩個字。隨着對現實信息管理的壓力太大的,咱們慢慢纔有計算機發明。爲了,更好的管理計算機,因而便有了編程語言,起初的語言,是面向機器的了,後來隨着世人更加理解的角度,就進一步面向過程,爲了令人更加理解世界萬物,就有了面向對象的語言,綜上所述,程序員的思惟,從何而來,從世間萬物的需求而來,從更好的解決問題的需求而來。
有了程序員的思惟從何而來的這一個冒解決了,咱們就可以很快的回答,程序員思惟你要到哪裏去了?
一切程序員思惟的宗旨就是,爲了更好的解決問題,更好解決需求,因而在這一光輝思想的引導下了,咱們就發明各類各樣設計模式,爲了使其代碼高內聚低耦合,這些都是使其咱們程序員花這小的代價來知足最大需求。
以上所述,即是我對程序員思惟的理解,懇請你們斧正。