冒號開班首言:「姓冒名號字解之,叫老冒便好。編程多年,小有所成,不敢專藏,開班共享。一家之言、一孔之見,若能拋磚引玉,何懼方家之哂?」
| 階段 | 內涵 | 角色定位 |
|---|---|---|
| 學會(知其所然) | 掌握具體編程知識 | 初級程序員 |
| 會學(知所以然) | 快速深刻理解技術、舉一反三 | 中級程序員 |
| 會用(人為我用) | 靈活運用所學於實際設計 | 高級程序員 |
| 被用(我為人用) | 設計廣為人用的應用、庫、框架 | 系統分析師/架構師 |
更高層次——發明主流設計模式、算法、語言、理論,可稱計算機專家。本班旨在助諸位向更高階提升。
傳統課堂:知識系統完備貌似終極、單向被動傳輸、注重現狀而非起源歷程未來。中國學生最擅長考試、最習慣考試、最厭倦考試。告別學生生涯踏上職業旅程——恭喜脫離苦海,悲告掉進火坑:時時學習無老師,時時考試無標準答案,直到老板通知「明天起放長假」。
若沿用封閉被動學習,在瞬息萬變的 IT 業難生存發展。本班風格不同:
「越喧囂世界,越需寧靜思考。編程無速成大法、必殺之技、錦囊秘笈、終南捷徑,只有思考、實踐、再思考、再實踐。中國 IT 界過於浮躁急功近利,盲從且自大,缺乏務實與研究、獨立與合作、批判與自省精神。沾染此風氣,再好學習方法也與『優秀』絕緣。」
優秀程序員除迅速掌握知識、善於領悟思想外,必須具備六大精神:
問號打破沉默:「老師——」冒號打斷:「別叫我老師,真正老師是你自己。師生角色模糊,自主學習、相互啟發、教學相長。」
問號問:「計算機語言這麼多,到底學哪個好?」冒號列出 TIOBE 2008年9月排名前12語言(Java、C、C++、VB、PHP、Python、Perl、C#、JavaScript、Delphi、Ruby、D),總佔有率超90%。
引號、逗號質疑 ASP、JSP、HTML、XML 缺席。冒號澄清:ASP/JSP 是模板/框架/腳本環境非新語言;PHP 是語言;HTML/XML 是標記語言屬數據格式標準;XSLT 含變量邏輯、圖靈完備屬程序語言;CSS 是樣式語言非程序語言;RSS 是數據交換規范;AJAX 是多語言綜合技術非語言。句號糾正:「老冒偷換概念——問的是計算機語言。」冒號點頭:「不僅學語言,還要熟悉開發環境工具,最重要的是學習其中的思想。」
歎號嘆:「學完頭發白了,程序員吃青春飯。」冒號:「缺乏靈感激情才覺吃青春飯。開放言論才能解放思想,思想解放才生靈感激情。無激情作氧氣,靈感火花注定轉瞬即滅。」
問號追問:「僅憑流行度分優劣?」冒號:「流行度非唯一指標。語言優劣因人而異,答案在你們自己身上——真正老師就是你自己。」
以兵器喻語言:威武的刀、靈活的槍、飄逸的劍……評判優劣撇開使用主體與對象皆空談。句號悟:「好語言就是適合編程者和解決對象的語言。」引號反駁:「高手十八般兵器樣樣精通。」冒號:「趙雲使錘、李元霸使槍,武力恐大打折扣。」
| 代數 | 名稱 | 代表 |
|---|---|---|
| 1GL | 機器語言 | 0/1 二進制 |
| 2GL | 匯編語言 | IA-32 Assembly, SPARC Assembly |
| 3GL | 高級語言 | Fortran, Pascal, C, Java, VB |
| 4GL | 面向問題語言 | SQL, SAS, SPSS |
| 5GL | 人工智能語言 | Prolog, Mercury, OPS5 |
引號概括:機器語言難記維護→匯編用助記碼但無主見不變通→高級語言配編譯器/解釋器優化指令,程序員勞動力解放,效率大增。冒號大讚:「精彩!精當!一氣呵成!」
4GL 更專注業務邏輯,程序員負責分析描述問題,最初希望非專業者也能開發。逗號驚:「我們要失業?」冒號寬慰:助手本身是軟體需專業開發,理想全面實現任重道遠。
5GL 繼承 3GL 通用性與 4GL 優點(重目標輕過程、重描述輕實現),如無人駕駛智能汽車——輸入目的地自動尋路變速駛至終點。但目標遙不可及:超級計算機贏國際象棋冠軍,圍棋卻弱智。
前兩代稱低級語言,後稱高級語言。從低到高:離機器遠、離人類近,易讀寫調試維護、安全通用移植性強、開發效率高、更抽象宏觀;但速度效率降、用法功能局限性大。兵器喻:高級語言如長兵器威力強長於大型應用「一寸長一寸強」;低級語言如短兵器輕便靈活長於底層「一寸短一寸險」。
C 語言兼具高級抽象移植性與低級指針位字段底層操作甚至內嵌匯編,稱中級語言。影響力最大,幾乎所有操作系統和高級語言用它實現,C 家族佔主流半壁江山。兵器喻:C 是劍輕靈銳利,武將腰懸寶劍;不會 C 如不會使劍的武將,缺憾。匯編如小刀匕首,機器語言近乎赤手空拳。
冒號:「高級語言近千種,選擇過多反無所適從。逗號以為學會 Java/C++/C#/VB 就是合格程序員?」連珠炮反問:「知不知它們為何流行?會不會被取代?如果會怎麼辦?如果不會又怎麼辦?」逗號語塞。
「掌握語法工具技巧只相當於學會兵器招法,更重要是心法。招法重形,心法重意。得形忘意捨本逐末;得意忘形游刃有餘。下面談的就是心法:編程範式。」
範式譯自 paradigm,指編程基本風格或典范模式。哲學術語:每個編程者創造虛擬世界,範式是其自覺不自覺採用的世界觀與方法論。
句號:「我們都是虛擬世界創造者,創造自己的黑客帝國?」冒號動情:「難道不是?只不過帝國有大小優劣。編程時進入自己創造的世界,注入想像力創造力激情才有生機。寫的豈止代碼還有樂曲,敲的豈止鍵盤還有琴鍵,跑的豈止程序還有世界。優美旋律奏起,世界翩然起舞,莫名滿足充溢全身。」眾被詩化語言感染。
引號問:「面向對象編程就是範式吧?」冒號點頭,順便吐槽:有本書《面向對象方法》暢銷因學生當戀愛指南買。將 Object-Oriented 譯為「對象導向」雖拗口但更貼切——範式引導帶著傾向分析解決問題,這就是「導向」;「面向」賓語往往預先確定目標,強調靜態結果;「導向」強調動態趨勢,更生動符合編程特質。句號金句:「找對象是『對象導向』,去約會是『面向對象』。」全班再倒。
範式抽象,需具體語言體現。世界觀體現於語言核心概念,方法論體現於表達機制。一種範式可在不同語言實現,一種語言可支持多種範式。語言設計傾向某些範式、回避某些範式,形成不同語法特征風格。
問號問:「框架、設計模式、架構呢?」冒號說出眾人心聲:想聽具體實用能立馬解決問題的,或時髦花哨不學心裡不踏實的。老冒明知卻偏扯範式。
「自以為懂的未必真懂,自以為不懂的未必真不懂。背得爛熟用得爛熟不代表真掌握;看起來新奇可能新瓶裝舊酒。」引號不服:「用得爛熟不算掌握,難道只有發明才算?」冒號:「用得爛熟≠用得恰到好處,能解決問題≠無後顧之憂。」
引號答框架定義:「一組協同工作的類,構建可重用設計,側重設計重用;庫/工具包側重代碼重用。」冒號補充:框架不限 OOP,可為協同函數。複雜應用:宏觀用框架控制結構流程,微觀用庫/工具包解決細節。框架意義:特定領域整體設計不重造輪子;庫/工具包意義:擺脫底層編碼專注業務邏輯。
問號問:「框架/庫/工具包都是代碼集合都提供 API,何以不同?」冒號核心差異:庫/工具包帶來自由,框架帶來約束。庫/工具包提供武器裝備;框架用控制反轉(IoC)機制統一調度,剝奪程序員全局掌控權,使其成手執武器聽候調遣士兵。框架是語法規則外施加的又一層枷鎖,但無規矩不成方圓——程序員是兵,框架是陣。
句號:「框架設計者把最甜部分啃掉了?」冒號點頭。逗號不甘心:「我就想啃最甜的。」冒號:「當心崩掉牙。第一沒本事,第二沒機會,第三有本事有機會重新設計框架未必好選擇。Struts 成事實標準,公司易招人低成本快見效,非因更優秀而是更普及。多數開發以金錢非技術為中心。」
設計模式:針對常見問題的有效設計方案,側重思想重用,比框架更抽象普適但限於局部,無框架整體性。慣用法類似但側重實現、與語言密切相關、更底層具體。架構:系統最高層整體結構規劃,可能包含多框架,框架可能包含多設計模式。
冒號為何不談三者?架構太高談之過早;框架太多無從談起(不同領域不同框架,同領域多選擇,不同語言不一樣),且框架不高深可無師自通關鍵在領會思想多實踐;設計模式就那幾十個,GoF 書足矣自己啃。簡言之:一個談之過早,一個無從談起,一個不必多談。
冒號以英語學習比喻:背單詞靠記憶,練句型語法靠練習,講地道英語靠語感培養。國內英語教學圍繞單詞句型轉,缺乏語感培養,導致「中式英語」。同理,慣用 C 者快寫 C++ 但若只注重語法不培養 OOP 語感,寫出「C 式 C++」,不如直接用 C。
語感 = 對語言敏銳感知力,反映整體直覺把握能力。語感強者聞弦外之音、說雙關之語、讀隽永之作、寫曉暢之文。培養語感關鍵在理解語言背後文化背景思維方式——編程範式正體現編程思維方式,是培養編程語感的關鍵。
「範式關乎語感,需慢慢培養滲透,不可能一蹴而就。不太明白沒關系,現在撒種子,慢慢生根發芽長成大樹。到時你們個頂個都是內外兼修武林高手。準備好了嗎?」眾齊聲:「準備好了!」冒號狡笑:「準備好就下課吧。下節課再談。」
[1] IoC:控制反轉,好萊塢法則「別打電話給我們,我們會打給你」。
[2] GoF:《Design Patterns》四位作者合稱。