程序员思维是什么?程序员思维从哪里来?程序员思维到哪里去?
? ? ?? 程序員思維是什么?
程序員思維從哪里來(lái)?
程序員思維到哪里去?
好吧,這是三個(gè)終極的問(wèn)題。沒(méi)有標(biāo)準(zhǔn)答案,也沒(méi)有什么不標(biāo)準(zhǔn)的答案。我只是試圖給出自己的一個(gè)思考的總結(jié)。
再解釋程序員思維是什么問(wèn)題這個(gè)問(wèn)題是什么時(shí)候,我們先用類(lèi)比法看一下什么是程序員思維。
類(lèi)比法,是個(gè)好方法啊,就像字典中的同義詞解析一樣。我們就類(lèi)比生活中的一些例子罷了,來(lái)解釋什么是程序員思維。有些人,說(shuō)編程就像解題,一個(gè)題干出出來(lái)了,我們需要利用所掌握的知識(shí),一步步,井井有條的解決出來(lái)。而編程了,則是根據(jù)客戶(hù)的一個(gè)需求,利用自己技能把其變成計(jì)算機(jī)軟件,來(lái)幫助解決現(xiàn)實(shí)生活中的問(wèn)題。有些人,說(shuō)編程就像操作機(jī)器,你像一個(gè)司機(jī),你操作方向盤(pán)讓車(chē)向左走,他不會(huì)向右左。我們編程也是同樣的道理,你輸入一條加法指令,計(jì)算機(jī)也不會(huì)幫你做減法。有些人,說(shuō)編程就像作家,作家,是將冰冷冷文字賦予了生命,來(lái)賣(mài)錢(qián)。程序員,是將毫無(wú)生氣的一些指令,變成那好玩游戲,哪方便的app。這些,都是很形象的類(lèi)比。我們這里套用馬克思*韋伯在《新教理論與資本主義》中首次提出了一個(gè)概念能夠很好的解釋上面列舉的事情的共性——工具理性。所謂“工具理性”,就是通過(guò)實(shí)踐的途徑確認(rèn)工具(手段)的有用性,從而追求事物的最大功效,為人的某種功利的實(shí)現(xiàn)服務(wù)。工具理性是通過(guò)精確計(jì)算功利的方法最有效達(dá)至目的的理性,是一種以工具崇拜和技術(shù)主義為生存目標(biāo)的價(jià)值觀(guān),所以“工具理性”又叫“功效理性”或者說(shuō)“效率理性”的定義。可以將程序員思維,定義為是在理性思維的框架下,利用相應(yīng)工具,來(lái)解決相應(yīng)實(shí)際的問(wèn)題。
再回答程序員思維從哪里來(lái),這個(gè)問(wèn)題時(shí)候,我們回顧了計(jì)算機(jī)語(yǔ)言歷史:
1940之前
第一個(gè)編程語(yǔ)言比現(xiàn)代的計(jì)算機(jī)還早誕生。首先,這種語(yǔ)言是種編碼(en:code)。 于1801年發(fā)明的提花織布機(jī)(或稱(chēng)甲卡提花織布機(jī),英文:en:Jacquard loom),運(yùn)用打孔卡上的坑洞來(lái)代表縫紉織布機(jī)的手臂動(dòng)作,以便自動(dòng)化產(chǎn)生裝飾的圖案。 Ada Lovelace在1842年至1843年間花費(fèi)了九個(gè)月,將意大利數(shù)學(xué)家Luigi Menabrea關(guān)于查爾斯·巴貝奇新發(fā)表機(jī)器分析機(jī)的回憶錄翻譯完成。她于那篇文章后面附加了一個(gè)用分析機(jī)計(jì)算伯努利數(shù)方法的細(xì)節(jié),被部分歷史學(xué)家認(rèn)為是世界上第一個(gè)電腦程序。這個(gè)故事我們上面也說(shuō)過(guò)。 Herman Hollerith在觀(guān)察列車(chē)長(zhǎng)對(duì)乘客票根在特定位置打洞的方式后,意識(shí)到他可以把資訊編碼記載到打孔卡上,隨后根據(jù)這項(xiàng)發(fā)現(xiàn)使用打孔卡來(lái)編碼并紀(jì)錄1890年的人口統(tǒng)計(jì)資料。 第一個(gè)嚴(yán)格意義上的計(jì)算機(jī)程式碼是針對(duì)他們的應(yīng)用面設(shè)計(jì)的。在20世紀(jì)的前十年主要是用十進(jìn)制來(lái)算數(shù),后來(lái)人們發(fā)現(xiàn)不只是用文字,也可以用數(shù)字來(lái)表現(xiàn)邏輯。舉例來(lái)說(shuō),阿隆佐·邱奇曾以公式化(formulaic)的方式表達(dá)λ演算。圖靈機(jī)是一種紙帶標(biāo)記(tape-marking)機(jī)器(就像電話(huà)公司用的那種)操作方法抽象化后的集合。圖靈機(jī)這種透過(guò)有限數(shù)字(finite number)呈現(xiàn)機(jī)器的方式,奠定了程式如同馮·諾伊曼結(jié)構(gòu)計(jì)算機(jī)中的資料一樣地儲(chǔ)存的基礎(chǔ)。但不同于λ演算,圖靈機(jī)的程式碼并沒(méi)有辦法成為高階編程語(yǔ)言的基石,這是是因?yàn)樗饕挠猛臼欠治鏊惴ǖ膹?fù)雜度。 就像許多歷史上的”第一次”一樣,第一個(gè)現(xiàn)代編程語(yǔ)言也很難界定。最一開(kāi)始是因?yàn)橛布拗贫薅苏Z(yǔ)言,打孔卡允許80行(column)的長(zhǎng)度,但某幾行必須用來(lái)記錄卡片的順序。FORTRAN則納入了一些與英文字詞相同的關(guān)鍵字,像是”IF”、”GOTO”(原字詞為go to),以及”CONTINUE”。之后采用磁鼓(magnetic drum)作為內(nèi)存使用,也代表計(jì)算機(jī)程式也必須插入(interleave)到磁鼓的轉(zhuǎn)動(dòng)(rotation)中。和現(xiàn)今比較起來(lái),這也讓編程語(yǔ)言必須更加依賴(lài)硬件(hardware-dependent)。 對(duì)部分的人認(rèn)為必須在”編程語(yǔ)言”的狀態(tài)確立之前,根據(jù)能力(power)以及可讀性(human-readability)的程度來(lái)決定歷史上第一個(gè)編程語(yǔ)言是什么語(yǔ)言。提花織布機(jī)和查爾斯·巴貝奇所制作的差分機(jī)(en:Difference Engine)都具備在大量限制下,簡(jiǎn)單描述機(jī)器應(yīng)執(zhí)行行為的語(yǔ)言。也有種并非設(shè)計(jì)給人類(lèi)運(yùn)用的受限特定領(lǐng)域語(yǔ)言(en:domain-specific language),是將打孔卡運(yùn)用到自動(dòng)演奏鋼琴(en:player piano)上。
1940年代
最早被確認(rèn)的現(xiàn)代化、電力啟動(dòng)(electrically powered)的計(jì)算機(jī)約在1940年代被創(chuàng)造出來(lái)。程式設(shè)計(jì)師在有限的速度及內(nèi)存容量限制之下,撰寫(xiě)人工調(diào)整(hand tuned)過(guò)的組合語(yǔ)言程式。而且很快就發(fā)現(xiàn)到使用組合語(yǔ)言的這種撰寫(xiě)方式需要花費(fèi)大量的腦力(intellectual effort)而且很容易出錯(cuò)(error-prone)。 Konrad Zuse于1948年發(fā)表了他所設(shè)計(jì)的Plankalkül編程語(yǔ)言的論文[1]。但是在他有生之年卻未能將該語(yǔ)言實(shí)作,而他原本的貢獻(xiàn)也被其他的發(fā)展所孤立。 在這段期間被開(kāi)發(fā)出來(lái)的重要語(yǔ)言包括有:
1943 – Plankalkül (Konrad Zuse)
1943 – ENIAC coding system
1949 – C-10
1950與1960年代
有三個(gè)現(xiàn)代編程語(yǔ)言于1950年代被設(shè)計(jì)出來(lái),這三者所衍生的語(yǔ)言直到今日仍舊廣泛地被采用:
Fortran (1955),名稱(chēng)取自”FORmula TRANslator”(公式翻譯器),由約翰·巴科斯等人所發(fā)明;
LISP,名稱(chēng)取自”LISt Processor”(列舉處理器),由約翰·麥卡錫等人所發(fā)明;
COBOL,名稱(chēng)取自”COmmon Business Oriented Language”(通用商業(yè)導(dǎo)向語(yǔ)言),由被葛麗絲·霍普深刻影響的Short Range Committee所發(fā)明。
另一個(gè)1950年代晚期的里程碑是由美國(guó)與歐洲計(jì)算機(jī)學(xué)者針對(duì)”算法的新語(yǔ)言”所組成的委員會(huì)出版的ALGOL 60報(bào)告(名稱(chēng)取自”ALGOrithmic Language”(算法語(yǔ)言))。這份報(bào)告強(qiáng)化了當(dāng)時(shí)許多關(guān)于計(jì)算的想法,并提出了兩個(gè)語(yǔ)言上的創(chuàng)新功能:
巢狀區(qū)塊結(jié)構(gòu):可以將有意義的程式碼片段群組成一個(gè)區(qū)塊(block),而非轉(zhuǎn)成分散且特定命名的程序。也就是我們所熟悉的模塊化設(shè)計(jì)。
詞匯范圍(lexical scoping):區(qū)塊可以有區(qū)塊外部無(wú)法透過(guò)名稱(chēng)存取,屬于區(qū)塊本身的變量、程序以及函式。就是我們所熟悉的作用域。
另一個(gè)創(chuàng)新則是關(guān)于語(yǔ)言的描述方式:一種名為巴科斯-諾爾范式 (BNF)的數(shù)學(xué)化精確符號(hào)被用于描述語(yǔ)言的語(yǔ)法。之后的編程語(yǔ)言幾乎全部都采用類(lèi)似BNF的方式來(lái)描述程式 語(yǔ)法中上下文無(wú)關(guān)的部份。BNF主要使用在了Algol 60的設(shè)計(jì)上面。而Algol 60對(duì)之后語(yǔ)言的設(shè)計(jì)上帶來(lái)了特殊的影響,在其他部分的語(yǔ)言設(shè)計(jì)中這種設(shè)計(jì)思想很快的就被廣泛采用。并且后續(xù)為了開(kāi)發(fā)Algol的擴(kuò)充子集合,設(shè)計(jì)了一個(gè)名為Burroughs(en:Burroughs large systems)的大型系統(tǒng)。而延續(xù)Algol的關(guān)鍵構(gòu)想所產(chǎn)生的成果就是ALGOL 68:
語(yǔ)法跟語(yǔ)意變的更加正交(orthogonal)
采用匿名的歷程(routines)
采用高階(higher-order)功能的遞回式輸入(typing)系統(tǒng)等等。
整個(gè)語(yǔ)言及語(yǔ)意的部分都透過(guò)為了描述語(yǔ)言而特別設(shè)計(jì)的Van Wijngaarden grammar來(lái)進(jìn)行正式的定義,而不僅止于上下文無(wú)關(guān)的部份。Algol 68一些較少被使用到的語(yǔ)言功能(如同步與并列區(qū)塊)、語(yǔ)法捷徑的復(fù)雜系統(tǒng),以及型態(tài)自動(dòng)強(qiáng)制轉(zhuǎn)換(coercions),使得實(shí)作者興趣缺缺,也讓Algol 68獲得了很難用(diffcult)的名聲。尼克勞斯·維爾特就干脆離開(kāi)該設(shè)計(jì)委員會(huì),另外在開(kāi)發(fā)出更簡(jiǎn)單的Pascal語(yǔ)言。 在這段期間被開(kāi)發(fā)出來(lái)的重要語(yǔ)言包括有:
1951 – Regional Assembly Language
1952 – Autocode
1954 – FORTRAN
1954 – IPL (LISP的先驅(qū))
1955 – FLOW-MATIC (COBOL的先驅(qū))
1957 – COMTRAN (COBOL的先驅(qū))
1958 – LISP
1958 – ALGOL 58
1959 – FACT (COBOL的先驅(qū))
1959 – COBOL
1962 – APL
1962 – Simula
1962 – SNOBOL
1963 – CPL (C的先驅(qū))
1964 – BASIC
1964 – PL/I
1967 – BCPL (C的先驅(qū))
1967-1978:確立了基礎(chǔ)范式
1960年代晚期至1970年代晚期的期間中,編程語(yǔ)言的發(fā)展也有了重大的成果。大多數(shù)現(xiàn)在所使用的主要語(yǔ)言范式都是在這段期間中發(fā)明的:
Simula,于1960年代晚期由奈加特與Dahl以Algol 60超集合的方式發(fā)展,同時(shí)也是第一個(gè)設(shè)計(jì)支援面向?qū)ο筮M(jìn)行開(kāi)發(fā)的編程語(yǔ)言。
C,于1969至1973年間由貝爾實(shí)驗(yàn)室的研究人員丹尼斯·里奇與肯·湯普遜所開(kāi)發(fā),是一種早期的系統(tǒng)程式設(shè)計(jì)(en:system programming)語(yǔ)言。
Smalltalk,于1970年代中期所開(kāi)發(fā),是一個(gè)完全從零開(kāi)始(ground-up)設(shè)計(jì)的面向?qū)ο缶幊陶Z(yǔ)言。
Prolog,于1972年由Colmerauer、Roussel,以及Kowalski所設(shè)計(jì),是第一個(gè)邏輯程式語(yǔ)言。
ML,于1973年由羅賓·米爾納所發(fā)明,是一個(gè)基于Lisp所建構(gòu)的多型(polymorphic)型態(tài)系統(tǒng),同時(shí)也是靜態(tài)型別函數(shù)編程語(yǔ)言的先驅(qū)。
這些語(yǔ)言都各自演展出自己的家族分支,現(xiàn)今多數(shù)現(xiàn)代編程語(yǔ)言的祖先都可以追朔他們其中至少一個(gè)以上。 在1960年代以及1970年代中結(jié)構(gòu)化程式設(shè)計(jì)的優(yōu)點(diǎn)也帶來(lái)許多的爭(zhēng)議,特別是在程式開(kāi)發(fā)的過(guò)程中完全不使用GOTO。這項(xiàng)爭(zhēng)議跟語(yǔ)言本身的設(shè)計(jì)非常有關(guān)系:某些語(yǔ)言并沒(méi)有包含GOTO,這也強(qiáng)迫程式設(shè)計(jì)師必須結(jié)構(gòu)化地編寫(xiě)程式。盡管這個(gè)爭(zhēng)議在當(dāng)時(shí)吵翻了天,但幾乎所有的程式設(shè)計(jì)師都同意就算語(yǔ)言本身有提供GOTO的功能,在除了少數(shù)罕見(jiàn)的情況下去使用GOTO是種不良的程序風(fēng)格。結(jié)果是之后世代的編程語(yǔ)言設(shè)計(jì)者發(fā)覺(jué)到結(jié)構(gòu)化編程語(yǔ)言的爭(zhēng)議實(shí)在既乏味又令人眼花撩亂。 在這段期間被開(kāi)發(fā)出來(lái)的重要語(yǔ)言包括有:
1968 – Logo
1970 – Pascal
1970 – Forth
1972 – C語(yǔ)言
1972 – Smalltalk
1972 – Prolog
1973 – ML
1975 – Scheme
1978 – SQL (起先只是一種查詢(xún)語(yǔ)言,擴(kuò)充之后也具備了程式結(jié)構(gòu))
1980年代:增強(qiáng)、模組、效能
1980年代的編程語(yǔ)言與之前相較顯得更為強(qiáng)大。C++合并了面向?qū)ο笠约跋到y(tǒng)程式設(shè)計(jì)。美國(guó)政府標(biāo)準(zhǔn)化一種名為Ada的系統(tǒng)編程語(yǔ)言并提供給國(guó)防承包商使用。日本以及其他地方運(yùn)用了大量的資金對(duì)采用邏輯編程語(yǔ)言結(jié)構(gòu)的第五代語(yǔ)言進(jìn)行研究。函數(shù)編程語(yǔ)言社群則把焦點(diǎn)轉(zhuǎn)移到標(biāo)準(zhǔn)化ML及Lisp身上。這些活動(dòng)都不是在開(kāi)發(fā)新的范式,而是在將上個(gè)世代發(fā)明的構(gòu)想進(jìn)一步發(fā)揚(yáng)光大。 然而,在語(yǔ)言設(shè)計(jì)上有個(gè)重大的新趨勢(shì),就是研究運(yùn)用模組或大型組織化的程式單元來(lái)進(jìn)行大型系統(tǒng)的開(kāi)發(fā)。Modula、Ada,以及ML都在1980年代發(fā)展出值得注意的模組化系統(tǒng)。模組化系統(tǒng)常拘泥于采用泛型程式設(shè)計(jì)結(jié)構(gòu):
泛型存在(generics being)
本質(zhì)(essence)
參數(shù)化模組(parameterized modules)
盡管沒(méi)有出現(xiàn)新的主要編程語(yǔ)言范式,許多研究人員仍就擴(kuò)充之前語(yǔ)言的構(gòu)想并將它們運(yùn)用到新的內(nèi)容上。舉例來(lái)說(shuō),Argus以及Emerald系統(tǒng)的語(yǔ)言配合面向?qū)ο笳Z(yǔ)言運(yùn)用到分散式系統(tǒng)上。 1980年代的編程語(yǔ)言實(shí)際情況也有所進(jìn)展。計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)中RISC假定硬件應(yīng)當(dāng)為編譯器設(shè)計(jì),而并非為人類(lèi)設(shè)計(jì)。借由中央處理器速度增快的幫助,編譯技術(shù)也越來(lái)越進(jìn)展神速,RISC的進(jìn)展對(duì)高階語(yǔ)言編譯技術(shù)發(fā)展來(lái)不小的貢獻(xiàn)。 在這段期間被開(kāi)發(fā)出來(lái)的重要語(yǔ)言包括有:
1980 – Ada
1983 – C++ (就像有類(lèi)別的C)
1984 – Common Lisp
1985 – Eiffel
1986 – Erlang
1987 – Perl
1988 – Tcl
1989 – FL (Backus)
1990年代:互聯(lián)網(wǎng)時(shí)代
1990年代未見(jiàn)到有什么重大的創(chuàng)新,大多都是以前構(gòu)想的重組或變化。這段期間主要在推動(dòng)的哲學(xué)思想是提升程式設(shè)計(jì)師的生產(chǎn)力。許多”快速應(yīng)用程式開(kāi)發(fā)” (RAD) 語(yǔ)言也應(yīng)運(yùn)而生,這些語(yǔ)言大多都有相應(yīng)的集成開(kāi)發(fā)環(huán)境、垃圾回收等機(jī)制,且大多是先前語(yǔ)言的衍生語(yǔ)言。這類(lèi)型的語(yǔ)言也大多是面向?qū)ο蟮木幊陶Z(yǔ)言,包含有Object Pascal、Visual Basic,以及C#。Java則是更加保守的語(yǔ)言,也具備垃圾回收機(jī)制。與其他類(lèi)似語(yǔ)言相比,也受到更多的觀(guān)注。新的腳本語(yǔ)言則比RAD語(yǔ)言更新更好。這種語(yǔ)言并非直接從其他語(yǔ)言衍生,而且新的語(yǔ)法更加開(kāi)放地(liberal)與功能契合。雖然腳本語(yǔ)言比RAD語(yǔ)言來(lái)的更有生產(chǎn)力,但大多會(huì)有因?yàn)樾〕淌捷^為簡(jiǎn)單,但是大型程式則難以使用腳本語(yǔ)言撰寫(xiě)并維護(hù)的顧慮[來(lái)源請(qǐng)求]。盡管如此,腳本語(yǔ)言還是網(wǎng)絡(luò)層面的應(yīng)用上大放異彩。 在這段期間被開(kāi)發(fā)出來(lái)的重要語(yǔ)言包括有:
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
現(xiàn)今的趨勢(shì)
編程語(yǔ)言持續(xù)在學(xué)術(shù)及企業(yè)兩個(gè)層面中發(fā)展進(jìn)化,目前的一些趨勢(shì)包含有:
在語(yǔ)言中增加安全性與可靠性驗(yàn)證機(jī)制:額外的堆棧檢查、資訊流(information flow)控制,以及靜態(tài)執(zhí)行緒安全。提供模組化的替代機(jī)制:混入(en:mixin)、委派(en:delegates),以及觀(guān)點(diǎn)導(dǎo)向。元件導(dǎo)向(component-oriented)軟件開(kāi)發(fā)元編程、反射或是存取抽象語(yǔ)法樹(shù)(en:Abstract syntax tree)更重視分散式及移動(dòng)式的應(yīng)用。
與數(shù)據(jù)庫(kù)的整合,包含XML及關(guān)聯(lián)式數(shù)據(jù)庫(kù)。支援使用Unicode編寫(xiě)程式,所以源代碼不會(huì)受到ASCII字符集的限制,而可以使用像是非拉丁語(yǔ)系的腳本或延伸標(biāo)點(diǎn)符號(hào)。
圖形化使用者接口所使用的XML(XUL、XAML)。在這段期間被開(kāi)發(fā)出來(lái)的重要語(yǔ)言包括有:
2001 – C#
2001 – Visual Basic .NET
2002 – F#
2003 – Scala
2003 – Factor
2006 – Windows PowerShell
2007 – Clojure
2009 – Go
從這些編程語(yǔ)言簡(jiǎn)史和人們?nèi)粘P枨?#xff0c;我們可以回答這個(gè)問(wèn)題了。所有的程序員思維都是來(lái)自于需求兩個(gè)字。隨著對(duì)現(xiàn)實(shí)信息管理的壓力太大的,我們慢慢才有計(jì)算機(jī)發(fā)明。為了,更好的管理計(jì)算機(jī),于是便有了編程語(yǔ)言,起初的語(yǔ)言,是面向機(jī)器的了,后來(lái)隨著世人更加理解的角度,就進(jìn)一步面向過(guò)程,為了使人更加理解世界萬(wàn)物,就有了面向?qū)ο蟮恼Z(yǔ)言,綜上所述,程序員的思維,從何而來(lái),從世間萬(wàn)物的需求而來(lái),從更好的解決問(wèn)題的需求而來(lái)。如果大家對(duì)Python感興趣的話(huà),可以加一下我們的學(xué)習(xí)交流摳摳群哦:649,825,285,免費(fèi)領(lǐng)取一套學(xué)習(xí)資料和視頻課程喲~
有了程序員的思維從何而來(lái)的這一個(gè)冒解決了,我們就能夠很快的回答,程序員思維你要到哪里去了?
一切程序員思維的宗旨就是,為了更好的解決問(wèn)題,更好解決需求,于是在這一光輝思想的引導(dǎo)下了,我們就發(fā)明各種各樣設(shè)計(jì)模式,為了使其代碼高內(nèi)聚低耦合,這些都是使其我們程序員花這小的代價(jià)來(lái)滿(mǎn)足最大需求。
總結(jié)
以上是生活随笔為你收集整理的程序员思维是什么?程序员思维从哪里来?程序员思维到哪里去?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第01课:深度学习概述
- 下一篇: 吴恩达《Machine Learning