程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 冒號課堂§1.0:開班導言

冒號課堂§1.0:開班導言

編輯:關於JAVA

第一課 開班導言

課前導讀

第一課為整個課堂學習的內容和風格定調,並圍繞三個問題進行展開:要成為一個優秀的程序員,最需要學習什麼知識?領會什麼思想?具備什麼精神?

本課共分五節——

1.開班發言

2.首輪提問

3.語言選擇

4.初識范式

5.軟件技術

1.1開班發言——程序員的四層境界

授人以魚不如授人以漁             ——古語

關鍵詞:程序員,知識,思想,精神

摘要:對程序員的一些忠告和建議

?提問

軟件開發者的成長需要經歷有哪些階段?

要想在IT業中生存與發展,傳統的學習方式是否夠用?

優秀程序員應該具備哪些素質?

:講解

冒號開了個程序員提高班,今天迎來了首期學員,他們是問號、句號、逗號、引號和歎號,皆為IT業的新兵。望著台下洋溢著青春與渴望的臉龐,冒號開始了他的開班發言——

大家好!先自我介紹一下,本人姓冒名號字解之。諸位不必叫我老師,就叫老冒好了。比在座各位癡長幾歲,“老”是擔得的,“師”卻不敢妄言。在下編程多年,自覺小有所成,不敢專藏,特開此班與眾共享。雖系一家之言、一孔之見,若能拋磚引玉,又何懼方家之哂?疏謬之處,還望海涵斧正,不致自誤誤人。

客套已畢,言歸正傳。本班主要采取討論的形式,只要是軟件開發中值得討論的,但凡本人力之所及,均可共同探討。

本班的宗旨是:學會不如會學,會學不如會用,會用不如被用。對於一個軟件開發者來說,這意味著四個階段:

學會(知其所然)——掌握一些具體編程知識的初級程序員

會學(知所以然)——能快速而深刻地理解技術並舉一反三的程序員

會用(人為我用)——能將所學靈活運用到實際編程設計之中的高級程序員

被用(我為人用)——能設計出廣為人用的應用程序(application)、庫(library)、工具包(toolkit)、框架(framework)等的系統分析員和架構師

至於被用的更高層次,如發明出主流的設計模式、算法、語言乃至理論等,則可稱得上計算機專家了。本班的目的,正是為各位向更高階段的提升助一臂之力。

大家可能都習慣了在小學、中學和大學裡的課堂,那裡的知識大多是系統而完備且貌似終極的,那裡的學習大多是單向而被動的。但習慣並不意味著享受,更多的是因為別無選擇。你們曾被引入一座座知識殿堂,被告知它們如何美輪美奂、巧奪天工,盡管很多時候你們或不以為然、或不解其妙,但還是不得不記下每一處被指點的細微結構。很少有人帶你們看看當初為建造這些殿堂而打下的地基、搭設的腳手架,哪怕只是上漆前的模樣也好,更遑論一瞻數易其稿的設計圖紙了。那些與殿堂相比顯得有些原始、甚至丑陋的東西,被有意無意地擋在視線之外。可沒有那些,你們將來如何為這些宮殿添磚加瓦,又如何另起樓閣呢?

中國學生恐怕是世界上最擅長考試、最習慣考試、也最厭倦考試的群體了。你們告別了學生生涯,踏上了職業之旅。首先我要恭喜你們,脫離苦海了!同時也要悲告你們,掉進火坑了!危言聳聽嗎?如果你選擇了做程序員,你時時都得學習,沒有手把手教你的老師,沒有指定的教科書和參考書,有的是層出不窮令人眼花缭亂的新概念、新技術、新問題,好不容易學到一些皮毛,有的已成明日黃花。你時時都得考試,每提交一段代碼就是上交一份答卷,你不知道什麼時候、什麼人會批改,直到——開發組同事發現你的代碼難以看懂,系統分析員指出你的程序不符合規范,測試工程師檢驗到你的軟件有缺陷,客戶抱怨你的產品太慢太難用,最後老板倒可能告訴你一個好消息:明天起放長假!

其實,又有哪行哪業的人不需要學習和考試呢?IT業只是相對更激烈、更富挑戰性而已。在這個瞬息萬變、適者生存的時代,如果還沿用封閉、被動的學習方式,恐有淘汰之虞。有鑒於此,本班的風格與你們習慣的課堂有所不同:這裡的知識不一定是系統或完備的,但一定是生動鮮活的。如果知識是水,我們要挖掘最先湧動的泉眼,還要探究最終流淌的曲線;如果知識是火,我們要捕捉起初點燃的火花,還要前瞻未來綿延的軌跡。這裡的問題不一定是預設的,結論不一定是終極的,甚至不一定是正確的,但一定是有的放矢、發人深思的。由此決定了這裡的學習方式將是開放多元、雙向互動的。

越是喧囂的世界,越需要寧靜的思考,讓躁動的心靈得以平息,讓蘊藏的靈性得以釋放。學習編程沒有速成大法、沒有必殺之技、沒有錦囊秘笈、沒有終南捷徑,只有思考、實踐、再思考、再實踐。中國的IT界乃至整個學術界過於浮躁和急功近利了,既盲從又自大,缺乏務實精神與研究精神、獨立精神與合作精神、批判精神與自省精神。如果一個程序員沾染這種風氣,哪怕有再好的學習方法和學習能力,他都注定與“優秀”絕緣。這就是本班極力倡導並將貫穿始終的理念——知識之上是思想,思想之上是精神。

我的開場白到此為止,現在把話語權交給你們,大家自由發問吧。

。總結

軟件開發者的成長階段:學會?會學?會用?被用。

這是一個從“知其所然”到“知所以然”、從“人為我用”到“我為人用”的歷程。

傳統的學習方式大多有如下特征:

封閉——系統完備的終極式知識

單向——師教生學的單向式傳輸知識

被動——師命生從的被動式接受知識

靜態——注重知識的現狀,而不是起源、歷程和未來發展

繼續沿襲這種學習方式,是很難在競爭日趨激烈、技術日新月異的IT業中求生存、謀發展的。開放多元、雙向互動的現代課堂乃大勢所趨。

“知識之上是思想,思想之上是精神。”

一個優秀的程序員,除了要迅速掌握知識、善於領悟思想外,還必須具備務實與研究精神、獨立與合作精神、批判與自省精神。

1.2首輪提問——什麼語言好?

敬畏老師莫如敬畏真理                     ——題記

關鍵詞:計算機語言,程序語言

摘要:討論流行的計算機語言

?提問

誰是你真正的老師?

程序員是吃青春飯的嗎?

計算機語言這麼多,到底學哪個好?

:講解

眾人面面相觑,一陣沉默後開始竊竊私語,顯然有些不太習慣這種教學方式——筆記本上還沒寫兩個字呢,老師就把球給踢回來了。

冒號也不說話,只是微笑地望著大家。

還是問號打破僵局,開始發問:“老師——”

冒號揚手打斷他:“請不要管我叫老師,真正的老師是你自己。本班的一個特色是:師生角色模糊,大家自主學習,相互啟發,教學相長。”

“老冒——”問號頓了頓,全班哄堂大笑,“學軟件開發,當然得先學語言,計算機語言這麼多,到底哪個好,或者說學哪個好?”

冒號笑道:“這個問題很典型,很實在,也很初級。”

問號被“初級”這個字眼刺得面上一紅。

“如果信奉流行的就是好的,那麼也許可以給你一個參考答案。”冒號轉身在黑板上寫下一串清單-——

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%)

“根據TIOBE[1]截至2008年9月份的統計結果,選出以上流行度超過1%的12種程序語言。從中可以看出,它們的總占有率超過90%,應該算得上是當今主流語言的代表。盡管有人置疑TIOBE排名的權威性和合理性,但這份名單應該還是八九不離十的。”

引號很疑惑:“怎麼可能那麼流行的ASP和JSP都不在其中呢?”

“對啊,”逗號附和著,“還有HTML和XML怎麼不算呢?”

冒號解釋道:“ASP、JSP和PHP是動態網頁最流行的三種解決方案。動態網頁的實現方式很多,但它們采取的幾乎是同樣的方式——在靜態網頁中植入一些能在服務器端運行的代碼。在ASP和JSP中,這些代碼並不涉及新的語言,故稱之為模板、框架或腳本環境更合適些。PHP則不同,本身是一種新的程序語言,並且除了應用於服務端外,還能編寫命令行腳本和桌面應用程序。至於HTML和XML,還有XHTML、WML等,均為SGML(Standard Generalized Markup Language)的子集,屬於標記語言(Markup Language)。與通常意義上的程序語言有所不同,它們是處理的對象而不是處理的主體。可以說它們更接近數據格式標准,正如CSV和JSON一樣。當然也不絕對,XSLT是一種特殊的XML,但卻包含變量定義和處理邏輯,更學術地說,它是圖靈完備的(Turing-complete)[2],應當屬於程序語言。”

問號殺了個回馬槍:“那CSS、RSS算是程序語言嗎?”

冒號從容作答:“與XSLT類似,CSS是一種樣式語言(Stylesheet Language),但不是以XML的形式出現。它將傳統的HTML中的樣式邏輯提煉出來,大大豐富和簡化了HTML。不過它沒有執行指令或運算,更談不上圖靈完備,因此不屬程序語言。至於RSS,只是一種用XML來描述的數據交換規范,甚至連語言都算不上。”

歎號也插了進來:“近來網絡開發語言AJAX特別火,難道不算程序語言嗎?”

冒號搖頭道:“的確有不少人以為AJAX是一門語言,但如果知道AJAX是Asynchronous JavaScript.And XML的簡稱,便知其謬矣。事實上,它是綜合了JavaScript、XML、HTML、CSS等多種語言的一種網絡應用技術。”

“就算這些不是程序語言,那也是計算機語言或者與語言密切相關的技術,該學的還是得學。”句號想起問號開始問的是計算機語言,老冒有偷換概念之嫌。

“不錯,”冒號點點頭,“不僅要學語言,還要熟悉相應的開發環境和開發工具等等,當然最重要的是學習其中的思想。”

“唉,學完這些頭發都白了,程序員可是吃青春飯的。”歎號歎息道。

冒號掃視了一下,說道:“現在班上每個人都尊口已開,這是一個很好的開始。開放言論才能解放思想,思想解放了才能產生靈感和激情。缺乏靈感和激情的程序員,學習起來吃力,工作起來辛苦,最後就會感慨這是吃青春飯的職業。”

歎號不好意思地撓了撓頭。

逗號接言:“靈感嘛,偶爾也許能閃一下,激情可就難喽!

冒號注視著他,一字一頓地說:“沒有激情作氧氣,靈感的火花注定轉瞬即滅。”

,插語

[1] TIOBE(http://www.tiobe.com)是一家評估編程語言流行度的權威機構,每月公布一次編程語言排行榜。

[2] 一個能計算出每個圖靈可計算函數(Turing-computable function)的計算系統被稱為圖靈完備的。一個語言是圖靈完備的,意味著該語言的計算能力與一個通用圖靈機(Universal Turing Machine)相當,這也是現代計算機語言所能擁有的最高能力。

。總結

本班倡導自主學習、相互啟發,真正的老師不是別人,正是自己。

當今主流語言的代表:Java,C,C++,VB,PHP,Python,Perl,C#,JavaScript,Delphi, Ruby和D。

“程序員是吃青春飯的職業”出自那些缺乏靈感和激情的人之口。

1.3 語言選擇——合適的就是好的

尺有所短,寸有所長                   ——《楚辭》

關鍵詞:計算機語言,低級語言,高級語言,中級語言

摘要:簡要回顧計算機語言

?提問

語言好壞的標准是什麼?

計算機語言的發展經歷了哪幾個階段?

第四代語言和第五代語言與前三代語言相比,有什麼不同?

什麼是低級語言和高級語言?各自的特點與應用范圍是什麼?

為什麼稱C語言為中級語言?

:講解

問號覺得自己的問題並未解決,追問:“這麼多種語言,僅憑流行度就能分出主次優劣嗎?”

“流行度當然不是唯一的指標。”冒號答道,“語言的主次優劣因人而異,答案在你們自己身上。還是剛才那句話,真正的老師就是你自己。”

期待的目光如風中之燭般開始黯淡。

冒號又道:“評書裡名師授藝時,常常要徒弟自己挑選稱手的兵器。威武的刀,靈活的槍,飄逸的劍,渾厚的棍,粗犷的斧,霸道的錘,詭異的鞭,無不谙合武者的個性。評判語言優劣,如同爭論兵器高下,倘若撇開使用的主體和對象,皆為空泛之談。”

句號若有所悟:“所以好的語言就是適合編程者和解決對象的語言。”

“非常正確!”冒號贊許道,“這就是問號同學要的答案。”

引號並不滿足:“可我記得評書裡經常描述高手的一句話-:十八般兵器樣樣精通。”

冒號一笑:“兵器雖多,其理相通,高手精通多種兵器何足為奇?但如果讓趙雲使錘,李元霸使槍,武力恐怕還是要大打折扣吧?”

逗號依然困惑:“我們如何判斷一種語言是否適合自己,是否適合解決對象呢?”

冒號看出大家共同的疑惑,不緊不慢地說:“要想從中選擇,自然先得了解,不然怎知兵器稱不稱手、合不合用?現在進入正題,我們先對計算機語言作個簡要的回顧。”

大伙均想,總算要撓著癢處了。

“計算機語言按其發展歷程通常分為五代。”冒號說完,在黑板上寫下——

第一代語言(1GL):機器語言

第二代語言(2GL):匯編語言——IA-32 Assembly,SPARC Assembly等

第三代語言(3GL):高級語言——Fortran,Pascal,C,Java,VB等

第四代語言(4GL):面向問題語言-——SQL,SAS,SPSS等

第五代語言(5GL):人工智能語言——Prolog,Mercury,OPS5等

“誰能簡要地談談這段歷史?”冒號又開始踢回傳球了。

“最新的兩代語言我不是特別熟悉,就說一下前幾代吧。” 一陣沉默後,引號終於毛遂自薦,“計算機語言是人用來指揮計算機的語言,而計算機只懂一種語言——由0和1組成的機器語言(machine language)。最初人們直接用這種語言下達指令,可它們實在太難記憶和閱讀了,開發和維護起來既費時又易錯,嚴重桎梏了程序員的生產力。後來人們發明了匯編語言(assembly language),用接近英語單詞的助記碼(mnemonic code)來代替0、1串,由助手——匯編器(assembler)將其轉化為機器語言。這些助手很稱職,但有兩個缺點:一是毫無主見,基本上只會一一對應地翻譯,程序員必須不厭其煩地交代每一個細節;二是不知變通,換種機器就傻眼了。於是人們陸續引進了各種高級語言(high-level programming language),同時啟用更得力的助手——編譯器(compiler)和解釋器(interpreter)。這些助手除了能理解更簡潔更抽象的高級語言外,還能因地制宜地對一些指令進行優化處理。程序員的勞動力得以極大的解放,生產效率得以大幅的提升。直到現在,高級語言還是最主要的開發語言,包括前面提到的十二種最流行的語言。”

引號發言甫畢,冒號立即獻上溢美之詞:“精彩!精當!一氣呵成!看看,你還懷疑自己不夠格作老師嗎?”

一種暈眩感向引號襲來。

冒號繼續引號的講述:“從機器語言到匯編語言、再到高級語言的演變,堪比從徒步行走到乘自行車、再到乘汽車的變革,越來越省時、省力、省心。循此方向,第四代語言更專注業務邏輯和問題領域。程序員主要負責分析和描述問題,不再花大量時間去考慮具體的算法和邏輯。事實上,最初提出第四代語言的概念,就是希望非專業程序員都能做應用開發。”

逗號心下一驚:“那我等豈不是要失業了?”

冒號寬慰道:“倒不用太擔心。正如引號所說的,語言越來越高級,背後靠的是越來越能干的助手。這些助手本身就是軟件,還是需要專業程序員開發的。更何況,這種理想的全面實現依然任重而道遠。”

問號百思莫解:“第四代語言到第五代語言的發展路線似乎不夠清晰,在邏輯上如何解釋呢?”

冒號作出解答:“第四代語言雖然足夠強大,但過於局限某些特定領域,基本上屬於領域特定語言[1](Domain Specific Language,簡稱DSL),而不是我們所熟悉的通用編程語言(General-Purpose Programming Language,簡稱GPPL)。專門用於數據庫操作的SQL、用於統計分析的SAS和SPSS、用於科學計算的Mathematica都是典型的第四代語言。然而一個系統往往橫跨多個領域,如果每個領域使用不同的語言,並且不同領域的語言在概念和方法上也不統一,必然會給集成和整合帶來的困難。第五代語言在保持第三代語言的通用性的前提下,繼承了第四代語言的優點,即重在目標而非過程、重在描述而非實現。如果把這種優點用在汽車上,那麼下一代的交通工具也許是無人駕駛的智能汽車。只要輸入目的地,它會自動通過GPS尋找最佳路徑,自動根據路況變速轉向,一直駛到終點。”

歎號身形微顫:“坐這種車我可不放心。”

冒號一撇嘴:“這當然只是一種假想。同樣地,第五代語言號稱人工智能語言,雖然雄心勃勃,試圖讓機器理解人類的自然語言,並且具備人類的思維能力,但目前看來這一目標還顯得遙不可及。”

句號很贊同:“是啊,超級計算機雖然可以戰勝國際象棋的世界冠軍,但在圍棋上弱智得很。”

冒號提綱挈領:“也有人簡單地將前兩代語言統稱為低級語言,其他的統稱為高級語言。語言從低級到高級,離機器語言更遠,離人類語言更近,因而更易讀寫、調試和維護,安全性、通用性和可移植性更強,開發效率更高,更加抽象和宏觀;但同時運行速度和效率下降,用法和功能上局限性更大。如果拿兵器作比,高級語言好比長兵器,威力強大卻難免滯重,長於大型應用,可謂‘一寸長,一寸強’;低級語言好比短兵器,輕便靈活卻難免風險,長於底層應用,可謂‘一寸短,一寸險’。”

大伙心裡話,敢情來這兒不是學編程,是學武術的。

歎號說道:“我看還是高級語言好,現在誰還學低級語言啊?”

冒號糾正道:“低級語言並不低級,只是隨著高級語言的出現,計算機硬件性能的提高,漸漸有些邊緣化了。雖然幾乎沒有人再用機器語言編程了,匯編語言仍有其用武之地。常見的有:包括嵌入式系統在內的系統開發,如操作系統、編譯器、驅動程序、無線通訊、DSP、PDA、GPS等;其他對資源、性能、速度和效率極為敏感的軟件開發;以信息安全、軟件維護與破解等為目的的逆向工程等等。即使你不打算從事系統開發,也不想作紅客、黑客或駭客,掌握匯編語言對你深入了解計算機內部運行機制、調試軟件和改進程序中某些關鍵代碼的算法也是有幫助的。”

引號提出:“好像有些書上把C語言稱為中級語言。”

冒號答道:“這是因為C兼具高級語言和低級語言的特征。一方面它提供了高層抽象和可移植性,使程序員更多地專注問題邏輯而不是機器邏輯;另一方面它也提供諸如指針、位字段(bitfield)等工具進行底層操作,甚至可直接內嵌匯編代碼。C語言既簡潔靈活又高效強大,是迄今為止最具影響力的語言。幾乎所有的操作系統和大多數高級語言都用它來實現,C家族的語言C、C++、Java、C#、D、Objective C等占據主流語言的半壁江山。如果再拿兵器作比,C語言就是一把劍,輕靈飄逸、銳利快捷。一名武將無論擅用什麼兵器,往往都會腰懸寶劍。不會C的程序員正如不會使劍的武將,無論如何都是一種缺憾。相比之下,匯編語言就像小刀匕首,而機器語言則近乎赤手空拳了。”

句號靈光一閃:“我明白了——西門吹雪的西來一劍,那是C語言;李尋歡的小李飛刀,那是匯編語言;陸小鳳的靈犀一指,那是機器語言。”

大家會心地笑了。

逗號冷不防冒出一句:“我會跆拳道哦!”

句號一樂:“哈哈,等你打贏了陸小鳳,就封你為機器語言。”

冒號也笑言:“這位是古龍的粉絲吧?武俠小說裡的俠客多輕功高絕且喜單打獨斗,故使用輕、短兵器居多;而歷史小說裡的戰將多騎馬進行大規模作戰,故除了佩劍外,使用重、長兵器居多。這就是前面提到的,中低級語言更適合中小型或底層應用,高級語言更適合大型應用。”

眾人活躍起來,開始議論紛紛。冒號放耳聽去,淨是些古龍金庸、三國水浒裡的人物情節,暗想:通俗小說到底比計算機編程吸引人啊。

,插語

[1] 領域特定語言,簡稱DSL。它區別於通用語言,一般用於特定的問題領域,多屬於第四代語言。比如SQL是專門針對數據庫的語言,LaTeX是專門用於排版的語言,正則表達式(regular expression)是專門處理字符匹配的語言。

。總結

評判語言優劣,不能離開使用語言的主體和對象。好的語言就是適合編程者和解決對象的語言。

計算機語言按其發展歷程分為五代,依次為:機器語言、匯編語言、高級語言、面向問題語言和人工智能語言。通常,前兩代統稱為低級語言,後面的統稱為高級語言。

第四代語言和第五代語言與前三代語言最大的不同在於:重目標輕過程、重描述輕實現。

C兼具高級語言和低級語言的特征,因此也被稱為中級語言。

計算機語言從低級發展到高級,漸漸遠離機器,靠近人類,以犧牲部分性能和效率為代價,換來更高的開發效率和可維護性。中低級語言更適合中小型或底層應用,高級語言更適合大型應用。

1.4 初識范式——程序王國中的世界觀與方法論

言者所以在意,得意而忘言                ——《莊子·外物》

關鍵詞:編程范式,編程語言,Object-Oriented

摘要:初步引入編程范式

?提問

什麼是編程范式?

編程范式與編程語言的關系是什麼?

:講解

問號第一個從小說裡走出來,問道:“剛才談到了低級語言和中級語言,現在該談高級語言了吧?”

冒號微歎:“高級語言大概有近千種,流行的也不下幾十種,有時候選擇過多反而無所適從啊。”

逗號不以為然:“最流行的不就那麼幾個:Java、C++、C#還有VB嗎?”

不意此言遭到冒號連珠炮似的反問:“可你知道它們為什麼會流行嗎?是不是學會這幾樣就是一個合格的程序員了?它們會不會變得不那麼流行,甚至被其他語言取代?如果不會,為什麼?如果會,又怎麼辦?”

逗號赧然語塞。

冒號口氣放緩:“掌握一門語言的語法、工具和技巧固然重要,但那只相當於學會一門兵器的招法,更重要的當然是心法。招法重形,心法重意。得形而忘意,無異捨本逐末;得意而忘形,方能游刃有余。下面要談的就是一種心法:編程范式。”

問號不解:“編程范式?聽上去很學究,那是什麼東東?”

冒號續道:“范式譯自英文的paradigm,也有譯作典范、范型、范例的。所謂編程范式(programming paradigm),指的是計算機編程的基本風格或典范模式。借用哲學的術語,如果說每個編程者都在創造虛擬世界,那麼編程范式就是他們置身其中自覺不自覺采用的世界觀和方法論。”

歎號吸口氣:“好抽象哦!”

句號心中一動:“您是說我們都是虛擬世界的創造者,都在創造自己的黑客帝國?”

大家不禁莞爾。

冒號動情地說:“難道不是嗎?只不過帝國有大小之分、優劣之別罷了。當你編程之時,便進入到自己創造的世界之中。這是你的世界,只有注入你的想象力、創造力和激情,它才有勃勃生機。你編寫的豈止是代碼,分明還有樂曲;你敲擊的豈止是鍵盤,分明還有琴鍵;你運行的豈止是程序,分明還有世界。當優美的旋律奏起,整個世界都隨之翩然起舞,一種莫可名狀的滿足是否會充溢你的全身?”

大家都被冒號詩化的語言感染了,沒想到編程也可以如此感性。

良久,引號試探地問:“面向對象編程就是一種編程范式吧?”

冒號點頭:“不錯,它是時下最流行的一種編程范式。順便說一句,‘面向對象’ 譯自Object-Oriented,但‘面向’二字令人費解。據說有本書叫‘面向對象方法’,比別的計算機書都暢銷,知道為什麼嗎?不少同學把它當成戀愛指南買走了。”

全班笑倒。

冒號認真地說:“將Object-Oriented譯成‘對象導向’[1],雖然稍嫌拗口,但更貼切。並非刻意要咬文嚼字,這關系到對編程范式的理解。我們知道,編程是為了解決問題,而解決問題可以有多種視角和思路,其中普適且行之有效的模式被歸結為范式。由於著眼點和思維方式的不同,相應的范式自然各有側重和傾向,因此一些范式常用‘oriented’來描述。換言之,每種范式都引導人們帶著某種的傾向去分析問題、解決問題,這不就是‘導向’嗎?而‘面向’ 的賓語往往是預先確定的目標,如面向世界、面向未來、面向用戶、面向問題等等。此外,‘面向’強調靜態結果,而‘導向’強調動態趨勢,顯然後者更生動,也更符合編程的特質[2]。”

句號一語驚人:“找對象是‘對象導向’的,去約會是‘面向對象’的。”

全班再倒。

句號得意地解釋:“按夢中情人的標准去找對象,目標未定但傾向已定,這就是一種導向,而且是對象導向。找到之後再約會,不就面向對象了嗎?”

眾人稱絕。

“我們是來談編程范式的,不是來談對象的。” 冒號一臉的道貌岸然,“編程范式是抽象的,必須通過具體的編程語言來體現。它代表的世界觀往往體現在語言的核心概念中,代表的方法論往往體現在語言的表達機制中。一種范式可以在不同的語言中實現,一種語言也可以同時支持多種范式。任何語言在設計時都會傾向某些范式、同時回避某些范式,由此形成了不同的語法特征和語言風格。”

,插語

[1]港澳台地區將其譯為“物件導向”。即使單從字面上翻譯,oriented是“以...為方向的;以...為目的的;導向的;定向的”的意思,也比譯為“面向”更合適。

[2]作為類比,經濟學中的“market-oriented”譯為“市場導向(或取向)的”的遠多於譯為“面向市場的”。

。總結

編程范式是計算機編程中的基本風格和典范模式,是編程者在其所創造的虛擬世界中自覺不自覺采用的世界觀和方法論。每種范式都引導人們帶著其特有的傾向和思路去分析和解決問題。OOP就是一種編程范式。

Object-Oriented多譯作“面向對象”,不如“對象導向”貼切。

如果把一門編程語言比作兵器,它的語法、工具和技巧等是招法,它采用的編程范式則是心法。

抽象的編程范式需要通過具體的編程語言來體現。范式的世界觀體現在語言的核心概念之中,范式的方法論體現在語言的表達機制中。一種語言的語法和風格與其所支持的編程范式密切相關。

“”參考

[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軟件技術——實用還是時髦?

借我借我一雙慧眼吧,讓我把這紛擾看得清清楚楚明明白白真真切切

——《霧裡看花》

關鍵詞:編程范式,框架,設計模式,架構,庫,工具包

摘要:關於框架、設計模式、架構和編程范式的討論

?提問

庫和工具包與框架有何不同?

什麼是設計模式和架構?

為什麼要談編程范式,而不是框架、設計模式或者架構? 

:講解

“現在我們具體介紹一下編程范式。”冒號忽然頓住,隱覺一抹失望從眾人臉上掠過,問號更是欲言又止,便鼓勵他開口。

問號略顯遲疑:“您說編程范式是一種心法,那框架、設計模式還有架構呢?”

“原來如此!”冒號心下了然,“讓我說說你們最想聽些什麼吧。”

眾現不信之色。

冒號說道:“一種是具體而實用的,最好能立馬解決學習和工作中的問題;一種是時髦而花哨的,管他有用沒用,不學點心裡就是不踏實。”

眾人雖覺此話有些尖刻,細想起來也有幾分道理,但老冒明知而不為,不走群眾路線,偏去扯什麼勞什子的范式——當然,直接談OOP倒是不錯的。

“自以為懂的未必真的懂,自以為不懂的未必真的不懂。” 冒號玩起了玄學,“有些概念和技術即使背得爛熟,甚至用得爛熟,那也不代表真正掌握;有些概念和技術看起來很新奇,卻不過是新瓶裝舊酒。”

引號頗不服氣:“用得爛熟都不算掌握,難不成只有發明概念和技術才算掌握?”

“哈哈,那倒不必。”冒號笑道,“用得爛熟不等於用得恰到好處,能解決問題不等於沒有後顧之憂。”

逗號問道:“那掌握的標准是什麼?”

“許多應聘者喜歡在簡歷中言必稱精通某某語言、某某技術雲雲,大多不必面試即知其大言炎炎——倘若真的精通,他當應聘更高的職位。”冒號有感而發卻又似不著邊際,“任何概念和技術都不是孤立的,如果不能在縱向的時間和橫向的聯系中找准坐標,便似那群摸象的盲人,各執一端卻又自以為是。”

眾人心想,老冒雖言辭旦旦卻有鑿空之嫌,一節課下來,天馬行空的扯了不少,真刀真槍的一個也無,該不是只會紙上談兵吧?

句號緊扣主題:“您為何選擇談編程范式,而不是框架、設計模式還有架構呢?難道它們真如您所說只是時髦而花哨的東西嗎?”

“我可沒這麼說。”冒號矢口否認,“但在弄清一樣東西存在的意義之前就隨眾跟風,早晚會跟丟的。我先問問你們:什麼是框架(framework)?它與一般的庫(library)和工具包(toolkit)有何不同?”

引號應答:“框架就是一組協同工作的類,它們為特定類型的軟件構築了一個可重用的設計。與庫和工具包不同之處在於前者側重設計重用而後兩者側重代碼重用。”

“嗯,有點標准答案的味道。”冒號誇道,“如果吹毛求疵的話,框架並不限於OOP,可以是協同工作的類,也可以是協同工作的函數。一個足夠復雜的應用軟件開發,為確保快速有效,通常采取的方式是:在宏觀管理上選取一些框架以控制整體的結構和流程;在微觀實現上利用庫和工具包來解決具體的細節問題。框架的意義在於使設計者在特定領域的整體設計上不必重新發明輪子;庫和工具包的意義在於使開發者擺脫底層編碼,專注特定問題和業務邏輯。”

問號提出問題:“框架與庫和工具包看起來很相似——都是一些代碼集合,都提供一些API(應用編程接口),是什麼使得它們不同呢?”

“問得好!”冒號贊言,“框架與工具包最大的差別在截然相反的設計理念上:庫和工具包是為程序員帶來自由的,框架是為程序員帶來約束的。具體地說,庫和工具包是為程序員提供武器裝備的,框架則利用控制反轉(IoC)[1]機制實現對各模塊的統一調度從而剝奪了程序員對全局的掌控權,使他們成為手執編程武器、隨時聽候調遣的士兵。”

歎號苦著臉:“程序員原來就是一小卒子啊!”

“哪個將軍不是從小卒做起的?”冒號反問道,“不錯,框架是在語言的語法規則之外施加於程序員的又一層枷鎖,但沒有規矩不成方圓。正如行軍打仗,講究排兵布陣,程序員就是那兵,框架就是那陣。”

句號說:“可不可以這麼理解,框架就是一些人——也就是框架設計者,把一個軟件開發中最甜的部分啃掉了,剩下部分留給下面的人?”

“從某種意義上說,是這樣。”冒號點點頭。

逗號很不甘心:“我就想啃最甜的部分。”

“當心別把牙給崩掉。”冒號笑道,“不是打擊你,首先你還沒那本事;其次即使你有本事也未必有機會;最後即使有本事也有機會,重新設計框架也未必是好的選擇。就說大名鼎鼎的Struts吧,哪怕你設計出比它更高明的框架也不會被采用,因為前者早已成為Java平台上網絡開發的事實(De Facto)標准,公司很容易從市場上招到懂Struts的程序員,不必培訓即可上手,成本低見效快。過去許多公司都有自己的網絡框架,但最後大多都放棄了,並不是因為Struts更優秀,而是因為它更普及。畢竟大多數軟件開發是以金錢而不是技術為中心的。”

問號提議:“您能談談設計模式和架構嗎?”

冒號侃侃而談:“與框架與庫和工具包不同,設計模式(design Pattern)和架構(architecture)不是軟件產品,而是軟件思想。設計模式是軟件的戰術思想,架構是軟件的戰略決策。設計模式是針對某些經常出現的問題而提出的行之有效的設計解決方案,它側重思想重用,因此比框架更抽象、更普適,但多限於局部解決方案,沒有框架的整體性。與之相似的還有慣用法(idiom),也是針對常發問題的解決方案,但偏重實現而非設計,與實現語言密切相關,是一種更底層更具體的編程技巧。至於架構,一般指一個軟件系統的最高層次的整體結構和規劃,一個架構可能包含多個框架,而一個框架可能包含多個設計模式。”

引號愈發疑惑:“這些不是都很重要嗎?”

“當然都很重要。不過——”冒號話鋒一轉,“在沒有打好基礎前,架構只是空中樓閣,因此不可能現在談它。至於框架,不同的應用領域有不同的框架,如表現層的Struts、業務層的Spring、持久層的Hibernate等等,即使相同領域的框架也有多個選擇,更不用說不同的語言框架還不一樣,從何談起?再說框架其實一點也不高深,完全可以無師自通,關鍵是領會思想,多學習多實踐。說到設計模式,一共就那麼幾十個,一本‘四人幫’(GoF)[2]的書足矣,自己慢慢去啃,又何須多談?簡言之,一個談之過早,一個無從談起,一個不必多談。”

下面開始交頭接耳竊竊私語起來。

“知識的學習有幾種方式:一種靠記憶,一種靠練習,一種靠培養。就拿英語學習來說吧,學單詞,單靠記憶即可;學句型、語法,光記憶是不夠的,需要勤加練習方可熟能生巧;而要講出地道的英語,光記憶和練習是遠遠不夠的。從小學到大學,甚至博士畢業,除了英語類專業的學生外,大多數人英語練了一二十年,水平如何?不客氣但很客觀地說:一個字,爛;兩個字,很爛;三個字,相當爛!口語甚至連一個英語國家的三歲小孩都不如。”冒號越說越激動,“原因只有一個,那就是國內的英語教學方式嚴重失策。教學總是圍繞單詞、詞組、句型、語法轉,缺乏對語感的重視和培養,導致學生只會‘中式英語’。同樣道理,一個慣用C語言編程的人也許很快就能寫一些C++程序,但如果他只注重C++的語法而不注重培養OOP的語感,那麼寫出的程序一定是‘C式C++’。與其如此,倒不如直接用C呢。”

句號悟道:“您是想告訴我們,學習編程范式能增強編程語言的語感?”

“一語中的!”冒號慶幸總算沒有白費口舌,“語感是一個人對語言的敏銳感知力,反映了他在語言方面的整體上的直覺把握能力。語感強者,能聽弦外之音,能說雙關之語,能讀隽永之作,能寫曉暢之文。這是一種綜合的素質和修養,其重要性是不言而喻的。那麼如何培養語感呢?普通的學習和訓練固不可少,但如果忽視語言背後的文化背景和思維方式,終究只是緣木求魚。編程范式正體現了編程的思維方式,因而是培養編程語言的語感的關鍵。現在如果我開始介紹范式,你們還有意見嗎?”

眾人受了鼓動,個個把頭搖得跟撥浪鼓似的。

冒號語重心長地說:“既然范式關乎語感,就需要慢慢的培養和滲透,不可能一蹴而就,因此有些地方不太明白也沒關系。現在只是撒下一些種子,慢慢的會生根發芽,直至長成大樹。到那時,你們個頂個的都是內外兼修的武林高手了。怎麼樣?大家准備好了嗎?”

“准備好了!”眾人齊聲道,求知的目光再度點燃。

“准備好了就下課吧。”冒號狡笑著,“下節課,下節課我們再談。”

,插語

[1] 控制反轉(Inversion of Control)是一種軟件設計原則。與通常的用戶代碼調用可重用的庫(library)代碼不同,IoC倒轉了控制流方向:由庫代碼調用用戶代碼。有人將此比作好萊塢法則:“不要打電話給我們,我們會打給你的”。

[2] 設計模式最經典書籍《Design Patterns: Elements of Reusable Object-Oriented Software》的四位作者常被稱為GoF或Gang of Four。

。總結

庫和工具包側重代碼重用,框架側重設計重用。庫和工具包從微觀上解決具體問題,是為程序員帶來自由的;框架從宏觀上控制軟件整體的結構和流程,是為程序員帶來約束的。框架是通過控制反轉(IoC)機制反客為主的。

設計模式是軟件的戰術思想,架構是軟件的戰略決策。與框架、庫和工具包不同,它們不是軟件產品,而是軟件思想。

設計模式與慣用法都是針對常發問題的解決方案,但前者偏重設計,後者偏重實現。

架構太高,談之過早;框架太多,無從談起;設計模式太少,不必多談。至於編程范式,對培養編程語言的語感至關重要,需要充分的重視和長期的積累,方能悟其精髓。

“”參考

[1] Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides.Design Patterns: Elements of Reusable Object-Oriented Software.Boston:Addison-Wesley,1994.26-28

課後思考

作為一個軟件開發者,你現在處於哪個階段?你未來的目標是什麼?

傳統的學習方式的弊端在哪裡?你是否有切膚之痛?

你認為一個優秀的程序員需要具備什麼素質和精神?

你了解哪些計算機語言?你對一門語言的取捨與喜惡的根據是什麼?

你認為計算機語言未來的發展方向是什麼?

你能否在編程中感受到自己的激情和靈性?

你了解哪些框架?它們的應用范圍是什麼?實現的機理是什麼?

你了解哪些設計模式?它們為什麼能成其為模式?

學習編程范式的意義何在?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved