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