如何讓你的程序員不要厭倦工作?
作為一個(gè)程序員,我從來(lái)沒有在同一家公司工作超過兩年。每換一份新工作都是一次很好的職業(yè)變動(dòng),在這個(gè)行業(yè)里跳槽如同家常便飯。但是我的前東家們對(duì)我的離去并不開心,他們其中一些人花了很大力氣想要挽留我,但是我已經(jīng)對(duì)一成不變的工作感到厭倦了,真的不想在同一家公司再待下去。
( 免責(zé)聲明:我很幸運(yùn)地生活在一個(gè)程序員工作崗位供大于求的地方,所以對(duì)我來(lái)說在換工作永遠(yuǎn)不止一個(gè)選擇。)
如今我成為了 Enki 公司的合伙人與 CTO,同時(shí)我還要負(fù)責(zé)在公司里面打造工程師文化。我工作內(nèi)容的一部分就是確保我們的程序員不要對(duì)工作感到厭倦,就像我過去那樣。
在團(tuán)隊(duì)的幫助下,我們?cè)O(shè)計(jì)了一整套策略去幫助程序員們對(duì)抗工作中產(chǎn)生的厭煩情緒,并將這些策略運(yùn)用到了公司的實(shí)踐當(dāng)中。距今為止這套方法還是挺管用的,因此我想要和大家分享一下。
在 Enki 我們的程序員很幸運(yùn)地一直從事著具有挑戰(zhàn)性的工作。我們有很多有趣的事情需要去編碼,還有大量有意思的問題亟待解決。因此如何解決「無(wú)聊」這件事情對(duì)我們來(lái)說并不很緊急。但是所有的工作都不會(huì)一開始就讓你感覺厭煩,無(wú)聊這種情緒是隨著時(shí)間推移蔓延開來(lái)的,并且會(huì)在最糟糕的時(shí)刻爆發(fā)出來(lái)。
這就是為什么我們從公司成立之初就開始著手預(yù)防這類問題,并依靠建立起一種企業(yè)文化去幫助我們的程序員克服工作中產(chǎn)生的無(wú)聊情緒(真心祈禱這套東西管用吧)。
下面就讓我們總結(jié)一下為什么程序員會(huì)感覺工作無(wú)聊,以及如何避免發(fā)生這些狀況吧。
1、項(xiàng)目時(shí)間延續(xù)太長(zhǎng),學(xué)不到新東西引發(fā)程序員無(wú)聊情緒最常見也最明顯的原因就是一個(gè)開發(fā)項(xiàng)目拖得時(shí)間太長(zhǎng)。
我在自己的第一份工作中就充分體驗(yàn)到了項(xiàng)目時(shí)間過長(zhǎng)帶來(lái)的無(wú)聊感。我的團(tuán)隊(duì)要做的是通過一個(gè)通用 API 去處理金融數(shù)據(jù)。一開始這項(xiàng)工作確實(shí)令人興奮,因?yàn)檫@些數(shù)據(jù)十分復(fù)雜且規(guī)模龐大,很有挑戰(zhàn)性。我從這項(xiàng)工作學(xué)習(xí)到了如何高效分析數(shù)據(jù)以及 API 接口設(shè)計(jì)。但是在一年之后,我們依然在針對(duì)相同的數(shù)據(jù)庫(kù)工作,使用的也是同樣的技術(shù)。我在這一針對(duì)性很強(qiáng)的領(lǐng)域已經(jīng)成為一個(gè)專家了,在這項(xiàng)工作中再也沒有什么新東西可以讓我學(xué)習(xí)。
我不可能再去別的團(tuán)隊(duì)或者項(xiàng)目,因?yàn)楣靖杏X把我留在這個(gè)項(xiàng)目里才是最合適的。我明白在這個(gè)項(xiàng)目中現(xiàn)有的數(shù)據(jù)與技術(shù)已經(jīng)用的太順手,所以不可能被替換。我無(wú)法說服公司僅僅為了讓項(xiàng)目組成員學(xué)習(xí)新知而改變?cè)臼褂玫募夹g(shù)。我向公司表達(dá)了自己的這種厭倦情緒與沮喪心情,但是無(wú)濟(jì)于事,那么我只好換一份有奔頭的新工作了。
如何阻止無(wú)聊情緒的產(chǎn)生?
在我們的團(tuán)隊(duì)里會(huì)試著避免讓任何一個(gè)程序員接觸相同的代碼、產(chǎn)品或者數(shù)據(jù)庫(kù)超過三個(gè)月的時(shí)間。將時(shí)間設(shè)定為三個(gè)月也許比較武斷,對(duì)于大公司來(lái)說這段時(shí)間可能也太短了。但是我們相信讓程序員在不同項(xiàng)目中快速輪轉(zhuǎn)是正確的。
為了實(shí)現(xiàn)這一設(shè)計(jì),我們?cè)诠纠锾岢环N全棧文化,團(tuán)隊(duì)里的每一個(gè)程序員都能夠承擔(dān)任一部分的編碼工作(或者是能夠快速學(xué)會(huì)操作)。
預(yù)防無(wú)聊情緒滋生的另一個(gè)方法就是開誠(chéng)布公地討論這個(gè)話題。我們每周都會(huì)進(jìn)行一次直接、開放的一對(duì)一談話。如果一個(gè)程序員在工作中已經(jīng)感到太過舒服沒有挑戰(zhàn),或者是已經(jīng)在這一方面過于專精,那么就是時(shí)候讓他輪轉(zhuǎn)到另一個(gè)項(xiàng)目當(dāng)中去了。
2、維護(hù)代碼這種遺留問題讓人感覺太無(wú)聊你能夠很清楚地分辨出何時(shí)項(xiàng)目就開始進(jìn)入了維護(hù)模式,不論是從正式的渠道還是別的途徑,只要當(dāng)你的程序員花上了 90% 的時(shí)間去修補(bǔ) BUG 而不是開發(fā)新功能,那就代表著他們已經(jīng)進(jìn)入了代碼維護(hù)期。有人會(huì)說維護(hù)代碼是一項(xiàng)不可避免的工作,老舊的代碼需要不斷得到支持。開發(fā)軟件就像造房子,你總是需要維護(hù)和翻新房子的,不是嗎?
既是,也不是。這項(xiàng)工作確實(shí)需要有人去做,但是問題通常會(huì)出在工作態(tài)度上。
我曾經(jīng)的一位職場(chǎng)前輩對(duì)于維護(hù)代碼具有強(qiáng)烈的抵觸情緒,他理所當(dāng)然地認(rèn)為維護(hù)代碼這種事情根本沒有什么好做的,軟件開發(fā)完畢之后就讓它們自己去運(yùn)行好了。生活簡(jiǎn)直糟透了,你還不得不適應(yīng)它。
如何緩解這種抵觸情緒呢?
項(xiàng)目開發(fā)工作進(jìn)入無(wú)聊的維護(hù)模式有時(shí)候是由于糟糕的技術(shù)決策與缺乏勇氣的雙重作用。
一個(gè)擁有著復(fù)雜的依賴關(guān)系的龐大整體代碼庫(kù)需要額外的付出時(shí)間去做維護(hù)工作,于此相反的是,一個(gè)架構(gòu)良好的微服務(wù)基礎(chǔ)設(shè)施擁有更強(qiáng)的靈活性。當(dāng)一個(gè)微服務(wù)架構(gòu)出現(xiàn)缺陷時(shí),你可以立即采取措施去修復(fù)。你可以重新寫一遍代碼,使用不同的編程語(yǔ)言或技術(shù)。通過這種方式,你會(huì)學(xué)習(xí)到新的東西而不是僅僅在遺留下來(lái)的代碼上修修補(bǔ)補(bǔ)。如果你的架構(gòu)不允許你重新來(lái)過,你還可以采取別的措施來(lái)改善,并且在這個(gè)過程中學(xué)到一些 DevOps 的技巧(譯者注:DevOps 就是開發(fā)(Development)和運(yùn)維(Operations)這兩個(gè)領(lǐng)域的合并,可將原本笨重的開發(fā)與運(yùn)維之間的工作移交過程變得流暢無(wú)礙)。
想要解決程序員在維護(hù)代碼中產(chǎn)生的無(wú)聊情緒有很多種方法可供選擇,公司采用微服務(wù)戰(zhàn)略只是其中一種可行方式。還有別的公司會(huì)通過打造智能工具去讓代碼維護(hù)工作變得更有效率也更有意思。一個(gè)比較極端的例子就是 Facebook 對(duì)他們的海量 PHP 代碼庫(kù)所做的工作。Facebook 開發(fā)了他們自己的編譯器以及帶有 Facebook 風(fēng)格的語(yǔ)言(Hack),這使得他們的 PHP 代碼庫(kù)不僅便于維護(hù),也改善了程序員的工作體驗(yàn)。我猜想這種方式并不能完全解決代碼維護(hù)的遺留問題,但是它確實(shí)讓這個(gè)工作聽上去更有趣了。
3、工作只剩下復(fù)制 / 粘貼這種小兒科的東西程序員所做的工作就是不停寫代碼。
我在之前的工作崗位上曾經(jīng)產(chǎn)出了大量沒有什么意義的代碼。比如說我曾經(jīng)為數(shù)據(jù)集成而編寫了 Groovy 與 Python 腳本。這些數(shù)據(jù)相當(dāng)復(fù)雜,包含了許多不一致的數(shù)據(jù)庫(kù)對(duì)象集合,因此也不能夠自動(dòng)化運(yùn)行。鑒于此我不得不編寫大量代碼,我的同事都猜想我肯定從中學(xué)習(xí)收獲了很多。
然而并沒有,為什么會(huì)這樣呢?
因?yàn)?50% 的代碼(這是夸張的描寫手法?。┦俏抑苯訌?Stack Overflow 復(fù)制粘貼過來(lái)的。還有 40% 的代碼是從其他腳本中復(fù)制過來(lái)的,有一些來(lái)自我同事的代碼,還有一些是我之前寫過的。工作變成了一種重復(fù)勞動(dòng),其中沒有一點(diǎn)創(chuàng)造性與學(xué)習(xí)長(zhǎng)進(jìn)可言。
我們?nèi)绾伪苊膺@種情況?
作為一個(gè)團(tuán)隊(duì),我們都會(huì)花時(shí)間去了解團(tuán)隊(duì)其他成員寫了哪些類型的代碼。我們?cè)诖a審查、同步以及工作回顧的時(shí)候去完成這件事情。如果一個(gè)人花了一星期時(shí)間卻只寫出了毫無(wú)創(chuàng)造性的代碼,我們就會(huì)試圖去弄明白在他身上到底發(fā)生了什么。
有時(shí)候問題的根源來(lái)源于你所用的技術(shù)。我們可能使用了過多的腳本,或者是做了許多本不應(yīng)該做的配置工作。如果是這種情況,我們就會(huì)添加更多的自動(dòng)化設(shè)置。有些時(shí)候我們進(jìn)行代碼的復(fù)制粘貼是事出有因的,在這種情況下大家就會(huì)一起分擔(dān)這項(xiàng)不得不完成的無(wú)聊工作。
4、只能使用內(nèi)部工具也太沒勁了作為一個(gè)程序員,我們喜歡打造一個(gè)自定義的內(nèi)部工具來(lái)解決某些特定問題,因?yàn)閯?dòng)手創(chuàng)造是一件令人興奮的事情。而且,構(gòu)建一個(gè)定制化的解決方案通常要比找出一個(gè)現(xiàn)有的方案進(jìn)行再利用要好得多。
然而相比于學(xué)習(xí)一門時(shí)下流行的開源技術(shù),學(xué)習(xí)一個(gè)內(nèi)部專有工具的趣味性只有前者的十分之一。 這到底是為什么呢?
因?yàn)樗荒艹蔀槟愫团笥蚜奶鞎r(shí)的談資,你也不能到處吹噓,你不會(huì)在 Hacker News 上讀到關(guān)于它的新聞,你也不可以在編程馬拉松(hackathons)活動(dòng)中使用它,當(dāng)然了你也不能將其用到自己秘密開發(fā)的副業(yè)項(xiàng)目中。
很多公司都跌入了打造內(nèi)部工具的陷阱當(dāng)中,因?yàn)樗S之而來(lái)的就是給程序員帶來(lái)更多的無(wú)聊情緒。換句話說:你為了解決一個(gè)短期問題所開發(fā)的內(nèi)部工具反而帶來(lái)了更多后患無(wú)窮的長(zhǎng)期問題。
在我的上一份工作中就對(duì)于這個(gè)問題有著切身體會(huì)。我被限制只能使用公司自己開發(fā)的針對(duì)大規(guī)模數(shù)據(jù)集成的 DSL 語(yǔ)言,而我此前一直學(xué)習(xí)的完全是另一種 SQL 語(yǔ)言。我更希望能夠用上哪怕是 Spark 這樣開放程度沒那么高的語(yǔ)言。如果不使用內(nèi)部工具,我將會(huì) 10 倍投入工作,寫出的代碼也會(huì) 2 倍優(yōu)于現(xiàn)有的水平,還會(huì)讓我的生產(chǎn)力提高 5 倍(不要糾結(jié)于其中的倍數(shù)是否有數(shù)學(xué)邏輯,你只要體會(huì)我的心情就行了?。?。
什么樣的企業(yè)文化能夠避免這一困境?
在我們公司中不會(huì)對(duì)開源技術(shù)抱有偏見。如果能夠重新利用相關(guān)開源技術(shù),我們當(dāng)然很樂意去做。我們不會(huì)回避前沿技術(shù),一旦開源技術(shù)變得足夠成熟能夠取代我們現(xiàn)行的專用語(yǔ)言,我們就會(huì)立馬拋棄原有的定制化代碼投向開源技術(shù)的懷抱中。在我們自己開發(fā)的定制化代碼變得足夠通用之時(shí),我們就會(huì)將其開源。
這么做也偶爾會(huì)犯錯(cuò)。比如說我們?cè)?jīng)使用過一段時(shí)間 agenda.js 去安排我們的后端工作,因?yàn)楦杏X這種技術(shù)既尖端又令人興奮。但是不久之后它就變得太過復(fù)雜了,我們只好重新用回了之前老舊但是可靠性更高的技術(shù)。即便如此,我們依然不后悔曾經(jīng)嘗試過,因?yàn)檫@也是一種寶貴的學(xué)習(xí)經(jīng)驗(yàn)。
5、如果不知道自己為何寫代碼,必然厭倦工作糟糕的人力管理也是造成程序員對(duì)工作心生厭倦的常見原因。更具體地說就是:針對(duì)程序員的自上而下的獨(dú)裁式管理會(huì)讓他們產(chǎn)生抵觸情緒。
心懷良好意圖的管理者經(jīng)常在不知不覺中就使用了這種獨(dú)裁式工作方法。尤其在一個(gè)開發(fā)項(xiàng)目進(jìn)行的不是那么順利或者是截止日期臨近之時(shí),這種管理方法就更為常見了。在巨大的項(xiàng)目壓力下,管理者很自然地就會(huì)縮短團(tuán)隊(duì)討論時(shí)間,減少頭腦風(fēng)暴,直接命令程序員去寫代碼,卻不解釋為何這么做,也不接受任何爭(zhēng)辯。而管理者通常這么做的出發(fā)點(diǎn)就是想要節(jié)省時(shí)間,盡快完成工作。
如果這種管理方法能夠被理解,也不是每一次都會(huì)招致厭煩;事實(shí)上,有一些人還挺能接受你簡(jiǎn)單直接地告訴他應(yīng)該做什么。當(dāng)然了,這也是建立在你的說話語(yǔ)氣是能被對(duì)方接受的基礎(chǔ)上。
使用這種獨(dú)裁式管理方法也有隱藏的成本。通常程序員在明確知道寫什么代碼之前,需要有一個(gè)將智力與創(chuàng)造性進(jìn)行轉(zhuǎn)換的固有思考過程。換句話說,如果你不讓他想明白其中的關(guān)鍵,只是一味地命令他去編碼,他就會(huì)變成一只會(huì)寫代碼不會(huì)思考的猿猴。
更重要的是,你應(yīng)該鼓勵(lì)程序員去追問「為什么」,這樣他們能夠更加投入到自己所做的工作中去。除非你們現(xiàn)在所做的是一個(gè)劍走偏鋒的極端玩意,或者是一個(gè)臨時(shí)補(bǔ)丁,不然的話都應(yīng)該和程序員交代清楚。如果一個(gè)程序員不再關(guān)心與項(xiàng)目有關(guān)的重要決定,也不再思考這些決定背后的邏輯,那么他應(yīng)該是已經(jīng)準(zhǔn)備跳槽了。
如何防范這一問題?
想要解決這一問題最需要的就是在企業(yè)文化中建立起公開討論問題的機(jī)制。要留出固定的討論時(shí)間,讓整個(gè)團(tuán)隊(duì)都參與討論接下來(lái)該做些什么、如何計(jì)劃。想要保持這種開放討論的企業(yè)文化,每個(gè)人都要對(duì)獨(dú)裁式的管理方式保持警覺。
尤其是在團(tuán)隊(duì)遭遇困難的時(shí)刻(或者是截止日期臨近的時(shí)候),團(tuán)隊(duì)成員需要更大聲地表達(dá)出自己的意見,而管理者則更需要小心謹(jǐn)慎地聆聽大家的心聲。
6、日復(fù)一日的工作總會(huì)不可避免地走向無(wú)聊還有一點(diǎn)不得不提的是:在一個(gè)封閉的工作環(huán)境里長(zhǎng)時(shí)間工作絕對(duì)會(huì)扼殺人感知生活的樂趣。這一點(diǎn)不僅僅是針對(duì)科技行業(yè)工作者或者是程序員崗位,放諸于其他行業(yè)也是一樣的。這一條幾乎適用于任何一個(gè)后臺(tái)操作崗位,每一天在相同的辦公室里,見著同樣一幫人,做著一成不變的工作,也沒有什么不同文化的碰撞。即便是在一個(gè)快速增長(zhǎng)的企業(yè)環(huán)境中,縱然所有的事情從客觀角度看都在「良好」運(yùn)行著,人們也會(huì)感覺自己有資格去尋找一些樂趣,并且會(huì)從不那么好的事情中感到沮喪。
如何與日常工作中滋生的無(wú)聊情緒做斗爭(zhēng)?
解決這一問題的關(guān)鍵就是盡力創(chuàng)造多樣化:招聘擁有不同背景以及來(lái)自不同國(guó)家的員工(比如我們的團(tuán)隊(duì)現(xiàn)有的 6 個(gè)成員就分別來(lái)自英國(guó)、法國(guó)、俄羅斯和希臘)。如果你每天看到的同樣一幫人能夠給你帶來(lái)不同文化的沖擊,那么上班這件事肯定會(huì)更有趣一些。
同時(shí),我們會(huì)積極地創(chuàng)造一些走出常規(guī)工作環(huán)境的機(jī)會(huì)。
例如我們會(huì)一起去參加一些行業(yè)聚會(huì)以及編程馬拉松活動(dòng)。我們還會(huì)一起打造工作之外的副業(yè),共同研究我們喜歡的開源工具。除此之外我們還會(huì)不時(shí)地幫助其他團(tuán)隊(duì)完成一些不那么技術(shù)性的工作(包括招聘、市場(chǎng)和分銷)。這么做并非因?yàn)槲覀兌忌瞄L(zhǎng)這些工作,只是為了在日常工作中尋求改變。
我們還會(huì)組織一些團(tuán)隊(duì)活動(dòng)(比如一起看一場(chǎng)秘密電影),我們每周還有一個(gè)固定的不需要事先預(yù)設(shè)主題的團(tuán)隊(duì)活動(dòng)時(shí)間。在這個(gè)自主活動(dòng)時(shí)間里,有時(shí)候我們會(huì)一起專研技術(shù),有時(shí)候會(huì)頭腦風(fēng)暴出一個(gè)新點(diǎn)子,有時(shí)候僅僅是聚在一起玩 LOL,或者是約好一同去泡吧。這個(gè)自由活動(dòng)的美好之處就在于當(dāng)我們坐下來(lái)討論該該去玩啥的時(shí)候,不到最后一分鐘根本就不知道要去干什么。
給生活增添這一小小的未知數(shù)成為了我們對(duì)抗無(wú)聊的終極一招。就像其他對(duì)抗無(wú)聊的方法一樣,這也不會(huì)是非常完美的解決之道。我們要做的就是在原有基礎(chǔ)上不斷調(diào)整,找出一些新招數(shù),并且將其不斷地運(yùn)用到對(duì)抗無(wú)聊的戰(zhàn)斗中。
來(lái)源:Medium,由 TECH2IPO翻譯
相關(guān)文章:
1. 程序員必須了解的內(nèi)存知識(shí)2. 程序員入行門檻真的那么低嗎?3. 如果你身邊有程序員 今天對(duì)他好一點(diǎn)4. 新站網(wǎng)站推廣該如何做 只用三招5. 程序員學(xué)習(xí)能力提升三要素6. Google Adsense西聯(lián)匯款領(lǐng)取方式與流程,親身實(shí)踐7. 貼吧引流變現(xiàn),高調(diào)創(chuàng)收!8. 微信公眾號(hào)每日推送增加到五次?這其實(shí)并不是好事9. 《上帝是個(gè)程序員》----IT男的成長(zhǎng)之路10. 如何辨別非自然鏈接 三種識(shí)別非自然性外鏈的方法解答