程序員如何才能被尊重
得知一位久違的老同學(xué)來(lái)到了灣區(qū),然而我見(jiàn)到他時(shí),這人正處于一生中最痛苦的時(shí)期。他對(duì)我訴苦說(shuō),自己任職的公司在他加入之前和之后,判若兩人。錄取的時(shí)候公司對(duì)他說(shuō),我們對(duì)你在實(shí)習(xí)期間的表現(xiàn)和學(xué)術(shù)背景非常滿(mǎn)意,你不用面試,甚至不用畢業(yè)拿學(xué)位,直接就可以加入我們公司成為正式員工。然而短短一年后的今天,這位同學(xué)已經(jīng)完全感覺(jué)不到公司對(duì)自己技能的尊重。Manager 讓他做一些亂七八糟沒(méi)技術(shù)含量的事情,還抱怨說(shuō)他做事太慢,并且在他的 evaluation 上很是寫(xiě)了一筆。在人格尊嚴(yán)和生活安全感的雙重打擊之下,這位同學(xué)壓力非常大,周末經(jīng)常偷偷地加班,仍然無(wú)法讓 manager 滿(mǎn)意。
我很了解這位同學(xué)的能力,在任何一流公司任職,肯定是綽綽有余了。他的名字我當(dāng)然保密,然而他所任職的公司,我卻不得不直接指出來(lái)——這就是被很多人膜拜得像天堂一樣的地方,Google。這位同學(xué)所描述的遭遇,跟我?guī)啄昵霸?Google 的實(shí)習(xí)經(jīng)歷如出一轍。我仍然記得,Google 的隊(duì)友在旁邊看著我用 Emacs,用小學(xué)老師似的口氣對(duì)我說(shuō):“按 Ctrl-k!” 我仍然記得,在提交隊(duì)友完全無(wú)法寫(xiě)出來(lái)的,高難度高水準(zhǔn)的代碼時(shí),被指責(zé)和嘲笑不會(huì)用 Perforce。我仍然記得,吃飯時(shí)同事們對(duì)所謂“Google 牛人”眉飛色舞的艷羨……
就算你受到過(guò)世界上最好的教育,你能完成世界上沒(méi)有第二個(gè)人能夠完成的工作,比起 Googler 們心目中的所謂“大牛”,你仍然什么都不是。在 Google 的每一天,我都感覺(jué)自己在上演《皇帝的新裝》。我在給皇帝做一件美輪美奐的衣服,愚蠢或者不稱(chēng)職的人都看不見(jiàn)這件衣服?;实鄣拇蟪紩r(shí)不時(shí)來(lái)視察一下,卻發(fā)現(xiàn)無(wú)法看見(jiàn)我織的布料…… 我又像是在上演《葉公好龍》,有一位叫葉公的人,聲稱(chēng)要尋找世界上最頂尖,最有創(chuàng)造力,掌握精髓知識(shí),不循規(guī)蹈矩的人才??僧?dāng)真的見(jiàn)到這種人的時(shí)候,他害怕了。他無(wú)法理解這種能力,不知道如何尊重它,保護(hù)它,使用它。他惱羞成怒,怎么會(huì)有人比我還聰明!他閉上眼默念,我才是世界上最厲害最聰明最偉大的!他吹毛求疵,用膚淺愚蠢的標(biāo)準(zhǔn)來(lái)評(píng)判龍的價(jià)值……
我的這位同學(xué)也算得上本領(lǐng)域頂尖的專(zhuān)家了。如此的踐踏一個(gè)專(zhuān)家的價(jià)值,用膚淺的標(biāo)準(zhǔn)來(lái)評(píng)判和對(duì)待他們,Google 并不是唯一一個(gè)這樣的公司。我之前任職的幾乎所有公司,或多或少都存在類(lèi)似的問(wèn)題。有時(shí)候這也許不是整個(gè)公司的問(wèn)題,而只是其中一些不懂事的人,然而我很肯定的是,這種現(xiàn)象在 Google,是一種全公司的風(fēng)氣和行為。Google 的所謂“牛人”(只是所謂)真太多了,所以他們根本不會(huì)在乎你。
IT 公司這種不尊重人的現(xiàn)象,不止針對(duì)專(zhuān)家級(jí)的人物,而且針對(duì)所有程序員。只不過(guò)專(zhuān)家見(jiàn)的東西多了,見(jiàn)慣不驚,所以一般不喜歡用膚淺的東西來(lái)凸顯自己。然而正是因?yàn)橹t虛,他們?nèi)菀壮蔀楸灰恢虢獾娜斯舻膶?duì)象。由于這種不尊重人現(xiàn)象的普遍性和極強(qiáng)的危害性,我覺(jué)得有必要專(zhuān)門(mén)講一下。在下文里,我想指出 IT 業(yè)界不尊重人的文化的由來(lái),同時(shí)給世界范圍內(nèi)的 IT 公司提出幾點(diǎn)建議,告訴他們?nèi)绾握嬲淖鹬匾粋€(gè)程序員。我希望這些建議對(duì)公司的管理層有借鑒意義,也希望它們能給與正在經(jīng)受同樣痛苦的程序員們一些精神上的鼓勵(lì)。
我覺(jué)得一個(gè)懂得尊重程序員的公司文化,應(yīng)該隨時(shí)注意以下幾個(gè)要點(diǎn):
承認(rèn)軟件系統(tǒng)的歷史遺留問(wèn)題
如果你對(duì)計(jì)算機(jī)科學(xué)理解到一定程度,就會(huì)發(fā)現(xiàn)我們其實(shí)仍然生活在計(jì)算機(jī)的石器時(shí)代。相比硬件而言,軟件系統(tǒng)建立在一堆歷史遺留的糟糕設(shè)計(jì)之上。各種設(shè)計(jì)蹩腳的操作系統(tǒng)(比如 Unix,Linux),程序語(yǔ)言(比如C++),數(shù)據(jù)庫(kù),…… 時(shí)常困擾著我們,這就是為什么你需要那么多的所謂“經(jīng)驗(yàn)”。然而,很多 IT 公司不喜歡承認(rèn)這一點(diǎn),他們一向以來(lái)的作風(fēng)是“一切都是用戶(hù)的錯(cuò)!”,“你應(yīng)該知道這些!” 這就造成了一種“皇帝的新裝現(xiàn)象”:大家都不會(huì)用一些設(shè)計(jì)惡劣的工具,卻都怕別人嘲笑或者懷疑自己的能力,從而沒(méi)有人敢指出設(shè)計(jì)者的失誤。
我這個(gè)人呢,就是這種“黑客文化”的一個(gè)反例。每當(dāng)有人因?yàn)椴粫?huì)某種工具或者語(yǔ)言來(lái)請(qǐng)教我時(shí),我總是很輕松的調(diào)侃這工具的設(shè)計(jì)者,然后告訴他,你沒(méi)理由知道這些破玩意兒,但其實(shí)它就是這么回事。然后我一陣見(jiàn)血的告訴他這東西怎么回事,怎么用,是哪些設(shè)計(jì)缺陷導(dǎo)致了我們現(xiàn)在的詭異用法…… 我覺(jué)得所有的 IT 從業(yè)人員對(duì)于這些工具,都應(yīng)該是我這樣的調(diào)侃態(tài)度。只有這樣,軟件行業(yè)才會(huì)得到實(shí)質(zhì)性的進(jìn)步,而不是被一些糟糕的設(shè)計(jì)所困擾,造成思維枷鎖。
總之,這是一個(gè)非常重要的“態(tài)度問(wèn)題”。雖然在現(xiàn)階段,我們有必要知道如何繞過(guò)一些設(shè)計(jì)拙劣的工具,利用它們來(lái)完成自己的任務(wù)。然而在此同時(shí),我們必須正視和承認(rèn)這些工具的惡劣本質(zhì),而不能怪罪于程序員。只有這樣,我們才能有效地尊重程序員們的智商。
分清精髓知識(shí)和表面知識(shí),不要太拿“經(jīng)驗(yàn)”當(dāng)回事
IT 公司經(jīng)常有這樣的人,以為精通一些看似復(fù)雜的命令行,或者某些難用的程序語(yǔ)言就很了不起似的。這些人沒(méi)有發(fā)現(xiàn),自己身邊有些同事其實(shí)掌握著精髓的知識(shí),他們完全有能力從自己已有的知識(shí),衍生制造出所有這些工具(而不只是使用它們),甚至設(shè)計(jì)得更加完善和方便易用。這種能夠設(shè)計(jì)制造出更好工具的人,往往身負(fù)更加重要的任務(wù),所以他們往往會(huì)在被現(xiàn)有工具的用法迷惑的時(shí)候,非常謙虛的請(qǐng)同事幫助解決,大膽的承認(rèn)自己的糊涂。
如果你是這個(gè)精通工具用法的人,切不可以把同事的謙虛請(qǐng)求當(dāng)成可以顯擺自己“資歷”的時(shí)候。這同事往往真的是在“不恥下問(wèn)”。他并不是“搞不懂”,而是根本不屑于,也沒(méi)有時(shí)間去考慮這種低級(jí)問(wèn)題。他的迷惑,往往來(lái)源于工具設(shè)計(jì)者的失誤。他很清楚這一點(diǎn),然而為了禮貌,他經(jīng)常不直接批評(píng)這工具的設(shè)計(jì),而是謙虛的責(zé)怪自己。所以同事對(duì)你的尊重,完全是為了制造一種友好融洽的氣氛,而并不等于他在膜拜你,承認(rèn)自己的技術(shù)能力不如你。
所以正確的對(duì)待方式應(yīng)該是誠(chéng)懇的表示對(duì)這種迷惑的理解,并且坦率的承認(rèn)工具設(shè)計(jì)上的不合理,蹩腳之處。如果你能夠以這種謙和的態(tài)度,而不是自以為專(zhuān)家的態(tài)度,同事會(huì)高興地從你這里“學(xué)到”他需要的,膚淺的死知識(shí),并且記住它,避免下次再為這種無(wú)聊事來(lái)打擾你。如果你做出一副“天下只有我知道這奇技淫巧”的態(tài)度,同事往往會(huì)對(duì)你,連同這工具一起產(chǎn)生鄙視的情緒。他下次會(huì)照樣記不住這東西的用法,然而他卻再也不會(huì)來(lái)找你幫忙,而是一拖再拖。
不要使用命令語(yǔ)氣,解釋自己的意圖
隨時(shí)都要記住,同事和下屬并不是奴隸,不是 code monkey,他們不一定要為你工作!他們是通情達(dá)理的人,然而卻不會(huì)因?yàn)槟昧斯べY就簡(jiǎn)單地服從你的低級(jí)命令。像我在 Google 的隊(duì)友的做法,就是一個(gè)很好的反面教材。其實(shí)這位 Googler 只是想告訴我“刪掉這行文本,然后改成這樣……”,然而她卻沒(méi)有直接表明這種“高級(jí)意圖”,而是使用非常低級(jí)的指令:“按 Ctrl-k!……” 而且語(yǔ)氣像是在對(duì)一個(gè)不懂事的小學(xué)生說(shuō)話(huà)。
有哪個(gè) Emacs 用戶(hù)不知道 Ctrl-k 是刪掉一行字呢,況且你現(xiàn)在面對(duì)的其實(shí)是一個(gè)資深 Emacs 用戶(hù),世界級(jí)的 Lisp 程序員。我想大家都看出來(lái)這里的問(wèn)題了吧。這樣的低級(jí)命令不但邏輯不清楚,而且讓人反感。你當(dāng)我是什么?。縞ode monkey?如果這位 Googler 表明自己的高級(jí)意圖,就會(huì)很容易在心理上和邏輯上讓人接受,比如她可以說(shuō):“配置文件的這行應(yīng)該刪掉,改成……”
在項(xiàng)目管理的其他時(shí)候也可以使用類(lèi)似的技巧。在讓人做某一件事之前,先要解釋為什么要做這件事以及它的重要性,要讓人理解。只有這樣,才能尊重程序員的智商,因?yàn)樗麄兪侨耍⒉皇侵粫?huì)服從你指揮的 code monkey。
不要期望新人向自己學(xué)習(xí)
很多 IT 公司喜歡把新人當(dāng)初學(xué)者,期望他們向自己“學(xué)習(xí)”。比如,Google 把所有新員工叫做“Noogler”(Newbie Googler 的意思),甚至給他們發(fā)一種特殊的螺旋槳帽子,其寓意在于告訴他們,小朋友要謙虛,要向“偉大的 Google”學(xué)習(xí),將來(lái)才可以飛黃騰達(dá)。
這其實(shí)是非常錯(cuò)誤的作法,它無(wú)視新員工已有的背景知識(shí),讓他們屈服于“偉大的 Google”的權(quán)威之下,成為一顆不起眼的螺絲釘。其實(shí) Google 里面真的有很多值得學(xué)習(xí)的東西嗎?學(xué)校的教育真的一文不值嗎?并非如此。我可以坦然的說(shuō),我從自己的教授身上學(xué)會(huì)了最精髓的知識(shí)。我并沒(méi)有從 Google 學(xué)到任何可以超越那些精髓的技能,反倒送給 Google 很多世界上最先進(jìn)的,任何 Googler 都想不到的技術(shù)。很多其它 PhD 學(xué)生鄙視 Google,就是因?yàn)?Google 不但自己技術(shù)很多一團(tuán)糟,反倒把自己包裝成最先進(jìn)的,超越其它公司和所有學(xué)校的,并且囂張的期望別人向他們“學(xué)習(xí)”。
只有了解,尊重和發(fā)揮新人從外界帶來(lái)的特殊技能,施展他們特有的長(zhǎng)處,而不是一味期望他們向自己“學(xué)習(xí)”,才能保持這些銳利的武器的棱角,讓公司立于不敗之地。
程序員的工作量不可用時(shí)間衡量
很多 IT 公司管理層不懂得如何估算程序員的工作量。如果你能力很強(qiáng),在很短的時(shí)間內(nèi)把最困難的問(wèn)題解決了,接下來(lái)他們不會(huì)讓你閑著,而會(huì)讓你做另外一些很低級(jí)的活。這是很不合理的作法。打個(gè)比方,能力強(qiáng)的員工就像一輛 F1 賽車(chē),馬力和速度是其他人的幾十倍。當(dāng)然,普通人需要很長(zhǎng)時(shí)間才能解決,甚至根本沒(méi)法解決的問(wèn)題,到他手里很快就化解掉了。這就像一輛 F1 賽車(chē),眨眼工夫就跑完了別人需要很久的路程。如果你用時(shí)間來(lái)衡量工作量,那么這輛 F1 賽車(chē)跑完全程只需要很短時(shí)間,所以你算出來(lái)的工作量就比普通車(chē)子小很多。你能因此說(shuō) F1 賽車(chē)工作不夠努力,要他快馬再加鞭嗎?這顯然是不對(duì)的。
物理定律是這樣:能量 = 功率 x 時(shí)間。工作量也應(yīng)該是同樣的計(jì)算方法。英明的,真正理解程序員的公司,就不會(huì)指望高水平的程序員不停地工作。高水平程序員由于經(jīng)常能夠另辟蹊徑,一個(gè)就可以抵好幾個(gè)甚至幾十個(gè)普通程序員。他們處理的問(wèn)題比常人的困難很多,費(fèi)腦力多很多,當(dāng)然他們需要更好的休息,保養(yǎng),娛樂(lè),……
當(dāng)然這并不是說(shuō)初級(jí)的程序員就應(yīng)該過(guò)量工作。編程是一項(xiàng)艱苦的腦力活動(dòng),超時(shí)超量的工作再加上壓力,只會(huì)帶來(lái)效率的低下,質(zhì)量的降低。
不要讓其他人修補(bǔ)自己的 BUG
這個(gè)我已經(jīng)在一篇專(zhuān)門(mén)的文章里討論過(guò)。讓一個(gè)程序員修補(bǔ)另外一個(gè)程序員的 BUG,不但是效率低下,而且是不尊重程序員個(gè)人價(jià)值的作法,應(yīng)該盡量避免。如果有人離開(kāi)公司,必須要有人修補(bǔ)他遺留下來(lái)的 BUG,那么說(shuō)話(huà)應(yīng)該特別特別的小心。你要特別的指出需要他幫忙的特殊原因,強(qiáng)調(diào)這件事本來(lái)不是他的問(wèn)題,本來(lái)是不應(yīng)該他來(lái)做的,但是有人走了,沒(méi)有辦法,并且誠(chéng)懇的為此類(lèi)事情的發(fā)生表示歉意。
只有這樣,程序員才會(huì)心甘情愿的在這種罕見(jiàn)的特殊關(guān)頭,修補(bǔ)另外一個(gè)人的 BUG。