我分了幾個小主題,下面一一講來。
一個程序員一天有多長時間在高效率地工作?
雖然現(xiàn)在絕大部分 IT 公司都聲稱是 8 小時工作制,但作為開發(fā)一線的程序員們一天里真正在高效工作的時間,絕少能超過 4 個小時,甚至一般只有兩個小時左右。這是我這兩年半以來對我自己和跟一些朋友交流得到的結(jié)論。而對于一個有經(jīng)驗的程序員來說,高效率時段和心不在焉的情況下,工作效率可以差上10倍或者20多倍。我曾經(jīng)有過用兩個多小時的時間把半個星期的任務(wù)都完成的經(jīng)歷。
因為真正高效的時段非常少,所以加班在我看來是根本不必要的。如果團隊里的人個個都精力十足,能力超群,一天能高效工作4個小時,那是非常了不起的。不過這樣就引出了下一個問題,既然加班是不必要的,那為什么會時常不得不加班呢?
為什么要加班
一句話來概括,之所以需要加班,是因為白天的時候程序員們都沒有好好干活。
那些主管、老板們聽到這話時先不要著急去找程序員算賬,先想想自己的管理方式有沒有問題。程序員們的工作特點是,他們要面對各種細(xì)節(jié)問題、權(quán)衡各種實現(xiàn)方案、測試已實現(xiàn)的功能。這是一種很需要細(xì)心和耐心的工作,典型的腦力勞動。要讓程序員們進入這種狀態(tài),你需要為他們提供必要的條件。在我看來,這條件是如此地簡單,那就是:不去打擾他們。
當(dāng)你全神貫注地做一件事的時候,有人跑過來問了你一個問題,你花了5分鐘去給他講,等你講完時,卻發(fā)現(xiàn)很難再進入到剛才那種全神貫注地狀態(tài)了。有些程序員們對這種事情極為反感,有些則是會用極簡潔的語言給對方講,因為一旦啰嗦起來,程序員們可能就再也做不下去了。也因此,這些人經(jīng)常會被人認(rèn)為是“缺乏溝通能力”。依我看,這不是溝通能力的問題,這反而是對工作負(fù)責(zé)任的態(tài)度。
做為程序員的上司,應(yīng)該想想,在你的公司里,程序員的工作是支持別人(為別人答疑解惑),還是開發(fā)產(chǎn)品。如果是后者,你是否又過于強調(diào)了溝通能力?要知道如果程序員的工作是做出高質(zhì)量的軟件產(chǎn)品,那你就應(yīng)該讓他專心做好這一件事,別讓他又寫代碼又當(dāng)客服。程序員不專心,白天的溝通太多,就不能做完工作。只好等到晚上加班,別人都走了,他在沒有干擾的情況下才有可能進入高效的狀態(tài)(注意我說的是有可能)。
我所理解的“溝通能力”
我不認(rèn)為僅僅能夠耐心地給別人講問題就算是溝通能力強。我認(rèn)為對于程序員來說,溝通能力首先表現(xiàn)在你寫的代碼要容易讀懂,當(dāng)別人接手你的代碼時,不至于讓對方過于旨解。同樣地,你也要善于讀懂別人的代碼,程序員的思維、設(shè)計全部都體現(xiàn)在代碼里??梢哉f,只要你有代碼,你就應(yīng)該盡量自己弄明白原作者的意思,盡可能不去動不動就問別人。理由同上面所說,減少對他人的干擾。
其次,溝通能力還應(yīng)該體現(xiàn)在所寫的文檔中。如API接口文檔,把每一個API的功能、參數(shù)類型、返回值類型、異常情況等等都用簡潔的、沒有歧義的語言描述出來。這樣讓后來的人有據(jù)可查,不用到處咨詢他人就可以在你的基礎(chǔ)上開發(fā)。對于程序員來說,文檔不要求生動形象,但必需要沒有歧義。有這樣的文檔,當(dāng)有人再來回跑來跑去問你問題時,你可以直接讓他去看代碼或者文檔,你需要專心地做手頭上的工作。
少開會
我曾經(jīng)參加過一個兼職的項目,項目的負(fù)責(zé)人找來的幾個人也都是兼職的,在不同的公司工作。有一次商量設(shè)計方案,負(fù)責(zé)人說要聚在一起討論,也就是開會。對于我們這些人來說,從不同的地方坐半天地鐵跑到一塊,就為了開一個1小時的會,這實在太不合算了。我當(dāng)時說其實根本沒有必要讓大家抽出晚上的時間跑過來,直接在網(wǎng)上說就足夠了。不過那個負(fù)責(zé)人說面對面的溝通效率高。呃……我為了過來和你面對面的溝通1小時,要花1個半小時的時間在路上,反正我是不相信這種方式的效率會高……
在《Rework(重來)》里看到一種觀點,說你把10個人叫到一塊,開了1個小時的會,就相當(dāng)于浪費了10個小時。其實遠(yuǎn)不止10個小時。參會的人要準(zhǔn)備,聽會的人被打斷工作,加起來有可能浪費超過20個小時。
關(guān)于結(jié)對編程
結(jié)對編程是在敏捷開發(fā)中提到的一種編程方法,即兩個人共用一臺電腦,一個人寫代碼,另一個人對他的代碼實時檢查。我一向不主張這種做法,在我看來,這種做法有兩個弊端:
首先是違背了我前面所說的,不要去打擾工作中的程序員。結(jié)對編程恰恰是對工作中的程序員不停的打擾。試想一下,當(dāng)你在實現(xiàn)一個比較復(fù)雜的邏輯時,你旁邊的人不停地在說“可能有更好的辦法……”、“變量名寫錯了”之類的話,你還能專心地寫下去嗎?反正我是覺得不能了。我甚至感覺,如果在我寫程序的時候背后有人在盯著我,我都沒辦法寫下去。
另一個弊端是,在旁邊監(jiān)督的人往往不如親自寫代碼的人想得仔細(xì),因為他不寫代碼,沒有親自參與到開發(fā)一線中去,就不會很專心,容易形成敷衍于事的情況。搞結(jié)對編程,不僅極大降低了其中一個程序員的開發(fā)效率,還幾乎白白浪費了另一個程序員的人力。
不要以加班為榮
領(lǐng)導(dǎo)往往容易認(rèn)為,肯加班的員工就是好員工。要我說,完全不是這回事。首先加班是不必要的,前面已經(jīng)說過。如果出現(xiàn)了不得不加班的情況,那就是領(lǐng)導(dǎo)沒當(dāng)好,程序員沒幾個愿意晚上加班的。恰恰相反,如果一個員工很少加班的話,說明他的效率高、能力強,反而應(yīng)該給予獎勵。而目前的薪酬制度,使得加班多的能多拿加班費,受到領(lǐng)導(dǎo)的重視;而真正的高效率員工往往被視而不見,只能拿基本工資。加班干活的員工不一定是好員工(但加班自學(xué)深造的一定是好員工)。