冒號和他的學(xué)生們
——程序員提高班紀事
- 軟件技術(shù)
借我借我一雙慧眼吧,讓我把這紛擾看得清清楚楚明明白白真真切切
——《霧里看花》
“現(xiàn)在我們具體介紹一下編程范式。”冒號忽然頓住,隱覺一抹失望從眾人臉上掠過,問號更是欲言又止,便鼓勵他開口。
問號略顯遲疑:“您說編程范式是一種心法,那框架、設(shè)計模式還有架構(gòu)呢?”
“原來如此!”冒號心下了然,“讓我說說你們最想聽些什么吧。”
眾現(xiàn)不信之色。
冒號說道:“一種是具體而實用的,最好能立馬解決學(xué)習(xí)和工作中的問題;一種是時髦而花哨的,管他有用沒用,不學(xué)點心里就是不踏實。”
眾人雖覺此話有些尖刻,細想起來也有幾分道理,但老冒明知而不為,不走群眾路線,偏去扯什么勞什子的范式——當(dāng)然,直接談OOP倒是不錯的。
“自以為懂的未必真的懂,自以為不懂的未必真的不懂。” 冒號玩起了玄學(xué),“有些概念和技術(shù)即使背得爛熟,甚至用得爛熟,那也不代表真正掌握;有些概念和技術(shù)看起來很新奇,卻不過是新瓶裝舊酒。”
引號頗不服氣:“用得爛熟都不算掌握,難不成只有發(fā)明概念和技術(shù)才算掌握?”
“哈哈,那倒不必。”冒號笑道,“用得爛熟不等于用得恰到好處,能解決問題不等于沒有后顧之憂。”
逗號問道:“那掌握的標準是什么?”
“許多應(yīng)聘者喜歡在簡歷中言必稱精通某某語言、某某技術(shù)云云,大多不必面試即知其大言炎炎——倘若真的精通,他當(dāng)應(yīng)聘更高的職位。”冒號有感而發(fā)卻又似不著邊際,“任何概念和技術(shù)都不是孤立的,如果不能在縱向的時間和橫向的聯(lián)系中找準坐標,便似那群摸象的盲人,各執(zhí)一端卻又自以為是。”
眾人心想,老冒雖言辭旦旦卻有鑿空之嫌,一節(jié)課下來,天馬行空的扯了不少,真刀真槍的一個也無,該不是只會紙上談兵吧?
句號緊扣主題:“您為何選擇談編程范式,而不是框架、設(shè)計模式還有架構(gòu)呢?難道它們真如您所說只是時髦而花哨的東西嗎?”
“我可沒這么說。”冒號矢口否認,“但在弄清一樣?xùn)|西存在的意義之前就隨眾跟風(fēng),早晚會跟丟的。我先問問你們:什么是框架(framework)?它與一般的庫(library)和工具包(toolkit)有何不同?”
引號應(yīng)答:“框架就是一組協(xié)同工作的類,它們?yōu)樘囟愋偷能浖?gòu)筑了一個可重用的設(shè)計。與庫和工具包不同之處在于前者側(cè)重設(shè)計重用而后兩者側(cè)重代碼重用。”
“嗯,有點標準答案的味道。”冒號夸道,“如果吹毛求疵的話,框架并不限于OOP,可以是協(xié)同工作的類,也可以是協(xié)同工作的函數(shù)。一個足夠復(fù)雜的應(yīng)用軟件開發(fā),為確??焖儆行Вǔ2扇〉姆绞绞牵涸?em>宏觀管理上選取一些框架以控制整體的結(jié)構(gòu)和流程;在微觀實現(xiàn)上利用庫和工具包來解決具體的細節(jié)問題??蚣艿囊饬x在于使設(shè)計者在特定領(lǐng)域的整體設(shè)計上不必重新發(fā)明輪子;庫和工具包的意義在于使開發(fā)者擺脫底層編碼,專注具體問題。”
問號提出問題:“框架與庫和工具包看起來很相似——都是一些代碼集合,都提供一些API(應(yīng)用編程接口),是什么使得它們不同呢?”
“問得好!”冒號贊言,“框架與工具包最大的差別在截然相反的設(shè)計理念上:庫和工具包是為程序員帶來自由的,框架是為程序員帶來約束的。具體地說,庫和工具包是為程序員提供武器裝備的,框架則利用控制反轉(zhuǎn)(IoC)機制實現(xiàn)對各模塊的統(tǒng)一調(diào)度從而剝奪了程序員對全局的掌控權(quán),使他們成為手執(zhí)編程武器、隨時聽候調(diào)遣的士兵。”
嘆號苦著臉:“程序員原來就是一小卒子?。?#8221;
“哪個將軍不是從小卒做起的?”冒號反問道,“不錯,框架是在語言的語法規(guī)則之外施加于程序員的又一層枷鎖,但沒有規(guī)矩不成方圓。正如行軍打仗,講究排兵布陣,程序員就是那兵,框架就是那陣。”
句號說:“可不可以這么理解,框架就是一些人——也就是框架設(shè)計者,把一個軟件開發(fā)中最甜的部分啃掉了,剩下部分留給下面的人?”
“從某種意義上說,是這樣。”冒號點點頭。
逗號很不甘心:“我就想啃最甜的部分。”
“當(dāng)心別把牙給崩掉。”冒號笑道,“不是打擊你,首先你還沒那本事;其次即使你有本事也未必有機會;最后即使有本事也有機會,重新設(shè)計框架也未必是好的選擇。就說大名鼎鼎的Struts吧,哪怕你設(shè)計出比它更高明的框架也不會被采用,因為前者早已成為Java平臺上網(wǎng)絡(luò)開發(fā)的事實(De Facto)標準,公司很容易從市場上招到懂Stuts的程序員,不必培訓(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è)重思想重用,因此比框架更抽象,更普適,但多限于局部解決方案,沒有框架的整體性。至于架構(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)的書足矣,又何須多談?簡言之,一個談之過早,一個無從談起,一個不必多談。”
下面開始交頭接耳竊竊私語起來。
“知識的學(xué)習(xí)有幾種方式:一種靠記憶,一種靠練習(xí),一種靠培養(yǎng)。就拿英語學(xué)習(xí)來說吧,學(xué)單詞,單靠記憶即可;學(xué)句型、語法,光記憶是不夠的,需要勤加練習(xí)方可熟能生巧;而要講出地道的英語,光記憶和練習(xí)是遠遠不夠的。從小學(xué)到大學(xué),甚至博士畢業(yè),除了英語類專業(yè)的學(xué)生外,大多數(shù)人英語練了一二十年,水平如何?不客氣但很客觀地說:一個字,爛;兩個字,很爛;三個字,相當(dāng)爛!口語甚至連一個英語國家的三歲小孩都不如。”冒號越說越激動,“原因只有一個,那就是國內(nèi)的英語教學(xué)方式嚴重失策。教學(xué)總是圍繞單詞、詞組、句型、語法轉(zhuǎn),缺乏對語感的重視和培養(yǎng),導(dǎo)致學(xué)生只會‘中式英語’。同樣道理,一個慣用C語言編程的人也許很快就能寫一些C++程序,但如果他只注重C++的語法而不注重培養(yǎng)OOP的語感,那么寫出的程序一定是‘C式C++’,與其如此,倒不如直接用C呢。”
句號悟道:“您是想告訴我們,編程范式就是編程語言的語感?”
“一針見血!”冒號慶幸總算沒有白費口舌,“現(xiàn)在如果我開始介紹范式,你們還有意見嗎?”
眾人個個把頭搖得跟撥浪鼓似的。
冒號語重心長地說:“既然范式是一種語感,就需要慢慢的培養(yǎng)和滲透,不可能一蹴而就,因此有些地方不太明白也沒關(guān)系?,F(xiàn)在只是撒下一些種子,慢慢的會生根發(fā)芽,直至長成大樹。大家準備好了嗎?”
“準備好了!”眾人齊聲道,求知的目光再度點燃。
“準備好了就下課吧。”冒號狡笑著,“下節(jié)課我們再談。”