新聞資訊
NEWSRedis之父:如何成為一個(gè)高效的程序員?

Fred Brooks(《人月神話》的作者)最早在他的論文“沒有銀彈——軟件工程的本質(zhì)和偶然性(No Silver Bullet - Essence and Accidents of Software Engineering)”中提出了“10x程序員”的概念。技術(shù)社區(qū)對(duì)于這個(gè)概念呈現(xiàn)出兩級(jí)分化的觀點(diǎn)。Redis之父Salvatore Sanfilippo(antirez)列出了9種特質(zhì),他認(rèn)為,如果一個(gè)程序員同時(shí)具備了這9種特質(zhì),那么就可以說他是一個(gè)10x程序員。
一個(gè)10x程序員,在相同條件下,可以完成十倍于普通程序員的工作。這里所說的“普通程序員”,是指那些能夠勝任自己工作的程序員,只是他們不具備10x程序員的神奇能力。普通程序員代表了這個(gè)領(lǐng)域所有專業(yè)程序員的平均水準(zhǔn)。
對(duì)于是否存在10x程序員這種“神獸”,編程社區(qū)的觀點(diǎn)呈現(xiàn)出兩級(jí)分化:有人認(rèn)為根本不存在所謂的10x程序員,有人則認(rèn)為不僅存在10x程序員,如果找對(duì)了門路,甚至能找到100x的程序員。
如果說編程是一項(xiàng)“線性”的工作,那么很明顯,10x程序員是不可能存在的。一個(gè)跑步運(yùn)動(dòng)員怎么可能跑得比另一個(gè)快上十倍?在相同時(shí)間內(nèi),一個(gè)建筑工人建造的東西怎么可能是其他人的十倍?不過,編程是一項(xiàng)很特別的設(shè)計(jì)工作。雖然程序員可能不會(huì)參與程序的架構(gòu)設(shè)計(jì),但程序的實(shí)現(xiàn)仍然涉及到一些設(shè)計(jì)工作,而這部分需要程序員去完成。
如果說程序的設(shè)計(jì)和實(shí)現(xiàn)不是線性的,那么在我看來,經(jīng)驗(yàn)、編碼能力、知識(shí)和去偽存真的能力就不僅僅是線性的優(yōu)勢(shì),它們?cè)诰幊踢^程中相互交織,成倍地發(fā)揮效能。當(dāng)然,如果程序員能夠同時(shí)勝任設(shè)計(jì)和實(shí)現(xiàn)工作,那么這種現(xiàn)象就尤為明顯。任務(wù)越是具有目標(biāo)導(dǎo)向性,程序員就越是能夠以更少的付出達(dá)成相同的目標(biāo),從而體現(xiàn)10x程序員的潛在能力。如果手頭的工作很死板,而且限定了可使用的工具和實(shí)現(xiàn)方式,那么10x程序員事半功倍的能力就會(huì)大打折扣。不過,在不改變大前提的情況下,程序員仍然可能通過局部的設(shè)計(jì)優(yōu)化來改進(jìn)工作,包括在項(xiàng)目的某些部分不按常理出牌。所以,他們可以少付出很多卻能達(dá)成幾乎相同的目標(biāo)。
在我的二十年程序員生涯中,我與其他程序員一起工作,作為同事,或者由我指導(dǎo)他們達(dá)成目標(biāo),為Redis和其他項(xiàng)目貢獻(xiàn)代碼補(bǔ)丁。在工作過程中,我仔細(xì)觀察他們。與此同時(shí),有很多人說我是一個(gè)高能的程序員。不過我不認(rèn)為自己是一個(gè)工作狂,我只是編碼速度比較快而已。
下面列出了我認(rèn)為可以用于區(qū)分程序員生產(chǎn)力高低的重要特質(zhì)。
編程裸技能:完成子任務(wù)
從處理編程子任務(wù)可以看出一個(gè)程序員的短板和長(zhǎng)處,比如實(shí)現(xiàn)一個(gè)函數(shù)或者一個(gè)算法。但從我的經(jīng)驗(yàn)來看,擅于應(yīng)用基本的編程技能來高效完成任務(wù)的程序員并非如人們所想得那樣普遍存在。有時(shí)候,團(tuán)隊(duì)里有些不是很稱職的程序員,他們甚至不知道該怎么寫一個(gè)簡(jiǎn)單的排序算法,但比起那些看似稱職卻缺乏實(shí)戰(zhàn)經(jīng)驗(yàn)的程序員,這些不稱職的程序員卻能完成更多的工作。
經(jīng)驗(yàn):模式匹配
我認(rèn)為,經(jīng)驗(yàn)就是一系列解決方案,它們已經(jīng)被證實(shí)可以用于處理一些重復(fù)性的任務(wù)。經(jīng)驗(yàn)老道的程序員知道該如何處理各種子任務(wù),這樣不但省掉了很多設(shè)計(jì)工作,而且避免了很多設(shè)計(jì)錯(cuò)誤,而設(shè)計(jì)錯(cuò)誤是簡(jiǎn)潔性最大的敵人。
專注:實(shí)際時(shí)間和假設(shè)時(shí)間
花在編碼上的時(shí)間不僅要看數(shù)量,也要看質(zhì)量。造成注意力不集中的因素既有內(nèi)部的,也有外部的。內(nèi)部的因素包括拖延、對(duì)手頭的項(xiàng)目不感興趣(一個(gè)人總是做不好自己不喜歡的事情)、缺乏練習(xí)、缺乏睡眠。外部因素包括頻繁的會(huì)議、不固定的工作環(huán)境、同事的打擾,等等。集中注意力和避免被打擾對(duì)于提高編程效率來說是至關(guān)重要的。有時(shí)候,為了集中注意力,需要采取一些極端的手段。例如,我會(huì)時(shí)不時(shí)地查看郵件,但大部分郵件先不做回復(fù)。
設(shè)計(jì)權(quán)衡:用5%換取90%
項(xiàng)目的非根本性目標(biāo)在很大程度上導(dǎo)致了設(shè)計(jì)的復(fù)雜性,或者導(dǎo)致無法達(dá)成其他更重要的目標(biāo),因?yàn)楦拘怨δ芎头歉拘怨δ茉谠O(shè)計(jì)上存在競(jìng)爭(zhēng)關(guān)系。如果意識(shí)不到這點(diǎn),復(fù)雜性就會(huì)隨之而來。實(shí)現(xiàn)全面的設(shè)計(jì)并不是件輕而易舉的事,付出與回報(bào)之間不能通過簡(jiǎn)單的比例來衡量。對(duì)于設(shè)計(jì)者來說,意識(shí)到這一點(diǎn)是很重要的。如果項(xiàng)目要最大化產(chǎn)出,那么就要把精力集中在重要的事情上,并在合理的時(shí)間內(nèi)完成。例如,在設(shè)計(jì)Disque(一個(gè)分布式消息隊(duì)列)時(shí),我發(fā)現(xiàn)對(duì)消息進(jìn)行排序之后,項(xiàng)目的其他方面就會(huì)得到實(shí)質(zhì)性的改進(jìn):可用性、查詢和客戶端交互、簡(jiǎn)潔性和性能。
簡(jiǎn)潔性
簡(jiǎn)潔性是成敗之間最為明顯的分界點(diǎn)。理解復(fù)雜性的產(chǎn)生過程有助于理解什么是簡(jiǎn)潔性。我認(rèn)為,不愿意做出設(shè)計(jì)權(quán)衡和設(shè)計(jì)錯(cuò)誤的累積是導(dǎo)致復(fù)雜性的兩個(gè)主要因素。
在設(shè)計(jì)過程中,每次走錯(cuò)一條道,就離最優(yōu)的方案越來越遠(yuǎn)。一個(gè)初始的設(shè)計(jì)錯(cuò)誤,如果沒能被糾正過來,那么可能導(dǎo)致一條道走到黑,最終得到的是一個(gè)復(fù)雜的系統(tǒng),而不是對(duì)原先系統(tǒng)的重新設(shè)計(jì)。項(xiàng)目會(huì)因此變得更加復(fù)雜和低效。
程序員可以在腦子里進(jìn)行“概念驗(yàn)證”,從大量簡(jiǎn)單的設(shè)計(jì)想法中選擇可行性最高且最直接的方案,從而達(dá)成簡(jiǎn)潔性。在后續(xù)的改進(jìn)工作中,個(gè)人的經(jīng)驗(yàn)和設(shè)計(jì)能力開始發(fā)揮作用,為子任務(wù)找到更加明智的解決方案。
不過,如果系統(tǒng)復(fù)雜性不可避免,那么在放棄掙扎之前也要盡量想辦法降低系統(tǒng)復(fù)雜性,甚至嘗試采取完全相反的設(shè)計(jì)。
完美主義(為了偏袒設(shè)計(jì)而放棄生產(chǎn)力)
完美主義可以分為兩種:一種是追求程序極致性能的工程文化,另一種是個(gè)人特質(zhì)。不管是哪一種完美主義,它們都會(huì)對(duì)程序員實(shí)現(xiàn)快速交付造成阻礙。完美主義和對(duì)外部評(píng)判的恐懼會(huì)導(dǎo)致設(shè)計(jì)上的偏袒,程序員根據(jù)主觀的心理因素和無關(guān)緊要的衡量參數(shù)做出設(shè)計(jì)決策,卻忽略了健壯性、簡(jiǎn)潔性和及時(shí)交付。
知識(shí):理論有益
在處理復(fù)雜任務(wù)時(shí),具備一些理論方面的知識(shí)會(huì)對(duì)設(shè)計(jì)產(chǎn)生重要影響,比如數(shù)據(jù)結(jié)構(gòu)方面的知識(shí)、了解計(jì)算能力的局限性和一些重要的算法。我們沒有必要成為無所不知的超級(jí)專家,但至少要知道一些問題的潛在解決方案。例如,在給一個(gè)給定流統(tǒng)計(jì)單一元素的個(gè)數(shù)時(shí),我們可以在設(shè)計(jì)上做出權(quán)衡(接受一定程度的錯(cuò)誤),并結(jié)合概率集合的基數(shù)估計(jì)(cardinality estimation)算法,避免設(shè)計(jì)出復(fù)雜、緩慢、低內(nèi)存效能的解決方案。
底層:理解機(jī)器原理
程序的很多問題都是源于對(duì)計(jì)算機(jī)工作原理的誤解,即使是使用高級(jí)語(yǔ)言開發(fā)的程序也不外乎如此。這種情況可能導(dǎo)致一個(gè)項(xiàng)目需要重新設(shè)計(jì)和實(shí)現(xiàn),因?yàn)轫?xiàng)目所使用的工具和算法出現(xiàn)了根本性的錯(cuò)誤。精通C語(yǔ)言,知道CPU的工作原理,了解系統(tǒng)內(nèi)核的行為以及系統(tǒng)調(diào)用的實(shí)現(xiàn)原理,做到這幾點(diǎn)可以挽救你于危難之中。
調(diào)試技能
查找和解決bug經(jīng)常會(huì)占用我們大量的時(shí)間。查找引起bug的問題根源,在合理的步驟內(nèi)修復(fù)bug,以簡(jiǎn)單的方式編寫包含較少bug的代碼,對(duì)于程序員來說,做到這幾點(diǎn)可以顯著提升效率。
一個(gè)程序員如果具備了上述幾點(diǎn)特質(zhì),那么他們的產(chǎn)出將會(huì)有10倍的提升,對(duì)此我一點(diǎn)也不感到驚訝。綜合這些特質(zhì),從一個(gè)可行的模型開始,實(shí)現(xiàn)更簡(jiǎn)單更好的設(shè)計(jì)。我認(rèn)為簡(jiǎn)潔性就是一種“投機(jī)取巧的編程”。簡(jiǎn)而言之,就是在開發(fā)的每個(gè)階段選擇性地實(shí)現(xiàn)一些功能,以最小化的付出為用戶帶來最大化的影響。
原文來自:聊聊架構(gòu)
免責(zé)聲明:以上內(nèi)容為本網(wǎng)站轉(zhuǎn)自其它媒體,相關(guān)信息僅為傳遞更多信息之目的,不代表本網(wǎng)觀點(diǎn),亦不代表本網(wǎng)站贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性。

