王垠:程式設計師的心理疾病
說實話,雖然似乎為之奮鬥了十多年,在真正進入軟體行業的短短一年之後,我已經對它感到相當的厭倦了。這並不是說這個行業沒有前景,而是在這個行業工作,其實很難得到心理上的快樂。
人們說女怕嫁錯郎,男怕入錯行。我並不認為自己入錯了行,我仍然很喜歡設計程式和語言,而且我顯然是這個領域的王牌之一。然而我卻看到了這個行業裡的無限混沌,讓我覺得喘不過氣來。幾十年的垃圾設計堆積在那裡,卻沒有人試圖把它們清理掉,權威主義盛行。無論你在哪個公司,哪個地方,只要跟程式設計師說話,十有八九會談不來。非常掃興不說,甚至感覺很傷自尊。
久而久之我發現了,由於程式設計師工作的性質,他們受到的“薰陶”,形成了一種行業性的心理疾病。這裡我就簡單的把我所觀察到的一些症狀總結一下。
無自知之明
由於程式設計師的工作最近幾年比較容易找,工資還不錯,所以很多程式設計師往往只看到自己的肚臍眼,看不到自己在整個社會裡的位置其實並不是那麼的關鍵和重要。很多程式設計師除了自己會的那點東西,幾乎對其它領域和事情完全不感興趣,看不起其他人。這就是為什麼我的前同事 TJ 作為一個資深的天體物理學家,在一個軟體公司裡面那麼卑微。貌似會寫點 node.js,iOS 軟體的人都可以對他趾高氣昂的樣子,而其實這些東西的價值哪裡可能跟 TJ 知道的物理知識相提並論。讓人感覺是在陰溝裡翻了船被老鼠欺負。
如果力學工程師犯了錯誤,飛機會墜毀;如果結構工程師犯了錯誤,大橋會垮塌;可是如果軟體工程師犯了錯誤,大不了網站掛掉一小時,重啟一下貌似又好了。所以所謂“軟體工程師”,由於門檻太低,他們的工作嚴謹程度,其實是根本沒法和力學工程,結構工程等真正的工程師相提並論的。實際上“軟體工程”這個名詞根本就是扯淡的,軟體工程師也根本不能被叫做“工程師”。跟其他的工程不一樣,軟體工程並不是建立在科學的基礎上的,電腦科學也根本不是科學。按照 Dijkstra 的說法,“軟體工程”是窮途末路的領域,因為它的目標是:如果我不會寫程式的話,怎麼樣才能寫出程式?
為了達到這個愚蠢的目的,很多人開始兜售各種像減肥藥一樣的東西。面向物件方法,軟體“重用”,設計模式,關係式資料庫,NoSQL,大資料…… 沒完沒了。只要是有錢人釋出的東西,神馬垃圾都能被吹捧上天。Facebook 給 PHP 做了個編譯器,可以編譯成 C++,還做了個 VM,多麼了不起啊!
其實軟體裡面有少數永恆的珍寶,可惜很少有人理解和尊重它們的價值。這在其它的工程領域看來是不可思議的,然而這卻是事實。
垃圾當寶貝
由於沒有科學作為理論的基礎,沒有實驗作為檢驗它們的標準,軟體行業的很多東西就像現代藝術一樣,醜陋無比的垃圾還能擺在外表堂皇的“現代藝術博物館”裡面,被人當成傳世大作一樣膜拜。
為了凸顯自己根本不存在的價值,又提出一些新的“理念”,就像有些現代藝術家一樣,說“藝術的目的不是為了美,而是為了自由。”哦,這就是為什麼你們可以自由地把那些讓人反胃的東西放在博物館裡,還要買門票才能參觀?
宗教鬥爭
當然了因為沒有實質的技術,為了爭奪市場和利益,各種軟體的理念就開始互相傾軋。一會兒說軟體危機啦,面向物件方法來拯救你們!一會兒又提出設計模式。過了一會兒又有人說這些設計模式裡面有些模式是“反模式”,然後又有人把函數語言程式設計包裝起來,說是面向物件程式設計的剋星,一會兒是關係式資料庫,一會兒是 NoSQL,一會兒是 web,一會兒是 cloud,一會兒又是 mobile…… 每個東西都喜歡把自己說成是未來的希望。
這就是為什麼有人說在軟體行業裡需要不停地“學習”,因為不斷地有人為了製造新的理念而製造新的理念。在這樣一個行業裡,你會很難找到一個只把程式語言或者技術當成是工具的人。如果有人問你對某個語言或者技術的評價,是非常尷尬甚至危險的事情,所以最可靠的辦法就是不做評論,什麼都不要說。
引難為豪
在 IT 行業裡批評一個技術難用,是一件非常容易傷自尊的事情,因為立馬會有人噼裡啪啦打出一大篇程式碼,說:就是這麼簡單!然後你就發現,這些人完全不明白什麼叫做設計,他們以自己能用最快的速度繞過各種前人的設計失誤為豪,很多程式設計師甚至以自己打字快為豪。
當遇到這樣的人,我的經驗是,千萬不要恭維他們。你必須大聲地嘲笑他們是 code monkey,否則你不但助長了他們的氣焰,而且將來自己的自尊也難保了。
去讀文件!
不知從什麼時候開始,人們開始引用 Eric Raymond 的一篇叫做《提問的藝術》的文章,這篇文章後來就成為了對提問者沒禮貌的藉口。由於這篇文章的誤導,當你希望同事能給你一個手把手的演示的時候,他們往往會丟給你一篇不知道什麼時候寫的文件,讓你自己去讀,彷彿文件就可以代替人之間的直接互動。況且不說這文件可能已經過時,裡面有很多地方已經不符合最新的設計,而這意味著在潛意識裡,他們覺得高你一等。他們甚至會對你說,如果每個新人來了我們都花這麼多時間去指導他們入門,哪裡還有時間幹正事呢?然後你就意識到了,你在他們心裡的地位,其實是如此的卑微和低下。
有的人稍微委婉一點,當你提問的時候,他們會二話不說開啟一個瀏覽器視窗,在裡面用 Google 搜尋,然後指給你:看,就是這樣。貌似比較禮貌,但那其實意味著他們在教訓你:Google 一下就找到了的,自己不動腦筋!有誰不會用 Google 呢?提問的人恐怕是想得到 Google 不能給他的答案。真正有禮貌的人在不知道答案的時候是不會當面去幫你搜索的,他會對你說:“這個我也不知道…… 要不你搜索一下?”
在 IRC 的聊天室裡,由於隔著網路的屏障,這種對提問者沒禮貌的現象就更加囂張。我曾經有幾次去 Java 的聊天室問一些貌似基礎,而其實很深入的語言設計問題,結果沒有一次不是以收到像“去讀 API!”這樣的回答而結束。API 誰不會讀,然而我需要的是一個有血有肉的人對此的理解。所以後來我根本不去 IRC 這種地方了,因為那裡面對你打字的基本上已經不是人類了。他們覺得你問問題浪費了他們的時間,然而他們一天到晚泡在 IRC 裡面好像就是在做什麼正事似的。後來你發現,原來在 IRC 裡面訓斥新手就是他們唯一的樂趣。
像 Haskell 之類的聊天室貌似稍微友好一點,然而後來你發現他們顯得友好是有所企圖的。因為當時 Haskell 還沒有很多人用,他們需要吸引新手,竭盡所能的誘導他們。而一旦你變成了專家,就會發現當對它的設計提出異議的時候,“id”們是多麼的不友好。最後你發現,其實所有語言的所謂“社群”都一個德行。如果 Haskell 有一天像 Java 一樣如日中天(當然不大可能),肯定對大部分問題的答案也就是“去讀 API!”
不得不指出,《提問的藝術》等介紹“黑客文化”的文章對於這種現象的出現有著極大的責任。這種文章試圖抹去人類文明幾千年來傳承的文化,而重新給“禮貌”做出定義。其結果是,人類的文明因為這些文章,在程式設計師的世界裡倒退了幾十甚至幾百年。很多外行人人不喜歡跟程式設計師說話,叫他們是 nerd,就是這個原因。
不要提問,不要謙虛,不要恭維
跟上面的症狀相似,程式設計師世界裡的一條重要的潛規則是:只有菜鳥才會問問題。所以如果你有任何機會可以自己得到答案,就不要試圖向人“請教”,尤其不要顯得好奇,否則你就會被認為是菜鳥。我有幾次不恥下問的經歷,最後導致了我被人當成菜鳥。我只是覺得那問題有趣,也許能夠啟發我設計自己的東西,所以吃飯時覺得是個話題可以說一下,結果呢就有人忙著鄙視你,那麼小的問題都沒搞清楚。正確的態度應該是誠實,直接,見慣不驚,那有什麼大不了的,我什麼沒見過,我很懷疑。
隨之而來的引論就是:不要謙虛!那些“職場經驗”之類的文章告訴你的進入新的公司工作,要謙虛好問,對 IT 公司這種不講美德的地方是不管用的。有的大 IT 公司有所謂的“文化”,比如叫你要“Googley”,要“humble”,其實只是用來貶低你價值的藉口。他們要你向他們“學習”,但其實他們沒有什麼值得學習的地方。他們只是想讓你安於“本分”,做一些微不足道,不能發揮你才能的工作。所以跟江湖一樣,在 IT 公司裡面一件很重要的事情是,亮出自己的寶劍和絕招,給人下馬威。介紹自己的東西一定要自豪,這就是世界上最好的,無敵的,沒有其他人能做到!不能有任何保留。不要像科學家一樣介紹自己技術的侷限性,否則隨之而來的就是有些人對你價值的懷疑和對你自信心的打擊。
另外要注意的是對於別人介紹的東西,不要輕易地表揚或者點頭,否則有人就更有氣勢了。你要問這樣的問題:這裡面有什麼新的東西嗎?這個事情,另外一種技術早就能做了啊,沒覺得有什麼了不起。
哎,總之這樣還是很累,所以最好是能不跟程式設計師講話就不講。
以語言取人
你的軟體是什麼語言寫的,告訴別人的時候是千萬要小心的,不到萬不得已最好不要說。因為十有八九,對方會立即會在心裡對你的軟體的價值做出判斷,光憑你用的是什麼語言。
很多程式設計師都以自己會用最近流行的一些新語言為豪,以為有了它們自己就成了更好的程式設計師。他們看不到,用新的語言並不能讓他們成為更好的程式設計師。其實最厲害的程式設計師無論用什麼語言都能寫出很好的程式碼。在他們的頭腦裡其實只有一種語言,他們首先用這種語言把問題建模出來,然後根據實際需要“翻譯”成最後的程式碼。這種在頭腦裡的建模過程的價值,是很難用他最後用語言的優劣來衡量的。有時候一個程式設計師用一個語言並不是因為他只會用那種語言,而是其他的原因。可是很多人誤以為他們不願意學習“新”的東西,從而從心裡鄙視他們。
這種以語言取人的現象甚至出現在一些公司裡。很可笑的是,我前段時間面試的所有使用 Python 的公司,最後都認定了我是 Python 的菜鳥。然而我的水平顯然高過 Python 的創造者 Guido van Rossum 很多。在製造了 PySonar 之後,他對程式語言的理解,他的每一個可笑的錯誤都被我看得清清楚楚。當然,Ruby 就更爛了。
跟屁蟲
有些程式設計師對新手和同事是那麼的不友好,然而對大牛們拍馬屁的功夫可真是出類拔萃。我剛到舊金山的幾個月經常參加一些程式語言的“meetup”,後來我發現這種 meetup 都是宗教氣氛非常濃厚的地方,跟傳銷大會差不多。Scala 的 meetup 裡面的人幾乎全都對 Scala 和 Martin Odersky 頂禮膜拜。Clojure 的,當然基本上把 Rich Hickey 當成神。各種 talk 總是宣揚,哇,我們用 Scala/Clojure 做出了多麼了不起的東西云云……
很多人喜歡做這些新的語言和技術的“evangelist”,盡顯各種馬屁神功,然後就開始寫書,寫 blog,…… 目的就是成為這個“領域”的第一批專家。這就難怪了,再垃圾的語言也有一大批人來鼓吹。因為這些沒真本事的人,隨便把一個東西捧上天都有自己的好處。
由於受到這些“先知”的影響,有些人開始在他們自己的公司裡“佈道”。比如有人在 Python 的 meetup 集會時告訴我,他試圖在自己的小組裡推 Python,可是一些老頑固一定要用 Java,認為 Java 才是王道。很鄙夷不高興的樣子。
看到這些我終於理解了,一些地區是如何被從一個國家分裂出去,最後淪落為另外一個國家殖民地的。最早的時候,一般是派傳教士過去“傳經”,然後就煽動一小部分人起來造反。到後來就可以名正言順的以“保護傳教士”,“保護宗教自由”,“維持和平”等理由把軍艦開到別人家門口……
作者:王垠
不知道作者大神說的對與不對,有些毛病貌似自己有,,轉過來,以此告誡自己吧