程序員的重復(fù)勞動(dòng)陷阱
同樣是一樣的計(jì)算機(jī)專業(yè)畢業(yè),進(jìn)入職場的職位和工作都差不多,為何有些程序員短短幾年就成長為全能選手或領(lǐng)域?qū)<遥行┏绦騿T還在做CRUD?
程序員的重復(fù)勞動(dòng)陷阱
不知道大家有沒有這樣的感覺,每次加入一個(gè)新的公司/組,一開始總是要學(xué)這個(gè)學(xué)那個(gè),可能會(huì)花很多時(shí)間看現(xiàn)有的代碼,然后花一些時(shí)間實(shí)現(xiàn)一點(diǎn)點(diǎn)小的功能,等到經(jīng)過一段時(shí)間后,自己對工作越來越得心應(yīng)手,提來的類似需求馬上就可以做,以做得多做得快為驕傲,覺的這樣可以更受老板青睞,可以升職加薪。
我在畢業(yè)第三年的時(shí)候加入前公司,在加入公司的第一個(gè)季度,我主要再做一些邊緣工具以及理解系統(tǒng),從第二個(gè)季度開始在組里的核心業(yè)務(wù)上開發(fā)。當(dāng)時(shí)自己為了能夠快速的出成果,會(huì)從組里所有的任務(wù)里挑看著比較容易實(shí)現(xiàn)的做,往往一天就可以做完一個(gè)或者兩個(gè)任務(wù)。做完一個(gè)任務(wù)后,發(fā)現(xiàn)backlog里面有相似的任務(wù),我也“趕緊”搶過來assign給自己,然后快速的做完,提交code review。從那個(gè)季度開始我每個(gè)季度做的工單越來越多,超過組里的所有其他成員,自己也對自己的“高效”洋洋得意,覺的自己工作的非常充實(shí),進(jìn)步很大。
然而在這個(gè)過程中,我已經(jīng)不知不覺得掉到“重復(fù)勞動(dòng)”的陷阱中去了。
我們在寫代碼的時(shí)候,有一個(gè)原則交叫DRY(Don't?Repeat?Youself)原則,簡單通俗的說就是不要copy paste代碼,能抽象成函數(shù)的抽象成函數(shù),能抽象成基類的抽象成基類。但是程序員的工作本身也應(yīng)該遵循一樣的道理,那就是盡量不要做重復(fù)的工作。
重復(fù)勞動(dòng)對程序員的危害
回到開篇的問題,同樣是一樣的計(jì)算機(jī)專業(yè)畢業(yè),進(jìn)入職場的職位和工作都差不多,為何有些程序員短短幾年就成長為全能選手或領(lǐng)域?qū)<?,有些程序員還在做CRUD?

大部分的技術(shù)學(xué)習(xí)曲線類似于上圖,經(jīng)歷過短暫的入門期和相對長一些的積累期之后,可能大部分技術(shù)都會(huì)進(jìn)入到高效期。在入門期和積累期的時(shí)候可能技能使用的效率會(huì)低一些,進(jìn)入到高效期之后,隨著技能使用的效率大大提高,工作所產(chǎn)生的“輸出”也越來越大。因此“高效期“給人以充實(shí)的假象。
一旦自己的某項(xiàng)技術(shù)進(jìn)入到高效期,在此基礎(chǔ)上的提升會(huì)非常困難,可能之前工作三個(gè)月所掌握的新知識(shí),比之后一年在工作中積累的要多。有時(shí)候我們看一個(gè)程序員工作了5年,但是他可能第一年學(xué)習(xí)并熟悉所用的技術(shù),接下來4年都在做相同的工作,解決類似的需求,那么他的5年工作經(jīng)驗(yàn)等于1年乘以5。
而有些程序員,他每工作一段時(shí)間之后,都會(huì)鉆研技術(shù)更深的部分,或者去學(xué)習(xí)新的技術(shù),總是保持著在嘗試自己并不擅長的領(lǐng)域,那么這樣的程序員,他的5年工作經(jīng)驗(yàn)會(huì)比前一種程序員要多。
如何擺脫重復(fù)勞動(dòng)的循環(huán)?
既然重復(fù)勞動(dòng)的危害這么大,那么我們是否可以擺脫重復(fù)勞動(dòng)的循環(huán)呢?
有的時(shí)候,程序員自己也不想老是重復(fù)的干類似的東西,但是無奈被派發(fā)的任務(wù)重復(fù)的很多,似乎自己可以選擇的不多。
在我自己在第三年大量重復(fù)勞動(dòng)之后,我的經(jīng)理找到我談話,說我不應(yīng)該這樣重復(fù)自己,同樣的事情做一兩次就好了,再重復(fù)的做對自己的幫助不大。我分享一下我是怎么樣避免重復(fù)的勞動(dòng)的:
找到Pattern,解決一類問題而不是一個(gè)問題。當(dāng)你解決了N次類似的需求的時(shí)候,是否可以把這些問題抽象出來,是否可以去自動(dòng)化的實(shí)現(xiàn)這類需求?改了N次bug之后,是否可以發(fā)現(xiàn)bug的規(guī)律,能夠開發(fā)出靜態(tài)分析工具來抓住這些bug?
嘗試用新的技術(shù)解決同樣的問題。有時(shí)當(dāng)項(xiàng)目的實(shí)現(xiàn)并沒有多少規(guī)定的時(shí)候,我們可以在一定的自由度下嘗試新的工具。今年年初的時(shí)候我去嘗試修改一個(gè)已有的內(nèi)部工具前段,持著學(xué)習(xí)新技術(shù)的心理,我用Redux重新實(shí)現(xiàn)了前段,而不是在原有的jQuery的前段基礎(chǔ)上修改。
嘗試換崗。換崗位可以直接的讓你接受不同的項(xiàng)目,做一些不同的事情。我在上家公司的第一組待了近三年才換組,現(xiàn)在來看應(yīng)該更早的時(shí)候嘗試不同的事情。換崗位也會(huì)帶來一些其他的問題,比如到新崗位之后可能會(huì)影響晉升速度,需要重新建立自己的權(quán)威等等。
換工作。換工作是一個(gè)終極大招,它會(huì)帶來很多其他的變化,不建議只是為了脫離重復(fù)勞動(dòng)而換工作。如果沒有養(yǎng)成良好的學(xué)習(xí)習(xí)慣,那么換一份新工作之后也很有可能陷入到新的重復(fù)勞動(dòng)的循環(huán)中。
重復(fù)勞動(dòng)不可以完全避免
重復(fù)勞動(dòng)是否可以完全避免呢?
我覺的是不可以避免的。以上的內(nèi)容都是基于程序員成長的角度去分析問題,重復(fù)勞動(dòng)是有害的。但是將程序員的勞動(dòng)視為價(jià)值輸出的話,熟練的價(jià)值輸出確實(shí)也是程序員的價(jià)值之一,可以爭取到更高的薪酬。
我們站在組織的角度上來看,重復(fù)的需求永遠(yuǎn)存在,這些重復(fù)的需求需要被完成。如果在人員配置有限的情況下,不可避免的單個(gè)個(gè)體成員需要去進(jìn)行一定的重復(fù)勞動(dòng)。而由于時(shí)間上的緊迫性,可能必須要用高效粗暴的方法來實(shí)現(xiàn)。
如果你是公司的初創(chuàng)成員,需要在初期做大量的重復(fù)工作來從無到有的實(shí)現(xiàn)新的產(chǎn)品,那毫無疑問這是應(yīng)該做的,因?yàn)檫@樣的重復(fù)勞動(dòng)帶來的收益可能是巨大的。
希望大家在工作中都可以正確的認(rèn)識(shí)到重復(fù)勞動(dòng)的陷阱,讓自己能夠保持持久的成長。
想要了解更多關(guān)于編程的知識(shí)可以點(diǎn)擊:
JAVA全套課程_尚學(xué)堂Java入門_Java零基礎(chǔ)必備_Java編程課程