因爲程序員工做的性質,他們長期以來受到的所謂「黑客」式的「薰陶」,造成了一種行業性的心理疾病。患了這種病的人對於不少新入行的人,甚至一些外行人士形成了持續的傷害。慢慢的,這些不幸的受害者也造成了「條件反射」,進而成爲了這個心理變態的系統的一部分,致使愈來愈多的人,愈來愈快的變成「怪胎」。這是一件可怕的事情,因此我以爲有必要警醒一下。html
這裏我就簡單的把我所觀察到的一些症狀總結一下,但願做爲對於 IT 業界人士的警示,有則改之,無則加勉。也但願爲遇到相似問題的新手和外行人士提供一些精神上的支持,以避免他們也成爲這個系統的一部分。node
因爲程序員的工做最近幾年比較容易找,工資還不錯,因此不少程序員每每只看到本身的肚臍眼,看不到本身在整個社會裏的位置其實並非那麼的關鍵和重要。不少程序員除了本身會的那點東西,幾乎對其它領域和事情徹底不感興趣,看不起其餘人。這就是爲何個人前同事 TJ 做爲一個資深的天體物理學家,在一個軟件公司裏面那麼卑微。貌似會寫點 node.js,iOS 軟件的人均可以對他趾高氣昂的樣子,而其實這些東西的價值哪裏可能跟 TJ 知道的物理知識相提並論。不少科學家其實均可以垂手可得的掌握程序員知道的那點東西,有人卻認定了他們不是這個專業的,不懂咱們的東西,或者故意把問題搞複雜,讓他們弄不明白。程序員
其實對於一個物理學家,他心目中知識的價值是這樣排序的:web
COBOL 在那麼靠前的位置我以爲是用來搞笑的,不過你大體看到了不少 IT 技術在真正的科學家眼裏的價值和它們的有效期。面試
若是力學工程師犯了錯誤,飛機會墜毀;若是結構工程師犯了錯誤,大橋會垮塌;但是若是軟件工程師犯了錯誤,大不了網站掛掉一小時,重啓一下貌似又好了。因此所謂「軟件工程師」,因爲門檻過低,他們的工做嚴謹程度,實際上是無法和力學工程,結構工程等真正的工程師相提並論的。實際上「軟件工程」這個名詞根本就是扯淡的,軟件工程師也不能被叫作「工程師」。跟其餘的工程不同,軟件工程並非創建在科學的基礎上的—計算機科學其實不是科學。數據庫
按照 Dijkstra 的說法,「軟件工程」是窮途末路的領域,由於它的目標是:若是我不會寫程序的話,怎麼樣才能寫出程序?編程
爲了達到這個愚蠢的目的,不少人開始兜售各類像減肥藥同樣的東西。面向對象方法,軟件「重用」,設計模式,關係式數據庫,NoSQL,大數據…… 沒完沒了。只要是有錢人發佈的東西,神馬垃圾都能被吹捧上天。Facebook 給 PHP 作了個編譯器,能夠編譯成 C++,還作了個 VM,多麼了不得啊!其實那種東西就是咱們在 Indiana 第一堂課就寫過的,只不過咱們是把比 PHP 好不少的語言翻譯成 C。咱們根本不想給 PHP 那麼垃圾的語言作什麼編譯器,讓垃圾繼續存活下去並不能證實咱們的價值。設計模式
其實軟件裏面有少數永恆的珍寶,惋惜不多有人理解和尊重它們的價值。這在其它的工程領域看來是難以想象的,然而這倒是事實。因爲沒有科學做爲理論的基礎,沒有實驗做爲檢驗它們的標準,軟件行業的不少東西就像現代藝術同樣,醜陋無比的垃圾還能擺在外表堂皇的「現代藝術博物館」裏面,被人當成傳世大做同樣膜拜。網絡
爲了凸顯本身根本不存在的價值,又提出一些新的「理念」,就像有些現代藝術家同樣,說「藝術的目的不是爲了美,而是爲了自由。」哦,這就是爲何大家能夠自由地把那些讓人反胃的東西放在博物館裏,還要買門票才能參觀?函數式編程
固然了由於沒有實質的技術,爲了爭奪市場和利益,各類軟件的理念就開始互相傾軋。一下子說軟件危機啦,面向對象方法來拯救大家!一下子又提出設計模式。過了一下子又有人說這些設計模式裏面有些模式是「反模式」,而後又有人把函數式編程包裝起來,說是面向對象編程的剋星,一下子是關係式數據庫,一下子是 NoSQL,一下子是 web,一下子是 cloud,一下子又是 mobile…… 每一個東西都喜歡把本身說成是將來的但願。
這就是爲何有人說在軟件行業裏須要不停地「學習」,由於不斷地有人爲了製造新的理念而製造新的理念。在這樣一個行業裏,你會很難找到一個只把程序語言或者技術當成是工具的人。若是有人問你對某個語言或者技術的評價,是很是尷尬甚至危險的事情,因此最可靠的辦法就是不作評論,什麼都不要說。
在 IT 行業裏批評一個技術難用,是一件很是容易傷自尊的事情,由於立馬會有人噼裏啪啦打出一些稀奇古怪的命令或者一大篇代碼,說:就是這麼簡單!而後你就發現,這些人徹底不明白什麼叫作設計,他們以本身能用最快的速度繞過各類前人的設計失誤爲豪,不少程序員甚至以本身打字快爲豪。
每每也就是這些自誇打字快的人喜歡使用過分複雜的方法來解決問題。我能夠告訴你,我打字的速度是至關之慢的。我大量的使用鼠標,方向鍵,並且把 Emacs 裏最經常使用的功能都儘可能綁到 F 功能鍵上,這樣我就能夠用一個指頭啓動一個功能。Dan Friedman 的打字速度就更慢,並且他常常故意使用「一指禪」。爲何呢?由於咱們寫出來的代碼很是精闢,幾乎不帶多餘的垃圾,因此根本不須要打很快。
當遇到這樣引難爲豪的人,個人經驗是,千萬不要恭維他們。你必須嘲笑這些東西的設計,而且指出它們的失誤之處,不然你不但滋長了這些人的氣焰,讓這種風氣繼續延續下去,並且未來本身的自尊也難保了。很惋惜,並非每一個人都有這種勇氣把這些話說出來,這就形成了今天的局面,紛繁複雜的垃圾充斥着世界。
愛因斯坦說,你須要不少的天才和很是大的勇氣,才能追求到簡單。很是大的勇氣…… 也許就是這個意思。
不知從何時開始,人們開始引用 Eric Raymond 的一篇叫作《提問的藝術》的文章,這篇文章後來就成爲了對提問者沒禮貌的藉口。因爲這篇文章的誤導,當你但願同事能給你一個手把手的演示的時候,他們每每會丟給你一篇不知道何時寫的文檔,讓你本身去讀,彷彿文檔就能夠代替人之間的直接互動。何況不說這文檔可能已通過時,裏面有不少地方已經不符合最新的設計,而這意味着在潛意識裏,他們以爲高你一等。
對於這種現象有一個專門的詞彙,叫作 RTFM(Read The Fucking Manual):
在 IRC 的聊天室裏,因爲隔着網絡的屏障,這種對提問者沒禮貌的現象就更加囂張。我曾經有幾回去 Java 的聊天室問一些貌似基礎,而其實很深刻的語言設計問題,結果沒有一次不是以收到像「去讀 API!」這樣的回答而結束。API 誰不會讀,然而我須要的是一個有血有肉的人對此的理解。因此後來我根本不去 IRC 這種地方了,由於那裏面對你打字的基本上已經不是人類了。他們以爲你問問題浪費了他們的時間,好像他們一天到晚泡在 IRC 裏面就是在作什麼正事似的。不想回答問題,不開口還不行嗎。後來你發現,原來在 IRC 裏面訓斥新手就是這些人惟一的樂趣,因此其實他們是非開口說話不可的。然而此次他們遇到的卻不是個新手,而是一個能夠把 Java 整個造出來的人。
像 Haskell 之類的聊天室貌似稍微友好一點,然然後來你發現他們顯得友好是有所企圖的。由於當時 Haskell 尚未不少人用,他們須要吸引新手,因此竭盡所能的誘導他們。而一旦它用戶稍微多了一點,有聲勢了,就有人開始居高臨下,成爲專家同樣的人物。他們就開始寫書,而後就開始牛氣哄哄的了。而後你就會發現當對 Haskell 的設計提出異議的時候,這些「id」們是多麼的不友好,有理也說不清。因此最後你發現,其實全部語言的所謂「社區」都一個德行。若是 Haskell 有一天像 Java 同樣如日中天(固然不大可能),確定對大部分問題的答案也就是「去讀API!」其實它已經在向這一步發展了。
不得不指出,《提問的藝術》等介紹「黑客文化」的文章對於這種現象的出現有着極大的責任。說穿了,寫這些文章的人通常都是 Unix 的跟屁蟲。這種文章試圖抹去人類文明幾千年來傳承的文化,而從新給「禮貌」作出定義。其結果是,人類的文明由於這些文章,在程序員的世界裏倒退了幾十甚至幾百年。不少外行人人不喜歡跟程序員說話,叫他們是 nerd,就是這個緣由。
跟上面的症狀類似,程序員世界裏的一條重要的潛規則是:只有菜鳥纔會問問題。因此若是你有任何機會能夠本身獲得答案,就不要試圖向人「請教」,尤爲不要顯得好奇,不然你就會被認爲是菜鳥。我有幾回不恥下問的經歷,最後致使了我被人當成菜鳥。我只是以爲那問題有趣,也許可以啓發我設計本身的東西,因此吃飯時以爲是個話題能夠說一下,結果呢就有人忙着鄙視你,那麼小的問題都沒搞清楚。正確的態度應該是誠實,直接,見慣不驚,那有什麼大不了的,我什麼沒見過,我很懷疑。
隨之而來的引論就是:不要謙虛!那些「職場經驗」之類的文章告訴你的進入新的公司工做,要謙虛好問,對 IT 公司是無論用的。有的大 IT 公司有所謂的「文化」,好比叫你要「humble」,其實只是用來貶低你價值的藉口。他們只是想讓你安於「本分」,作一些微不足道,不能發揮你才能的工做。看看那些叫你要 humble 的人,他們 humble 嗎?因此跟江湖同樣,在 IT 公司裏面一件很重要的事情是,亮出本身的寶劍和絕招,給人下馬威。介紹本身的東西必定要自豪,這就是世界上最好的,無敵的,沒有其餘人能作到!不能有任何保留。不要像科學家同樣介紹本身技術的侷限性,不然隨之而來的就是有些人對你價值的懷疑和對你自信心的打擊。
另外要注意的是對於別人介紹的東西,不要輕易地表揚或者點頭,不然有人就更有氣勢了。你要問這樣的問題:這裏面有什麼新的東西嗎?這個事情,另一種技術早就能作了啊,沒以爲有什麼了不得。
你的軟件是什麼語言寫的,告訴別人的時候是千萬要當心的,不到萬不得已最好不要說。由於十有八九,對方會當即在內心對你的軟件的價值作出判斷,光憑你用的是什麼語言。
不少程序員都以本身會用最近流行的一些新語言爲豪,覺得有了它們本身就成了更好的程序員。他們看不到,用新的語言並不能讓他們成爲更好的程序員。其實最厲害的程序員不管用什麼語言都能寫出很好的代碼。在他們的頭腦裏其實只有一種很簡單的語言,他們首先用這種語言把問題建模出來,而後根據實際須要「翻譯」成最後的代碼。這種在頭腦裏的建模過程的價值,是很難用他最後用語言的優劣來衡量的。
有時候高明的程序員用一個語言並非由於他只會用那種語言,而是其餘的緣由。他們的頭腦裏有着萬變不離其宗的理念,可讓他們當即掌握幾乎任何語言或者工具,因此他們對所謂的「新語言」都不覺得然。但是不少人誤覺得他們不肯意學習「新東西」,從而從內心鄙視他們。其實計算機的世界裏哪裏有不少新的東西,只不過是有人給一樣的東西起了不少不一樣的名字而已。若是連這樣的程序員都不能理解你的技術,就說明你的技術設計有問題,而不是他們有問題。就像 Seymour Cray 說的,我只能理解簡單的東西,若是它太複雜了,我是不能理解的。
早些年的時候,你們都認爲招募某種特定語言的程序員是一種浮淺的作法,不少公司看重的都是解決問題的能力。但是近些年我發現這些浮淺的作法愈來愈廣泛。能夠說如今像 Google 這樣的公司面試員工的方式和態度,其實還不如八年前個人第一份國內工做。而這種現象在使用 Python,Ruby,JavaScript 等「流行語言」的公司裏就更爲廣泛。
有些程序員對新手和同事是那麼的不友好,然而對大牛們拍馬屁的功夫可真是出類拔萃。我剛到舊金山的幾個月有時候參加一些程序語言的「meetup」,後來我發現這種 meetup 都是宗教氣氛很是濃厚的地方,跟傳銷大會差很少。Scala 的 meetup 裏面的人幾乎全都對 Scala 和 Martin Odersky 頂禮膜拜,甚至把 Rod Johnson 請來講一堆胡話。Clojure 的,固然基本上把 Rich Hickey 當成神,甚至稱他爲「二十一世紀最重要的思想家之一」。各類 talk 老是宣揚,哇,咱們用 Scala/Clojure 作出了多麼了不得的東西云云,其實只不過是在向你兜售減肥藥。
不少人喜歡作這些新的語言和技術的「evangelist」,盡顯各類馬屁神功,而後就開始寫書,寫 blog,…… 目的就是成爲這個「領域」的第一批專家。這就難怪了,再垃圾的語言也有一大批人來鼓吹。由於這些沒真本事的人,隨便把一個東西捧上天都有本身的好處。
因爲受到這些「先知」的影響,有些人開始在他們本身的公司裏「佈道」。好比有人在 Python 的 meetup 集會時告訴我,他試圖在本身的小組裏推 Python,但是一些老頑固必定要用 Java,認爲 Java 纔是王道。很鄙夷不高興的樣子。我並不認爲 Java 是很好的語言,然而 Python 也好不到哪去。它們在我眼裏只不過是臨時拿來用一下的工具,但是我仍然能用它們寫出一流的代碼。
看到這些宗教性質的聚會,我終於理解了一些地區是如何被從一個國家分裂出去,最後淪落爲另一個國家殖民地的。最先的時候,通常是派傳教士過去「傳經」,而後就煽動一小部分人起來造反。到後來就能夠名正言順的以「保護傳教士」,「保護宗教自由」,「維持和平」等理由把軍艦開到別人家門口……