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