最近好幾個(gè)讀者問:如何成為牛逼的程序員?編碼能力如何成長(zhǎng)。回答完后,有些心得也給大家分享下。 其實(shí)程序員最關(guān)鍵的技能遠(yuǎn)不止編碼能力,架構(gòu)思維、底層知識(shí)的深度等等,同樣很重要。 程序員這個(gè)行業(yè),是一個(gè)區(qū)隔度特別高的行業(yè)。不少人短短幾年就可以成長(zhǎng)為高級(jí)工程師、資深架構(gòu)師、首席架構(gòu)師,而另外一部分人很可能工作10年還是初中級(jí)工程師。程序員行業(yè)還有一個(gè)特點(diǎn),優(yōu)秀程序員的產(chǎn)出是普通程序員的好多倍,甚至是10倍!這是因?yàn)榫幊滩皇且婚T「線性科學(xué)」,而是一門「非線性科學(xué)」。 「線性科學(xué)」,比如跑步的速度就是,世界冠軍的速度也不可能是普通人的10倍。「非線性科學(xué)」是指很多種因素交匯在一起,極大增加了系統(tǒng)的復(fù)雜度。 程序設(shè)計(jì)和實(shí)現(xiàn)不是一種線性能力,像經(jīng)驗(yàn)、編碼能力、工程能力、知識(shí)、學(xué)習(xí)新知識(shí)的能力、對(duì)無用部分的識(shí)別等這些就不僅僅是線性優(yōu)勢(shì),匯聚到一起會(huì)對(duì)編程產(chǎn)生倍增級(jí)效應(yīng)。優(yōu)秀的程序員能達(dá)到百萬年薪,而入門級(jí)或者初中級(jí)程序員可能只能拿10萬年薪。輸出的10倍差距帶來的是收入上的10倍差距!很多時(shí)候,遇見復(fù)雜系統(tǒng)問題,派多少個(gè)初中級(jí)工程師都于事無補(bǔ),而一個(gè)資深架構(gòu)師就可以輕松搞定。過去11年的職場(chǎng)生涯,我?guī)н^過百名程序員,見過非常優(yōu)秀的也見過平庸的。以下是我認(rèn)為程序員和普通程序員拉開巨大差距的7個(gè)關(guān)鍵點(diǎn):裸編程能力:處理程序?qū)嶋H實(shí)現(xiàn)部分的子任務(wù),實(shí)現(xiàn)函數(shù)或者算法之類的能力。聽起來很簡(jiǎn)單對(duì)吧?實(shí)際上很多程序員缺失這樣的能力。 不知道大家有沒有見過「復(fù)制粘貼工程師」,review他們的代碼甚至?xí)l(fā)現(xiàn)一些網(wǎng)上的注釋,又或者其他人的編寫錯(cuò)誤。 并不是所有程序員都具備利用必備的基本編程結(jié)構(gòu)有效的實(shí)現(xiàn)某個(gè)產(chǎn)品或者某個(gè)模塊。 不少工作多年的程序員甚至連一個(gè)簡(jiǎn)單算法排序都沒有考慮,當(dāng)然這并不影響普通工作的輸出,但在面臨調(diào)優(yōu)或者攻堅(jiān),這類型的程序員的表現(xiàn)甚至比剛畢業(yè)的優(yōu)秀程序員還要糟糕。 在工作中遇到過一次將代碼時(shí)間復(fù)雜度降低幾個(gè)數(shù)量級(jí)的情況,在壓測(cè)模擬過萬人同時(shí)使用的情況下,沒優(yōu)化前服務(wù)端程序直接卡死,優(yōu)化后能流暢的運(yùn)行。
在這個(gè)復(fù)盤過程中,我發(fā)現(xiàn)實(shí)現(xiàn)這個(gè)功能的程序員缺乏基礎(chǔ)的算法基礎(chǔ)。for循環(huán)的嵌套,簡(jiǎn)直是觸目驚心。 BAT大廠招聘高級(jí)工程師,為什么總是要求手寫各種算法,恐怕也是基于考察裸編程能力。 調(diào)試能力某種程度上比編碼能力更重要。查找和解決BUG會(huì)占用程序員大量的時(shí)間。查找BUG產(chǎn)生的根源不是一件簡(jiǎn)單的事情,需要整體的分析和經(jīng)驗(yàn)的沉淀,同時(shí)還需要對(duì)各種調(diào)試工具熟練應(yīng)用。 不少程序員,解決完一個(gè)BUG卻導(dǎo)致了更多的隱患,沒有真正把BUG產(chǎn)生的原因找到,只治標(biāo)不治本。對(duì)于程序員來說,掌握在合理的步驟內(nèi)修復(fù)BUG,以極簡(jiǎn)的方式編寫較少BUG的代碼的能力,就能顯著提升效率。另外在團(tuán)隊(duì)中擔(dān)任骨干的往往都是調(diào)試能力極強(qiáng)的程序員,在其他成員遇到困境之時(shí),快速定位解決問題。能否運(yùn)用調(diào)試技能快速解決問題,是衡量一個(gè)程序員水平高低的重要標(biāo)準(zhǔn)。代碼的注釋是否恰到好處、函數(shù)模塊和類的結(jié)構(gòu)是否能讓其他人直接秒懂、架構(gòu)的設(shè)計(jì)是否足夠清晰等等,都屬于程序員追求簡(jiǎn)約的范疇。 有一種炫技程序員或者架構(gòu)師,喜歡簡(jiǎn)單事情往復(fù)雜了做。明明幾個(gè)類能搞定的,弄出很多中間類,明明三層架構(gòu)就解決的問題,生生弄出五層。簡(jiǎn)約是成敗之間最為明顯的分界點(diǎn),事實(shí)上能做到簡(jiǎn)約的人,恰恰是深度理解了系統(tǒng)的復(fù)雜性。就好比微信是一個(gè)極度簡(jiǎn)約的產(chǎn)品,能做到這么簡(jiǎn)約恰恰是因?yàn)閺埿↓埳疃壤斫饬送ㄐ藕蜕缃划a(chǎn)品的復(fù)雜度。一個(gè)產(chǎn)品功能,有人用了500行實(shí)現(xiàn),你寫了幾千行。多出來的代碼有價(jià)值嗎?不僅沒有價(jià)值,還會(huì)對(duì)未來接手代碼的人有很大的困擾。less is more,簡(jiǎn)單就是美,這話說的真沒錯(cuò)。看看Google、Facebook等公司的源碼,找不到太多多余的代碼和結(jié)構(gòu)。無論是代碼層面、類層面還是架構(gòu)層面,都做到了恰如其分、恰到好處。 4.準(zhǔn)確預(yù)測(cè)技術(shù)工期 老板想了個(gè)idea授意產(chǎn)品經(jīng)理估工期。產(chǎn)品經(jīng)理原型都沒畫出來,只有個(gè)大概想法,就找技術(shù)排工期。 這個(gè)時(shí)候,技術(shù)的內(nèi)心大概多了幾道菜式:清蒸產(chǎn)品經(jīng)理、紅燒產(chǎn)品總監(jiān)、油炸CTO。其實(shí)準(zhǔn)確預(yù)測(cè)技術(shù)工期是程序員一項(xiàng)非常重要的能力。為什么這么說?只有具備這項(xiàng)能力,才能讓開發(fā)工作游刃有余、可進(jìn)可退。事實(shí)上鍛煉這種能力也并不困難,拿移動(dòng)端開發(fā)來說,一個(gè)idea大概對(duì)應(yīng)多少個(gè)頁面多少個(gè)邏輯類,是能夠估算出來的,以此為基礎(chǔ)完全可以估出大概時(shí)間。更不用說產(chǎn)品文檔出來之后的預(yù)測(cè),會(huì)更為精準(zhǔn)。那么預(yù)測(cè)技術(shù)工期的意義在哪呢?首先在沒有出文檔之前的估計(jì),可以作為給老板的重要判斷武器。做任何功能一定會(huì)投入研發(fā)力量,而往往研發(fā)力量是最寶貴的,如果在idea出來之后就能大概知道工期,對(duì)于做什么不做什么的判斷,意義重大。產(chǎn)品文檔出來之后的精確工期呢?對(duì)控制風(fēng)險(xiǎn)和進(jìn)度把控非常有幫助,這個(gè)時(shí)候的精確排期其實(shí)對(duì)風(fēng)險(xiǎn)點(diǎn)的估計(jì)、資源協(xié)調(diào)的能力都有很高要求。準(zhǔn)確預(yù)測(cè)的過程其實(shí)就是風(fēng)險(xiǎn)預(yù)判的過程。處理復(fù)雜任務(wù)或解決復(fù)雜BUG時(shí),具備深厚的底層系統(tǒng)知識(shí)非常重要。比如數(shù)據(jù)結(jié)構(gòu)、網(wǎng)絡(luò)協(xié)議、操作系統(tǒng)相關(guān)知識(shí),等等。程序的很多問題都是源于對(duì)計(jì)算機(jī)工作原理的誤解,即使是使用高級(jí)語言開發(fā)的程序也一樣。另外,一些更偏應(yīng)用層的架構(gòu)或框架,基礎(chǔ)一定是更底層的系統(tǒng)。
了解了底層原理,我們才能看穿眼花繚亂的技術(shù)背后的東西,不被層出不窮的新技術(shù)所累。 比如Docker技術(shù)興起,改變了CI/CD的方式,推動(dòng)了云原生技術(shù)的發(fā)展。那么Docker到底是什么東西呢,其底層無外乎:CGroups進(jìn)行資源限制、Namespace對(duì)進(jìn)程視圖修改、rootfs為容器進(jìn)程提供隔離后執(zhí)行環(huán)境的文件系統(tǒng)。 了解了Docker的底層原理,才能在實(shí)際工作中更好的駕馭Docker。
再舉個(gè)應(yīng)用場(chǎng)景的例子:一提到分布式鎖問題,大多數(shù)同學(xué)想到的方案是基于Redis的Master-Slave模式來實(shí)現(xiàn)。這個(gè)實(shí)現(xiàn)方案行不行?分布式鎖本質(zhì)是一個(gè)CP需求,基于Redis的實(shí)現(xiàn)是一個(gè)AP需求,乍一看基于Redis的實(shí)現(xiàn)是無法滿足的。脫離業(yè)務(wù)場(chǎng)景來談架構(gòu)都是耍流氓。從技術(shù)戰(zhàn)略的需求層面來看,如果分布式鎖在極端情況下獲取鎖的不一致,社交業(yè)務(wù)場(chǎng)景能夠接受,那么基于Redis的實(shí)現(xiàn)是完全可行的。 如果業(yè)務(wù)是交易場(chǎng)景,分布式鎖在極端情況下獲取鎖的不一致性無法接受,那么基于Redis的實(shí)現(xiàn)方案是不可行的。在鎖強(qiáng)一致性的場(chǎng)景下,需要采取基于CP模型的etcd等方案來實(shí)現(xiàn)。 做出以上判斷,需要深度理解底層系統(tǒng)原理。缺乏了這種理解,無法做出正確的架構(gòu)抉擇,也自然會(huì)對(duì)工作造成不利影響。6.嚴(yán)格把控關(guān)鍵設(shè)計(jì)無論是大的系統(tǒng)還是小的模塊,一定都有最關(guān)鍵的功能。要在最關(guān)鍵功能上投入大量設(shè)計(jì)時(shí)間,才能規(guī)避開發(fā)過程中的各種坑。 程序員非常不情愿看到的一種情況是,需要在一些無關(guān)緊要的功能上浪費(fèi)大量的時(shí)間,但你又不得不去將這個(gè)無關(guān)緊要的功能實(shí)現(xiàn),因?yàn)樗鼱砍吨@個(gè)項(xiàng)目的主要功能。這種時(shí)候,就需要反思,在頂層設(shè)計(jì)的時(shí)候是否考慮周全。詳細(xì)而縝密的頂層設(shè)計(jì)能夠減少上述情況的發(fā)生,降低模塊間的耦合性。必須意識(shí)到每一個(gè)細(xì)小的模塊都有可能成為項(xiàng)目的瓶頸。對(duì)于項(xiàng)目而言,最終的目標(biāo)是合理的時(shí)間做最大的產(chǎn)出,實(shí)施重點(diǎn)就應(yīng)該放在項(xiàng)目最主要的模塊上。拿設(shè)計(jì)IM功能來說,一個(gè)IM系統(tǒng)最重要的核心模塊,一定是通信部分。將通信部分的各種設(shè)計(jì)搞定,其他錦上添花的方面都可以后續(xù)慢慢補(bǔ)充,例如客戶端交互、好友關(guān)系等等。完美主義包含兩種情況,一種是追求極致性能的工程師文化、還有一種是個(gè)人性格使然。無論哪一種,過分追求完美都會(huì)對(duì)業(yè)務(wù)交付產(chǎn)生影響。 完美主義會(huì)影響程序員的心態(tài),過于擔(dān)心外部評(píng)價(jià)或過于追求內(nèi)心的安全,反而會(huì)導(dǎo)致設(shè)計(jì)上的過度和偏差。 程序員真正產(chǎn)生價(jià)值一定需要和業(yè)務(wù)結(jié)合,業(yè)務(wù)交付的及時(shí)性、健壯性、簡(jiǎn)潔性、可持續(xù)性一定是首先需要考量的事情。一定不能出現(xiàn)偏袒設(shè)計(jì)而犧牲生產(chǎn)力的情況。不少創(chuàng)業(yè)公司上來就談中臺(tái)戰(zhàn)略,并花大量研發(fā)力量去實(shí)踐,最終中臺(tái)沒做好基礎(chǔ)的業(yè)務(wù)保障也出問題了。在我看來,這也是追求完美主義的一種體現(xiàn),誠(chéng)然有一個(gè)類似阿里那樣的能給各業(yè)務(wù)線賦能的中臺(tái)是一個(gè)美好的愿望,但很多時(shí)候連業(yè)務(wù)方向都要多變,追求這種賦能無異于空中樓閣。前幾天我的讀者群又有創(chuàng)業(yè)者在談AI中臺(tái),我只想說既然是創(chuàng)業(yè),咱能不能先MVP?等業(yè)務(wù)用戶量更大了,再來追求更漂亮的實(shí)現(xiàn)?以上關(guān)于優(yōu)秀程序員的7個(gè)能力,就說完了。其實(shí)還有一些通用的能力,比如高效學(xué)習(xí)能力、耐力、注意力等等,這些也是拉開程序員之間差距的重要因素。 還有個(gè)感悟:世界上的事情分兩種,一種是有邊界確定性強(qiáng)的事情:比如運(yùn)動(dòng)就會(huì)瘦、早起早睡會(huì)更健康、勤奮努力會(huì)具備架構(gòu)思維。 另一種是無邊界不確定的事情:比如練就6塊腹肌、長(zhǎng)壽100歲、成為首席架構(gòu)師。如果我們連有邊界確定性強(qiáng)的事情都搞不定還懊悔,那不要懊悔了,是因?yàn)槲覀儔焊鶝]有真正渴望。 2021年,希望我身邊的每個(gè)有足夠渴望的程序員都能成為牛逼的程序員! PS:最近開放朋友圈,歡迎大家加洋哥好友,空位不多哈,朋友圈定期發(fā)一些洋哥對(duì)這個(gè)世界的看法,洋哥是個(gè)不錯(cuò)的段子手哦:
|