程序員的重復(fù)勞動(dòng)陷阱
同樣是一樣的計(jì)算機(jī)專(zhuān)業(yè)畢業(yè),進(jìn)入職場(chǎng)的職位和工作都差不多,為何有些程序員短短幾年就成長(zhǎng)為全能選手或領(lǐng)域?qū)<?,有些程序員還在做CRUD?
程序員的重復(fù)勞動(dòng)陷阱
不知道大家有沒(méi)有這樣的感覺(jué),每次加入一個(gè)新的公司/組,一開(kāi)始總是要學(xué)這個(gè)學(xué)那個(gè),可能會(huì)花很多時(shí)間看現(xiàn)有的代碼,然后花一些時(shí)間實(shí)現(xiàn)一點(diǎn)點(diǎn)小的功能。
等到經(jīng)過(guò)一段時(shí)間后,自己對(duì)工作越來(lái)越得心應(yīng)手,提來(lái)的類(lèi)似需求馬上就可以做,以做得多做得快為驕傲,覺(jué)得這樣可以更受老板青睞,可以升職加薪。
我在畢業(yè)第三年的時(shí)候加入前公司,在加入公司的***個(gè)季度,我主要再做一些邊緣工具以及理解系統(tǒng),從第二個(gè)季度開(kāi)始在組里的核心業(yè)務(wù)上開(kāi)發(fā)。
當(dāng)時(shí)自己為了能夠快速的出成果,會(huì)從組里所有的任務(wù)里挑看著比較容易實(shí)現(xiàn)的做,往往一天就可以做完一個(gè)或者兩個(gè)任務(wù)。
做完一個(gè)任務(wù)后,發(fā)現(xiàn)backlog里面有相似的任務(wù),我也“趕緊”搶過(guò)來(lái)assign給自己,然后快速的做完,提交code review。
從那個(gè)季度開(kāi)始我每個(gè)季度做的工單越來(lái)越多,超過(guò)組里的所有其他成員,自己也對(duì)自己的“高效”洋洋得意,覺(jué)的自己工作的非常充實(shí),進(jìn)步很大。
然而在這個(gè)過(guò)程中,我已經(jīng)不知不覺(jué)得掉到“重復(fù)勞動(dòng)”的陷阱中去了。
我們?cè)趯?xiě)代碼的時(shí)候,有一個(gè)原則交叫DRY(Don't Repeat Youself)原則,簡(jiǎn)單通俗的說(shuō)就是不要copy paste代碼,能抽象成函數(shù)的抽象成函數(shù),能抽象成基類(lèi)的抽象成基類(lèi)。
但是程序員的工作本身也應(yīng)該遵循一樣的道理,那就是盡量不要做重復(fù)的工作。
重復(fù)勞動(dòng)對(duì)程序員的危害
回到開(kāi)篇的問(wèn)題,同樣是一樣的計(jì)算機(jī)專(zhuān)業(yè)畢業(yè),進(jìn)入職場(chǎng)的職位和工作都差不多,為何有些程序員短短幾年就成長(zhǎng)為全能選手或領(lǐng)域?qū)<?,有些程序員還在做CRUD?
大部分的技術(shù)學(xué)習(xí)曲線類(lèi)似于上圖,經(jīng)歷過(guò)短暫的入門(mén)期和相對(duì)長(zhǎng)一些的積累期之后,可能大部分技術(shù)都會(huì)進(jìn)入到高效期。
在入門(mén)期和積累期的時(shí)候可能技能使用的效率會(huì)低一些,進(jìn)入到高效期之后,隨著技能使用的效率大大提高,工作所產(chǎn)生的“輸出”也越來(lái)越大。因此“高效期“給人以充實(shí)的假象。
一旦自己的某項(xiàng)技術(shù)進(jìn)入到高效期,在此基礎(chǔ)上的提升會(huì)非常困難,可能之前工作三個(gè)月所掌握的新知識(shí),比之后一年在工作中積累的要多。
有時(shí)候我們看一個(gè)程序員工作了5年,但是他可能***年學(xué)習(xí)并熟悉所用的技術(shù),接下來(lái)4年都在做相同的工作,解決類(lèi)似的需求,那么他的5年工作經(jīng)驗(yàn)等于1年乘以5。
而有些程序員,他每工作一段時(shí)間之后,都會(huì)鉆研技術(shù)更深的部分,或者去學(xué)習(xí)新的技術(shù),總是保持著在嘗試自己并不擅長(zhǎng)的領(lǐng)域,那么這樣的程序員,他的5年工作經(jīng)驗(yàn)會(huì)比前一種程序員要多。
如何擺脫重復(fù)勞動(dòng)的循環(huán)
既然重復(fù)勞動(dòng)的危害這么大,那么我們是否可以擺脫重復(fù)勞動(dòng)的循環(huán)呢?
有的時(shí)候,程序員自己也不想老是重復(fù)的干類(lèi)似的東西,但是無(wú)奈被派發(fā)的任務(wù)重復(fù)的很多,似乎自己可以選擇的不多。
在我自己在第三年大量重復(fù)勞動(dòng)之后,我的經(jīng)理找到我談話,說(shuō)我不應(yīng)該這樣重復(fù)自己,同樣的事情做一兩次就好了,再重復(fù)的做對(duì)自己的幫助不大。
我分享一下我是怎么樣避免重復(fù)的勞動(dòng)的:
1.找到Pattern,解決一類(lèi)問(wèn)題而不是一個(gè)問(wèn)題。
當(dāng)你解決了N次類(lèi)似的需求的時(shí)候,是否可以把這些問(wèn)題抽象出來(lái),是否可以去自動(dòng)化的實(shí)現(xiàn)這類(lèi)需求?
改了N次bug之后,是否可以發(fā)現(xiàn)bug的規(guī)律,能夠開(kāi)發(fā)出靜態(tài)分析工具來(lái)抓住這些bug?
2.嘗試用新的技術(shù)解決同樣的問(wèn)題。
有時(shí)當(dāng)項(xiàng)目的實(shí)現(xiàn)并沒(méi)有多少規(guī)定的時(shí)候,我們可以在一定的自由度下嘗試新的工具。
今年年初的時(shí)候我去嘗試修改一個(gè)已有的內(nèi)部工具前段,持著學(xué)習(xí)新技術(shù)的心理,我用Redux重新實(shí)現(xiàn)了前段,而不是在原有的jQuery的前段基礎(chǔ)上修改。
3.嘗試換崗。
換崗位可以直接的讓你接受不同的項(xiàng)目,做一些不同的事情。我在上家公司的***組待了近三年才換組,現(xiàn)在來(lái)看應(yīng)該更早的時(shí)候嘗試不同的事情。
換崗位也會(huì)帶來(lái)一些其他的問(wèn)題,比如到新崗位之后可能會(huì)影響晉升速度,需要重新建立自己的權(quán)威等等。
4.換工作。
換工作是一個(gè)***大招,它會(huì)帶來(lái)很多其他的變化,不建議只是為了脫離重復(fù)勞動(dòng)而換工作。
如果沒(méi)有養(yǎng)成良好的學(xué)習(xí)習(xí)慣,那么換一份新工作之后也很有可能陷入到新的重復(fù)勞動(dòng)的循環(huán)中。
重復(fù)勞動(dòng)不可以完全避免
重復(fù)勞動(dòng)是否可以完全避免呢?
我覺(jué)的是不可以避免的。以上的內(nèi)容都是基于程序員成長(zhǎng)的角度去分析問(wèn)題,重復(fù)勞動(dòng)是有害的。
但是將程序員的勞動(dòng)視為價(jià)值輸出的話,熟練的價(jià)值輸出確實(shí)也是程序員的價(jià)值之一,可以爭(zhēng)取到更高的薪酬。
我們站在組織的角度上來(lái)看,重復(fù)的需求永遠(yuǎn)存在,這些重復(fù)的需求需要被完成。
如果在人員配置有限的情況下,不可避免的單個(gè)個(gè)體成員需要去進(jìn)行一定的重復(fù)勞動(dòng)。而由于時(shí)間上的緊迫性,可能必須要用高效粗暴的方法來(lái)實(shí)現(xiàn)。
如果你是公司的初創(chuàng)成員,需要在初期做大量的重復(fù)工作來(lái)從無(wú)到有的實(shí)現(xiàn)新的產(chǎn)品,那毫無(wú)疑問(wèn)這是應(yīng)該做的,因?yàn)檫@樣的重復(fù)勞動(dòng)帶來(lái)的收益可能是巨大的。
希望大家在工作中都可以正確的認(rèn)識(shí)到重復(fù)勞動(dòng)的陷阱,讓自己能夠保持持久的成長(zhǎng)。