編程蹦玫,眾所周知被定義為知識工作诬辈。所有的知識工作,從業(yè)者和門外漢都喜歡把它神秘化趴乡,將整個過程以不可知論的風(fēng)格來解釋对省。理由往往非常簡單粗暴蝗拿,無非是“照搬體力工作時代的工作方式會在知識工作中失敗晾捏。”
這其實毫無理論依據(jù)哀托。偶有幾個人能寫寫理論與理由惦辛,也跟癔癥者的囈語無甚差別。我個人是反對將知識工作神秘化的仓手,我是科學(xué)管理原理的忠實粉絲胖齐,盡管科學(xué)管理原理的具體案例都過時了玻淑,但泰勒的研究方法依然是有效的,只是研究者和被研究者發(fā)生了一些微妙的變化呀伙。
彼得德魯克在《21世紀(jì)的管理挑戰(zhàn)》中提到补履,“知識工作者需要自我管理”,那么很明顯不是體力工作時代形成的方法不能用在知識工作中剿另,而是不能指望個體之外的人對個體進(jìn)行簡單的粗暴的分析和命令箫锤,不要妄想以此產(chǎn)生很高的生產(chǎn)效率。這個分析和下命令的人必須是知識工作者自己雨女,我們需要自己紀(jì)錄自己的行為谚攒,然后分析、優(yōu)化氛堕,才能得到生產(chǎn)力的提升馏臭,任何向外訴求都會很快的撞上一個“天花板”而無法提升。如果非要尋求外部控制讼稚,那么我們只能說括儒,對于新時代的管理者定位,老板更像老師乱灵,以引導(dǎo)和幫助訓(xùn)練為主塑崖,真正的效率提升主要還是靠自己。
那么如文章標(biāo)題所述痛倚,追求知識工作的一種——編程的效率规婆,是本文關(guān)注的重點。但我們首先要聲明蝉稳,本文不會給一個可以直接產(chǎn)生高效率的方法抒蚜,而會給一個可以將生產(chǎn)效率可視化,并從中發(fā)現(xiàn)瓶頸的方式耘戚。至少在不改變質(zhì)量的前提下嗡髓,可以極大的提升你的效率,如果使用得當(dāng)收津,可能會得到質(zhì)量和效率的雙提升饿这。
本文引入的方法也并不新鮮,簡單說來撞秋,就是任務(wù)列表法+PDCA的一套組合使用而已长捧。大道至簡,堅持者寡吻贿,而堅持下來的人往往都可以獲得數(shù)倍的效率提升串结。
任務(wù)列表法
我們做任何事情都應(yīng)該劃出任務(wù)列表,按照列表一項項去完成,這不是什么特別稀奇的工作方式肌割。然而卧蜓,很多人的問題在于,列出的問題列表不能達(dá)到完全窮盡把敞,各自獨立弥奸。
完全窮盡是什么意思呢?
當(dāng)我開始做事情的時候奋早,如果不能把所有的事情窮盡其爵,我列出的列表跟我做的事情是不完全等價的,這說明我們的工作行為非成祢牵混沌且不可視摩渺,哪怕是對自己。
有時剂邮,事情看起來在大面上窮盡了摇幻,但是做的時候,又會發(fā)現(xiàn)新的任務(wù)挥萌。那說明每一項任務(wù)的輸入和輸出沒有想清楚绰姻,因此每當(dāng)發(fā)現(xiàn)有所欠缺,就需要輸入新的任務(wù)作為補充引瀑。于是任務(wù)列表就增加了狂芋,這也是一種沒有窮盡。
各自獨立是什么意思呢憨栽?
意味著帜矾,每一項任務(wù)都可以單獨做完,而不需要先做完其中一項任務(wù)屑柔,才能做另一項屡萤。
假如我有三項任務(wù):任務(wù)1、任務(wù)2掸宛、任務(wù)3死陆。
我做的時候,必須把任務(wù)2做完唧瘾,任務(wù)1才能做完措译;任務(wù)3做完,任務(wù)2才能做完饰序。結(jié)果我就從任務(wù)1開始一路做到任務(wù)3领虹,最后再逐步回到任務(wù)1,整個過程非尘穑混亂掠械,那就不是各自獨立的。
在現(xiàn)實生活中想做到各項任務(wù)都獨立注祖,挑戰(zhàn)還是比較大的猾蒂,但是在編程的世界里就輕松多了。優(yōu)秀的設(shè)計都是要求解耦的是晨,如果做不到肚菠,基本等于活兒比較爛。
當(dāng)我們做到“任務(wù)的完全窮盡與各自獨立”之后罩缴,我們的任務(wù)列表法才算達(dá)標(biāo)蚊逢,這之后才能高效的工作,然而達(dá)到這一點并不是一蹴而就的箫章,沒有誰可以一上來就做到任務(wù)劃分的完全窮盡烙荷、各自獨立,需要不停的刻意練習(xí)檬寂。所以我們稱之為編程的精進(jìn)之法终抽。
PDCA
PDCA是Plan-Do-Check-Action四個詞的組合。這是著名的戴明環(huán)桶至。講究從計劃開始昼伴、經(jīng)過實踐、反思镣屹、產(chǎn)生的改進(jìn)行動再納入下一輪計劃的持續(xù)改進(jìn)過程圃郊。
當(dāng)我們把這一套從工業(yè)領(lǐng)域搬過來的時候,我們對計劃的理解還是工業(yè)領(lǐng)域那一套女蜈。如果用在個人提升方面持舆,我們應(yīng)該把PDCA微觀化,這之后就有兩個問題需要被解答伪窖,一個是Plan是什么吏廉?一個是Check什么?
第一個問題的答案很顯然惰许,我們前面講的任務(wù)列表法就是在形成這個Plan席覆。
第二個問題本身是一個母問題,每當(dāng)我們對這個問題進(jìn)行回答汹买,都要回答一個衍生出來的子問題:我們要做點什么才能在需要Check的時候能夠Check佩伤。
常用的套路有兩個:
- Plan的時候估計一個時間,然后開始做晦毙,做的時候計時生巡,做完就要Check這個時間是否達(dá)標(biāo),無論快了還是慢了(通常是比較明顯的差距才能引起反思见妒,比如20%以上的差距)孤荣,Check都要反思并產(chǎn)生Action,納入到未來的Plan中去。
- 估計的任務(wù)列表和實際做的任務(wù)列表是否是一樣多的盐股?往往是會多出來钱豁,這時就要反思,自己在哪里有不足導(dǎo)致了這個差別疯汁。
這些反思往往是發(fā)現(xiàn)自己的問題牲尺,比如自己不熟悉的知識點、方法幌蚊,甚至業(yè)務(wù)知識谤碳,最后的Action也往往都是通過刻意練習(xí)來提升生產(chǎn)效率,比如反復(fù)練類似題目溢豆。有時也會借助一些工具來提升效率蜒简,比如抽取live template,使用快捷鍵漩仙,只是效率工具的使用往往也需要刻意練習(xí)臭蚁。有時也可以通過復(fù)用技術(shù)(其實live template已經(jīng)是復(fù)用技術(shù)了)來提升生產(chǎn)效率,然而可復(fù)用模式的識別與抽取本身也是需要練習(xí)的讯赏,否則在那里糾結(jié)浪費的時間更長垮兑。
有些同學(xué)會感覺到,記錄了時間卻不知道哪里有問題漱挎,這個時候可以跟TDD相結(jié)合系枪,把時間劃分為寫測試的時間,寫實現(xiàn)的時間和測試通過的時間磕谅。其實除去這幾種時間私爷,還有其他時間消耗,比如調(diào)研的時間膊夹。不管怎么劃分衬浑,將時間消耗結(jié)構(gòu)化掉,一部分一部分的追求最高效率是一種可行的辦法放刨。
舉例
我們做一個簡單的修改用戶信息功能的API工秩。那么我們在某一個Java技術(shù)棧上可能的任務(wù)列表是長這樣的:
- 寫UserController (10分鐘)
- 寫UserDAO (15分鐘)
當(dāng)你真正開始做的時候,會碰到兩種主要的意外:
- 任務(wù)列表擴張
- 時間估計不準(zhǔn)
下面就這個例子进统,就講一講當(dāng)我們遇到這兩種意外助币,該怎么反思和處理。
任務(wù)列表擴張
任務(wù)列表擴張螟碎,顧名思義眉菱,就是指我們所估計的任務(wù)數(shù)量會隨著我們開始工作變的比預(yù)想的多,可能有兩種主要原因:
- 技術(shù)原因
- 業(yè)務(wù)原因
技術(shù)原因:
比如在這個案例里面掉分,第二項任務(wù)是“寫UserDAO”俭缓,就是一個沒想清楚的事情克伊。我們還需要建數(shù)據(jù)庫表,我們在一個有migration腳本支持的技術(shù)棧設(shè)計上工作华坦,我們還需要寫初始化腳本和回滾腳本愿吹。也許這是我的第一個表,所以我還得配置數(shù)據(jù)庫季春,搞不好還要把ORM的基礎(chǔ)代碼都寫完,所以這些導(dǎo)致了我可能任務(wù)估少了消返。
再比如载弄,項目規(guī)范要求我們Controller不能直接調(diào)DAO,要在中間加一個Service撵颊,盡管我個人覺得這是一件很二的規(guī)范宇攻,然而規(guī)范就是規(guī)范,我對項目技術(shù)規(guī)范不熟悉倡勇,導(dǎo)致我的計劃缺少了一些必要的任務(wù)逞刷。再比如,我們的項目采用了Jersey妻熊,根本沒有Controller這么一個東西夸浅,那么不了解技術(shù)框架導(dǎo)致我的任務(wù)表從根本上就列錯了。
這種情況屬于我對技術(shù)了解不足扔役,通過對任務(wù)列表擴張的原因進(jìn)行Check帆喇,我會得出一些Action:去了解技術(shù)規(guī)范、項目的技術(shù)架構(gòu)亿胸、現(xiàn)有的代碼坯钦,以防止以后的任務(wù)畫錯。
業(yè)務(wù)原因:
也比如在這個例子里侈玄,在更新用戶的API里不能更新密碼婉刀,所以我們還需要一個專門修改密碼的API。再比如序仙,這是一個遺留系統(tǒng)突颊,用戶信息的修改會觸發(fā)數(shù)據(jù)庫里的一系列觸發(fā)器,進(jìn)而修改系統(tǒng)的其他數(shù)據(jù)潘悼,然而有些修改是有前提的洋丐,那么我就需要更多的任務(wù)去處理這些前提條件;或者當(dāng)數(shù)據(jù)變化時挥等,要求我去修改系統(tǒng)里的其他數(shù)據(jù)友绝,那么我就需要更多的任務(wù)去完成這些工作。
這種情況屬于我對整個系統(tǒng)的業(yè)務(wù)了解不足肝劲,通過對任務(wù)列表擴張原因的Check迁客,我會得出一些Action:通讀數(shù)據(jù)庫表郭宝、通讀代碼、更全面的閱讀需求掷漱,或者跟需求方更多的溝通粘室,以了解業(yè)務(wù)。
時間估計不準(zhǔn)
時間估計不準(zhǔn)就簡單很多卜范,在這個例子里衔统,可能的主要原因也有三個:
- 任務(wù)列表擴張了,但是我沒意識到海雪。比如UserDAO寫起來沒有我想的那么簡單锦爵,所以多花了時間;
- 單純的技術(shù)不熟練奥裸;
- 花了太多時間在糾結(jié)上险掀;
對于隱藏的任務(wù)列表擴張,不準(zhǔn)確的時間估計給了我們一個很好的線索去發(fā)現(xiàn)湾宙。一旦發(fā)現(xiàn)了樟氢,可以如前文所述去處理,也就不再贅述侠鳄。
對于單純的技術(shù)不熟練埠啃,正如前文所述,要設(shè)計刻意練習(xí)伟恶。比如我就曾設(shè)計過針對數(shù)據(jù)庫的增刪改查訓(xùn)練以提升自己的速度霸妹,使我即便使用TDD依然保持一個極高的速度。我們或許不曾意識到知押,基礎(chǔ)能力的薄弱對于我們的高級能力的限制有多嚴(yán)重叹螟,這種體驗也只有基礎(chǔ)能力已經(jīng)熟練的人去教基礎(chǔ)能力不熟練的人一些高級技能的時候才會發(fā)現(xiàn)。這種視而不見的收益台盯,使得大多數(shù)人都會輕視基本功的練習(xí)罢绽。哪怕已經(jīng)獲得收益的人,也容易鼓吹要更多的啟發(fā)而忽略了基本功的價值静盅。
對于花了太多時間在糾結(jié)上良价,這其實也是一種不熟練,是對設(shè)計知識和能力的不熟練蒿叠。之前看的設(shè)計知識只能有一個大概的感覺明垢,對于每個知識的邊界、使用之后的發(fā)展市咽、如何從一種設(shè)計過渡為另一種設(shè)計了解不清痊银,從而害怕在那一刻犯錯。實際上真正值得糾結(jié)的部分沒有那么多施绎,大多是自己嚇自己溯革,或者引入了過度設(shè)計贞绳。
當(dāng)然也有一種情況是暴露出了架構(gòu)級的問題,比如我們對于應(yīng)該提出的原則性規(guī)范沒有提出致稀,導(dǎo)致我們每個地方都要現(xiàn)想冈闭,大家可以想象在沒有RESTful之前設(shè)計Web API,我們可能真的是每一個API都現(xiàn)想的抖单,有了它之后萎攒,我們的糾結(jié)時間就變少了。這種情況下矛绘,通過本方法耍休,架構(gòu)師也算是有了相應(yīng)的數(shù)據(jù)支持,那么架構(gòu)師也就有了發(fā)現(xiàn)問題的一種工具蔑歌。
結(jié)論
總的來說羹应,任務(wù)列表法+PDCA式工作法形成的組合方法揽碘,是一個通過逐漸提升個人能力以實現(xiàn)高效工作的方法次屠。這兩種方法單獨拿出來用,都會由于各自的局限而觸碰到各自的天花板雳刺,只有有機結(jié)合才能真正突破這個天花板劫灶。
剛開始使用時,很多人會感覺到一些痛苦掖桦,這一點上我只能說本昏,提升就是痛苦的,而新的習(xí)慣一旦養(yǎng)成枪汪,痛苦也就不翼而飛涌穆,所以美國心理學(xué)之父威廉詹姆士說,“我們需要在盡可能早的時候雀久,讓盡可能多的有用動作變成自動的和習(xí)慣的……一段痛苦的艱難時期之后就是自由的時光”宿稀。當(dāng)我們的基礎(chǔ)能力達(dá)到一個極高的水平之后,會發(fā)現(xiàn)爭取自由的籌碼會變得更多赖捌。