Feeds:
Posts
Comments

这个比较短。朋友在interview时被问到这个问题,让解释这个Pattern。我想想,好象
我也解释不好,因为觉得会说得太狭义。仔细读了一下,说到底就是刻划一棵树。技巧
上,用到recursive function, 和Null Object。本质还是很简单。

【定义】
Allows you to compose objects into tree structures to represent part-whole
hierarchies. Composite lets clients treat individual objects and
compositions of objects uniformly.

In other words, we can ignore the differences between compositions of
objects and individual objects.

【要点】
– Whole-part relationship
– Tree structure
– Treat uniformly, usually recursive function.
– Not all operations applicable to all objects, NullHandler helps here.

章培恆

這是一篇我早就想寫的文章。 但單是它的題目,就會使不少讀者產生不倫不類之感,何況還可能引起姚雪垠先生的不快。而據姚先生的自述,他不但是「當代有代表性的」、「在海內外享有一定 聲譽的」、「著名的老作家」,而且,「《李自成》第1卷日譯本於1982年在東京出版,日本政府(外務省和文部省)因重視這一工作,特向日譯者陳舜臣、陳 謙臣兄弟頒發翻譯獎,向出版者講談社頒發文化獎。」這更是連魯迅和郭沫若都沒有享受過的殊榮。——由於我的孤陋寡聞,我原來只知道《李自成》日譯者陳氏兄 弟在1983年獲得了「第二十迴日本翻譯家協會賞」,而日本翻譯家協會(會長平松乾夫氏)只是翻譯工作者所組成的一個團體;現在纔知道陳氏兄弟還得到了日 本政府特頒的獎,連講談社都叨光獲得了日本政府的獎賞。我雖然不清楚這種說法的依據是什麼,在我就此向一位研究中國現代文學、又與陳氏兄弟熟悉的日本教授 請教時,他還說「日本政府沒有這樣的頒獎制度」,但姚先生的文章是「既要對得起我自己,也要對得起廣大讀者,還要對得起後人」的,我們自不應對他的自述有 任何懷疑。既然牽涉到這樣的一位大作家,我的這篇文章寫成後是否能找得到發表的園地是很難預卜的,而它又顯然沒有「藏之名山,傳之其人」的價值,所以我也 就一直沒有動筆的興趣。但最近忽然想起了一句「百貨中百客」的俗諺,感到也不妨寫出來試試;至於通儒碩學對它的鄙棄,則自是意料中事。

在相當長的一段時期內,人們將五四運動以後的中國文學分為新文學和舊文學兩類;近幾年又參考國外的分類法,分為純文學和通俗文學兩類。至少在許多文藝工作者的觀念中,舊文學、通俗文學事層次較低的文學,新文學、純文學則是層次較高的文學。
我想,這兩種分類法都有一定的道理。而且,從原則上認為新文學高於舊文學、純文學高於通俗文學,恐怕也是不錯的。而從我們現在的分類習慣來看,《李自 成》當然不屬於舊小說或通俗小說,武俠小說則在過去被歸於舊文學,在今天被歸於通俗文學。這樣,金庸先生的武俠小說就似乎要比《李自成》低一個層次,二者 沒有比較的必要與可能。因此,我們不得不重新問一問:新文學和舊文學、純文學與通俗文學的劃分標準到底是什麼?
其實,即使在解放前,關於新文 學和舊文學的劃分也存在著一些複雜的現象。例如,秦瘦鷗先生的《秋海棠》與吳祖光先生的《風雪夜歸人》,雖然一是小說,一是劇本,但內容上是頗有類似之處 的。兩部作品種的主角可說是同類型的受迫害者,而且,兩位作者都對主角的遭遇表示同情,對迫害主角的社會現實提出批評:從這方面來說,兩部作品都具有反帝 反封建的傾向。從作品在當時的社會影響來說,《秋海棠》比《風雪夜歸人》似乎還廣泛一些。然而,《風雪夜歸人》是公認的新文學作品,《秋海棠》則被歸入舊 文學。——近十年出版的新文學史著作我沒有留心,以前出版的新文學史著作是都不提它的。當然,這兩部作品的區別還是存在的。雖然寫的是同類的社會現象,但 吳祖光先生卻以新的意識形態為憑依,對人生問題進行了更深入的思考,從而給予讀者以新的啟示。所以,假如以這兩部作品為例,那麼,所謂新文學,除了政治上 的反帝反封建以外,還必須在人生問題上有一種新的思考與認識。
至於《李自成》,它熱情地歌頌了古代地農民起義,這當然是反封建地。然而,作品 到底對人生問題作了什麼深刻的思考,給了讀者以什麼新的啟示呢?是告訴讀者農民起義在歷史上起過進步作用,因而是正義的嗎?或者是告訴讀者農民起義的失敗 是必然的,只有在新的階級力量出現以後纔能推翻封建社會嗎?但是,這在毛澤東的《中國革命和中國共產黨》中不早就說得很清楚了麼?然則是告訴讀者應該像書 中得英雄人物那樣地來生活嗎?但我們不是早就有了更好、更現代化地學習對象——雷鋒了麼?如果說,我們新文學史上的名作——例如魯迅、郁達夫、茅盾、丁 玲、巴金、蕭軍等人的優秀小說——乃至解放後的《組織部新來的年輕人》、《芙蓉鎮》等作品在其發表的當時都曾經在讀者中間程度不同地產生過振聾發聵地作 用,那麼,《李自成》的這種作用又何在呢?
金庸先生的武俠小說當然同樣不具有振聾發聵的作用,但他的《連城訣》揭露了封建社會裡的財主對貧苦 人民的陷害——據他在該書的《後記》中的自述,這還是有真人真事為張本的;在他的《射雕英雄傳》和《神雕俠侶》中,都贊美了在封建社會裡而能輕視甚或否定 封建道德的人物與行為:這也不都是反封建的嗎?順便提一下,就反封建來說,金庸先生與武俠小說的另一位著名作者梁羽生先生在某些方面似乎比姚雪垠先生還徹 底一些。例如,姚先生在《李自成》1977年出版的《前言》中說:「野史說(為《明史》所采用)紅娘子將李信擄去,「強委身焉」,也就是強迫李信要她做小 老婆。我在小說中拋棄了這一流行的說法。如果我按照這一說法寫,就要將紅娘子寫成了一隻「破鞋」,江湖上的女流氓。」是否按照這種說法去寫紅娘子,本是一 個並無多大關係的問題,但認為紅娘子如果曾經「強委身焉」就成了「破鞋」,那卻不免是受了封建思想的影響。——封建道德在兩性關係上是放縱男方而苛求女方 的。與此相應,《李自成》中的張獻忠共娶了九房姨太太,至少其中的八姨太是搶來的,但姚先生顯然沒有把張獻忠寫成淫棍、色鬼,還在不少地方對他作了不乏熱 情的贊揚,足見男人「強迫」女性「委身」做自己的小老婆是不算什麼大問題的;而作為女性的紅娘子如果對其所愛的男人「強委身焉」,就要被姚先生視為淫賊, 斥為「破鞋」了,儘管她沒有跟別的男人亂搞過。可以作為對照的是:金庸先生《天龍八部》中的木娩清,梁羽生先生《雲海玉弓緣》中的厲勝男,都曾對其所愛的 男子「強委身焉」,作者卻都沒有認為她們的這種做法有什麼可鄙之處。當然,她們都並不是強要做對方的小老婆,但在封建社會裡,「三妻四妾」本被認為是正常 的現象,所以,「強委身」而為大老婆與「強委身」而為小老婆,在當時並無太大的不同。又,「強委身焉」乃是「硬嫁給了他」的意思,姚先生釋「強」為「強 迫」,似乎不大精神。
如果我們再仔細考察一下,就可以發現:金庸先生作品的一個基本精神,是贊揚那種獨來獨往的人格。《射雕英雄傳》的黃藥 師,《神雕俠侶》的楊過、小龍女,《笑傲江湖》的令狐沖乃至盈盈、任我行等等,都是這一類的人物。他們做事只求心之所安,而置既定的道德與其他的社會規範 於不顧。對他們的這種品格,金庸先生顯然是喜愛的。在《神雕俠侶》的《後記》中,金庸先生並曾明確表示:道德本來就是變動不居的。另一方面,金庸先生的作 品還揭示出:當一定的社會規範成為一種凝固的、神聖不可侵犯的東西嚴厲地控制著整個社會的時候,許多人生的慘劇就在這下面開演了。在《倚天屠龍記》中,一 個名門正派的女弟子跟一個邪教中的男性相愛了,她的師傅以立她作自己的繼承人為條件,要她去把那個按人殺掉,她不同意,於是她的師傅就殺死了她,並企圖把 她和那男人所生的一個小女孩也殺掉。在《笑傲江湖》中,一個名門正派的著名人物與邪教中的人由於對音樂的共同愛好而成了好朋友,他怕因此而遭名門正派的迫 害,想退出江湖,但一些名門正派的人物還是凶殘地殺害了他和他的家屬,也殺了那個邪教中人及其孫女兒——一個天真無邪的小女孩。這種所謂「正」、「邪」之 辯,本是中國社會的強有力的傳統;用以區分「正」、「邪」的標準也很微妙,也許可以說,「正」就是既定的社會規範的總和,從而對社會規範的任何一個方面的 觸犯都可以被判為「邪」而受到蠶棵的懲處,例如明代的李卓吾就是以「敢倡邪說」的罪名而被迫害死的。在這樣的慘劇中,迫害者的一方是以正義的化身的面目出 現的,被迫害者的一方則蒙受著種種恥辱與污垢。金庸先生卻通過自己的作品對迫害者的一方——無論他們是在真心實意地維護其認為神聖的東西抑或別有企圖—— 的殘忍和愚蠢作了憤怒的揭露,對被迫害者一方表現了真正的同情。而其實質,乃是對於將一定的社會規範作為凝固的、神聖不可侵犯的東西來嚴酷地控制整個社會 的否定。這種否定和上述的對於獨立人格的頌贊,是與封建思想尖銳對立的;也正因此,在封建意識的殘餘還具有相當影響的今天,金庸先生的小說是有可能給讀者 某種啟示的。坦率地說,我讀金庸先生的小說完全是為了消遣,但在讀到《笑傲江湖》裡那個邪教中人的小女孩被殺的一節時,我受到了震動,想起了「文革」期間 「黑八類」的子女受迫害的情況,想起了早就應該被清除的種種腐朽的傳統觀念對人的虐殺。再補充一句:我在讀《李自成》時從未受到過這樣的震動。
總之,如果說《李自成》是反封建的,那麼,金庸先生的武俠小說也是但封建的,而且,後者所機給予讀者的啟示也許比前者還多一些。因此,把《李自成》劃入 新文學而把金著武俠小說劃入舊文學,實在是沒有依據的。自然,姚雪垠先生在1977年版《李自成》第1卷的《前言》曾說,他是「不斷地學習馬克思列寧主 義、毛澤東思想」而形成作品的主題思想的;而據我猜想,金庸先生寫武俠小說時大概沒有經過這樣的刻苦學習過程。但是,這也並不能成為把金著武俠小說劃入舊 文學而把《李自成》劃入新文學的理由,因為《李自成》中對農民軍的描寫很難說是符合馬克思主義的。——這在下文將專門進行討論。
現在說純文學 和通俗文學的劃分問題。所謂純文學,乃是指以文學本身的價值為目的的文學。因此,把娛樂讀者為目的的武俠小說、推理小說等從純文學中劃出去,稱之為通俗文 學,似乎是不成問題的。然而,什麼是以文學本身的價值為目的的呢?在這方面並無一個同意的標準。例如,在西方就有一派——而且是並不小的一派——人:藝術 (包括文學)是愉悅人的。倘若按照這一派的意見,那麼,以娛樂讀者為目的豈不正是以文學本身的價值為目的,從而武俠小說不就正應列入純文學麼?另一方面, 如果因為文學的對象是人,所以把魯迅那樣的「為人生」的小說也劃入純文學,這自然也有道理。但姚先生寫《李自成》卻是要「為無產階級專政的利益佔領歷史題 材這一角文學陣地」(1977年版的《李自成》第1卷《前言》)。這顯然並不是以文學本身的價值為目的,所以,把《李自成》劃入純文學是既不符合客觀實 際、也不符合姚先生的主觀願望的。換言之,純文學和通俗文學的這種分類法並不能用來判斷《李自成》和金著武小說的高下。

中 國的新文學從「五四」時期以來就形成了現實主義的有力傳統。因此,是否深刻地反映了生活的真實,常常成為文學批評的一個重要的標準。從這個角度來看,武俠 小說就很容易被視為原理甚或違反生活真實的無價值的作品。至於《李自成》,則不但姚先生自己說它是現實主義的,許多研究文章也都對此作了熱情的肯定。這 樣,不但金著武俠小說和《李自成》的優劣立判,而且,把《李自成》作為新文學的傑出作品,將金著武俠小說看成是與新文學對立的東西,也都是順理成章的事 了。
不過,我人《李自成》對以李自成為首的這支農民軍作了過分的美化,因而基本上是違反歷史的真實,也即違反生活的真實的。
根據書中的描寫,李自成的這支部隊是在與勞苦民眾的緊密聯係(簡直可以說是親如一家)中發展起來的。作為部隊首領的李自成,是在自覺地為勞苦民眾的利益而鬥爭。據他自己說:

我李自成從小替人家放過羊,挨過鞭子。長大以後,生計困難,去銀川當驛卒,常受長官辱罵,有時也不免挨打。朝廷裁減驛卒,奪了我的飯碗,只得去當 兵。……我李自成沒忘記自己是窮百姓出身,同百姓苦連苦,心連心,決不做擾害百姓得壞事。……我起義以後,嚴禁部下騷擾百姓,不許姦淫,不許殺害無 辜。……倘若忘記了百姓的苦,反而苦害百姓,那不是跟官軍一樣了?跟許多草寇一樣了?那,那,還算什麼起義?(第2卷,217頁)

這 不僅事他的宣言,實際上他也確是如此行動的。當他在潼關南原戰敗,只剩下了少數將士,被迫駐紮商洛山中時,儘管軍中糧食困難,但他還是幾次分發糧食,賑濟 窮苦百姓。有一次,他決定在當天中午發賑濟糧,但部隊裡的有關負責人告訴他:如果再放賑,部隊就會因糧食不足而出問題。這使李自成產生了思想鬥爭,「俗話 說:兵沒糧草自散。難道能讓兄弟們餓著肚子散夥麼?可是如果不放賑,難道能眼巴巴地看著附近地百姓餓死和逃光麼?」正在他為此所困惑的時候,看到了一個四 十多歲的女人和她的孩子再飢餓線上掙扎的情況,他激動了,「於是他下定決心,不管有多大困難擺在他面前,今天也要放賑」(第1卷,554頁)。可以說,這 實在是一個全心全意為勞苦民眾利益而鬥爭的革命者。自然,他也想打江山,做皇帝,,但這一則是由於他認識到「非推倒明朝江山,來一個改朝換代,吏治是不會 清明的」(第1卷,416頁);再則是要使全國再他的統治下「輕徭薄賦,吏治清明,興學校,獎農桑,通商惠工」,讓百姓們「各安生業,共享太平之福」(第 2卷,890頁),而且,因為「縱然在太平治世,小民也有官府聚斂敲剝之苦,大戶欺凌兼併之苦」,所以他還下定決心,「日後等我有了天下,一定從根本上想 想辦法」(第2卷,891頁)。由此可見,他的想做皇帝,主要也是為人民的利益;難怪姚先生在1977年版的第1卷《前言》中說:「農民起義領袖有帝王思 想不能說明他的落後,而是說明他反對舊皇權的堅決和鮮明立場。」正是在這樣一位革命者的領導下,部隊中存在的少數不良風氣得到了糾正,建成了一支與勞苦民 眾打成一片的、為勞苦民眾利益而鬥爭的軍隊。而勞苦民眾也把這支軍隊看成自己人,甚至自己的救星,為他們帶路、送情報,並且踴躍參軍。
這就提出了一個問題:在封建社會的農民軍隊中,能不能出現這樣的革命領袖,形成這樣的革命部隊?
社會存在決定社會意識,在一個社會裡的統治思想就是統治階級的思想,這是馬克思主義的常識。因此,如果認為生活於封建思想所統治的社會裡的作為小私有者 的農民意識——哪怕是這種意識裡的最進步的部分——竟是這樣的一種革命形態,那顯然是違背馬克思主義的基本原理的。如果說,李自成的這種思想並不是農民意 識的產物,那麼,它就超越於當時的一切階級之上,因為它顯然不可能是地主階級的或當時市民階級的意識的產物。在這樣的情況下,也就是承認在一個社會裡可以 產生凌駕於整個社會——之上的意識,超階級、超社會的意識,而這同樣是違反馬克思主義的基本原理的。
我們再看一看實際情況。從陳勝、吳廣算 起,直到李自成為止,中國曆史上的農民軍領袖有哪一位具有姚先生所賦予的這種思想和品質?根據現有的史料,李自成的部隊紀律原也不好,直到李信參加李自成 軍後,纔提出了「迎闖王,不納糧」等口號,勸李自成整頓紀律,改變了部隊的面貌。而李信之所以提出這種勸告,顯然並不是要李自成自覺地為勞苦民眾的利益去 鬥爭,而是一種爭奪天下,使李自成獲得皇帝寶座的策略和手段。所以,從現有史料來看,歷史上的實際的李自成與姚先生書中所寫的存在著很大距離。
姚先生並不是不知道這些史料,而是對不利於李自成及其部隊的史料采取排斥的態度。他在1977年版的第1卷《前言》中說:「圍繞著李自成的革命經歷,我 首先對於每個重要的歷史問題都本著實事求是的態度進行科學研究,做到深入歷史,心中有數……」他還舉了一個具體的例子:李自成被圍於「魚復諸山」的說法, 「幾乎成了定論,故我國現代有關李自成的著作中也多采用。其實,這個故事完全是捕風捉影之談,毫無事實根據。李自成在馳入河南之前實際是潛伏在漢水以南的 勛陽山中。……在《李自成》第2卷中處理這個問題,我采用了自己研究的結論,拋棄了流行甚廣的說法。」然而,為什麼「這個故事完全是捕風捉影之談,毫無事 實根據」?他的「自己研究的結論」是怎麼得出的?他都沒有任何交代。而這個李自成被圍於魚復諸山的史料,實在是對於李自成、劉宗敏都很不利的,難怪姚先生 稱之為「惡毒地歪曲和誣衊了李自成及其將士」。所以,也許姚先生認為,他事在以「自己研究的結論」否定了不利於李自成及其部隊的史料以後,纔把李自成塑造 成這樣的形象的。但是,第一,他用以否定這些史料的證據何在?基本上沒有作過任何說明。個別問題曾經寫過專文(例如劉宗敏是否掠奪陳圓圓的問題),但又遭 到了其他同志的證據充足的批評,證明瞭姚先生對有的史料確存在著誤解。因此,我們無法認為這些史料全部或大部是不可信的。第二,他把李自成塑造成這樣的革 命者形象,並無任何史料依據。間或有一些推論,但似乎也難以成立。例如,為了證明李自成部隊在李信參加以前就是一支很受人民擁護的部隊,姚先生在第1卷 《前言》中說:「當時天下擾攘,群雄紛起。李自成剛到豫西不久,李信偏要從豫東奔到伏牛山中投他,正可以證明在李信的眼中李自成與其他眾多的起義領袖一向 不同,而且也可以證明李自成一到河南境內便開始執行了嶄新的政治和軍事路線,大獲豫西百姓擁戴,促使他傾心相從。」其實,李信當時能投的農民軍領袖中,張 獻忠等人的部隊距李信所在的豫東都很遠,李自成部隊則比較近。所以,他的投李而不投張,也可能是地理條件的關係。而且,如果李信確是對李自成的才略評價較 高而去投奔他,那也有可能是由於他認為李自成的才略非張獻忠可及,或認為李自成較能接受他的意見,何以見得一定是由於李自成采用了嶄新的路線呢,「大獲豫 西百姓擁戴」呢?
為了說明姚先生所塑造的李自成形象與歷史實際的距離,這裡再舉一個具體的例子。李自成最後一次包圍開封時,官軍曾企圖決黃河 之水以淹李自成部隊。李自成發覺後,一面移營高地,一面擴大黃河決口以淹開封,終於給整個開封帶來毀滅性的災難,造成無數人民的死亡。這不僅有許多史料可 資證明,而且沒有一條史料時否認這一點的,只不過有的史料掩蓋了官軍先決黃河以淹李自成的事實。當然,我們可以指責官軍,但如果李自成真是為勞苦民眾利益 而鬥爭的革命者,與人民「苦連苦,心連心」,能忍心製造這種慘絕人寰的浩劫嗎?而在《李自成》第3卷中,姚先生是這樣寫的:官軍決黃河後,開封為大水所包 圍;本來還可以把城門堵塞,不致使開封為水淹沒,但由於尖銳的階級矛盾,有三個被官府派來堵塞城門的人為了跟城中的統治者同歸於盡,故意把水放進來,於是 開封毀滅了。姚先生說:這就是開封被毀滅的「真相」,「只是事後官紳們諱言真相,遂使真相被歪曲和掩蓋了三百多年!」(第3卷,1514頁)但是,在沒有 任何史料可作憑依的情況下,生活在「三百多年」以後的姚先生,是怎麼知道這個「真相」的呢?
我絕不是要求姚先生把作為小說人物的李自成寫得跟 歷史上得真人完全一樣,我只是說:第一,從馬克思主義得觀點來看,當時的社會裡不可能出現像姚先生書中所寫的那種性質的革命者;第二,歷史上的農民軍領 袖,包括李自成本人在內,也根本不是這樣的革命者。所以,姚先生的這種描寫,是既不符合馬克思主義,也不符合歷史的真相——生活的真實的。
在書中,姚先生還著力描寫了李自成的大智大勇、平易近人、與士卒同甘共苦等等,而這一切都是跟李自成作為革命者的上述崇高品質聯係在一起的,也可說是由這種崇高品質所派生的。但這種品質既然是不真實的,與之相關的這些描寫也就難以使人感到真實可信了。
至於書中李自成手下的幾個革命將領,越是作者著力歌頌的(如劉宗敏等),就越是體現出跟李自成同樣的崇高品質、從而失去了真實性。
還應該說明的是:不僅在上述的這些主要方面,就是在次要人物的細節描寫上,也常讓人感到不真實之處。為了節省篇幅,僅舉一個例子。
關於慧梅,姚先生在第1卷中寫道:「她在心中暗暗地愛著張鼐」,「暗中關心他,有時在夢裡夢見他」,對他「無限深情」;並且說:「從此,她在人世上只剩 下了三位親人。第一位親人是高夫人,……第二位親人是慧英,……第三位親人是張鼐。」(474-475頁)但在第2卷中,慧梅中了毒箭將要死去時,作者是 這樣寫的:

……她知道尚神仙未必能及時趕來,這種烈性毒藥正在向她的內臟侵入,不久她就要死去。此刻她心中最覺得難過的是,從此以 後,她再不能跟再高夫人的身邊,遇到緩急時自己躍馬揮劍,捨身保護她了;另外,慧英姐不在此地,永遠不能同這位情同骨肉的女伴再見一面了。望著高夫人,她 一句話說不出來,淚珠在眼中滾動。(318頁)

這個年輕的女孩子在明知自己即將死去的事後,她所惦記的只是她的親人中的兩位,獨獨沒 有記起另外一位:她「無限深情」地愛著的、「有時在夢裡夢見」的張鼐。這難道不使人奇怪嗎?姚先生在揭示「建國後支配著我國文藝界的」左「的教條主義」的 表現形態時說:「……至於對待正面英雄人物,不能寫他們身上的弱點和缺點,也不能寫他們的愛情生活。」他不讓慧梅在臨死時想到愛人張鼐,不知是忘了慧梅還 有一位親人,抑或是受到這種「左」的教條主義的影響。
所以,姚先生雖然力圖使《李自成》成為真實的歷史畫卷,但在我看來,其結果,卻常常是真 中見假。正如魯迅先生早就指出的:真中見假就會導致讀者的幻滅感。而這種幻滅感也正是我在讀《李自成》時所經常產生的。因此,儘管姚先生在寫作過程中「常 常被自己構思的情節感動得熱淚縱橫和哽咽」,但我卻始終感動不起來。而在這方面,金著武俠小說恰恰具有相反的特點:它們不是真中見假,而是假中見真。
金著武俠小說的情節的展開離不開神氣的武功。如果以目前的某些(絕非全部)宣傳氣功和特異功能的文章為依據,實在不妨說金庸先生的這種描寫是符合生命科 學的。不過,更為科學的做法,恐怕還是承認這些神氣的武功全屬於子虛烏有;金庸先生在《神雕俠侶》的《後記》中也是這麼承認的。所以,金著武俠小說的基本 情節之不符合真實性的要求,乃是不言而喻的事。
然而,如果撇開人物所具有的神氣武功,他們的性格卻往往是真實的,它們的喜怒哀樂是能夠與讀者 相通的。像《天龍八部》中的喬鋒在誤傷其愛人阿朱致死後的深沈的悲痛,《連城訣》中的狄雲在連續遭到財主、官府的迫害和眾多俠義道——包括他所救的一位姑 娘的仇視、鄙視後所爆發的類似瘋狂的悲憤,都是能使人感動的。而其對於人物性格複雜性的揭示,尤其值得重視。例如,在《天龍八部》裡的「四大惡人」中名列 第二的葉二娘,每天都要從別人家裡抱來一個嬰孩,當作自己的親生子女,親熱地抱著撫弄,道了晚上則把孩子弄死。而其之所以如此,是因她在年輕時與少林寺方 丈玄慈熱戀,生了一個兒子,但兒子生下來就被人搶去,,那人還在她臉上劃了兩條傷痕,同時,以玄慈的地位當然不能還俗與她結婚,生產後她不得不離玄慈而 去,在江湖上飄零,但內心仍然深深地愛著玄慈,並知道玄慈心裡也很痛苦。所以,她其實是一個被迫害者,不但兒子給搶去是受迫害,不能與玄慈結合也是受社會 習俗的迫害;她的殘忍而荒謬的行為,則是被迫害者的瘋狂報復心理(她自己說,她搶去別人的孩子是因為別人搶去了她的孩子)與未能滿足的母愛的變態的結合。 也正因此,讀者在開始時憎惡她的凶殘,但在明白了她的身世,看到了她在與玄慈及兒子重會時表現出來的深沈的愛,以及最終的殉情而死以後,就不得不油然產生 了對她的同情,感到在她身上存在著很善良的一面,甚至感到她在本質上就是善良的。這種性格比較複雜的人物,不僅比另一些作品裡性格單一的,仿佛天生就是善 良的化身或凶惡的化身的人物來得真實可信,而且還可以引起讀者的思考:一個在身上存在著山嶺一面、甚或本質上就是善良的人,時怎麼會變成如此凶殘得呢?人 類社會是否能儘量去掉一些愚蠢的行為與觀念(例如高僧不應還俗結婚的觀念)來減少這類轉化呢?
這種跟顯然虛假的情節伴隨在一起的人物性格的真 實,在文學中並不是獨一無二的現象。例如,在童話中就有這樣的情況:顯然不可能出現的神奇力量以及與之相伴隨的真實的人物性格。所以,有人把武俠小說稱為 成人的童話,並不是沒有道理的。但從未聽說人們把童話作為反現實主義的東西。
總之,如果以現實主義的真實性的標準來衡量,那麼,《李自成》與金著武俠小說都存在著距離:真中見假與假中見真都是不充分的真實性。但真中見假給讀者帶來的幻滅感使作品不可能產生真正的藝術感染力,因此,與其真中見假,毋寧假中見真。

《開 展廠》雖然存在著以上的缺點,但並不是毫無價值的。其實,我在上文所說,乃是按照現在的習慣,把《李自成》作為嚴肅的文學作品去要求的結果。但如果把它作 為消遣性的作品去讀,那麼,其中的許多情節都是饒有興趣的,例如李自成的兩次與張獻忠會面、王吉元的詐降宋家寨等等。人們的需要是多方面的,消遣性的作 品,只要寫得好,同樣是對讀者得貢獻。姚先生在述及《李自成》的巨大影響時說:「《李自成》在「文化大革命」以後,1、2卷的漢文版都銷售了100多萬 部,共合500多萬冊;……第3卷也銷售了20-30萬部。」這比起《三俠五義》之類書的銷售來雖然還差得很遠(據我所知,《三俠五義》在「文化大革命」 以後就銷售了好幾百萬部),但也確實證明瞭它還是有相當數量得讀者得,這也就是它的價值所在。
不過,既然是作為消遣性的作品,那就跟金庸先生的武俠小說屬於同一類型,也就有了可比的基礎。從這個角度來看,我認為金著武俠小說比起《李自成》來,具有想象奇特、結構緊湊、富於幽默感等優點,而且還能於消遣之中給人以某種有益的啟示,因而不失為上乘之作。
我的這種看法,也許有點不安分之嫌。正如姚先生所說,《李自成》不僅在許多研究論著中獲得贊揚,而且還得到了「茅盾、朱光潛兩位大師」的稱贊。按照中國 的傳統,經過「大師」肯定的東西,我輩小人物是不應再妄議的。不過,「智者千慮,必有一失」,茅盾先生雖是我國新文學史上的傑出作家,朱光潛先生也是有名 的學者,他們的意見卻未必都是不刊之論。例如吧,在蘇聯和中國都已有學者譔文對「現實主義與反現實主義的鬥爭貫穿於整個文學發展過程」的論斷加以駁斥之 後,茅盾先生在他的《夜讀偶記》中仍然堅持並進一步闡發這個觀點,但他的看法終於沒有被學術界所接受;至於朱光潛先生,不僅他對陶淵明的評價和對錢起詩句 「曲終人不見,江上數峰青」的評書曾遭魯迅先生的批評,就是在其解放後的論文中,也不是沒有離奇的常識性錯誤的。而在活著的時候也可說是小人物的龔自珍 (因為他始終是個小官),則在其《文體箴》中早就說過:「雖田地之久定位,亦心審而後許其然;苟心察而弗許,我安能頷彼久定之雲?」我想,既然已經生活在 20世紀80年代,總不能比生活在19世紀前半葉的龔自珍還膽怯:無論「大師」是怎麼看的,我還是說我自己的話吧!

ZT: 正确练习滑雪

有很多同学从犁式转平行式也就是从初级到高级的时候很困惑 练习中遇见了很多技术问题 有的运气好碰到热情耐心又有这个能力的高手指点 有的人东听一句西听一句有的互相矛盾的更不知道怎么练习了 看到有的同学滑得怪里怪气很着急 有的人愿意听从你的规劝认真练习 有的人不重视技术练习的重要 基于我经常带初学者有些经验 这里发表以下看法 希望能对向高级阶段进步的同学又帮助

一. 走刃:最流行的影响最大就算央视滑雪教学盘了我看了很多地方说得很好 尤其是基础训练说讲得很多 但是本人觉得这个教程也有它的不足 最重要的是没有强调走刃说到了刃的重要但没有强调 我想原因是编写的人是专业滑雪运动员出身的基本功太好了 他们犁式联系都要进行两年 所以他们不用强调走刃自然就再走刃 业余同学大都没有这个耐心 差不多会了犁式转弯就开始滑行平行式 从犁式刹车开始就搓雪 转弯还搓雪 转入平行式以后根本不会走刃 又在模仿教学盘的说法动跨崖膝盖 看起来怪里怪气的 左扭右扭的 关键问题没有走刃
解决办法:多练习犁式 犁式是基础但是一定要在练习犁式的时候注意走刃 就是外侧腿(转弯的时候吃力的那条腿)不能搓雪 要在雪面上刻画一条弧线 不能搓出一大片 刹车的时候可以搓雪因为只能搓雪才能刹住 不要以为刹车搓雪转弯也可以搓雪 转弯的时候一定不要搓雪 要走刃 还有练习小回转在开始阶段也要走刃 虽然现在流行搓雪小回转 但是我认为也不是整个的雪板搓雪 只是板尾搓雪 是转弯中走刃划出尽可能充分的圆弧后中心从前到中再到后形成的看起来像搓雪的板尾搓雪 这项技术比较难 开始的阶段可以先不要这样练习 尤其是初学的时候即使是练习小回转也要注意走刃 给个练习建议:降一个等级练习,如果你能在高级到自由的滑行你就到中级道练习 如果你能在中级道滑行你就上初级道练习 这样一方面克服恐惧的心理游刃有余地做动作 最重要的是逼着你走刃 因为你在初级到上还继续搓雪的话就滑不动了就会自然地走刃 不要认为你在中级道上做得好初级道上不会做了 那你在中级道上作的动作就是错误的 如果你滑得好在哪都滑得好才算滑得好

二. 我还想说一下重心 两个概念:一个是前后重心 一个是左右脚的重心转换
整个身体的 重心一定要向前 以什么为标准呢 以你的滑雪靴紧紧地贴到你的小腿迎面骨上为标准 开始的时候养成习惯 要不然以后成了毛病就很难改了 如果已经成毛病了那你现在什么也不要做 就在滑行的时候改你的这个毛病 随时注意你的腿是否贴在你的靴子上 随时注意也可以改掉 如果改不掉这个毛病会严重影响你的提高 像有的人的腿怎么也并不过来 很可能就是你的重心在后面压住了你的板尾动不了 我也不是一下子就姿势正确的 在改正这个毛病的时候 压得迎面骨生疼
左右脚重心转换 卡冰滑好了才能两个脚的重心五五开 大多数人多是时间都是要左右脚重心转换的 尤其是小回转 所以有的人说甚至教练说两个脚的力量是平均的不能算错但是作为咱们业余发烧友来说不要把这项技术作为目标 咱们也许一辈子都做不到 不要刚滑了几次就幻想着你滑的是卡冰你觉得可以做到左右脚五五开我不用看就是知道肯定不对 至少两年以后再说还要每周都滑除了个别的天才之外

三. 压板:这是一个教练的画龙点睛的点拨 这个说法太重要了 是个创举 是每一个人都要体会都要学习都要做的 做好了就会走对了路 就会事倍功半 就会一下子滑得好看 就会从初级水平一下子进入到高级水平
我 们都知道现在的板子叫大头版 这是一项器材革命 自从大头班发明技术动作都随之改变了 以前小回转要抬一条腿(现在抬腿也不算错)所以有这项先进的器材也省了很多事 最重要的就是压板 只要你压住板他自己就会在滑行中转弯 这也是业余同学不想多练习犁式的补救办法 我看得很多同学大都是没有走刃 这样不管是大回转小回转都在搓雪 有的看央视教程里面说转胯亚膝盖 你的板子没有压住没有走刃这些都是空谈 作出的动作必然是怪里怪气的七扭八歪的 根据咱们的特殊情况我以我这里强调压板 用你所有的注意力和你尽可能多的教上的力量压住你的板子 尤其是你的重心腿的板子 让他听你的话不要乱动 这时候神奇的一幕出现了 他自动地转弯了先不用作出其他的动作因为做不好的话会适得其反 初学者练习犁式的时候也是要压住板子 压住重心腿就是外侧腿的那个板子 等转到一定程度(根据坡度调整弯度坡度陡多转坡度缓少转)再交换重心 这个时期具体练习的时候需要有人指点 因为身体压到什么程度 交换重心的时候要有引身 引身到什么程度 小回转还要加上点杖 什么时候点 点在什么地方这里非常不好说 说了也记不住 现场说的话几句话作个示范就解决了 还可以根据你的情况提醒你注意什么 到了练习哪一步的时候 像我看到有的同学在拼命练习平行式 但是两只板子晃来晃去永远压不住 这时候就只能建议他回去练习犁式了 要不他这样怪里怪气地滑雪是永远滑不好的 所以压板也是在你有能力压住板子的时候才能体现出它的神奇 控制不了你的板子的时候什么都是空谈 只要你做好压板在速度快了节奏掌握好了以后会形成反弓 腿就会自然地推出去一下子就会滑得好看了 就会觉得你飘起来了 在雪场上就会非常抢眼 绿野滑雪的高手非常多 到哪里都非常抢眼 滑得好的一出现就会招来回头率和赞叹声 有的同学几天不见一下子令人耳目一新的 就是掌握好了压板子技术

四. 自然引身:不管是大回转小回转压板的时候要平稳地用力 尽可能长时间的压住 不要压一下就完成任务了(这样的同学我也是经常碰到的)尤其转弯的时候压住 等转过弯去的时候交换重心的时候身体会自动地向上引 就有了引身 本人认为不用专门的核对引身的时间 这样会形成看起来很不自然 再说一下 因为当你压板的时候身体会自然下压 重心自然降低看起来像身体下蹲 左右脚转换中心的时候自然要起身要不然很难交换重心 这样就子让形成了引身 引身一完左右脚交换重心后又面临下一轮的压板 这样看起来有节奏的一起一伏但是压板为主引身形成的 没有压板的下蹲身体直直的何谈引身呢 所以前面说的压板首先要做好

五. 雪感练习:
这个练习非常重要 央视盘里也有很多这些方面的练习 我前面讲的走刃 重心 压板如果你走在雪地上永远像走在棉花上 永远晃晃悠悠 永远控制不了你的雪板这些都是空谈 你不可能做到甚至不可能学会 可能永远停留在初级水平 过一段时间你就会觉得没意思了就会退出这项非常有魅力的运动
所以建议:每一次滑雪开始阶段还有滑雪累了的时候 都作一下雪感练习 具体方法央视盘里有 这里也介绍几种简单而却快捷的方法
1. 抬板 穿上雪板后整体抬起 然后再尝试抬板尖 抬板尾 体会雪板在你的脚上的感觉 也是初级控制雪板的能力
2. 原地错脚滑行 就是左脚向前右脚向后来回交替 体会滑行 也有练习控制雪板的功能
3. 原地转圈 开始的时候在平地上 这样很容易 然后在陡坡上这就难了 就要用刃体会刃的意义 因为面对山下时你要内八字用刃刻住雪要不就滑下去了 背对山下时你药用外八字仍然要用刃刻住雪要不就会倒退着滑下山 这样对初学者练习雪感很有帮助
4. 侧滑降 90度对坡 两个板子平行于雪面的时候滑行 然后膝盖弯向一面形成反弓 雪板的刃自然就会让你停住 这个练习对你对刃的感觉非常有好处 练习过后你对刃会有新的体会 还可以增加对雪板的控制
5. 斜滑降 这是平行式的一个重要的练习项目了 开始的时候也可以作为辅助练习 不转弯 斜滑降后停下 做到真正的斜滑降 然后再坐下一个斜滑降 压住板子重心在山下腿因为这时候你的山下腿用的是内刃 也可以尝试一下用外刃就是给山上腿加点压力三七或者四六开但是容易摔跤 因为我们还是没有习惯用外刃
6. 剪刀滑 就是在滑行的时候板尾打开合拢 打开的时候减速合拢的时候速度会快 建议在初级道上练习或者转外的时候练习 这个练习一方面练习雪感和控制你的板子 一方面对犁式转半犁式 半犁式转平形势都是有帮助的
7. 还有一个我的体会 那就是随时随地地注意你的雪板 随时感觉雪地对你的雪板的力量的反馈 甚至在等缆车在人群里走动的时候都要注意你的雪板 那时候有人踩了你的雪板 你踩了什么东西你都有感觉 在走动的时候你尽量不要让你的雪板晃悠或者走空 每走一下都要稳稳地脚踏实地的感觉 这样就是用多余的时间进行着雪感练习

六. 怎样学习进步快
1. 请教练:有人问清教练是不是很好 初学犁式的时候因为很简单 只要有认真和经历过正确指导的同伴在就可以指导你可以考虑不清教练 因为相对来说很简单 容易教也容易学 但如果你要是有钱当然可以找教练 钱多还可以每次都找教练当然会有帮助 但是一定要找个好教练 我听一个朋友说他请了一个教练在教他滑雪的过程中摔了两个跟头 找个好教练不否认是首选
2. 和绿野的兄弟们切磋请教 这样可以保证你不少走弯路甚至不走弯路 绿野这些兄弟们据我了解很少有人请教练的 请也就是很少的一次两次 大都是互相切磋提高的技术 还有他们既然是互相切磋提高的所以都非常热情 只要你能不耻下问他们都会很高兴地传授给你他们所知道的一切所以 我的建议最好的和大家一起去 看见绿的高手就请教 有很多同学就是这样滑得像莫像样的 有的已经成为高手 当然也欢迎和我切磋 现在已经有很多徒弟已经超过我了 但是也有的人东听一句西听一句 有的是互相矛盾的 找好一个类型的人很重要
3. 看教学盘 我知道的有央视滑雪教程 南山出过初级教程(初级) 我的朋友翻译的日本滑雪教程(高级)还有六极小回转(专业)都可以看 但是滑雪教程不能面面俱到 不能根据你的具体情况指出你的问题 要完全靠自己
4. 拍录像 看自己的姿势 我就是在向山给我拍了录像看到我得惨不忍睹的姿势后知道自己滑得有多差 才重视滑雪技术练习的 有个教练说 录像就是你的教练 因为你在滑雪的时候经常看到高手滑雪 自己形成了概念 当看道你的滑雪动作的时候就会自己找出毛病 当你永远看自己不满意的时候就说明你在进步了 离高手不远了

还有很多练习的方法 进步快的方法 还有很多高手们教过不少徒弟 也有很多心得体会 也请他们出来说一说 这样我们的发烧友就会省下请教练的钱多滑几次雪 让咱们不想请教练的同学节省练习的时间 少走弯路 或者不走弯路 早日进入到高手的行列里

  1. Set a duration of how long you think it should take to solve a problem – C’mon, admit it! I’m just as guilty as the next programmer. I’ve seen programmers sit in front of a monitor for eight hours at a time trying to solve a particular problem. Set a time table for yourself of 1 hour, 30 minutes, or even 15 minutes. If you can’t figure out a solution to your problem within your time frame, ask for help or research your problem on the Internet instead of trying to be super-coder.
  2. A language is a language is a language – Over time, once you understand how one language works, you’ll notice similarities between other languages. The language you choose should provide you with a suitable “comfort” level, the ability to produce efficient (and clean) code, and, above all, allow the language to suit the project and vice-versa.
  3. Don’t over-”design pattern” applications – Sometimes it’s just easier to write a simple algorithm than it is to incorporate a singleton or facade pattern. For the most part, it even allows for cleaner, understandable code. 🙂
  4. Always backup your code – I’ve experienced a complete hard drive failue and lost a lot of code when I was younger and felt horrible because of what had happened. The one time you don’t back up your data may be the one time where you have a strict deadline with a client and they need it tomorrow. Source code/version control applies here as well.
  5. You are not the best at programming. Live with it. – I always thought that I knew so much about programming, but there is always someone out there better than you. Always. Learn from them.
  6. Learn to learn more – With number five explained, I’ve always had a magazine or book in my hand about computers or programming (ask my friends, they’ll confirm). True, there is a lot of technology out there and keeping up with it is a fulltime job, but if you have a smart way of receiving your news, you’ll learn about new technology every single day.
  7. Change is constant – Your knowledge of technology and/or programming should be similar to how you treat stocks: Diversify. Don’t get too comfortable with a particular technology. If there’s not enough support for that language or technology, you might as well start updating your resume now and start your training period. My general rule of thumb that has kept me going? Know at least two or three languages, so if one dies off, you have another one to fall back on while you train for a new technology.
  8. Support Junior – Assist and train the junior/entry-level developers on good programming guidelines and techniques. You never know…you may move up in rank and you’ll feel more confident having personally trained and prepared them for their next position.
  9. Simplify the algorithm – Code like a fiend, but once you’re done, go back through your code and optimize it. A little code improvement here and there will make support happier in the long run.
  10. Document your code – Whether its documenting a Web Service API or documenting a simple class, document as you go. I’ve been accused of over-commenting my code and that’s something I’m proud of. It only takes a second to add an additional comment line for each 3 lines of code. If it’s a harder technique to grasp, don’t be afraid to over-comment. This is one problem most architects, backup coders, and support groups don’t complain about if you’ve done your job right.
  11. Test, Test, Test – I’m a fan of Black Box Testing. When your routine is finished, your “stamp of approval” period starts. If you have a Quality Assurance department, you may be talking more to them than your project manager regarding errors in your code. If you don’t test your code thoroughly, you may develop more than code. Possibly a bad reputation.
  12. Celebrate every success – I’ve met a lot of programmers who have conquered headache-style problems with a great programming technique and celebrated with a fellow programmer by doing the “shake”, the high-five, or even a “happy dance.” Everyone has enlightening periods in their life and even though that one happy coder asked you to come and see his extraordinary piece of code and you’ve seen that one piece of code over 100 times in your experiences, celebrate the success of a fellow developer for the 101-st time.
  13. Have Code Reviews Frequently – On projects and personally. In the company, you will always have code reviews of how well you coded something. Don’t look at it as people crucifying your coding style. Think of it as constructive criticism. On the personal front, review your code and always ask, “How could I have done it better?” This will accelerate your learning and make you a better programmer.
  14. Reminisce about your code – There are two ways to looking at old code: “I can’t believe I wrote this code” and “I can’t believe I wrote this code.” The first statement is often of disgust and wondering how you can improve it. You’d be surprised at how old code can be resurrected into a possible and better routine, or maybe even an entire product. The second statement is of amazement and achievement. Developers have their one or two project code achievements that they completed and had everyone standing up and taking notice. Again, based on your excellent coding ability, you could take those past routines or projects and update them into a better product or idea.
  15. Humor is necessary – In my 20 years of development, I have never met a programmer who hasn’t had a decent sense of humor. Actually, in this industry, it’s a requirement.
  16. Beware the know-it-all, possessive coder, and the inexperienced coder – Humble yourself when you meet these types of coders. The know-it-all tries to upstage you instead of working as a team player, the defensive coder created code that he doesn’t want to share with anyone, and the inexperienced coder constantly asks for assistance every ten minutes where the finished code developed is yours, not theirs.
  17. No project is ever simple – I’ve been asked by friends, family, and associates to just “whip something up for me.” To “whip” up a program or web site, it takes planning from both parties to complete something that both sides can appreciate. If someone needs a 3-page web site with Microsoft Access from the start, it winds up becoming a 15-page web site with SQL Server, a forum, and a custom CMS (Content Management System).
  18. Never take anything for granted – If you take on a simple project, you may think that a certain section will be easy to complete. Don’t think that even for a moment. Unless you have a class, component, or piece of code already coded…and has been tested thoroughly…and is in production from an existing project, don’t think it will be easy.
  19. Software is never finished – A fellow programmer once told me that software is never finished, it’s “temporarily completed.” Sound advice. If the client is still using a program you wrote and has stood the test of time, chances are, you are still updating it, which isn’t a bad thing. It keeps you working. 🙂
  20. Patience is definitely a virtue – When clients, friends, or family members use a PC, they get frustrated and proceed to hit a component of the PC or storm off. I keep telling everyone, “you are controlling the computer not the other way around.” You need to have a certain level of patience for programming computers. As soon as programmers understand what they did wrong, they look at it from the computers point of view and say, “Oh, that’s why it was doing that.”

这可能是Design Pattern里最简单的之一,但是上次JobHunting版有人问时,仔细想想,发现有些东西其实自己是没想清楚的,所以又读了一遍。

=================================================================

Decorator的核心就是一个operation, 经过一条链来处理,链上的每个环节都可以影响/处理最后的输出。这条链是可以动态增加的。

从结果看,你希望达到的效果就是:
decoratedObj.act()会依次call链上的每一个decorator的act()

要达到这种效果,那每个decorator需要知道:
1. 最初的object的一些公开属性,这可以通过传递object实现
2. 链的上一层处理完的结果,这个通过在act()里递归实现
所以,Decorator需要wrap原来的object, 这个既可以在constructor里实现,也可以通过set***()函数实现,这点跟Inversion of Control(IoC)的实现是一个意思。但个人以为,写在constructor里,实现更清晰易读。

其次,Decorator需要实现act(), 这个实现就是完成自己的任务,然后调用链的上一节
点的act(),形成递归。注意:这个次序是可以改变的,完成自己的任务可以在parent.
act()之前,也可以是之后。

写成code, 大致就是:
public class Decotorator {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void act() {
this.component.act();
}
}

把那个JobHunting版的例子改一下就是:

public class Person {
private String name;

public Person() {}

public Person(String name) {
this.name = name;
}

public void show() {
System.out.print(“Decorated person is ” + this.name + “.”);
}

public static void main(String[] args) {
Person p = new Person(“Alice”);
Finery decorated = new TShirt(new BigTrouser(new Sneakers(p)));
decorated.show();
}
}

class Finery extends Person {
protected Person caller;
public Finery(Person caller) {
this.caller = caller;
}

public void show() {
caller.show();
}
}

class TShirt extends Finery {
public TShirt(Person caller) {
super(caller);
}

public void show() {
System.out.print(“TShirt “);
caller.show();
}
}

class BigTrouser extends Finery {
public BigTrouser(Person caller) {
super(caller);
}

public void show() {
System.out.print(“BigTrouser “);
caller.show();
}
}

class Sneakers extends Finery {
public Sneakers(Person caller) {
super(caller);
}

public void show() {
System.out.print(“Sneakers “);
caller.show();
}
}

最后的主函数就是三句:

Person p = new Person(“Alice”);
Finery decorated = new TShirt(new BigTrouser(new Sneakers(p)));
decorated.show();

【典型例子】
Java IO里的:InputStream (base object),FilterInputStream(Decorator) 及其实
现:BufferedInputStream, DeflatorInputStream, InflaterInputStream,
LineNumberInputStream, PushbackInputStream etc.

FileInputStream, StringBufferInputStream, ByteArrayInputStream则是
InputStream的实现。

【附记】
Decorator和Chain of Responsibility的区别,后者是链上的某一个环节,把发来的请
求处理了,就返回;不处理,就扔给下一个环节。

【副作用】
* Decorator可能导致很多小class,每一个都只是功能的一部分实现。
* Decorator可以动态添加,该用多少,互相之间有什么影响,这些动态因素可能影响
将来的维护。尤其是如果Decorator里有任何的假设,或者dependency,将来很可能不经意地引入bug。

去年圣诞节,室友和女朋友约会去了,我一个人在房间里。

我把浴室的灯打开,把热水打开,浴室里就雾气腾腾的透出光亮,像一个神迹显现。

我在隔着一个客厅的房间里上网,发帖子,发微薄,假装自己正在等一个女人洗完澡,出来陪我**,但其实水是我开的,浴室里没人。

我的室友回来了,带着一个女孩儿,他很吃惊的看着浴室。

你带了人回来吗?

我应该诚实,但真相太可悲了,我说是的,我带了人回来。

他拍拍我,说好小子,真看不出来呀,那就不打扰你了。神色隐秘的一笑,和他的女友钻进他的房间了。

但其实浴室里没有人,水是我开的,过了一会儿,我觉得这样很浪费,就把水关了。回到自己的房间睡着了。

后来我的室友就跟人说,我有一个女友。别人就问我,你有一个女友吗?

我怎么说呢?我只能说是,我不能告诉他们水是我开的,卧室里没有人。

所以我度过了一段麻烦的日子。我不能再参与单身汉的下班活动了,因为他们听说,我有个女友。

去陪你的小情人吧,他们一群人哄着赶走了我。

公司里发电影票,他们给了我两张,我装作很感谢的样子,可是我从哪儿找另一个人陪我去看电影呢?

所以我一个人,旁边的位置上放着我的爆米花。

你和你的女朋友吵架吗?他们问我。我该怎么回答呢?我说,不经常吵。这是真的,我们没吵过架。

有些时候他们老见不到我的女朋友,就很奇怪,为什么见不到你的女朋友呢?而且有些心直口快的女孩儿说,你都从不给你女朋友买东西,还说,不吵架,就是快散了。

所以我被他们拉着买了一些女人的小玩意,有些东西真的不错,我想,在我送给她的时候,她会很高兴吧。

后来他们还说没有见过我的女朋友,一直都没有,我怎么办?告诉他们浴室里没有人,水是我开的?

我说不出口,没有办法,我买了一些卫生巾,不常见的型号,还有唇膏,一些粉底。

有人走进我的房间,说这些东西是谁的?

是我女朋友的,因为她有时候在我这里过夜,所以我为她准备了一些常用品,比如卫生巾,都是她特别用的那种。

女人听完泪眼婆娑,揪住她男友的袖子,你看看人家。连男人都露出了不好意思的神色。

谁会不信我呢?谁会不信我有个女友呢?

只是她性格怪癖,不爱见人而已。

我上班前在封底上揩一下,抹在脸上。

要是有一部相机留下每天我卧室内的照片,那些东西都在一天天减少,看起来就好像有个隐形的女友一样。

人人都相信我有个女朋友。没有人会发现浴室里其实没有人,水是我开的。

又过了很长时间。

我们老板找我去办公室,面带关切,莫名其妙的给我一天的假,隔壁桌的两个女孩儿面带同情的看着我,鼓励我,想我这么好的男人,肯定能找到更好的。

我才知道有人看到我一个人去看电影了,还看到我一个人坐了两个人的位子,在电影中间哭。

哦,原来我是失恋了。虽然那部片子很感人啊。

我简直想痛骂自己一顿,这是早就可以通往解脱的一条路,我早就该这么说啊。仅仅是因为卫生巾和粉底不算贵,我不知不觉过来好长时间。

我立即揪着自己的头发,很痛苦的样子,喃喃得看着远方。她们又捂着嘴,抽鼻子,背过头,有一个人忍不住哭了。

我没哭,我跟我女友没什么感情。

我又单身了,吃过两顿安慰饭之后,一切又回归了生活的平静。有女孩儿要给我介绍女朋友。

他为她女友买专用的卫生巾呢!她们不厌其烦的说,讲了很多我都不知道的痴情故事,是吗?那个介绍来的女孩偏过头来问我。

我怎么办,我只能说,是啊,难道要我告诉她,浴室里没有人,水是我开的?

我跟那个女孩儿出去了两次,后来她委婉的把这事儿分了。

你的心里空落落的 ,我感觉你还爱着她,我没信心取代这个位置。她眼红红的,临走还给我一拥抱。

这姑娘真够意思。

后来就没有人再介绍女孩儿给我了。

经她这么一点拨,我开始想念起我的前女友来,然后我想起来,我没有一个前女友啊。

浴室里没有人,水是我开的。

又到了一年圣诞节,还是那个室友,和一个不同的姑娘出去了,我一个人在屋里上网。

我那时候想,不知道那一次圣诞节,我究竟是因为什么把浴室里的热水打开呢?

一个人点着一根烟,在昏暗的灯光里,感觉很冷。想了很久,突然想起来,原来我是在想象有一个女孩儿是属于我的。

没有抗拒这诱惑力,我打开灯,扭开热水,浴室里就雾气腾腾透出光亮,像一个神迹显现。

这时候,我的室友抱着那个女孩回来了,他看着浴室,先是好奇,接着露出了惊讶和欣喜的神色。

是她回来了?

他旁边的女孩儿都跟着高兴和惊讶起来,是你跟我说的那个吗?是他以前那个女朋友吗?

两个人调子都变了,在客厅里高兴的又蹦又跳,好像约瑟和玛利亚。

不,我说。

浴室里没有人,水是我开的。

不解风情的死理性派们在情感生活中不免会遇到这样悲催的一幕:偶然间遇到一位心仪的漂亮女孩,从此日思夜想,废寝忘食,开始了漫长的暗恋之旅,等到一日,在无尽的纠结中,终于鼓起勇气向女孩表白,结果女孩一句“我已经有男朋友了”如晴天霹雳,实在难以接受……

为了避免此种尴尬的发生,如何准确判断一位女生是否单身就成了一项的必修的课程。

如果自己和女孩在一起共事,常常在她的身边,了解她是否单身就不是难题了。可是死理性派们要完成的高难度任务是:作为一个与女孩保持距离的陌生人, 在女孩毫无察觉的情况下,就可以用手头有限的信息判断出女孩的单身情况,不仅如此,死理性派追求的结果一定是量化的,计算出的mm单身概率还要保留两位小 数。

做法是这样的:第一步,要相信直觉。死理性派可以考虑多找几个朋友一起秘密观察一下目标女孩,当然找的人不要都是死理性派,什么心事鉴定组、谣言粉 碎机、自然控、犯罪法医谜最好都找几个来,已婚人士、情场老手、采花大盗也要找一下,人越多越好,越多样化越好。然后大家根据自己对mm的印象从各自的角 度估计一下目标mm单身的概率是多少,投一下票,最后的结果一定会有差异了,仁者见仁,智者见智,可能心事鉴定组觉着女孩单身可能性是90%,谣言粉碎娘 却觉着mm单身只是谣言。死理性派根据这些人平时一贯的靠谱程度,把每个人说出的概率平均一下,原则是平时比较靠谱的人给出的结果考虑的比重就要大一些, 不靠谱的人给的数字就要小一些,假设最后得到的结果是:该女孩单身概率为65.65%,我们就完成了第一步。

以上结果只是依靠各位投票者个人经验感性给出的结果,哪里符合死理性派客观理性的做事风格呢?为此,我们要进行第二步,要用事实和证据说话。一个mm是不是单身,可以从很多细节中寻找答案。

就像做科学研究一样,可以先查一下资料,google上随便一搜就可以找到不少寂寞人士多年潜心研究的简单易用的单身判别标准,比如手机原则(恋爱 中的女生手机使用频率会比较高),自习原则(单身的女孩常常和几个女生结伴上自习的话)。之后,在自己身边已经知道是否单身的女孩人群中做一下统计实验, 当然样本越大越好了,得到

诸如此类的统计值。

当这些“实验数据”都到手了,我们就可以继续了,对刚刚投票出来的概率值65.65%进行修正和优化。依靠的是什么呢? 自然是目标女孩在各项标准上的表现。比如发现目标mm喜欢和朋友一起去上自习,而根据自己的“统计研究结果”:在已经恋爱的mm中,喜欢和朋友一起去上自 习的女孩大约占其中的60%;在没有恋爱的女孩中,喜欢和朋友一起去上自习的女孩大约占其中的30%;

那么现在目标mm是单身的概率就会变为

死理性派心中一定暗暗高兴,希望增大了!

如果研究结果还发现,在单身女孩中,手机使用率大于1.2次/小时占其中的80%;在已经恋爱的mm中,这一数值则是40%;可是对于目标mm的观察结果是,她的手机使用率低于每小时1.2次,那么概率结果又要更新了。

这回mm单身的概率又悲剧地降回了56.02%,死理性派可以去找更多的“评核标准”,做更多的研究,不断更新女孩的单身概率值,让它越来越贴近事 实,不过在得到最后的结果之前,自己要先定一个阈值:女孩单身概率超过这个阈值(比如90%),自己才值得出手表白,否则,还是直接死心吧。

不过要注意的是,不管计算次数多少,得到的终归是一个概率值,不是事实,就算经过多次研究,已经可以将目标女孩的单身概率确定到99.9%,马上就 准备向她表白了,可是在最后一次对女孩的观察研究中,发现人家和一个男生手挽手的有说有笑,拥抱在一起,那么,女孩的单身概率值会立刻从99.9%掉到接 近于0,后果可想而知了……

本文告诉大家的这种判断mm是否单身的科学而严谨的死理性方法称为贝叶斯统计方法。贝叶斯方法简单的说就是“先验概率+新得到的证据=更正后的概 率”,可以不受信息量多少的限制,将各种来源的结果,包括主观判断和有限的客观信息,综合到一起,得到最后的结论。这里严正声明,本方法存在一定风险,尝 试时需谨慎,小朋友就不要尝试了。

不过话说回来,死理性派发明的贝叶斯大法还是不可小视的,美国海军在汪洋大海里搜索丢失的氢弹、失踪的核潜艇都用过这种方法,下面我们就由情感频道转台到历史频道。

1966年1月的一天,美国一架B-52轰炸机在西班牙的帕洛玛雷斯上空飞过,飞机上的几位飞行员在执行着空军司令部安排给他们的空中加油任务。按 理说这次飞行称不上危险,据说机长还是个很淡定的人,没事儿喜欢拿个大烟斗抽两口,甚至在飞机飞行舱里也不例外。可是这一会机长和他的几个部下可遇到大麻 烦了,以后能不能再享用大烟斗都难说了。在一次加油的时候,负责加油的运输机试图从其右后侧方接近B-52轰炸机,以便把柔性输油管送至对方飞机上。两机 速度没有控制好,互相撞擦了一下,这一“亲密接触”不要紧,加油机的油立刻起火爆炸,B-52也被撞的不轻,两架飞机的飞行员当场死的死,跳伞的跳伞……

可是故事还没有完,之后又发生一连串的悲剧和喜剧

为了找那一枚丢失的氢弹,美国赶紧从国内调集了包括了多位专家的搜索部队前往现场,其中也包括一位名为John Craven的数学家,头衔是“美国海军特别计划部首席科学家”,既然是特别的,那就不是一般的,Craven博士做的工作到底有什么特别之处呢?

【John Craven】

在寻找氢弹的问题上,Craven提出的方案使用了刚刚提到的贝叶斯方法,他召集了各方面的专家,不过每个专家都有自己擅长的领域,并非通才。有的 对于B-52轰炸机了解甚多,却对于氢弹的特性知之甚少。氢弹如何储存在飞机上是一个问题,氢弹怎么从飞机上掉下来又是一个问题;氢弹会不会和飞机残骸在 一起也没有答案;氢弹上的两个降落伞各自打开的概率是多少?风的流速和方向?氢弹落到地上之后会被埋到土里吗?

对于这些各式各样的问题,Craven要求专家们做出各种假设,想象出各种情景,然后在各种情境下猜测出氢弹在各个位置的概率,以及每种情境出现的可能性。

Craven的做法也受到了同行的质疑,因为在他的方案中,结果很多是这些专家以猜测、投票甚至可以说赌博的形式得到的,无法保证所有结果的准确性,可是因为搜索氢弹的任务紧迫,并没有时间进行精确的实验、建立完整可靠的理论,Craven的办法不失为一个可行的办法。

Craven得到了从专家那里“招供”的结果后,综合到一起,画了一张氢弹位置的概率图:把整个可能的区域划分成了很多个小方格,每一个小方格有不 同的概率值,有高有低,如同地图上表示山峰和山谷的等高线一样。像判断女孩是否单身的死理性派们一样,Craven完成了贝叶斯方法的第一步。

之后,Craven和搜索部队的指挥官一起开始了对氢弹的搜索,在搜索的过程中同时对每个格子的概率进行更新,不过,概率最大的方格子指示的位置常 常是陆地上险峻的峡谷和深海区,即使氢弹真的在那里,也未必找得到,所以需要绘制另一张概率图,表示“氢弹已经在那里,能找到的概率”而不是氢弹位置的概 率。最后氢弹被找到,Craven的两张概率图和他的贝叶斯方法发挥了不小作用。

仅仅过了两年,到1968年,Craven又有机会发挥一下才能了,上回丢了个小小的氢弹,这回美国海军丢了个“大个儿”的。

1968年6月海军的天蝎号核潜艇在大西洋亚速海海域一下子失踪了,潜艇和艇上的99名海军官兵全部杳无音信。按照事后调查报告说法,罪魁祸首是这艘潜艇上的一枚奇怪的鱼雷,发射出去后竟然敌我不分,扭头射向自己,让潜艇中弹爆炸。

为了寻找天蝎号的位置,美国海军进行了大规模的搜索,Craven自然也参与其中。由于失事时潜艇航行的速度快慢,方向,爆炸冲击力的大小方向,爆 炸时潜艇方向舵的指向都是未知量,即使知道潜艇在哪里爆炸,也很难确定潜艇残骸最后被海水冲到哪里。Craven初略地估计一下,在半径20英里的圆圈内 的海底,天蝎潜艇都有可能躺在那里,要在这么大的范围内、这么深的海底找到潜艇几乎成了不可能完成的任务。

没有专家能准确的估计到,在出事前后潜艇到底发生了什么,和搜索氢弹的时候一样,Craven咨询了数学家、潜艇专家、海事搜救各个领域的专家,编 写了各种可能的“剧本”,让他们按照自己的知识和经验对于情况会向哪一个方向发展进行猜测。据说,为了给枯燥的工作增加一些趣味,Craven还准备了威 士忌酒作为“投注”正确的奖品。

最后,Craven得到了一张20英里海域的概率图。整个海域被划分成了很多个小格子,每个小格子有两个概率值p和q,p是潜艇躺在这个格子里的概 率,q是如果潜艇在这个格子里,它被搜索到的概率。按照经验,第二个概率值主要跟海域的水深有关,在深海区域搜索时失事潜艇“漏网”的可能性会更大。如果 一个格子被搜索后,没有发现潜艇的踪迹,按照贝叶斯原理更新后,这个格子潜艇存在的概率就会降低:

其他各个格子的潜艇存在的概率值就会上升:

每次寻找时会挑选整个区域内潜艇存在概率值最高的一个格子进行搜索,如果没有发现,概率分布图会被“洗牌”一次,搜寻船只就会驶向新的“最可疑格子”进行搜索,这样一直下去,直到找到天蝎为止。

最初的时候,海军人员凭经验估计潜艇是在爆炸点的东侧海底,对于Craven和其它数学家的建议嗤之以鼻,但是几个月的搜索后一无所获。后来海军不 得不听从了Craven的建议,按照概率图,失事后的潜艇应该在爆炸点的西侧。经过几次搜索,潜艇果然在爆炸点西南方的海底被找到了。

经过两次给力的表现,Craven在海事搜索中使用的贝叶斯方法逐渐被广为接受,从此,贝叶斯方法意想不到地常常和氢弹、核潜艇一起成为关键词在各 处出现。几十年间,贝叶斯方法应用越来越广泛,从google搜索筛选词条到无人驾驶汽车综合判断自己的行驶位置,钻进了各个角落。当然,这个神奇的方法 用在追女上实在是大材小用了。

(本文获得2011年台湾财团法人国立自然科学博物馆文教基金会第五届人与自然科普写作桂冠奖征文竞赛第三名。)