[轉]怎樣尊重一個程式設計師
先在前面寫一些,這篇文章提到的一些問題應該很多人都碰到過,很多IT類公司都存在這樣的毛病,也存在文中提到的那些人。最後提到的git難用,失敗的設計等等都是很正確的。雖然王垠有時候挺偏激的,但是這篇文章我完全贊同。
正文開始:
得知一位久違的同學來到了舊金山灣區,然而我見到他時,這人正處於一生中最痛苦的時期。他告訴我,自己任職的公司在他加入之前和之後,判若兩人。錄取的時候公司對他說,我們對你在實習期間的表現和學術背景非常滿意,你不用面試,甚至不用畢業拿學位,直接就可以加入我們公司成為正式員工。然而短短一年後的今天,這位同學已經完全感覺不到公司對自己技能的尊重。Manager讓他做一些亂七八糟沒技術含量的事情,還抱怨說他做事太慢,並且在他的evaluation上很是寫了一筆。在人格尊嚴和工作安全感的雙重打擊之下,這位同學壓力非常大,週末經常偷偷地加班,仍然無法讓manager滿意。
我很瞭解這位同學的能力,在任何一流公司任職,肯定是綽綽有餘了。他的名字我當然保密,然而他所任職的公司因為太過囂張,我不得不直接指出來——這就是被很多人嚮往得像天堂一樣的地方,Google。這位同學所描述的遭遇,跟我幾年前在Google的實習經歷如出一轍。我仍然記得,Google的隊友在旁邊看著我用Emacs,用小學老師似的口氣對我說:“按Ctrl-k!” 我仍然記得,在提交隊友完全無法寫出來的高難度程式碼時,被指責和嘲笑不會用Perforce。我仍然記得,吃飯時同事們對所謂“Google牛人”眉飛色舞的豔羨。我仍然記得,最後我一個人做出整個團隊做夢都做不出來的專案的時候,有人發出沉悶的咆哮:“快——寫——測——試!” ……
就算你受到過世界上最好的教育,能完成世界上沒有第二個人能夠完成的工作,比起Googler們心目中的所謂“大牛”,你仍然什麼都不是。在Google的每一天,我都感覺自己在上演《皇帝的新裝》。我在給皇帝做一件美輪美奐的衣服,愚蠢或者不稱職的人都看不見這件衣服。皇帝的大臣時不時來視察一下,卻發現無法看見我織的布料…… 我又像是在上演《葉公好龍》,有一位叫葉公的人,聲稱要尋找世界上最有創造力,掌握精髓知識,不循規蹈矩的人才。可當真的見到這種人的時候,他害怕了。他無法理解這種能力,不知道如何尊重它,保護它,使用它。他閉上眼默唸,我才是世界上最厲害最聰明最偉大的!他吹毛求疵,用膚淺愚蠢的標準來評判龍的價值……
我的這位同學也算得上本領域頂尖的專家了。如此的踐踏一個專家的價值,用膚淺的標準來評判和對待他們,Google並不是唯一一個這樣的公司。我之前任職的好幾個公司,或多或少都存在類似的問題。很多時候也不一定是公司管理層無端施加壓力,而是程式設計師之間互斗的厲害,互相judge,傷害自尊。從最近Linus Torvalds在演講現場公然對觀眾無理,你可以看出這種只關心技術,不尊重人的思潮,在程式設計師的社群裡是非常普及的。
後來我發現,並不是程式設計師故意想要藐視對方或者互相攻擊,而是他們真的不明白什麼叫做“尊重”,他們不知道如何說話才可以不傷害另一個程式設計師,所以有時不小心就讓人怒火中燒。所以說,尊重他人其實是一個“技術問題”,而不是有心就可以做到的。因為這個原因,我想在下文裡從心理和技術角度出發,指出IT業界不尊重人現象的起源,同時提出幾點建議,告訴人們如何真正的尊重一個程式設計師。我希望這些建議對公司的管理層有借鑑意義,也希望它們能給與正在經受同樣痛苦的程式設計師們一些精神上的鼓勵。
我覺得為了建設一個程式設計師之間互相尊重的公司文化,應該注意以下幾個要點。
認識和承認計算機系統裡的歷史遺留糟粕
很多不尊重人現象的起源,都是因為某些人偏執的相信某種技術就是世界上最好的,每個人都必須知道,否則他就不是一個合格的程式設計師。這種現象在Unix(Linux)的世界尤為普遍。Unix系統的鼓吹者們(我曾經是其中之一)喜歡到處佈道,告訴你其它系統的設計有多蠢,你應該遵從Unix的“哲學”。他們彷彿認為Unix就是世界終極的作業系統,然而事實卻是,Unix是一個設計非常糟糕的系統。它似乎故意被設計為難學難用,容易犯錯,卻美其名曰“強大”,“靈活”。眼界開闊一點的程式設計師都知道,Unix的設計者其實基本不懂設計,他們並不是世界上最好的程式設計師,卻有一點做得很成功,那就是他們很會製造宗教,煽動人們的盲從心理。Unix設計者把自己的設計失誤推在使用者身上,讓使用者覺得學不會或者搞錯了都是自己的錯。
如果你對電腦科學理解到一定程度,就會發現我們其實仍然生活在計算機的石器時代。特別是軟體系統,建立在一堆歷史遺留的糟糕設計之上。各種蹩腳腦殘的作業系統(比如Unix,Linux),程式語言(比如C++,JavaScript,PHP,Go),資料庫,編輯器,版本控制工具,…… 時常困擾著我們,這就是為什麼你需要那麼多的所謂“經驗”和“知識”。然而,很多IT公司不喜歡承認這一點,他們一向以來的作風是“一切都是程式設計師的錯!”,“作為程式設計師,你應該知道這些!” 這就造成了一種“皇帝的新裝現象”——大家都不喜歡用一些設計惡劣的工具,卻都怕別人嘲笑或者懷疑自己的能力,所以總是喜歡顯示自己“會用”,“能學”,而沒有人敢說它難用,敢指出設計者的失誤。
我這個人呢,就是這種“黑客文化”的一個反例。我所受到的多元化教育,讓我從這些偏激盲從,教條主義的心理裡面跳了出來。每當有人因為不會某種工具或者語言來請教我時,我總是很輕鬆的調侃這工具的設計者,然後告訴他,你沒理由知道這些破玩意兒,但其實它就是這麼回事。然後我一針見血的告訴他這東西怎麼回事,怎麼用,是哪些設計缺陷導致了我們現在的詭異用法…… 我覺得所有的IT從業人員對於這些工具,都應該是這樣的調侃態度。只有這樣,軟體行業才會得到實質性的進步,而不是被一些自虐的設計所困擾,造成思維枷鎖。
總之,這是一個非常重要的“態度問題”。雖然在現階段,我們有必要知道如何繞過一些蹩腳的工具,利用它們來完成自己的任務。然而在此同時,我們必須正視和承認這些工具的惡劣本質,而不能拿它們當教條,把什麼事都怪罪於程式設計師。只有分清工具設計者的失誤和程式設計師自己的失誤,不把工具的設計失誤怪罪於程式設計師,我們才能有效地尊重程式設計師們的智商,鼓勵他們做出簡單,優雅,完善的產品。
分清精髓知識和表面知識,不要太拿經驗當回事
在任何領域,都只有少數知識是精髓的,另外大部分都是表面的,膚淺的,是從精髓知識衍生出來的。精髓知識和表面知識都是有用的,然而它們的分量和重要性卻是不一樣的。所以必須區分精髓知識和表面知識,不能混為一談,對待它們的態度應該是不一樣的。由於表面知識基本是死的,而且很容易從精髓知識推導衍生出來。我們不應該因為自己知道很多表面知識,就自以為比掌握了精髓知識的人還要強。不應該因為別人不知道某些表面知識,就以為自己高人一等。
IT公司經常有這樣的人,以為精通一些看似複雜的命令列,或者某些難用的程式語言就很了不起似的。他們如果聽說你不知道某個命令的用法,那簡直就像法國人不知道拿破崙,美國人不知道華盛頓一樣。這些人沒有發現,自己身邊有些同事其實掌握著精髓的知識,他們完全有能力從自己已有的知識,衍生製造出所有這些工具,而不只是使用它們,甚至設計得更加完善和方便易用。這種能夠設計製造出更好工具的人,往往身負更加重要的任務,所以他們往往會在被現有工具的用法迷惑的時候,非常謙虛的請同事幫助解決,大膽的承認自己的糊塗。
如果你是這個精通工具用法的人,切不可以把同事的謙虛請求當成可以顯擺自己“資歷”的時候。這同事往往真的是在“不恥下問”。他並不是搞不懂,而是根本不屑於,也沒有時間去考慮這種低階問題。他的迷惑,往往來源於工具設計者的失誤。他很清楚這一點,他也知道自己的技術水平其實是高於這工具的設計者的。然而為了禮貌,他經常不直接批評這工具的設計,而是謙虛的責怪自己。所以同事向你“虛心請教”,完全是為了製造一種友好融洽的氣氛,這樣可以節省下時間來幹真正重要的事情。這種虛心並不等於他在膜拜你,承認自己的技術能力不如你。
所以正確的對待方式應該是誠懇的表示對這種迷惑的理解,並且坦率的承認工具設計上的不合理,蹩腳之處。如果你能夠以這種謙和的態度,而不是自以為專家的態度,同事會高興地從你這裡“學到”他需要的,膚淺的死知識,並且記住它,避免下次再為這種無聊事來打擾你。如果你做出一副“天下只有我知道這奇技淫巧”的態度,同事往往會對你,連同這工具一起產生鄙視的情緒。他下次會照樣記不住這東西的用法,然而他卻再也不會來找你幫忙,而是一拖再拖。
不要自以為聰明,不要評判別人的智商和能力
在IT公司裡,總是有很多人覺得自己聰明,想顯示自己比別人聰明。這種人似乎隨時都在評判(judge)別人,你說的任何話,不管認真的還是開玩笑的,都會被他們拿去作為評估你智商和能力的依據。
有時候你寫了一些程式碼,自己知道時間不夠,可是當時有更重要的事情要做,所以打算以後再改進。如果你提交程式碼時被這種人看到了,他們就會堅定地認為你一輩子只能寫出那樣的程式碼。這就是所謂“wishful thinking”,人只能看到他希望看到的東西。這種人隨時都在希望自己比別人聰明,所以他們隨時都在監聽別人顯得不如他聰明的時候,而對別人比他高明的時候視而不見。他們只能看到別人疏忽的時候,因為那是可以證明他們高人一等的有利證據。
當然,誰會喜歡這樣的人呢,可是他們在IT公司裡相當的普遍。你不敢跟他們說話,特別是不敢開玩笑,因為他們會把你稀裡糊塗的玩笑話全部作為你智商低下或者經驗不足的證據。你不敢問他們問題,因為他們會認為你問問題,說明你不懂!我發現具有這種心理的人,一般潛意識裡都存在著自卑。他們有某些方面(包括智力在內)不如別人,所以總是找機會顯得高人一等。我還沒有想出可以糾正這種心理問題的有效方法,但如我上節所說,意識到整個行業,包括你仰慕的鼻祖們,其實都不懂很多東西,都是混飯吃的,是一個有效的放鬆這種心理的手段。
有時候我喜歡自嘲,對人說:“我們這行業的祖先做了這麼多BUG來讓我們修補。現在你做了一坨屎,我也做了一坨屎,我的屎貌似比你的屎香一點。”這樣一來,不但顯示出心理的平等和尊重,而且避免了因為謙虛而讓對方產生高人一等的情緒。說真的,做這行根本不需要很高的智力,所以最好是完全放棄對人智力的判斷。你不比任何人更聰明,也不比他們笨。
解釋高階意圖,不要使用低階命令
隨時都要記住,同事和下屬是跟你智力相當的人。他們是通情達理的人,然而卻不會簡單地服從你的低階命令。像我在Google的隊友的做法,就是一個很好的反面教材。其實這位Googler只是想告訴我:“刪掉這行文字,然後改成這樣……” 就是如此一個簡單的事情,然而她卻故弄玄虛,不直接告訴我這個“高階意圖”,而是使用非常低階的指令:“按Ctrl-k!……” 語氣像是在對一個不懂事的小學生說話,好像自己懂很多,別人什麼都不知道似的。
有哪個Emacs使用者不知道Ctrl-k是刪掉一行字呢,況且你現在面對的其實是一個資深Emacs使用者。我想大家都看出來這裡的問題了吧。這樣的低階命令不但邏輯不清楚,而且是對另一個人的智力的嚴重侮辱。你當我是什麼啊?猴子?如果這位Googler表明自己的高階意圖,就會很容易在心理上和邏輯上讓人接受,比如她可以說:“配置檔案的這行應該刪掉,改成……”
在專案管理的時候也需要注意。在讓人做某一件事之前,應該先解釋為什麼要做這件事,以及它的重要性。這樣才能讓人理解,才能尊重程式設計師的智商。
不要期望新人向自己學習
很多IT公司喜歡把新人當初學者,期望他們“從新的起跑線出發”,向自己“學習”。比如,Google把新員工叫做“Noogler”(Newbie Googler的意思),甚至給他們發一種特殊的螺旋槳帽子,其寓意在於告訴他們,小屁孩要謙虛,要向偉大的Google學習,將來才可以飛黃騰達。
這其實是非常錯誤的作法,因為它完全不尊重新員工早已具備的背景知識,把自己的地位強加於他們頭上。並不是你說“新的起跑線”就真的可以把人的過去都抹殺了的。新人不瞭解你們的程式碼結構和工程方式,並不等於你們的方式就會先進一些。Google裡面真的有很多值得學習的東西嗎?學校的教育真的一文不值嗎?其實恰恰相反。我可以坦然的說,我從自己的教授身上學會了最精髓的知識,而從Google得到的,只是一些很膚淺的,死記硬背就可以掌握的技能,而且其中有挺多其實是糟粕。我在Google做出的所有創新成果,全都是從學校獲得的精髓知識的衍生物。很多PhD學生鄙視Google,就是因為Google不但自己技術平庸,反倒喜歡把自己包裝成最先進的,超越其它公司和學校的,並且囂張的期望別人向他們“學習”。
一個真正尊重人才的公司會去了解,尊重和發揮新人從外界帶來的特殊技能,施展他們特有的長處,而不是一味期望他們向自己“學習”。只有這樣,我們才能保持這些銳利武器的稜角,在激烈的競爭中讓自己立於不敗之地。如果你一味的讓新人“學習”,而無視他們特有的長處,最後就不免淪為平庸。
不要以老師自居,分清“學習”和“瞭解”
如上文所說,IT行業的很多所謂“知識”,只不過是一些奇技淫巧,用以繞過前人設計上的失誤。所以遇到別人不知道一些東西的時候,請不要以為你“教會”了別人什麼東西,不要以為自己可以當老師了。以老師自居,使用一些像“跟我學”一類的語言,其實是一種居高臨下,不尊重人的行為。
人們很喜歡在獲得了資訊的時候用“學習”這個詞,然而我覺得這個詞被濫用了。我們應該分清兩種情況:“學習”和“瞭解”。前者指你通過別人的指點和自己的理解,獲得了精髓的,不能輕易製造出來的知識。後者只是指你“瞭解”了原來不知道的一些事情。舉個例子,如果有人把一件物品放在了某個你不知道的地方,你找不到,問他,然後他告訴你了。這種資訊的獲取,顯然不叫“學習”,這種資訊也不叫做“知識”。
然而,IT行業很多時候所謂的“學習”,就是類似這種情況。比如,有人寫了一些程式碼,設計了一些框架模組。有人不知道怎麼用,然後有人告訴他了。很多人把這種情況稱為“學習”,這其實是對人的不尊重。這跟有人告訴你他把東西放在哪裡了,是同樣性質的。這樣的程式碼和設計,我也可以做,甚至做得更好,憑什麼你說我在向你學習呢?我只是瞭解了一下而已。
所謂學習,必須是更加高階的知識和技能,必須有一種“有收穫”,“有提高”的感覺。簡單的資訊獲取不能叫做“學習”,只能叫做“瞭解”。分清“瞭解”和“學習”,不以老師自居,是尊重人的一個重要表現。
明確自己的要求,不要使用指責的語氣
有些人很怪異,他根本沒告訴過你他想要什麼,有什麼特別的要求,可他潛意識裡假設已經告訴你了。到了後來,他發現你的作法不符合要求,於是嚴厲指責你沒有按照他“心目中的要求”辦事。這種現象不止限於程式設計師,而且包括日常生活中的普通人。舉個例子,我媽就是這種人的典型,所以我以前在家生活經常很辛苦。她心目中有一套“正確”的做事方式,如果你沒猜出來就會捱罵。你為了避免捱罵,乾脆什麼事都不要做,然後她又會說你懶,所以你就左右不是人