冒號課堂
第一課 開班導(dǎo)言
課前導(dǎo)讀
第一課為整個課堂學(xué)習(xí)的內(nèi)容和風(fēng)格定調(diào),并圍繞三個問題進(jìn)行展開:要成為一個優(yōu)秀的程序員,最需要學(xué)習(xí)什么知識?領(lǐng)會什么思想?具備什么精神?
本課共分五節(jié)——
1.開班發(fā)言
2.首輪提問
3.語言選擇
4.初識范式
5.軟件技術(shù)
1.1開班發(fā)言——程序員的四層境界
授人以魚不如授人以漁 ——古語
關(guān)鍵詞:程序員,知識,思想,精神
摘要:對程序員的一些忠告和建議
?提問
- 軟件開發(fā)者的成長需要經(jīng)歷有哪些階段?
- 要想在IT業(yè)中生存與發(fā)展,傳統(tǒng)的學(xué)習(xí)方式是否夠用?
- 優(yōu)秀程序員應(yīng)該具備哪些素質(zhì)?
:講解
冒號開了個程序員提高班,今天迎來了首期學(xué)員,他們是問號、句號、逗號、引號和嘆號,皆為IT業(yè)的新兵。望著臺下洋溢著青春與渴望的臉龐,冒號開始了他的開班發(fā)言——
大家好!先自我介紹一下,本人姓冒名號字解之。諸位不必叫我老師,就叫老冒好了。比在座各位癡長幾歲,“老”是擔(dān)得的,“師”卻不敢妄言。在下編程多年,自覺小有所成,不敢專藏,特開此班與眾共享。雖系一家之言、一孔之見,若能拋磚引玉,又何懼方家之哂?疏謬之處,還望海涵斧正,不致自誤誤人。
客套已畢,言歸正傳。本班主要采取討論的形式,只要是軟件開發(fā)中值得討論的,但凡本人力之所及,均可共同探討。
本班的宗旨是:學(xué)會不如會學(xué),會學(xué)不如會用,會用不如被用。對于一個軟件開發(fā)者來說,這意味著四個階段:
學(xué)會(知其所然)——掌握一些具體編程知識的初級程序員
會學(xué)(知所以然)——能快速而深刻地理解技術(shù)并舉一反三的程序員
會用(人為我用)——能將所學(xué)靈活運用到實際編程設(shè)計之中的高級程序員
被用(我為人用)——能設(shè)計出廣為人用的應(yīng)用程序(application)、庫(library)、工具包(toolkit)、框架(framework)等的系統(tǒng)分析員和架構(gòu)師
至于被用的更高層次,如發(fā)明出主流的設(shè)計模式、算法、語言乃至理論等,則可稱得上計算機專家了。本班的目的,正是為各位向更高階段的提升助一臂之力。
大家可能都習(xí)慣了在小學(xué)、中學(xué)和大學(xué)里的課堂,那里的知識大多是系統(tǒng)而完備且貌似終極的,那里的學(xué)習(xí)大多是單向而被動的。但習(xí)慣并不意味著享受,更多的是因為別無選擇。你們曾被引入一座座知識殿堂,被告知它們?nèi)绾蚊垒喢缞J、巧奪天工,盡管很多時候你們或不以為然、或不解其妙,但還是不得不記下每一處被指點的細(xì)微結(jié)構(gòu)。很少有人帶你們看看當(dāng)初為建造這些殿堂而打下的地基、搭設(shè)的腳手架,哪怕只是上漆前的模樣也好,更遑論一瞻數(shù)易其稿的設(shè)計圖紙了。那些與殿堂相比顯得有些原始、甚至丑陋的東西,被有意無意地?fù)踉谝暰€之外。可沒有那些,你們將來如何為這些宮殿添磚加瓦,又如何另起樓閣呢?
中國學(xué)生恐怕是世界上最擅長考試、最習(xí)慣考試、也最厭倦考試的群體了。你們告別了學(xué)生生涯,踏上了職業(yè)之旅。首先我要恭喜你們,脫離苦海了!同時也要悲告你們,掉進(jìn)火坑了!危言聳聽嗎?如果你選擇了做程序員,你時時都得學(xué)習(xí),沒有手把手教你的老師,沒有指定的教科書和參考書,有的是層出不窮令人眼花繚亂的新概念、新技術(shù)、新問題,好不容易學(xué)到一些皮毛,有的已成明日黃花。你時時都得考試,每提交一段代碼就是上交一份答卷,你不知道什么時候、什么人會批改,直到——開發(fā)組同事發(fā)現(xiàn)你的代碼難以看懂,系統(tǒng)分析員指出你的程序不符合規(guī)范,測試工程師檢驗到你的軟件有缺陷,客戶抱怨你的產(chǎn)品太慢太難用,最后老板倒可能告訴你一個好消息:明天起放長假!
其實,又有哪行哪業(yè)的人不需要學(xué)習(xí)和考試呢?IT業(yè)只是相對更激烈、更富挑戰(zhàn)性而已。在這個瞬息萬變、適者生存的時代,如果還沿用封閉、被動的學(xué)習(xí)方式,恐有淘汰之虞。有鑒于此,本班的風(fēng)格與你們習(xí)慣的課堂有所不同:這里的知識不一定是系統(tǒng)或完備的,但一定是生動鮮活的。如果知識是水,我們要挖掘最先涌動的泉眼,還要探究最終流淌的曲線;如果知識是火,我們要捕捉起初點燃的火花,還要前瞻未來綿延的軌跡。這里的問題不一定是預(yù)設(shè)的,結(jié)論不一定是終極的,甚至不一定是正確的,但一定是有的放矢、發(fā)人深思的。由此決定了這里的學(xué)習(xí)方式將是開放多元、雙向互動的。
越是喧囂的世界,越需要寧靜的思考,讓躁動的心靈得以平息,讓蘊藏的靈性得以釋放。學(xué)習(xí)編程沒有速成大法、沒有必殺之技、沒有錦囊秘笈、沒有終南捷徑,只有思考、實踐、再思考、再實踐。中國的IT界乃至整個學(xué)術(shù)界過于浮躁和急功近利了,既盲從又自大,缺乏務(wù)實精神與研究精神、獨立精神與合作精神、批判精神與自省精神。如果一個程序員沾染這種風(fēng)氣,哪怕有再好的學(xué)習(xí)方法和學(xué)習(xí)能力,他都注定與“優(yōu)秀”絕緣。這就是本班極力倡導(dǎo)并將貫穿始終的理念——知識之上是思想,思想之上是精神。
我的開場白到此為止,現(xiàn)在把話語權(quán)交給你們,大家自由發(fā)問吧。
。總結(jié)
- 軟件開發(fā)者的成長階段:學(xué)會?會學(xué)?會用?被用。
這是一個從“知其所然”到“知所以然”、從“人為我用”到“我為人用”的歷程。
- 傳統(tǒng)的學(xué)習(xí)方式大多有如下特征:
封閉——系統(tǒng)完備的終極式知識
單向——師教生學(xué)的單向式傳輸知識
被動——師命生從的被動式接受知識
靜態(tài)——注重知識的現(xiàn)狀,而不是起源、歷程和未來發(fā)展
繼續(xù)沿襲這種學(xué)習(xí)方式,是很難在競爭日趨激烈、技術(shù)日新月異的IT業(yè)中求生存、謀發(fā)展的。開放多元、雙向互動的現(xiàn)代課堂乃大勢所趨。
一個優(yōu)秀的程序員,除了要迅速掌握知識、善于領(lǐng)悟思想外,還必須具備務(wù)實與研究精神、獨立與合作精神、批判與自省精神。
1.2首輪提問——什么語言好?
敬畏老師莫如敬畏真理 ——題記
關(guān)鍵詞:計算機語言,程序語言
摘要:討論流行的計算機語言
?提問
- 誰是你真正的老師?
- 程序員是吃青春飯的嗎?
- 計算機語言這么多,到底學(xué)哪個好?
:講解
眾人面面相覷,一陣沉默后開始竊竊私語,顯然有些不太習(xí)慣這種教學(xué)方式——筆記本上還沒寫兩個字呢,老師就把球給踢回來了。
冒號也不說話,只是微笑地望著大家。
還是問號打破僵局,開始發(fā)問:“老師——”
冒號揚手打斷他:“請不要管我叫老師,真正的老師是你自己。本班的一個特色是:師生角色模糊,大家自主學(xué)習(xí),相互啟發(fā),教學(xué)相長。”
“老冒——”問號頓了頓,全班哄堂大笑,“學(xué)軟件開發(fā),當(dāng)然得先學(xué)語言,計算機語言這么多,到底哪個好,或者說學(xué)哪個好?”
冒號笑道:“這個問題很典型,很實在,也很初級。”
問號被“初級”這個字眼刺得面上一紅。
“如果信奉流行的就是好的,那么也許可以給你一個參考答案。”冒號轉(zhuǎn)身在黑板上寫下一串清單——
Java(20.72%) C(15.38%) C++(10.72%) VB(10.49%) PHP(9.24%) Python(5.01%)
Perl(4.84%)C#(4.33%) JavaScript(3.13%) Delphi(3.06%) Ruby(2.76%) D(1.27%)
“根據(jù)TIOBE[1]截至2008年9月份的統(tǒng)計結(jié)果,選出以上流行度超過1%的12種程序語言。從中可以看出,它們的總占有率超過90%,應(yīng)該算得上是當(dāng)今主流語言的代表。盡管有人置疑TIOBE排名的權(quán)威性和合理性,但這份名單應(yīng)該還是八九不離十的。”
引號很疑惑:“怎么可能那么流行的ASP和JSP都不在其中呢?”
“對啊,”逗號附和著,“還有HTML和XML怎么不算呢?”
冒號解釋道:“ASP、JSP和PHP是動態(tài)網(wǎng)頁最流行的三種解決方案。動態(tài)網(wǎng)頁的實現(xiàn)方式很多,但它們采取的幾乎是同樣的方式——在靜態(tài)網(wǎng)頁中植入一些能在服務(wù)器端運行的代碼。在ASP和JSP中,這些代碼并不涉及新的語言,故稱之為模板、框架或腳本環(huán)境更合適些。PHP則不同,本身是一種新的程序語言,并且除了應(yīng)用于服務(wù)端外,還能編寫命令行腳本和桌面應(yīng)用程序。至于HTML和XML,還有XHTML、WML等,均為SGML(Standard Generalized Markup Language)的子集,屬于標(biāo)記語言(Markup Language)。與通常意義上的程序語言有所不同,它們是處理的對象而不是處理的主體。可以說它們更接近數(shù)據(jù)格式標(biāo)準(zhǔn),正如CSV和JSON一樣。當(dāng)然也不絕對,XSLT是一種特殊的XML,但卻包含變量定義和處理邏輯,更學(xué)術(shù)地說,它是圖靈完備的(Turing-complete)[2],應(yīng)當(dāng)屬于程序語言。”
問號殺了個回馬槍:“那CSS、RSS算是程序語言嗎?”
冒號從容作答:“與XSLT類似,CSS是一種樣式語言(Stylesheet Language),但不是以XML的形式出現(xiàn)。它將傳統(tǒng)的HTML中的樣式邏輯提煉出來,大大豐富和簡化了HTML。不過它沒有執(zhí)行指令或運算,更談不上圖靈完備,因此不屬程序語言。至于RSS,只是一種用XML來描述的數(shù)據(jù)交換規(guī)范,甚至連語言都算不上。”
嘆號也插了進(jìn)來:“近來網(wǎng)絡(luò)開發(fā)語言AJAX特別火,難道不算程序語言嗎?”
冒號搖頭道:“的確有不少人以為AJAX是一門語言,但如果知道AJAX是Asynchronous JavaScript.And XML的簡稱,便知其謬矣。事實上,它是綜合了JavaScript、XML、HTML、CSS等多種語言的一種網(wǎng)絡(luò)應(yīng)用技術(shù)。”
“就算這些不是程序語言,那也是計算機語言或者與語言密切相關(guān)的技術(shù),該學(xué)的還是得學(xué)。”句號想起問號開始問的是計算機語言,老冒有偷換概念之嫌。
“不錯,”冒號點點頭,“不僅要學(xué)語言,還要熟悉相應(yīng)的開發(fā)環(huán)境和開發(fā)工具等等,當(dāng)然最重要的是學(xué)習(xí)其中的思想。”
“唉,學(xué)完這些頭發(fā)都白了,程序員可是吃青春飯的。”嘆號嘆息道。
冒號掃視了一下,說道:“現(xiàn)在班上每個人都尊口已開,這是一個很好的開始。開放言論才能解放思想,思想解放了才能產(chǎn)生靈感和激情。缺乏靈感和激情的程序員,學(xué)習(xí)起來吃力,工作起來辛苦,最后就會感慨這是吃青春飯的職業(yè)。”
嘆號不好意思地?fù)狭藫项^。
逗號接言:“靈感嘛,偶爾也許能閃一下,激情可就難嘍!
冒號注視著他,一字一頓地說:“沒有激情作氧氣,靈感的火花注定轉(zhuǎn)瞬即滅。”
,插語
[1] TIOBE(http://www.tiobe.com)是一家評估編程語言流行度的權(quán)威機構(gòu),每月公布一次編程語言排行榜。
[2] 一個能計算出每個圖靈可計算函數(shù)(Turing-computable function)的計算系統(tǒng)被稱為圖靈完備的。一個語言是圖靈完備的,意味著該語言的計算能力與一個通用圖靈機(Universal Turing Machine)相當(dāng),這也是現(xiàn)代計算機語言所能擁有的最高能力。
。總結(jié)
- 本班倡導(dǎo)自主學(xué)習(xí)、相互啟發(fā),真正的老師不是別人,正是自己。
- 當(dāng)今主流語言的代表:Java,C,C++,VB,PHP,Python,Perl,C#,JavaScript,Delphi, Ruby和D。
- “程序員是吃青春飯的職業(yè)”出自那些缺乏靈感和激情的人之口。
1.3語言選擇——合適的就是好的
尺有所短,寸有所長 ——《楚辭》
關(guān)鍵詞:計算機語言,低級語言,高級語言,中級語言
摘要:簡要回顧計算機語言
?提問
- 語言好壞的標(biāo)準(zhǔn)是什么?
- 計算機語言的發(fā)展經(jīng)歷了哪幾個階段?
- 第四代語言和第五代語言與前三代語言相比,有什么不同?
- 什么是低級語言和高級語言?各自的特點與應(yīng)用范圍是什么?
- 為什么稱C語言為中級語言?
:講解
問號覺得自己的問題并未解決,追問:“這么多種語言,僅憑流行度就能分出主次優(yōu)劣嗎?”
“流行度當(dāng)然不是唯一的指標(biāo)。”冒號答道,“語言的主次優(yōu)劣因人而異,答案在你們自己身上。還是剛才那句話,真正的老師就是你自己。”
期待的目光如風(fēng)中之燭般開始黯淡。
冒號又道:“評書里名師授藝時,常常要徒弟自己挑選稱手的兵器。威武的刀,靈活的槍,飄逸的劍,渾厚的棍,粗獷的斧,霸道的錘,詭異的鞭,無不諳合武者的個性。評判語言優(yōu)劣,如同爭論兵器高下,倘若撇開使用的主體和對象,皆為空泛之談。”
句號若有所悟:“所以好的語言就是適合編程者和解決對象的語言。”
“非常正確!”冒號贊許道,“這就是問號同學(xué)要的答案。”
引號并不滿足:“可我記得評書里經(jīng)常描述高手的一句話:十八般兵器樣樣精通。”
冒號一笑:“兵器雖多,其理相通,高手精通多種兵器何足為奇?但如果讓趙云使錘,李元霸使槍,武力恐怕還是要大打折扣吧?”
逗號依然困惑:“我們?nèi)绾闻袛嘁环N語言是否適合自己,是否適合解決對象呢?”
冒號看出大家共同的疑惑,不緊不慢地說:“要想從中選擇,自然先得了解,不然怎知兵器稱不稱手、合不合用?現(xiàn)在進(jìn)入正題,我們先對計算機語言作個簡要的回顧。”
大伙均想,總算要撓著癢處了。
“計算機語言按其發(fā)展歷程通常分為五代。”冒號說完,在黑板上寫下——
第一代語言(1GL):機器語言
第二代語言(2GL):匯編語言——IA-32 Assembly,SPARC Assembly等
第三代語言(3GL):高級語言——Fortran,Pascal,C,Java,VB等
第四代語言(4GL):面向問題語言——SQL,SAS,SPSS等
第五代語言(5GL):人工智能語言——Prolog,Mercury,OPS5等
“誰能簡要地談?wù)勥@段歷史?”冒號又開始踢回傳球了。
“最新的兩代語言我不是特別熟悉,就說一下前幾代吧。” 一陣沉默后,引號終于毛遂自薦,“計算機語言是人用來指揮計算機的語言,而計算機只懂一種語言——由0和1組成的機器語言(machine language)。最初人們直接用這種語言下達(dá)指令,可它們實在太難記憶和閱讀了,開發(fā)和維護(hù)起來既費時又易錯,嚴(yán)重桎梏了程序員的生產(chǎn)力。后來人們發(fā)明了匯編語言(assembly language),用接近英語單詞的助記碼(mnemonic code)來代替0、1串,由助手——匯編器(assembler)將其轉(zhuǎn)化為機器語言。這些助手很稱職,但有兩個缺點:一是毫無主見,基本上只會一一對應(yīng)地翻譯,程序員必須不厭其煩地交代每一個細(xì)節(jié);二是不知變通,換種機器就傻眼了。于是人們陸續(xù)引進(jìn)了各種高級語言(high-level programming language),同時啟用更得力的助手——編譯器(compiler)和解釋器(interpreter)。這些助手除了能理解更簡潔更抽象的高級語言外,還能因地制宜地對一些指令進(jìn)行優(yōu)化處理。程序員的勞動力得以極大的解放,生產(chǎn)效率得以大幅的提升。直到現(xiàn)在,高級語言還是最主要的開發(fā)語言,包括前面提到的十二種最流行的語言。”
引號發(fā)言甫畢,冒號立即獻(xiàn)上溢美之詞:“精彩!精當(dāng)!一氣呵成!看看,你還懷疑自己不夠格作老師嗎?”
一種暈眩感向引號襲來。
冒號繼續(xù)引號的講述:“從機器語言到匯編語言、再到高級語言的演變,堪比從徒步行走到乘自行車、再到乘汽車的變革,越來越省時、省力、省心。循此方向,第四代語言更專注業(yè)務(wù)邏輯和問題領(lǐng)域。程序員主要負(fù)責(zé)分析和描述問題,不再花大量時間去考慮具體的算法和邏輯。事實上,最初提出第四代語言的概念,就是希望非專業(yè)程序員都能做應(yīng)用開發(fā)。”
逗號心下一驚:“那我等豈不是要失業(yè)了?”
冒號寬慰道:“倒不用太擔(dān)心。正如引號所說的,語言越來越高級,背后靠的是越來越能干的助手。這些助手本身就是軟件,還是需要專業(yè)程序員開發(fā)的。更何況,這種理想的全面實現(xiàn)依然任重而道遠(yuǎn)。”
問號百思莫解:“第四代語言到第五代語言的發(fā)展路線似乎不夠清晰,在邏輯上如何解釋呢?”
冒號作出解答:“第四代語言雖然足夠強大,但過于局限某些特定領(lǐng)域,基本上屬于領(lǐng)域特定語言[1](Domain Specific Language,簡稱DSL),而不是我們所熟悉的通用編程語言(General-Purpose Programming Language,簡稱GPPL)。專門用于數(shù)據(jù)庫操作的SQL、用于統(tǒng)計分析的SAS和SPSS、用于科學(xué)計算的Mathematica都是典型的第四代語言。然而一個系統(tǒng)往往橫跨多個領(lǐng)域,如果每個領(lǐng)域使用不同的語言,并且不同領(lǐng)域的語言在概念和方法上也不統(tǒng)一,必然會給集成和整合帶來的困難。第五代語言在保持第三代語言的通用性的前提下,繼承了第四代語言的優(yōu)點,即重在目標(biāo)而非過程、重在描述而非實現(xiàn)。如果把這種優(yōu)點用在汽車上,那么下一代的交通工具也許是無人駕駛的智能汽車。只要輸入目的地,它會自動通過GPS尋找最佳路徑,自動根據(jù)路況變速轉(zhuǎn)向,一直駛到終點。”
嘆號身形微顫:“坐這種車我可不放心。”
冒號一撇嘴:“這當(dāng)然只是一種假想。同樣地,第五代語言號稱人工智能語言,雖然雄心勃勃,試圖讓機器理解人類的自然語言,并且具備人類的思維能力,但目前看來這一目標(biāo)還顯得遙不可及。”
句號很贊同:“是啊,超級計算機雖然可以戰(zhàn)勝國際象棋的世界冠軍,但在圍棋上弱智得很。”
冒號提綱挈領(lǐng):“也有人簡單地將前兩代語言統(tǒng)稱為低級語言,其他的統(tǒng)稱為高級語言。語言從低級到高級,離機器語言更遠(yuǎn),離人類語言更近,因而更易讀寫、調(diào)試和維護(hù),安全性、通用性和可移植性更強,開發(fā)效率更高,更加抽象和宏觀;但同時運行速度和效率下降,用法和功能上局限性更大。如果拿兵器作比,高級語言好比長兵器,威力強大卻難免滯重,長于大型應(yīng)用,可謂‘一寸長,一寸強’;低級語言好比短兵器,輕便靈活卻難免風(fēng)險,長于底層應(yīng)用,可謂‘一寸短,一寸險’。”
大伙心里話,敢情來這兒不是學(xué)編程,是學(xué)武術(shù)的。
嘆號說道:“我看還是高級語言好,現(xiàn)在誰還學(xué)低級語言啊?”
冒號糾正道:“低級語言并不低級,只是隨著高級語言的出現(xiàn),計算機硬件性能的提高,漸漸有些邊緣化了。雖然幾乎沒有人再用機器語言編程了,匯編語言仍有其用武之地。常見的有:包括嵌入式系統(tǒng)在內(nèi)的系統(tǒng)開發(fā),如操作系統(tǒng)、編譯器、驅(qū)動程序、無線通訊、DSP、PDA、GPS等;其他對資源、性能、速度和效率極為敏感的軟件開發(fā);以信息安全、軟件維護(hù)與破解等為目的的逆向工程等等。即使你不打算從事系統(tǒng)開發(fā),也不想作紅客、黑客或駭客,掌握匯編語言對你深入了解計算機內(nèi)部運行機制、調(diào)試軟件和改進(jìn)程序中某些關(guān)鍵代碼的算法也是有幫助的。”
引號提出:“好像有些書上把C語言稱為中級語言。”
冒號答道:“這是因為C兼具高級語言和低級語言的特征。一方面它提供了高層抽象和可移植性,使程序員更多地專注問題邏輯而不是機器邏輯;另一方面它也提供諸如指針、位字段(bitfield)等工具進(jìn)行底層操作,甚至可直接內(nèi)嵌匯編代碼。C語言既簡潔靈活又高效強大,是迄今為止最具影響力的語言。幾乎所有的操作系統(tǒng)和大多數(shù)高級語言都用它來實現(xiàn),C家族的語言C、C++、Java、C#、D、Objective C等占據(jù)主流語言的半壁江山。如果再拿兵器作比,C語言就是一把劍,輕靈飄逸、銳利快捷。一名武將無論擅用什么兵器,往往都會腰懸寶劍。不會C的程序員正如不會使劍的武將,無論如何都是一種缺憾。相比之下,匯編語言就像小刀匕首,而機器語言則近乎赤手空拳了。”
句號靈光一閃:“我明白了——西門吹雪的西來一劍,那是C語言;李尋歡的小李飛刀,那是匯編語言;陸小鳳的靈犀一指,那是機器語言。”
大家會心地笑了。
逗號冷不防冒出一句:“我會跆拳道哦!”
句號一樂:“哈哈,等你打贏了陸小鳳,就封你為機器語言。”
冒號也笑言:“這位是古龍的粉絲吧?武俠小說里的俠客多輕功高絕且喜單打獨斗,故使用輕、短兵器居多;而歷史小說里的戰(zhàn)將多騎馬進(jìn)行大規(guī)模作戰(zhàn),故除了佩劍外,使用重、長兵器居多。這就是前面提到的,中低級語言更適合中小型或底層應(yīng)用,高級語言更適合大型應(yīng)用。”
眾人活躍起來,開始議論紛紛。冒號放耳聽去,凈是些古龍金庸、三國水滸里的人物情節(jié),暗想:通俗小說到底比計算機編程吸引人啊。
,插語
[1] 領(lǐng)域特定語言,簡稱DSL。它區(qū)別于通用語言,一般用于特定的問題領(lǐng)域,多屬于第四代語言。比如SQL是專門針對數(shù)據(jù)庫的語言,LaTeX是專門用于排版的語言,正則表達(dá)式(regular expression)是專門處理字符匹配的語言。
。總結(jié)
- 評判語言優(yōu)劣,不能離開使用語言的主體和對象。好的語言就是適合編程者和解決對象的語言。
- 計算機語言按其發(fā)展歷程分為五代,依次為:機器語言、匯編語言、高級語言、面向問題語言和人工智能語言。通常,前兩代統(tǒng)稱為低級語言,后面的統(tǒng)稱為高級語言。
- 第四代語言和第五代語言與前三代語言最大的不同在于:重目標(biāo)輕過程、重描述輕實現(xiàn)。
- C兼具高級語言和低級語言的特征,因此也被稱為中級語言。
- 計算機語言從低級發(fā)展到高級,漸漸遠(yuǎn)離機器,靠近人類,以犧牲部分性能和效率為代價,換來更高的開發(fā)效率和可維護(hù)性。中低級語言更適合中小型或底層應(yīng)用,高級語言更適合大型應(yīng)用。
1.4初識范式——程序王國中的世界觀與方法論
言者所以在意,得意而忘言 ——《莊子·外物》
關(guān)鍵詞:編程范式,編程語言,Object-Oriented
摘要:初步引入編程范式
?提問
- 什么是編程范式?
- 編程范式與編程語言的關(guān)系是什么?
:講解
問號第一個從小說里走出來,問道:“剛才談到了低級語言和中級語言,現(xiàn)在該談高級語言了吧?”
冒號微嘆:“高級語言大概有近千種,流行的也不下幾十種,有時候選擇過多反而無所適從啊。”
逗號不以為然:“最流行的不就那么幾個:Java、C++、C#還有VB嗎?”
不意此言遭到冒號連珠炮似的反問:“可你知道它們?yōu)槭裁磿餍袉幔渴遣皇菍W(xué)會這幾樣就是一個合格的程序員了?它們會不會變得不那么流行,甚至被其他語言取代?如果不會,為什么?如果會,又怎么辦?”
逗號赧然語塞。
冒號口氣放緩:“掌握一門語言的語法、工具和技巧固然重要,但那只相當(dāng)于學(xué)會一門兵器的招法,更重要的當(dāng)然是心法。招法重形,心法重意。得形而忘意,無異舍本逐末;得意而忘形,方能游刃有余。下面要談的就是一種心法:編程范式。”
問號不解:“編程范式?聽上去很學(xué)究,那是什么東東?”
冒號續(xù)道:“范式譯自英文的paradigm,也有譯作典范、范型、范例的。所謂編程范式(programming paradigm),指的是計算機編程的基本風(fēng)格或典范模式。借用哲學(xué)的術(shù)語,如果說每個編程者都在創(chuàng)造虛擬世界,那么編程范式就是他們置身其中自覺不自覺采用的世界觀和方法論。”
嘆號吸口氣:“好抽象哦!”
句號心中一動:“您是說我們都是虛擬世界的創(chuàng)造者,都在創(chuàng)造自己的黑客帝國?”
大家不禁莞爾。
冒號動情地說:“難道不是嗎?只不過帝國有大小之分、優(yōu)劣之別罷了。當(dāng)你編程之時,便進(jìn)入到自己創(chuàng)造的世界之中。這是你的世界,只有注入你的想象力、創(chuàng)造力和激情,它才有勃勃生機。你編寫的豈止是代碼,分明還有樂曲;你敲擊的豈止是鍵盤,分明還有琴鍵;你運行的豈止是程序,分明還有世界。當(dāng)優(yōu)美的旋律奏起,整個世界都隨之翩然起舞,一種莫可名狀的滿足是否會充溢你的全身?”
大家都被冒號詩化的語言感染了,沒想到編程也可以如此感性。
良久,引號試探地問:“面向?qū)ο缶幊叹褪且环N編程范式吧?”
冒號點頭:“不錯,它是時下最流行的一種編程范式。順便說一句,‘面向?qū)ο?#8217; 譯自Object-Oriented,但‘面向’二字令人費解。據(jù)說有本書叫‘面向?qū)ο蠓椒?#8217;,比別的計算機書都暢銷,知道為什么嗎?不少同學(xué)把它當(dāng)成戀愛指南買走了。”
全班笑倒。
冒號認(rèn)真地說:“將Object-Oriented譯成‘對象導(dǎo)向’[1],雖然稍嫌拗口,但更貼切。并非刻意要咬文嚼字,這關(guān)系到對編程范式的理解。我們知道,編程是為了解決問題,而解決問題可以有多種視角和思路,其中普適且行之有效的模式被歸結(jié)為范式。由于著眼點和思維方式的不同,相應(yīng)的范式自然各有側(cè)重和傾向,因此一些范式常用‘oriented’來描述。換言之,每種范式都引導(dǎo)人們帶著某種的傾向去分析問題、解決問題,這不就是‘導(dǎo)向’嗎?而‘面向’ 的賓語往往是預(yù)先確定的目標(biāo),如面向世界、面向未來、面向用戶、面向問題等等。此外,‘面向’強調(diào)靜態(tài)結(jié)果,而‘導(dǎo)向’強調(diào)動態(tài)趨勢,顯然后者更生動,也更符合編程的特質(zhì)[2]。”
句號一語驚人:“找對象是‘對象導(dǎo)向’的,去約會是‘面向?qū)ο?#8217;的。”
全班再倒。
句號得意地解釋:“按夢中情人的標(biāo)準(zhǔn)去找對象,目標(biāo)未定但傾向已定,這就是一種導(dǎo)向,而且是對象導(dǎo)向。找到之后再約會,不就面向?qū)ο罅藛幔?#8221;
眾人稱絕。
“我們是來談編程范式的,不是來談對象的。” 冒號一臉的道貌岸然,“編程范式是抽象的,必須通過具體的編程語言來體現(xiàn)。它代表的世界觀往往體現(xiàn)在語言的核心概念中,代表的方法論往往體現(xiàn)在語言的表達(dá)機制中。一種范式可以在不同的語言中實現(xiàn),一種語言也可以同時支持多種范式。任何語言在設(shè)計時都會傾向某些范式、同時回避某些范式,由此形成了不同的語法特征和語言風(fēng)格。”
,插語
[1]港澳臺地區(qū)將其譯為“物件導(dǎo)向”。即使單從字面上翻譯,oriented是“以...為方向的;以...為目的的;導(dǎo)向的;定向的”的意思,也比譯為“面向”更合適。
[2]作為類比,經(jīng)濟學(xué)中的“market-oriented”譯為“市場導(dǎo)向(或取向)的”的遠(yuǎn)多于譯為“面向市場的”。
。總結(jié)
- 編程范式是計算機編程中的基本風(fēng)格和典范模式,是編程者在其所創(chuàng)造的虛擬世界中自覺不自覺采用的世界觀和方法論。每種范式都引導(dǎo)人們帶著其特有的傾向和思路去分析和解決問題。OOP就是一種編程范式。
- Object-Oriented多譯作“面向?qū)ο?#8221;,不如“對象導(dǎo)向”貼切。
- 如果把一門編程語言比作兵器,它的語法、工具和技巧等是招法,它采用的編程范式則是心法。
- 抽象的編程范式需要通過具體的編程語言來體現(xiàn)。范式的世界觀體現(xiàn)在語言的核心概念之中,范式的方法論體現(xiàn)在語言的表達(dá)機制中。一種語言的語法和風(fēng)格與其所支持的編程范式密切相關(guān)。
“”參考
[1] Wikipedia.Programming paradigm.http://en.wikipedia.org/wiki/Programming_paradigm
[2] Stephen H. Kaisler.SOFTWARE PARADIGMS.New Jersey:Wiley,2005.21-22
1.5軟件技術(shù)——實用還是時髦?
借我借我一雙慧眼吧,讓我把這紛擾看得清清楚楚明明白白真真切切
——《霧里看花》
關(guān)鍵詞:編程范式,框架,設(shè)計模式,架構(gòu),庫,工具包
摘要:關(guān)于框架、設(shè)計模式、架構(gòu)和編程范式的討論
?提問
- 庫和工具包與框架有何不同?
- 什么是設(shè)計模式和架構(gòu)?
- 為什么要談編程范式,而不是框架、設(shè)計模式或者架構(gòu)?
:講解
“現(xiàn)在我們具體介紹一下編程范式。”冒號忽然頓住,隱覺一抹失望從眾人臉上掠過,問號更是欲言又止,便鼓勵他開口。
問號略顯遲疑:“您說編程范式是一種心法,那框架、設(shè)計模式還有架構(gòu)呢?”
“原來如此!”冒號心下了然,“讓我說說你們最想聽些什么吧。”
眾現(xiàn)不信之色。
冒號說道:“一種是具體而實用的,最好能立馬解決學(xué)習(xí)和工作中的問題;一種是時髦而花哨的,管他有用沒用,不學(xué)點心里就是不踏實。”
眾人雖覺此話有些尖刻,細(xì)想起來也有幾分道理,但老冒明知而不為,不走群眾路線,偏去扯什么勞什子的范式——當(dāng)然,直接談OOP倒是不錯的。
“自以為懂的未必真的懂,自以為不懂的未必真的不懂。” 冒號玩起了玄學(xué),“有些概念和技術(shù)即使背得爛熟,甚至用得爛熟,那也不代表真正掌握;有些概念和技術(shù)看起來很新奇,卻不過是新瓶裝舊酒。”
引號頗不服氣:“用得爛熟都不算掌握,難不成只有發(fā)明概念和技術(shù)才算掌握?”
“哈哈,那倒不必。”冒號笑道,“用得爛熟不等于用得恰到好處,能解決問題不等于沒有后顧之憂。”
逗號問道:“那掌握的標(biāo)準(zhǔn)是什么?”
“許多應(yīng)聘者喜歡在簡歷中言必稱精通某某語言、某某技術(shù)云云,大多不必面試即知其大言炎炎——倘若真的精通,他當(dāng)應(yīng)聘更高的職位。”冒號有感而發(fā)卻又似不著邊際,“任何概念和技術(shù)都不是孤立的,如果不能在縱向的時間和橫向的聯(lián)系中找準(zhǔn)坐標(biāo),便似那群摸象的盲人,各執(zhí)一端卻又自以為是。”
眾人心想,老冒雖言辭旦旦卻有鑿空之嫌,一節(jié)課下來,天馬行空的扯了不少,真刀真槍的一個也無,該不是只會紙上談兵吧?
句號緊扣主題:“您為何選擇談編程范式,而不是框架、設(shè)計模式還有架構(gòu)呢?難道它們真如您所說只是時髦而花哨的東西嗎?”
“我可沒這么說。”冒號矢口否認(rèn),“但在弄清一樣?xùn)|西存在的意義之前就隨眾跟風(fēng),早晚會跟丟的。我先問問你們:什么是框架(framework)?它與一般的庫(library)和工具包(toolkit)有何不同?”
引號應(yīng)答:“框架就是一組協(xié)同工作的類,它們?yōu)樘囟愋偷能浖?gòu)筑了一個可重用的設(shè)計。與庫和工具包不同之處在于前者側(cè)重設(shè)計重用而后兩者側(cè)重代碼重用。”
“嗯,有點標(biāo)準(zhǔn)答案的味道。”冒號夸道,“如果吹毛求疵的話,框架并不限于OOP,可以是協(xié)同工作的類,也可以是協(xié)同工作的函數(shù)。一個足夠復(fù)雜的應(yīng)用軟件開發(fā),為確保快速有效,通常采取的方式是:在宏觀管理上選取一些框架以控制整體的結(jié)構(gòu)和流程;在微觀實現(xiàn)上利用庫和工具包來解決具體的細(xì)節(jié)問題。框架的意義在于使設(shè)計者在特定領(lǐng)域的整體設(shè)計上不必重新發(fā)明輪子;庫和工具包的意義在于使開發(fā)者擺脫底層編碼,專注特定問題和業(yè)務(wù)邏輯。”
問號提出問題:“框架與庫和工具包看起來很相似——都是一些代碼集合,都提供一些API(應(yīng)用編程接口),是什么使得它們不同呢?”
“問得好!”冒號贊言,“框架與工具包最大的差別在截然相反的設(shè)計理念上:庫和工具包是為程序員帶來自由的,框架是為程序員帶來約束的。具體地說,庫和工具包是為程序員提供武器裝備的,框架則利用控制反轉(zhuǎn)(IoC)[1]機制實現(xiàn)對各模塊的統(tǒng)一調(diào)度從而剝奪了程序員對全局的掌控權(quán),使他們成為手執(zhí)編程武器、隨時聽候調(diào)遣的士兵。”
嘆號苦著臉:“程序員原來就是一小卒子啊!”
“哪個將軍不是從小卒做起的?”冒號反問道,“不錯,框架是在語言的語法規(guī)則之外施加于程序員的又一層枷鎖,但沒有規(guī)矩不成方圓。正如行軍打仗,講究排兵布陣,程序員就是那兵,框架就是那陣。”
句號說:“可不可以這么理解,框架就是一些人——也就是框架設(shè)計者,把一個軟件開發(fā)中最甜的部分啃掉了,剩下部分留給下面的人?”
“從某種意義上說,是這樣。”冒號點點頭。
逗號很不甘心:“我就想啃最甜的部分。”
“當(dāng)心別把牙給崩掉。”冒號笑道,“不是打擊你,首先你還沒那本事;其次即使你有本事也未必有機會;最后即使有本事也有機會,重新設(shè)計框架也未必是好的選擇。就說大名鼎鼎的Struts吧,哪怕你設(shè)計出比它更高明的框架也不會被采用,因為前者早已成為Java平臺上網(wǎng)絡(luò)開發(fā)的事實(De Facto)標(biāo)準(zhǔn),公司很容易從市場上招到懂Struts的程序員,不必培訓(xùn)即可上手,成本低見效快。過去許多公司都有自己的網(wǎng)絡(luò)框架,但最后大多都放棄了,并不是因為Struts更優(yōu)秀,而是因為它更普及。畢竟大多數(shù)軟件開發(fā)是以金錢而不是技術(shù)為中心的。”
問號提議:“您能談?wù)勗O(shè)計模式和架構(gòu)嗎?”
冒號侃侃而談:“與框架與庫和工具包不同,設(shè)計模式(design Pattern)和架構(gòu)(architecture)不是軟件產(chǎn)品,而是軟件思想。設(shè)計模式是軟件的戰(zhàn)術(shù)思想,架構(gòu)是軟件的戰(zhàn)略決策。設(shè)計模式是針對某些經(jīng)常出現(xiàn)的問題而提出的行之有效的設(shè)計解決方案,它側(cè)重思想重用,因此比框架更抽象、更普適,但多限于局部解決方案,沒有框架的整體性。與之相似的還有慣用法(idiom),也是針對常發(fā)問題的解決方案,但偏重實現(xiàn)而非設(shè)計,與實現(xiàn)語言密切相關(guān),是一種更底層更具體的編程技巧。至于架構(gòu),一般指一個軟件系統(tǒng)的最高層次的整體結(jié)構(gòu)和規(guī)劃,一個架構(gòu)可能包含多個框架,而一個框架可能包含多個設(shè)計模式。”
引號愈發(fā)疑惑:“這些不是都很重要嗎?”
“當(dāng)然都很重要。不過——”冒號話鋒一轉(zhuǎn),“在沒有打好基礎(chǔ)前,架構(gòu)只是空中樓閣,因此不可能現(xiàn)在談它。至于框架,不同的應(yīng)用領(lǐng)域有不同的框架,如表現(xiàn)層的Struts、業(yè)務(wù)層的Spring、持久層的Hibernate等等,即使相同領(lǐng)域的框架也有多個選擇,更不用說不同的語言框架還不一樣,從何談起?再說框架其實一點也不高深,完全可以無師自通,關(guān)鍵是領(lǐng)會思想,多學(xué)習(xí)多實踐。說到設(shè)計模式,一共就那么幾十個,一本‘四人幫’(GoF)[2]的書足矣,自己慢慢去啃,又何須多談?簡言之,一個談之過早,一個無從談起,一個不必多談。”
下面開始交頭接耳竊竊私語起來。
“知識的學(xué)習(xí)有幾種方式:一種靠記憶,一種靠練習(xí),一種靠培養(yǎng)。就拿英語學(xué)習(xí)來說吧,學(xué)單詞,單靠記憶即可;學(xué)句型、語法,光記憶是不夠的,需要勤加練習(xí)方可熟能生巧;而要講出地道的英語,光記憶和練習(xí)是遠(yuǎn)遠(yuǎn)不夠的。從小學(xué)到大學(xué),甚至博士畢業(yè),除了英語類專業(yè)的學(xué)生外,大多數(shù)人英語練了一二十年,水平如何?不客氣但很客觀地說:一個字,爛;兩個字,很爛;三個字,相當(dāng)爛!口語甚至連一個英語國家的三歲小孩都不如。”冒號越說越激動,“原因只有一個,那就是國內(nèi)的英語教學(xué)方式嚴(yán)重失策。教學(xué)總是圍繞單詞、詞組、句型、語法轉(zhuǎn),缺乏對語感的重視和培養(yǎng),導(dǎo)致學(xué)生只會‘中式英語’。同樣道理,一個慣用C語言編程的人也許很快就能寫一些C++程序,但如果他只注重C++的語法而不注重培養(yǎng)OOP的語感,那么寫出的程序一定是‘C式C++’。與其如此,倒不如直接用C呢。”
句號悟道:“您是想告訴我們,學(xué)習(xí)編程范式能增強編程語言的語感?”
“一語中的!”冒號慶幸總算沒有白費口舌,“語感是一個人對語言的敏銳感知力,反映了他在語言方面的整體上的直覺把握能力。語感強者,能聽弦外之音,能說雙關(guān)之語,能讀雋永之作,能寫曉暢之文。這是一種綜合的素質(zhì)和修養(yǎng),其重要性是不言而喻的。那么如何培養(yǎng)語感呢?普通的學(xué)習(xí)和訓(xùn)練固不可少,但如果忽視語言背后的文化背景和思維方式,終究只是緣木求魚。編程范式正體現(xiàn)了編程的思維方式,因而是培養(yǎng)編程語言的語感的關(guān)鍵。現(xiàn)在如果我開始介紹范式,你們還有意見嗎?”
眾人受了鼓動,個個把頭搖得跟撥浪鼓似的。
冒號語重心長地說:“既然范式關(guān)乎語感,就需要慢慢的培養(yǎng)和滲透,不可能一蹴而就,因此有些地方不太明白也沒關(guān)系。現(xiàn)在只是撒下一些種子,慢慢的會生根發(fā)芽,直至長成大樹。到那時,你們個頂個的都是內(nèi)外兼修的武林高手了。怎么樣?大家準(zhǔn)備好了嗎?”
“準(zhǔn)備好了!”眾人齊聲道,求知的目光再度點燃。
“準(zhǔn)備好了就下課吧。”冒號狡笑著,“下節(jié)課,下節(jié)課我們再談。”
,插語
[1] 控制反轉(zhuǎn)(Inversion of Control)是一種軟件設(shè)計原則。與通常的用戶代碼調(diào)用可重用的庫(library)代碼不同,IoC倒轉(zhuǎn)了控制流方向:由庫代碼調(diào)用用戶代碼。有人將此比作好萊塢法則:“不要打電話給我們,我們會打給你的”。
[2] 設(shè)計模式最經(jīng)典書籍《Design Patterns: Elements of Reusable Object-Oriented Software》的四位作者常被稱為GoF或Gang of Four。
。總結(jié)
- 庫和工具包側(cè)重代碼重用,框架側(cè)重設(shè)計重用。庫和工具包從微觀上解決具體問題,是為程序員帶來自由的;框架從宏觀上控制軟件整體的結(jié)構(gòu)和流程,是為程序員帶來約束的。框架是通過控制反轉(zhuǎn)(IoC)機制反客為主的。
- 設(shè)計模式是軟件的戰(zhàn)術(shù)思想,架構(gòu)是軟件的戰(zhàn)略決策。與框架、庫和工具包不同,它們不是軟件產(chǎn)品,而是軟件思想。
- 設(shè)計模式與慣用法都是針對常發(fā)問題的解決方案,但前者偏重設(shè)計,后者偏重實現(xiàn)。
- 架構(gòu)太高,談之過早;框架太多,無從談起;設(shè)計模式太少,不必多談。至于編程范式,對培養(yǎng)編程語言的語感至關(guān)重要,需要充分的重視和長期的積累,方能悟其精髓。
“”參考
[1] Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides.Design Patterns: Elements of Reusable Object-Oriented Software.Boston:Addison-Wesley,1994.26-28
課后思考
- 作為一個軟件開發(fā)者,你現(xiàn)在處于哪個階段?你未來的目標(biāo)是什么?
- 傳統(tǒng)的學(xué)習(xí)方式的弊端在哪里?你是否有切膚之痛?
- 你認(rèn)為一個優(yōu)秀的程序員需要具備什么素質(zhì)和精神?
- 你了解哪些計算機語言?你對一門語言的取舍與喜惡的根據(jù)是什么?
- 你認(rèn)為計算機語言未來的發(fā)展方向是什么?
- 你能否在編程中感受到自己的激情和靈性?
- 你了解哪些框架?它們的應(yīng)用范圍是什么?實現(xiàn)的機理是什么?
- 你了解哪些設(shè)計模式?它們?yōu)槭裁茨艹善錇槟J剑?/span>
- 學(xué)習(xí)編程范式的意義何在?