
前言
第1章
痛苦是本書的靈感源泉。唔,還有酒精。而當痛苦累積到一定程度的時候,我就會忍不住開始抱怨。再加上酒精作祟,什么刻?。ㄉ踔粱┑脑捨叶颊f得出來?,F在我還會時不時地回頭翻看這些東西,每次都忍俊不禁。原來我很毒舌嘛。
和絕大多數程序員不同,痛苦在我身上留下了獨特的印記,迫使我的世界觀發生了極大的變化。我現在能一眼看穿很多老鳥都看不到的東西,因為,老實說,他們都太墨守成規了。
過去25年里,經歷了很多形態迥異的編程類型,寫了太多原本不用寫的代碼。彎路走多了,反倒讓我培養出一種第六感——我能看見死人。這種感覺其實很不好。如果你也這么倒霉,得到了這種第六感,那可以選擇的路其實只有兩條:要么心懷不滿,沮喪不已;要么微笑面對。
于是我試著用樂觀的態度去面對它。一開始會很難,不過現在也越來越熟練了。這當中少不了酒精的作用。當然,熟能生巧也是一方面啦。你得習慣自嘲,還要學著嘲笑別人,以及我們所生活的這個瘋狂世界。更重要的是要把握好分寸,適可而止。
那以開車來舉例好了。每次看著那些顯然沒有從車禍中吸取教訓的人們,我都會笑得很緊張,眼角不由自主地抽搐起來。我總是能注意到那些跟車跟得太緊,結果把前保險杠撞爛的家伙;還有突然急剎,結果把后保險杠撞得稀巴爛的車;車頭太出路口,結果被撞得一塌糊涂的車;以及那些冒冒失失偏離自己的路線,在隔離帶上擦出巨大刮痕的車。
只要你注意到這些東西,它們可以說隨處可見。很多司機似乎都不知道吸取教訓。他們總是覺得自己“知道”怎么開車,之前的那次車禍根本不是自己的錯!
你周圍有多少成年人真的花時間去提高自己的駕駛水平?你認識的人里,是不是有些人的駕駛習慣讓你難以忍受,想要幫他們指出來?只不過你知道他們肯定不愛聽。
而事實上,每個人都覺得自己會開車。好像開車這件事和用微波爐加熱玉米煎餅一樣簡單似的。任何指責他們駕駛技術不嫻熟的人都是不知所謂。
其實這中間是有微妙區別的。大多數司機的問題在于他們覺得“會開車”和“好司機”是一回事。只要考到了駕照,再開上幾年車,自己就算是經驗豐富的司機了!該知道的自己都知道了。除了一些罕見的情況,比如雪地、沙漠、濕地、煙霧、極冷極熱、強風、陡峭山地、人群,等等。那時只要開得慢一點兒不就萬事大吉了嘛。而且大多時候是可以避免開車的。如果真的有必要,到時候再專門去學一下就好了。你一定是這么想的吧?
好吧……只不過書到用時方恨少,到了真的需要這些駕駛技巧的時候,通常連佛腳也沒處抱了。比如車子正在打滑沖向電線桿的時候。運氣好的話或許還能躲過一劫。只不過事故過后,你會想到要去接受培訓,提高駕駛水平嗎?當然不會啦,除非法官逼你去。畢竟你是“會開車”的人。
如果羅列一下所有的特種駕駛類型——專業賽車手、追捕車輛的警察、在森林公園防火道上的巡邏員、巨型車司機,還有很多聞所未聞的駕駛種類——只要稍微動點兒腦筋就能明白,其實你的駕駛技術根本不算什么,充其量也就是過得去而已。既然有一半的司機低于平均線,那么很可能你也是其中一員,大家都心知肚明,只有你自己還感覺良好。
這似乎是讓所謂的僵尸啟示錄顯得合理的原因之一。因為我們都知道,沒人對此有所準備。大多數司機都只是僵尸的獵物罷了,因為他們都覺得自己“會開車”,別人也不會點穿他們。
事實證明,編程和開車非常像。只要寫幾年代碼,行了!自己就算是“會寫程序”了,好像用微波爐加熱玉米煎餅一樣。大多數程序員這時都會陷入舒適區,再也走不出來,就像司機會盡量避開自己不熟悉的情況一樣。要是有人給他們提點建議和意見,那這個人肯定是有毛病,要么就是搞不清楚狀況。
但這種狗屁不通的觀點和很多父母對待游泳課的態度不是一回事嗎?無數的父母不讓自己的小孩學游泳,因為他們有可能會溺水?
程序員和司機一樣,總是自我安慰說等到需要的時候再去學新技能也來得及。但是在內心深處他們都明白,其實當需求出現的時候就已經太晚了。因此現實情況是這樣的,旱鴨子會和水保持距離,司機會繞開泥濘的路段,而程序員會躲在舒適區里,搭建圍欄把自己保護起來,然后祈禱世界和平。
可能你覺得這沒什么大不了的——只要每個崗位上都有專門的人才不就萬事大吉了嘛。但只要稍微深入思考一下編程和開車的比喻,就會發現事情并沒有那么簡單。開車很復雜,也是一件很自我的事情。我們都不愿承認這一點,因此產生了很多現實生活中的問題。
. 比如每個地區的駕駛風格就各有不同。盡管西雅圖和洛杉磯的交規基本一樣,但是兩地的司機完全不一樣。有一次,有個土木工程師告訴我說,一個地區的車速和咄咄逼人的程度,和這個地區糟糕的交通狀況歷史成正比。洛杉磯的交通幾十年來一直都很差,所以每個人都知道,不兇狠一點是開不了車的。而西雅圖的交通變糟只是這十幾年來的事情,而且還沒糟到洛杉磯的那種程度,所以西雅圖的司機開車都像老奶奶。
不過西雅圖的司機很不擅長在雨里開車,這一點相當搞笑。就算把車速降到接近零,每年還是會發生無數次車禍。
為什么會這樣呢?這是因為西雅圖的駕駛風格正處在轉變之中,從休閑變得咄咄逼人。其中一部分原因是因為很多加利福尼亞居民沿著海岸線北上的同時,把原來的駕駛習慣也一起帶了過來。另一部分原因是當地人口的快速增長,使得西雅圖公路上的汽車數量年年翻新。所以現在西雅圖的路上,既有彬彬有禮的司機,也有兇狠粗魯的司機。
駕駛風格發生碰撞的時候,車輛自然也會撞到一起。等到風格統一了,也就是同一個地區的人開車方式“都一樣”的時候,車禍數量自然也會減少了——哪怕在外人看來,這些司機都像瘋子一樣。
編程和開車其實一樣錯綜復雜。編程的世界里也有司機、技工、汽車生產商、交通工程師、地區性的交通法規、交通執法、不同地區的駕駛風格,當然還有大規模的汽車追尾事故等。編程也有自己的亞文化,若硬要把它們放在一起,肯定會出現不協調。
這就是我要寫這本書的原因,也是怎么寫這本書的指引。我選擇了一條不尋常的小路,幾十年來不斷探索大多數程序員從未接觸過的領域,了解了人們在不同的風格和文化里是如何開發軟件的。我領導過一幫擁有令人難忘的怪癖的專家,用過十幾種語言,活躍于各個社區,見證了巨型項目的崛起、輝煌、衰敗和消亡。雖然我不敢自稱編程界的“百曉生”,但也是見過大世面的。
現在的狹隘可以說隨處可見。就好像不同地區的司機,程序員也會在工業界和學術界里組成自己的小圈子,形成自己的術語、慣例、禁忌、學問等文化產物。他們能創造出自己的知識領地,就覺得自己天下第一、獨一無二。
不管發生何種重大事故或交通問題,人們都會把責任怪在不合格的司機和程序員頭上。雖然有時候的確是他們不好,但很多時候,沖突都是由文化差異導致的理念不同所產生的。
可惜,大多數自認為“會寫程序”的程序員都會狹隘地給異己者貼上“錯”的標簽。這是人的本性,是我們最容易犯的錯誤之一,我自己也不曾幸免。
剛剛開始發牢騷的時候,我還是個丑陋的美國佬,在帖子里上躥下跳,除了大喊“你們這幫家伙到底在搞什么”什么都不會。不過在接下來的十年里,我覺得我漸漸變成了一個業余的軟件人類學家。現在我非常贊同文化相對論,盡量不去對那些和我意見不同的人下結論。
當然我不會因此就放棄開他們玩笑的機會,同樣我也不介意別人來拿我尋開心。我最終希望能說服那些還在搖擺的程序員認同我對編程的看法,因為編程和開車一樣,只有在大家步調一致的時候才是最好的。所以我會繼續宣揚自己的觀點,也就是所謂的“軟件自由主義”,它是完全合理的,甚至可能是很多軟件開發都應該采用的方式。
妄圖讓所有人都更自由肯定是行不通的,這一點毋庸置疑。即便如此,我還是希望能幫助來自不同軟件文化的人們更好地理解對方。
我會繼續搖旗吶喊,因為這似乎是可以讓大眾聽到我聲音的唯一的方法?,F在還有人會跟我說我的博客寫得太啰嗦了,他們覺得我的觀點完全可以在100個字里表達清楚。我發現這些評論主要是來自我的反對者,其實他們真正想要的是在反駁我的時候可以少寫點字。不過一些贊同我的人也在抱怨,覺得我的博客太長,沒辦法抓住他們的注意力。在這里我要說,沒抓住重點的人是他們,我的博客根本不長,沒有足夠的“分量”是無法直指人心的。經過這么多年的試錯,我發現最容易抓住聽眾的辦法還是講故事。而不深入其中,享受過程,是講不好故事的。
這就是本書的大致內容了。它是由一系列故事組成的。它們形式各異,可能是文章、論文、指南、抱怨,也可能是小說。但不論文體是什么,每篇都和你分享了一個故事。就算你不會同意我所有的觀點,至少我希望你能喜歡我的故事,若還能讓你覺得豁然開朗的話,就再幸運不過啦。
Hyperink的編輯們挑選了要收錄的帖子,而且大部分章節段落的組織都是他們負責的。雖然我自己也做了一點修改,但是你現在所看到的這本書基本上是根據他們的想法組織起來的。他們干得非常漂亮。
愿你能和我一樣享受這段旅程。
Steve Yegge
2012年8月