原文鏈接:http://antirez.com/news/112
infoQ翻譯:http://www.infoq.com/cn/news/2017/04/Redis-father-10x?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=homepage
傳說中的10x程序員是指那些工作效率超過普通程序員10倍的人褪子。我們所說的普通程序員可以勝任一個他的本職工作苛败,但是卻沒有10x程序員的神奇能力。更準確一些词爬,我們所說的“普通程序員”是指那些可以達到業(yè)內(nèi)平均水平的編程人員永乌。
編程社區(qū)中對于這樣的“怪物”是否存在吨述,有著很大的爭議:部分人認為10x程序員根本就不存在,而其他的人認為不僅僅他是存在的歧寺,甚至還能找到100x程序員燥狰。
如果你認為編程是一種“線性”的工作棘脐,那毫無疑問10x程序員是不可能存在的,就像不可能有人能比其他人跑得快10倍一樣龙致,也不可能有建筑工人在同一時間內(nèi)比別人多干10倍的活蛀缝。然而編程是一種特殊的設(shè)計工作。即使一個程序員從來沒有刻意訓練過編程方面的架構(gòu)設(shè)計目代,在實現(xiàn)功能的過程中也需要一些簡單的設(shè)計屈梁。
在我看來,設(shè)計和實現(xiàn)程序都不是“線性”能力榛了,它是由經(jīng)驗在讶,編碼能力,知識霜大,對無用部分的甄別能力等這一系列非線性優(yōu)勢組合而成的构哺,尤其是當一個程序員同時負責設(shè)計和實現(xiàn)時,這個現(xiàn)象就更加明顯战坤。任務越是目標明確曙强,10x程序員就月能釋放他的潛力來盡快達成目標。如果手上的工作非常死板途茫,比如規(guī)定了必須要用什么工具來用什么方式完成任務旗扑,那么10x程序員的高效能力則會被削弱。他們始終可以在“局部地區(qū)”通過設(shè)計完成更好的工作慈省,然而卻不能用更直接的方法來完成目標(甚至是拋棄現(xiàn)有工程的某些部分)∶吖剑看上去最終達成的目標是相同的边败,但是效率卻大打折扣。
在二十年的職業(yè)生涯中捎废,我關(guān)注著其他和我一起協(xié)作的程序員笑窜。他們在我制定的目標下一起完成一些任務,例如給Redis打補丁等等登疗。同時許多人告訴我排截,他們認為我是一名十分高效的程序員。雖然我并不是一名工作狂辐益,但我也經(jīng)常會那自己來作為快速編碼的例子來介紹給別人聽断傲。
下面列舉的品質(zhì)是我認為的高產(chǎn)程序員的獨特品質(zhì)。
分解編程任務的能力:完成各個子任務
將程序的分解為各種子任務(函數(shù)智政,算法或者其他)认罩,是程序員最顯著的能力之一。然而令人震驚的是续捂,并沒有那么多人使用最基本的變成結(jié)構(gòu)來有效地實現(xiàn)一些功能垦垂。我觀察到一些連最簡單的排序算法都不會的“低能”程序員宦搬,卻比那些受過良好理論教育(但缺乏實踐)的程序員完成更多的工作。
經(jīng)驗:模式匹配
這里我說的經(jīng)驗是指對于那些經(jīng)常出現(xiàn)的任務的一系列解決方案劫拗。一名有經(jīng)驗的程序員事實上知道如何去將問題分解间校。這樣就避免了很多的設(shè)計工作并且可以避免出現(xiàn)簡化問題時出現(xiàn)的最大問題——設(shè)計錯誤。
專注:實際時間VS假想時間
拋開時間的利用質(zhì)量页慷,只關(guān)注寫代碼所話費的時間憔足,都是耍流氓。注意力無法集中可能由外因和內(nèi)因兩方面導致差购。內(nèi)因包括拖延癥四瘫,或者對手頭的項目不感興趣(你無法好好的做自己不喜歡的事情),缺乏鍛煉或者身體狀況不佳欲逃,以及缺乏睡眠找蜜。外因則是頻繁的會議,工作環(huán)境不佳稳析,協(xié)作者的頻繁打斷洗做。所以人們會很自然地想要提高注意力的集中程度,以及去減少打斷的次數(shù)來創(chuàng)造一個沒有邊界效應的編程環(huán)境彰居。有時候為了可以更好地集中注意力诚纸,一些極端的方法也是必要的。比如我只在固定的時間點去閱讀郵件并且不會進行回復陈惰。
設(shè)計方面的犧牲:舍棄5%來贏得90%
項目的非基本功能會大大增加設(shè)計的復雜度畦徘,或者導致另外一個重要的目標難以達成,這是因為由于不重要的目標和基本功能之間總是存在著牽連抬闯,所以這么做會使任務變得非常復雜井辆。所以設(shè)計者必須要意識到,項目中哪些部分是投入和產(chǎn)出不成正比的溶握。如果一個工程是為了將輸出最大化杯缺,那我們只需要將精力集中在與之相關(guān)的方面,這樣就可以在合理的時間內(nèi)完成它睡榆。舉個例子萍肆,當我們設(shè)計消息隊列 Disque時,我意識到最值得付出的功能是將消息組織排序胀屿,從而其他的各個方面就會有實質(zhì)上的進步塘揣,包括可用性,請求語言和客戶端交互碉纳,簡潔性和性能勿负。
簡潔性
這顯然是成敗的分界點。為了理解簡潔性是什么,我們有必要去找到復雜性產(chǎn)生的原因奴愉。我認為兩個導致復雜性的主要原因是不愿意犧牲部分設(shè)計琅摩,以及設(shè)計上的錯誤積累。
試想一下锭硼,在設(shè)計的過程中每一次我們都誤入歧途房资,最終會使我們離最優(yōu)解越來越遠。最初的設(shè)計錯誤并不會讓這整個系統(tǒng)被重新設(shè)計檀头,而是會導致下一次使用另一個復雜的解決方案來掩蓋它轰异。從而整個工程會變得越來越復雜,并且在每一次錯誤的設(shè)計之后變得更加低效暑始。
在腦海中進行許多細碎的“概念驗證”后搭独,大量的簡介設(shè)計會在程序員的心里浮現(xiàn),從而開始構(gòu)建靈活而又有效的解決方案并最終達到簡潔性廊镜。之后牙肝,經(jīng)驗和個人設(shè)計能力將會進一步提升設(shè)計和找到合理的子任務解決方案。
然而每當需要用到復雜的解決方案時嗤朴,就需要花大量的時間來構(gòu)思如何避免它配椭,直到實在沒有其他可以代替的方案之后才能繼續(xù)前行。
完美主義雹姊, 為了偏袒設(shè)計而削弱生產(chǎn)力
完美主義有兩種:追求工程師文化中理論上的最強性能股缸,或者追求個人特色。我認為這兩種都將阻礙程序員的生產(chǎn)力吱雏。完美主義和害怕外部的評價導致了設(shè)計上的偏袒敦姻,從而導致最終只是根據(jù)個人意愿和性能指標來作出設(shè)計方案,健壯性歧杏、簡潔性和按時交付都不會被考慮在內(nèi)替劈。
學識:某些理論知識是很有用的
如果了解數(shù)據(jù)結(jié)構(gòu),知道計算的極限性能得滤,以及對于某些模型非差給你適用的算法,那么在面對復雜問題時就能給出非常合適的設(shè)計盒犹。你并不需要在各個方面都十分精通懂更,但是知道問題的多種解決方案確實很有必要的。例如我們在設(shè)計上做出部分妥協(xié)(接受一定比例的錯誤)和并且預估了總體的基數(shù)急膀,那么兩者結(jié)合就可以避免在一個數(shù)據(jù)流中進行統(tǒng)計特定目標這個問題上沮协,給出一個復雜低速和內(nèi)存使用率低的方案。
了解底層原理
即使在使用高級語言的時候卓嫂,我們?nèi)匀粫驗椴焕斫庥嬎銠C的運行原理而導致編寫出來的程序有些問題慷暂。這會導致我們必須推翻之前的設(shè)計,因為在某些工具或者算法上存在根本性的錯誤。深入理解C語言行瑞,并清楚的知道CPU和內(nèi)核的工作原理奸腺,可以避免在工程后期發(fā)現(xiàn)一些根本上的問題。
調(diào)試技巧
尋找bug總是會花掉很多時間血久。所以如果你善于發(fā)現(xiàn)bug出現(xiàn)的原因突照,知道如何將它修復,并且更傾向與寫那些簡短的無誤代碼氧吐,將會大大提高你的編程效率讹蘑。
對我而言,擁有上述品質(zhì)的人能到達10倍的產(chǎn)出一點也不奇怪筑舅。這些品質(zhì)讓程序員可以給出一個擁有靈活的模型的好設(shè)計座慰,并且比其他的方案更加的簡潔。我認為簡潔性就是一種“投機取巧的編程”翠拣。簡而言之版仔,就是在開發(fā)的每個階段選擇性地實現(xiàn)一些功能,以最小化的付出為用戶帶來最大化的影響心剥。