1. 程式人生 > >金庸筆下的"程式設計師" | 附金庸武俠全集

金庸筆下的"程式設計師" | 附金庸武俠全集

金庸

飛雪連天射白鹿,笑書神俠倚碧鴛
當您八十高齡取得牛津大學唐朝史學博士學位,我還以為這是另一部史詩開始的訊號,然而沒有後續了。
我的高中到大學,是十遍《笑傲江湖》的距離,我的整個青春,是大俠郭靖到祖師郭襄的歲月。
你是桀驁不羈的方正君子令狐沖,也是俠氣沖天嫉惡如仇的大俠胡斐,但你說你最像優柔寡斷多情卻殘忍的張無忌。
不過,在我心中,您永遠是我的偶像,一路走好,老爺子 。

今天與人閒談中無意間提到了“倚天屠龍記”中的張無忌,這是一個普通的甚至性格有點軟弱的主角,性格複雜,很多人讀完小說以後覺得他一點都不像一個英雄人物,與喬峰喬大俠、郭靖郭大俠等相比,簡直是差得太遠了。回來之後細細回味思索一番,除了張教主是不是英雄這個問題外,我意外地發現他的學藝之路竟然頗有啟發性,想來金庸大師也是哲學方面的高才啊。 下面讓我們一起來回憶一下張教主的學藝之路,並結合金庸小說中的各種成名絕技,看是否有值得借鑑之處。

面向物件思想——任督二脈

打通任督二脈,是修習高等武術的基礎和必經步驟,大家看過武俠小說的都知道,也基本都見識過了。之所以是基礎,道理很簡單,如果任督二脈不通,真氣流轉不流暢,當然就不能發揮自己體內最大的能量了。就好比一條非常細小的水渠,怎麼能承受得了陡然暴發的洪水。 這一關通常看似簡單,但是非常有難度,即使是主角兄弟們,也只是會“意外”通過,一般都是藉助了外力,比如武功高強的師傅、能力超凡的道具、不可思議的奇遇,等等。對於張教主來說,這一關在說不得大師的乾坤布袋中順帶通過了,凶險萬分但非常輕鬆。對於大部分普通人來說,這一關可能終生都無法逾越,所以武功怎麼練也無法達到上層境界。

基本上,任何用過面嚮物件語言(如Java、C++、C#等)的同學們張口就能說出面向物件的三大特徵:繼承、封裝、多型。但是又有幾個人曾試圖深層次地瞭解過這6 個字背後的含義呢?

面向物件思想是軟體工程發展史上的偉大里程碑,它提供了軟體設計與開發的新思路:那就是一切皆是物件。這種思想體現了人們對世界的重新認識。這種認識體現到實際的行動中,就是使用物件去表述世界發展的一切活動。為了生動描述事物之間特性的傳承性,“繼承”就誕生了;為了描述事物之間相同特性基礎上表現出來的差異性,於是“多型”就被創造出來;為了描述事物的完整性和相對封閉性,“封裝”就提上了日程,細節從此不需要再去關注。這是面向物件世界觀的三大基本特徵,也是面向物件設計的核心根基,只有深刻理解了它們,時時刻刻記住它們,把它們深深地融入到你的日常活動中去,你的神功才會一日千里。

面向物件設計原則——九陽神功

當你能做到任何時候、任何場合,眼中只有物件的時候,那麼恭喜你,你的任督二脈已經打通!你可以學習任何一門高深的內功了。為什麼先學習內功呢?這個大家也都非常熟悉,沒有內功的配合,任何高深的招式都是浮雲。所以要想天下無敵,必須要練就一身深厚的內功,比如九陽神功。

物件的三大特徵全都有了,表明在你眼中一切都應該是物件了,你已經是面向物件了,但是並不是說這就是好的面向物件了。

如何評判一個系統是好的面向物件呢? 一般是參照“SOLID”標準。 單一職責原則(SRP):做一個專一的人 做好並且只做好一件事,這條原則其實不僅僅適用於物件,同樣適用於函式、變數等一切程式設計元素。當然,在商業模式中,將一件事做到極致就是成功,我覺得也還是成立的。 

開放封閉原則(OCP):改造世界大部分不是破壞原來的秩序在物件世界中,新增新的功能一般意味著新的物件,一個好的設計也意味著這個新的修改不要大幅度波及現有的物件。這一條理解起來簡單,實施起來卻最是困難。無數的模式和解耦方法都是為了達到這個目的而誕生的。

里氏替換原則(LSP):長大後,我就成了你 父類使用的地方,子類也可以使用。這一條希望子類不要破壞父類的介面成員,一旦破壞了,就如同人與人之間破壞合同一樣,有時候會很糟糕。

介面分離原則(ISP):不要一口吃成胖子 介面不要過於龐大,繁雜的東西是難以理解、難以擴充套件、難以修改的。這一條的目的與單一職責原則類似,不過是更加強調了介面的邏輯一致性和簡易性。

依賴倒置原則(DIP):抽象的藝術才有生命力 高層與底層元件之間都應該依賴於抽象的元件。這一條深刻揭示了抽象的生命力,抽象的物件才是最有表達能力的物件,因為它通常是“無形”的,可以隨時填充相關的細節。

除了這幾個基本的設計原則外,還有一些衍生原則,掌握它們,你將能更好地面向物件。

迪米特法則:儘量不與無關的類發生關係。 物件之間聯絡越是簡單,則越是容易管理。 好萊塢法則:不要呼叫我,讓我呼叫你。 電影中常說,單線聯絡最安全,就是這樣。 多使用組合,少使用繼承 複用的手段除了繼承這種強約束手段外,組合這種弱耦合的關係更加靈活。 實現依賴於抽象 這一點一般也稱為面向介面程式設計,保證了物件之間關係穩定。

修煉完這些原則,你已經神功初成了,那是不是活動活動手腳,就可以大幹一場了呢?

模式——乾坤大挪移

當張無忌學會了九陽神功下山以後,他已經身負絕世內功了,但是不知大家發現了沒有,他居然連最普通,只會些三腳貓功夫的毛賊都打不過,他只能依靠阿蛛的招式,來借力反擊,只是這樣談何天下無敵呢。不過當他學會了乾坤大挪移以後,那真的是如同鳳凰涅槃,瞬間完成了超級賽亞人變身。這個道理似乎也很簡單,光有高深的內功,但是沒有運轉自如、充分發揮內功的招式,同樣也是不成的。招式,那可是前輩們經驗的總結,是精華啊。學會了這個,你才有決勝天下的資本。

世間原本沒有模式,使用的人多了,才有了模式。模式是經驗的總結,是“巨俠”們的心血。 大型模式如架構模式(分層、MVC、PAC、黑板、中間人、反射、管道、微核、REST 架構等),它們描述了系統大骨架的構建過程; 中等規模的模式如設計模式(GOF 23種模式、POSA 中的各種設計模式),它們描述了子系統中元件的構建過程; 小的模式如各種語言中的程式設計實踐(C#中的IDispose模式、C++中的Counted Point)模式等,它們描述瞭解決語言中特定問題的實施方案。 這些模式合起來就是面向物件程式設計過程中針對特定問題的乾坤大挪移神功。

重構——太極拳

如果一定要評出金庸小說中的三大巔峰神功,那麼太極拳必能入選。練習太極拳是需要超凡的悟性的,太極拳重在以意運轉,不能有絲毫外在強加的約束,這一點看過原著的同學們都很清楚。自從太極拳問世後,人們才真正體會到了什麼叫做“以柔克剛”!

重構是精心打磨、持續雕琢程式碼的過程,是任何資深碼農的必備技能。重構不是無目的的,重構是一種在不改變程式碼行為的前提下,改善程式碼可讀性、可擴充套件性的過程。 之所以需要重構,就是因為程式碼也是符合事物發展規律的,也有一個從出生到成長,從強壯到衰敗,從衰敗到腐爛的過程,而且是循序漸進的,不知不覺地就從好變爛了。

毫無疑問,並不是所有的爛程式碼都是一次寫成的,也許最初的程式碼設計是很好的,但是一旦被多個人修改過以後,就變壞了,很多人對此都深有體會。程式碼總是在所有人的共同“努力”下寫爛的。 如果說上面提到的那些技術都有跡可循、規則性比較強的話,那麼相對來說,重構的技術要相對柔和一點,沒有那麼強烈的約束條款,而且雖然也有像介紹“程式碼壞味道”的偉大著作(《重構》一書)誕生,但是,通常人們腦海中對於重構的衝動,從沒有像使用模式那麼強烈,根本不會想到重構會是那麼的重要,就如同書中的那些高人們根本不會想到如此緩慢而且無固定招式的太極拳會是那麼強悍一樣。重構與太極拳一樣,進行到多大程度和畫多大多小的圈,都無法明確衡量,它們都是真正的“意識流”。

抽象與組合——獨孤九劍

要說金庸小說中最厲害的武功,筆者認為既不是乾坤大挪移,也不是太極拳,更不是葵花寶典,而是獨孤九劍。那是什麼境界啊?九劍破遍天下任何拳腳、氣功、暗器、十八般兵器,這才叫“無敵”。

當然,這個武功不是隨便是誰都能練得成的,也就是像令狐沖那樣智慧超群,灑脫異常,具備一定內功(後期更輔助以吸星大法),武功又雜的小哥才能練;而且這個練習過程一般也比較長,據風清揚介紹,令狐老兄刻苦練習十幾年後方能與東方不敗一戰。 我們再看看該神功原創者獨孤大俠一輩子兵器的變遷:從利劍到重劍,到木劍,再到無劍。大家發現了沒有,到了最後拋開一切招式、內功,融會貫通,水乳的交融以後,才是真正的超凡入聖,這個時候也才發現原來一切又回到了起點:原來武功就是這麼簡單,就是鍛鍊與發揮人體的最大能量,隨便地一揮一灑就有無與倫比的威力。返璞歸真才是武者的終極、青銅門後面的永恆(出自盜墓筆記一書)。

不管是面向過程,還是面向物件,不管是面向元件,還是面向服務,歸根結底只不過是人們對世界的抽象方式和抽象的粒度不同而已,把抽象出來的東西組合起來,形成一定的規範和流程,依靠這些去解決實際的需求,這就是程式設計。抽象與組合,才是終極的藝術。