前言:
最近有好多人問(wèn)我說(shuō):“George,怎樣才能成為公司里的前線主力架構(gòu)師,我現(xiàn)在在公式已經(jīng)干了快五年了,現(xiàn)在還是一個(gè)默默無(wú)聞的程序員,我也通過(guò)很多種渠道來(lái)突破我現(xiàn)在瓶疾,但就是走不出來(lái),技術(shù)也一直沒(méi)有突破上去,我真的是沒(méi)有辦法了,通過(guò)朋友推薦介紹,說(shuō)您這里可以解決我的技術(shù)瓶疾,所以我想請(qǐng)你幫我突破一下技術(shù)方面上的瓶疾?!?/p>
你們是否有也有類似這樣的問(wèn)題——“天天寫(xiě)業(yè)務(wù)代碼的程序員,怎么成為技術(shù)大牛,開(kāi)始寫(xiě)技術(shù)代碼?”
今天,我和我之前一起共事的朋友,一起探討出了這么一個(gè)結(jié)論:要怎樣努力才可以成為公司主力架構(gòu)師。
不管是開(kāi)發(fā)、測(cè)試、運(yùn)維,每個(gè)技術(shù)人員心里多多少少都有一個(gè)成為技術(shù)大牛的夢(mèng),畢竟“夢(mèng)想總是要有的,萬(wàn)一實(shí)現(xiàn)了呢”!正是對(duì)技術(shù)夢(mèng)的追求,促使我們不斷地努力和提升自己。
然而“夢(mèng)想是美好的,現(xiàn)實(shí)卻是殘酷的”,很多同學(xué)在實(shí)際工作后就會(huì)發(fā)現(xiàn),夢(mèng)想是成為大牛,但做的事情看起來(lái)跟大牛都不沾邊,例如,程序員說(shuō)“天天寫(xiě)業(yè)務(wù)代碼還加班,如何才能成為技術(shù)大牛”,測(cè)試說(shuō)“每天都有執(zhí)行不完的測(cè)試用例”,運(yùn)維說(shuō)“扛機(jī)器接網(wǎng)線敲shell命令,這不是我想要的運(yùn)維人生”。
我也是一位程序員,所以我希望通過(guò)以下基于程序開(kāi)發(fā)的一些例子,幫助大家解決這些困惑。大道理是相通的,測(cè)試、運(yùn)維都可以借鑒。
成為架構(gòu)師的幾個(gè)誤區(qū)
第一:拜大牛為師
有人認(rèn)為想成為技術(shù)大牛最簡(jiǎn)單直接、快速有效的方式是“拜團(tuán)隊(duì)技術(shù)大牛為師”,讓他們平時(shí)給你開(kāi)小灶,給你分配一些有難度的任務(wù)。
我個(gè)人是反對(duì)這種方法的,主要的原因有幾個(gè):
大牛很忙,不太可能單獨(dú)給你開(kāi)小灶,更不可能每天都給你開(kāi)1個(gè)小時(shí)的小灶;而且一個(gè)團(tuán)隊(duì)里面,如果大牛平時(shí)經(jīng)常給你開(kāi)小灶,難免會(huì)引起其他團(tuán)隊(duì)成員的疑惑,我個(gè)人認(rèn)為如果團(tuán)隊(duì)里的大牛如果真正有心的話,多給團(tuán)隊(duì)培訓(xùn)是最好的。然而做過(guò)培訓(xùn)的都知道,準(zhǔn)備一場(chǎng)培訓(xùn)是很耗費(fèi)時(shí)間的,課件和材料至少2個(gè)小時(shí)(還不能是碎片時(shí)間),講解1個(gè)小時(shí),大牛們一個(gè)月做一次培訓(xùn)已經(jīng)是很高頻了。
因?yàn)榈谝粋€(gè)原因,所以一般要找大牛,都是帶著問(wèn)題去請(qǐng)教或者探討。因?yàn)榛卮鸹蛘咛接憜?wèn)題無(wú)需太多的時(shí)間,更多的是靠經(jīng)驗(yàn)和積累,這種情況下大牛們都是很樂(lè)意的,畢竟影響力是大牛的一個(gè)重要指標(biāo)嘛。然而也要特別注意:如果經(jīng)常問(wèn)那些書(shū)本或者google能夠很容易查到的知識(shí),大牛們也會(huì)很不耐煩的,畢竟時(shí)間寶貴。經(jīng)常有網(wǎng)友問(wèn)我諸如“jvm的-Xmn參數(shù)如何配置”這類問(wèn)題,我都是直接回答“請(qǐng)直接去google”,因?yàn)檫@樣的問(wèn)題實(shí)在是太多了,如果自己不去系統(tǒng)學(xué)習(xí),每個(gè)都要問(wèn)是非常浪費(fèi)自己和別人的時(shí)間的。
大牛不多,不太可能每個(gè)團(tuán)隊(duì)都有技術(shù)大牛,只能說(shuō)團(tuán)隊(duì)里面會(huì)有比你水平高的人,即使他每天給你開(kāi)小灶,最終你也只能提升到他的水平;而如果是跨團(tuán)隊(duì)的技術(shù)大牛,由于工作安排和分配的原因,直接請(qǐng)教和輔導(dǎo)的機(jī)會(huì)是比較少的,單憑參加幾次大牛的培訓(xùn),是不太可能就成為技術(shù)大牛的。
綜合上述的幾個(gè)原因,我認(rèn)為對(duì)于大部分人來(lái)說(shuō),要想成為技術(shù)大牛,首先還是要明白“主要靠自己”這個(gè)道理,不要期望有個(gè)像武功師傅一樣的大牛手把手一步一步地教你。適當(dāng)?shù)臅r(shí)候可以通過(guò)請(qǐng)教大?;蛘吆痛笈L接憗?lái)提升自己,但大部分時(shí)間還是自己系統(tǒng)性、有針對(duì)性的提升。
第二:業(yè)務(wù)代碼一樣很牛逼
有人認(rèn)為寫(xiě)業(yè)務(wù)代碼一樣可以很牛逼,理由是業(yè)務(wù)代碼一樣可以有各種技巧,例如可以使用封裝和抽象使得業(yè)務(wù)代碼更具可擴(kuò)展性,可以通過(guò)和產(chǎn)品多交流以便更好的理解和實(shí)現(xiàn)業(yè)務(wù),日志記錄好了問(wèn)題定位效率可以提升10倍等等。
業(yè)務(wù)代碼一樣有技術(shù)含量,這點(diǎn)是肯定的,業(yè)務(wù)代碼中的技術(shù)是每個(gè)程序員的基礎(chǔ),但只是掌握了這些技巧,并不能成為技術(shù)大牛,就像游戲中升級(jí)打怪一樣,開(kāi)始打小怪,經(jīng)驗(yàn)值很高,越到后面經(jīng)驗(yàn)值越少,打小怪已經(jīng)不能提升經(jīng)驗(yàn)值了,這個(gè)時(shí)候就需要打一些更高級(jí)的怪,刷一些有挑戰(zhàn)的副本了,沒(méi)看到哪個(gè)游戲只要一直打小怪就能升到頂級(jí)的。成為技術(shù)大牛的路也是類似的,你要不斷的提升自己的水平,然后面臨更大的挑戰(zhàn),通過(guò)應(yīng)對(duì)這些挑戰(zhàn)從而使自己水平更上一級(jí),然后如此往復(fù),最終達(dá)到技術(shù)大牛甚至業(yè)界大牛的境界,寫(xiě)業(yè)務(wù)代碼只是這個(gè)打怪升級(jí)路上的一個(gè)挑戰(zhàn)而已,而且我認(rèn)為是比較初級(jí)的一個(gè)挑戰(zhàn)。
所以我認(rèn)為:業(yè)務(wù)代碼都寫(xiě)不好的程序員肯定無(wú)法成為技術(shù)大牛,但只把業(yè)務(wù)代碼寫(xiě)好的程序員也還不能成為技術(shù)大牛。
第三:上班太忙沒(méi)時(shí)間自己學(xué)習(xí)
很多人認(rèn)為自己沒(méi)有成為技術(shù)大牛并不是自己不聰明,也不是自己不努力,而是中國(guó)的這個(gè)環(huán)境下,技術(shù)人員加班都太多了,導(dǎo)致自己沒(méi)有額外的時(shí)間進(jìn)行學(xué)習(xí)。
這個(gè)理由有一定的客觀性,畢竟和歐美相比,我們的加班確實(shí)要多一些,但這個(gè)因素只是一個(gè)需要克服的問(wèn)題,并不是不可逾越的鴻溝,畢竟我們身邊還是有那么多的大牛也是在中國(guó)這個(gè)環(huán)境成長(zhǎng)起來(lái)的。
我認(rèn)為有幾個(gè)誤區(qū)導(dǎo)致了這種看法的形成:
(1)上班做的都是重復(fù)工作,要想提升必須自己額外去學(xué)習(xí)
形成這個(gè)誤區(qū)的主要原因還是在于認(rèn)為“寫(xiě)業(yè)務(wù)代碼是沒(méi)有技術(shù)含量的”,而我現(xiàn)在上班就是寫(xiě)業(yè)務(wù)代碼,所以我在工作中不能提升。
(2)學(xué)習(xí)需要大段的連續(xù)時(shí)間
很多人以為要學(xué)習(xí)就要像學(xué)校上課一樣,給你一整天時(shí)間來(lái)上課才算學(xué)習(xí),而我們平時(shí)加班又比較多,周末累的只想睡懶覺(jué),或者只想去看看電影打打游戲來(lái)放松,所以就沒(méi)有時(shí)間學(xué)習(xí)了。
實(shí)際上的做法正好相反:首先我們應(yīng)該在工作中學(xué)習(xí)和提升,因?yàn)閷W(xué)以致用或者有實(shí)例參考,學(xué)習(xí)的效果是最好的;其次工作后學(xué)習(xí)不需要大段時(shí)間,而是要擠出時(shí)間,利用時(shí)間碎片來(lái)學(xué)習(xí)。
在此我向大家推薦一個(gè)交流學(xué)習(xí)群:575745314 里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源,目前受益良多
如何突破和避免以上幾大誤區(qū)
如何突破以上的誤區(qū),那就看你怎么學(xué)習(xí),有沒(méi)有一套系統(tǒng)化的學(xué)習(xí)體系給你學(xué)習(xí),有沒(méi)有一個(gè)學(xué)習(xí)氛圍的群,有沒(méi)有一群是遇到瓶疾一起突破的兄弟姐妹。有么??????我這里有。
我向大家推薦一下我認(rèn)為比較全面且最系統(tǒng)化的學(xué)習(xí)體系(分解后的,完整的加群可以獲取)
一、源碼分析
二、分布式架構(gòu)
三、微服務(wù)
四、性能優(yōu)化
五、Java工程化
以上就是我推薦給大家的最具有系統(tǒng)化的學(xué)習(xí)體系,若果你想學(xué)習(xí)以上的知識(shí)內(nèi)容,你可以加這個(gè)群獲?。航涣鲗W(xué)習(xí)群:575745314 里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源,目前受益良多
那么問(wèn)題又來(lái)了,學(xué)完以上的課程體系后,就能成為公司主力架構(gòu)師么?答案是:NO
要想成為主力架構(gòu)師,還需知道以下知識(shí)
要想成為軟件開(kāi)發(fā)的專家,需要我們完整了解軟件開(kāi)發(fā)的流程,并在關(guān)鍵部分掌握豐富經(jīng)驗(yàn)。
需要我們了解設(shè)計(jì)模式和算法的細(xì)微差別,同時(shí)遵循軟件開(kāi)發(fā)的最佳實(shí)踐,包括創(chuàng)造性和思考力,為編程問(wèn)題提供合適的解決方案。
實(shí)現(xiàn)這一目標(biāo)需要掌握服務(wù)器端開(kāi)發(fā)、客戶端開(kāi)發(fā)、DevOps運(yùn)維、云計(jì)算、網(wǎng)頁(yè)設(shè)計(jì)、分布式系統(tǒng)、數(shù)據(jù)庫(kù)、編程規(guī)約、代碼管理、基礎(chǔ)設(shè)施管理、可擴(kuò)展性、安全性待方面的能力。
你可能未必全部掌握以上內(nèi)容。但是可以嘗試從表層了解絕大部分內(nèi)容,然后再深入掌握其中幾個(gè)技術(shù)。
以下給各位列出開(kāi)發(fā)者缺乏的幾個(gè)主要技術(shù)能力,而技術(shù)管理者或架構(gòu)師在招聘這些職位時(shí)應(yīng)該熟悉檢查這些要素。
編碼規(guī)范
編碼規(guī)范有助于確保良好的開(kāi)發(fā)實(shí)踐和產(chǎn)品開(kāi)發(fā)。要了解一些最重要的編碼規(guī)約:
DRY(不要重復(fù)自己),SOLID , TDD , 防御性編程
設(shè)計(jì)模式
設(shè)計(jì)模式在軟件開(kāi)發(fā)中是一種常見(jiàn)的,可重復(fù)使用的解決方案,可解決軟件中的常見(jiàn)問(wèn)題。軟件開(kāi)發(fā)者要了解一些常見(jiàn)的Design Partern是非常重要的,還有更重要的是要能夠識(shí)別給定問(wèn)題的正確設(shè)計(jì)模式。如MVC、Singleton、DAO、Facade、Proxy、Adapter、Strategy和Absract Factory等一些一流開(kāi)發(fā)者使用的設(shè)計(jì)模式。
服務(wù)器端開(kāi)發(fā)
在較復(fù)雜的軟件系統(tǒng)中,后端會(huì)有各種各樣的邏輯。作為后端開(kāi)發(fā)人員,處理應(yīng)該程序的業(yè)務(wù)邏輯就要面臨很多挑戰(zhàn)。任何開(kāi)發(fā)人員都能夠編寫(xiě)代碼,但是只有有經(jīng)驗(yàn)的開(kāi)發(fā)人員才可以寫(xiě)出具有高性能、可伸縮性和可靠性都好的高質(zhì)量代碼。開(kāi)發(fā)優(yōu)秀軟件的過(guò)程涉及的領(lǐng)域包括大量科學(xué)、數(shù)學(xué)、計(jì)算機(jī)等專業(yè)知識(shí),有處理的思維和經(jīng)驗(yàn)非常重要。
高速緩存
數(shù)據(jù)緩存的各種機(jī)制(文件、數(shù)據(jù)庫(kù)、內(nèi)存、反向代理、HTTP....)
內(nèi)存管理
Java有一個(gè)非常好的垃圾收集器,能夠自動(dòng)管理內(nèi)存,清理未使用的對(duì)象并釋放一些內(nèi)存。但是一個(gè)資深的Java開(kāi)發(fā)者需要對(duì)內(nèi)存的工作原因有一個(gè)非常透的理解,這樣才能寫(xiě)出高性能和優(yōu)化的應(yīng)用程序。
了解以下概念至關(guān)重要:
堆棧,堆,強(qiáng)引用,弱引用,轉(zhuǎn)義引用,如何引用字符串,垃圾收集過(guò)程,meta空間,垃圾收集器類型。
異常處理
這是一個(gè)相當(dāng)重要,也是一個(gè)比較大的話題,我們后續(xù)會(huì)再寫(xiě)關(guān)于它的專門(mén)文章?,F(xiàn)在,列出一些處理異常的一些良好實(shí)踐:
1、遵循“錯(cuò)誤優(yōu)先”原則使軟件更可靠
2、不要捕捉無(wú)法恢復(fù)的異常
3、不要記錄完異常后,又將異常拋出來(lái)
4、選擇正確的層來(lái)處理異常(例如:DAO不知道是數(shù)據(jù)庫(kù)的故障如何處理,但是服務(wù)層可以知道)
5、如果無(wú)法從異常中恢復(fù),則優(yōu)先選擇未經(jīng)檢查的異常
IO操作
了解I/O操作的成本以及可能出現(xiàn)的不可預(yù)知的結(jié)果。
異步編程
使用線程實(shí)現(xiàn)Java中的異步編程,它也是Java平臺(tái)的基礎(chǔ)部分,有效使用并發(fā)對(duì)于構(gòu)建高性能應(yīng)用程序非常重要。
比如線程池、死鎖、生產(chǎn)者-消費(fèi)者、原子性、不可變對(duì)象、信號(hào)量等等詞匯對(duì)資深開(kāi)發(fā)人員來(lái)說(shuō)不應(yīng)該是新東西。
批處理
在實(shí)際場(chǎng)景中,編寫(xiě)批量作業(yè)非常普遍。通常執(zhí)行重要的任務(wù),有一些基本規(guī)則:
1、每個(gè)任務(wù)應(yīng)該按輸入、處理過(guò)程與輸出進(jìn)行劃分;
2、始終輪詢批量輸入數(shù)據(jù);
3、處理器應(yīng)該是線程安全;
4、產(chǎn)出物應(yīng)該為原子屬性;
5、存儲(chǔ)工作結(jié)果;
6、要考慮EIP模式。
分布式計(jì)算
在現(xiàn)代世界中,分布式計(jì)算是指使用分布式系統(tǒng)來(lái)解決計(jì)算問(wèn)題。然而,分布式系統(tǒng)與傳統(tǒng)系統(tǒng)不同,具有非常高的復(fù)雜性。當(dāng)用戶開(kāi)始高速增長(zhǎng)資源消耗較大時(shí),有分布式系統(tǒng)工作經(jīng)驗(yàn)的工程師會(huì)在此時(shí)發(fā)揮作用。微服務(wù)軟件體系結(jié)構(gòu)是分布式計(jì)算以及分布式體系結(jié)構(gòu)所有的優(yōu)點(diǎn)與折衷的一個(gè)很好的例子。
而今,微服務(wù)是當(dāng)今軟件工程師之必備技能,就需要我們對(duì)分布式系統(tǒng)有豐富的經(jīng)驗(yàn)。
比如容錯(cuò)性,可用性與一致性,分布式事務(wù)/事件、同步與異步通信,分布式認(rèn)證,分布式應(yīng)用,共識(shí)應(yīng)用程序等非常重要。
數(shù)據(jù)庫(kù)
精確掌握與數(shù)據(jù)庫(kù)從通信到獲取數(shù)據(jù)中要涉及的所有成本,如連接握手、數(shù)據(jù)傳輸?shù)惹闆r。清楚了解原子事務(wù)以及如何確保數(shù)據(jù)一致性。因此,數(shù)據(jù)庫(kù)管理是軟件開(kāi)發(fā)人員的必備技能。
數(shù)據(jù)庫(kù)用于管理數(shù)據(jù),這是一項(xiàng)艱巨的任務(wù),即使不考慮將業(yè)務(wù)邏輯添加到數(shù)據(jù)庫(kù)中。 在大型IT系統(tǒng)中,數(shù)據(jù)庫(kù)在安全性,可伸縮性,容量和可用性方面面臨著諸多挑戰(zhàn)。我們要考慮加密,復(fù)制,分片,大數(shù)據(jù)等問(wèn)題。 了解數(shù)據(jù)庫(kù)的工作方式以及如何優(yōu)化它以及每項(xiàng)處理消耗的成本(例如,占用內(nèi)存、CPU數(shù))將有助于有效設(shè)計(jì)系統(tǒng)的數(shù)據(jù)庫(kù)管理。
DevOps
主力開(kāi)發(fā)工程師要有能推動(dòng)DevOps的文化理念和實(shí)踐的能力,在所有運(yùn)維步驟中做到自動(dòng)化,提高高質(zhì)量和高速度交付應(yīng)用程序與服務(wù)能力。代碼部署或配置基礎(chǔ)設(shè)施必須為自動(dòng)化,且要靈活以及受到監(jiān)控。
一個(gè)強(qiáng)大的開(kāi)發(fā)者應(yīng)該很好地了解從測(cè)試,發(fā)布到部署和基礎(chǔ)架構(gòu)管理的全開(kāi)發(fā)生命周期。需要我們了解云計(jì)算,Linux,網(wǎng)絡(luò),容器,工程管理等。
代碼管理
鑒于代碼的重要性,只有主力開(kāi)發(fā)人員才能夠掌握代碼生命周期,并力促軟件工程最佳實(shí)踐。 為此,需要你熟諳源代碼管理系統(tǒng),比如Git,對(duì)分支策略,版本控制,分布式修訂控制,另外還有代碼質(zhì)量保證工具,代碼間的通信和依賴管理,配置管理等有清晰的思維。
安全
Web安全是件很難處理的事情,一部分取決于許多外部參數(shù); 軟件工程師需要遵循構(gòu)建安全Web應(yīng)用程序的最佳實(shí)踐與準(zhǔn)則。
主力工程師需要對(duì)信息安全有較深的理解,不僅要如何避免構(gòu)建不安全與容易受攻擊的系統(tǒng),還需要知道保護(hù)用戶的隱私。
一個(gè)偉大的開(kāi)發(fā)人員需要能夠創(chuàng)建一個(gè)指南來(lái)處理前10個(gè)Web應(yīng)用程序安全風(fēng)險(xiǎn)。 在Web應(yīng)用程序中,我們有更多需要工程師關(guān)注安全威脅,其中包括如下:
1、上傳文件檢查;
2、密碼暴力破解;
3、會(huì)話到期處理;
4、會(huì)話來(lái)源驗(yàn)證;
5、通過(guò)網(wǎng)絡(luò)安全通信;
6、安全的Cookie訪問(wèn);
7、用戶憑證處理。
前端開(kāi)發(fā)
前端開(kāi)發(fā)是軟件開(kāi)發(fā)重要的一部分,如果您不知道程序設(shè)計(jì)與良好用戶體驗(yàn)的關(guān)系,則不能成為主力軟件工程師。
在前端世界中,JavasScript和CSS是軟件工程師必備的。 在這兩方面掌握掌握并不容易,但了解它們的工作方式以及兩者如何與HTML連接一起,使我們能夠提供出色的用戶體驗(yàn)非常重要。
若要領(lǐng)導(dǎo)一個(gè)前端團(tuán)隊(duì),你需要知道的不僅僅是如何建立一個(gè)漂亮布局,要想前端開(kāi)發(fā)做得更好,你需要了解如下:
1、瀏覽器作為引擎可以構(gòu)建什么?
2、如何開(kāi)發(fā)響應(yīng)式網(wǎng)站;
3、如何提高網(wǎng)站的性能;
4、如何開(kāi)發(fā)單頁(yè)面應(yīng)用程序;
5、如何建設(shè)現(xiàn)代高效的發(fā)展環(huán)境;
6、熟悉HTML5 API。
7、熟悉React.js或Vue.js框架
為了掌握這些技能,開(kāi)發(fā)人員需能夠自我激勵(lì),主動(dòng)學(xué)習(xí)新技術(shù),并在職業(yè)生涯中給自己扣上很多帽子。 繼而不斷挑戰(zhàn)自我,然后更好地解決問(wèn)題,這就是編程的本質(zhì)。 知識(shí)很重要,在某些復(fù)雜問(wèn)題的情況下更是如此。在變化如此之快的IT技術(shù)領(lǐng)域中,知識(shí)的獲取在任何時(shí)候比我們已會(huì)的技能更為重要。