前言:
最近有好多人問我說:“George翻诉,怎樣才能成為公司里的前線主力架構(gòu)師炮姨,我現(xiàn)在在公式已經(jīng)干了快五年了,現(xiàn)在還是一個默默無聞的程序員碰煌,我也通過很多種渠道來突破我現(xiàn)在瓶疾舒岸,但就是走不出來,技術(shù)也一直沒有突破上去芦圾,我真的是沒有辦法了蛾派,通過朋友推薦介紹,說您這里可以解決我的技術(shù)瓶疾个少,所以我想請你幫我突破一下技術(shù)方面上的瓶疾洪乍。”
你們是否有也有類似這樣的問題——“天天寫業(yè)務(wù)代碼的程序員夜焦,怎么成為技術(shù)大牛壳澳,開始寫技術(shù)代碼?”
今天茫经,我和我之前一起共事的朋友巷波,一起探討出了這么一個結(jié)論:要怎樣努力才可以成為公司主力架構(gòu)師萎津。
不管是開發(fā)、測試抹镊、運維姜性,每個技術(shù)人員心里多多少少都有一個成為技術(shù)大牛的夢,畢竟“夢想總是要有的髓考,萬一實現(xiàn)了呢”!正是對技術(shù)夢的追求弃酌,促使我們不斷地努力和提升自己氨菇。
然而“夢想是美好的,現(xiàn)實卻是殘酷的”妓湘,很多同學(xué)在實際工作后就會發(fā)現(xiàn)查蓉,夢想是成為大牛,但做的事情看起來跟大牛都不沾邊榜贴,例如豌研,程序員說“天天寫業(yè)務(wù)代碼還加班,如何才能成為技術(shù)大呕5常”鹃共,測試說“每天都有執(zhí)行不完的測試用例”,運維說“扛機器接網(wǎng)線敲shell命令驶拱,這不是我想要的運維人生”霜浴。
我也是一位程序員,所以我希望通過以下基于程序開發(fā)的一些例子蓝纲,幫助大家解決這些困惑阴孟。大道理是相通的,測試税迷、運維都可以借鑒永丝。
成為架構(gòu)師的幾個誤區(qū)
第一:拜大牛為師
有人認為想成為技術(shù)大牛最簡單直接、快速有效的方式是“拜團隊技術(shù)大牛為師”箭养,讓他們平時給你開小灶慕嚷,給你分配一些有難度的任務(wù)。
我個人是反對這種方法的露懒,主要的原因有幾個:
大牛很忙闯冷,不太可能單獨給你開小灶,更不可能每天都給你開1個小時的小灶懈词;而且一個團隊里面蛇耀,如果大牛平時經(jīng)常給你開小灶,難免會引起其他團隊成員的疑惑坎弯,我個人認為如果團隊里的大牛如果真正有心的話纺涤,多給團隊培訓(xùn)是最好的译暂。然而做過培訓(xùn)的都知道,準(zhǔn)備一場培訓(xùn)是很耗費時間的撩炊,課件和材料至少2個小時(還不能是碎片時間)外永,講解1個小時,大牛們一個月做一次培訓(xùn)已經(jīng)是很高頻了拧咳。
因為第一個原因伯顶,所以一般要找大牛,都是帶著問題去請教或者探討骆膝。因為回答或者探討問題無需太多的時間祭衩,更多的是靠經(jīng)驗和積累,這種情況下大牛們都是很樂意的阅签,畢竟影響力是大牛的一個重要指標(biāo)嘛掐暮。然而也要特別注意:如果經(jīng)常問那些書本或者google能夠很容易查到的知識,大牛們也會很不耐煩的政钟,畢竟時間寶貴路克。經(jīng)常有網(wǎng)友問我諸如“jvm的-Xmn參數(shù)如何配置”這類問題,我都是直接回答“請直接去google”养交,因為這樣的問題實在是太多了精算,如果自己不去系統(tǒng)學(xué)習(xí),每個都要問是非常浪費自己和別人的時間的碎连。
大牛不多殖妇,不太可能每個團隊都有技術(shù)大牛,只能說團隊里面會有比你水平高的人破花,即使他每天給你開小灶谦趣,最終你也只能提升到他的水平;而如果是跨團隊的技術(shù)大牛座每,由于工作安排和分配的原因前鹅,直接請教和輔導(dǎo)的機會是比較少的,單憑參加幾次大牛的培訓(xùn)峭梳,是不太可能就成為技術(shù)大牛的舰绘。
綜合上述的幾個原因,我認為對于大部分人來說葱椭,要想成為技術(shù)大牛捂寿,首先還是要明白“主要靠自己”這個道理,不要期望有個像武功師傅一樣的大牛手把手一步一步地教你孵运。適當(dāng)?shù)臅r候可以通過請教大徘芈或者和大牛探討來提升自己,但大部分時間還是自己系統(tǒng)性治笨、有針對性的提升驳概。
第二:業(yè)務(wù)代碼一樣很牛逼
有人認為寫業(yè)務(wù)代碼一樣可以很牛逼赤嚼,理由是業(yè)務(wù)代碼一樣可以有各種技巧,例如可以使用封裝和抽象使得業(yè)務(wù)代碼更具可擴展性顺又,可以通過和產(chǎn)品多交流以便更好的理解和實現(xiàn)業(yè)務(wù)更卒,日志記錄好了問題定位效率可以提升10倍等等。
業(yè)務(wù)代碼一樣有技術(shù)含量稚照,這點是肯定的蹂空,業(yè)務(wù)代碼中的技術(shù)是每個程序員的基礎(chǔ),但只是掌握了這些技巧果录,并不能成為技術(shù)大牛腌闯,就像游戲中升級打怪一樣,開始打小怪雕憔,經(jīng)驗值很高,越到后面經(jīng)驗值越少糖声,打小怪已經(jīng)不能提升經(jīng)驗值了斤彼,這個時候就需要打一些更高級的怪,刷一些有挑戰(zhàn)的副本了蘸泻,沒看到哪個游戲只要一直打小怪就能升到頂級的琉苇。成為技術(shù)大牛的路也是類似的,你要不斷的提升自己的水平蟹腾,然后面臨更大的挑戰(zhàn)馍管,通過應(yīng)對這些挑戰(zhàn)從而使自己水平更上一級琼腔,然后如此往復(fù),最終達到技術(shù)大牛甚至業(yè)界大牛的境界穷蛹,寫業(yè)務(wù)代碼只是這個打怪升級路上的一個挑戰(zhàn)而已,而且我認為是比較初級的一個挑戰(zhàn)昼汗。
所以我認為:業(yè)務(wù)代碼都寫不好的程序員肯定無法成為技術(shù)大牛肴熏,但只把業(yè)務(wù)代碼寫好的程序員也還不能成為技術(shù)大牛。
第三:上班太忙沒時間自己學(xué)習(xí)
很多人認為自己沒有成為技術(shù)大牛并不是自己不聰明顷窒,也不是自己不努力蛙吏,而是中國的這個環(huán)境下,技術(shù)人員加班都太多了鞋吉,導(dǎo)致自己沒有額外的時間進行學(xué)習(xí)鸦做。
這個理由有一定的客觀性,畢竟和歐美相比谓着,我們的加班確實要多一些泼诱,但這個因素只是一個需要克服的問題,并不是不可逾越的鴻溝赊锚,畢竟我們身邊還是有那么多的大牛也是在中國這個環(huán)境成長起來的坷檩。
我認為有幾個誤區(qū)導(dǎo)致了這種看法的形成:
(1)上班做的都是重復(fù)工作却音,要想提升必須自己額外去學(xué)習(xí)
形成這個誤區(qū)的主要原因還是在于認為“寫業(yè)務(wù)代碼是沒有技術(shù)含量的”,而我現(xiàn)在上班就是寫業(yè)務(wù)代碼矢炼,所以我在工作中不能提升系瓢。
(2)學(xué)習(xí)需要大段的連續(xù)時間
很多人以為要學(xué)習(xí)就要像學(xué)校上課一樣,給你一整天時間來上課才算學(xué)習(xí)夷陋,而我們平時加班又比較多胰锌,周末累的只想睡懶覺骗绕,或者只想去看看電影打打游戲來放松,所以就沒有時間學(xué)習(xí)了资昧。
實際上的做法正好相反:首先我們應(yīng)該在工作中學(xué)習(xí)和提升酬土,因為學(xué)以致用或者有實例參考,學(xué)習(xí)的效果是最好的格带;其次工作后學(xué)習(xí)不需要大段時間撤缴,而是要擠出時間,利用時間碎片來學(xué)習(xí)叽唱。
如何突破和避免以上幾大誤區(qū)
如何突破以上的誤區(qū)屈呕,那就看你怎么學(xué)習(xí),有沒有一套系統(tǒng)化的學(xué)習(xí)體系給你學(xué)習(xí)棺亭,有沒有一個學(xué)習(xí)氛圍的群虎眨,有沒有一群是遇到瓶疾一起突破的兄弟姐妹。有么镶摘?嗽桩??凄敢?涤躲??我這里有贡未。
我向大家推薦一下我認為比較全面且最系統(tǒng)化的學(xué)習(xí)體系(分解后的种樱,完整的加群可以獲取)
一俊卤、源碼分析
二嫩挤、分布式架構(gòu)
三、微服務(wù)
四消恍、性能優(yōu)化
五岂昭、Java工程化
以上就是我推薦給大家的最具有系統(tǒng)化的學(xué)習(xí)體系,若果你想學(xué)習(xí)以上的知識內(nèi)容狠怨,你可以加這個群獲仍及 :交流學(xué)習(xí)群:433-540-541里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring邑遏,MyBatis,Netty源碼分析恰矩,高并發(fā)记盒、高性能、分布式外傅、微服務(wù)架構(gòu)的原理纪吮,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識體系。還能領(lǐng)取免費的學(xué)習(xí)資源萎胰,目前受益良多
那么問題又來了碾盟,學(xué)完以上的課程體系后,就能成為公司主力架構(gòu)師么技竟?答案是:NO
要想成為主力架構(gòu)師冰肴,還需知道以下知識
要想成為軟件開發(fā)的專家,需要我們完整了解軟件開發(fā)的流程榔组,并在關(guān)鍵部分掌握豐富經(jīng)驗熙尉。
需要我們了解設(shè)計模式和算法的細微差別,同時遵循軟件開發(fā)的最佳實踐瓷患,包括創(chuàng)造性和思考力,為編程問題提供合適的解決方案遣妥。
實現(xiàn)這一目標(biāo)需要掌握服務(wù)器端開發(fā)擅编、客戶端開發(fā)、DevOps運維箫踩、云計算爱态、網(wǎng)頁設(shè)計、分布式系統(tǒng)境钟、數(shù)據(jù)庫锦担、編程規(guī)約、代碼管理慨削、基礎(chǔ)設(shè)施管理洞渔、可擴展性、安全性待方面的能力缚态。
你可能未必全部掌握以上內(nèi)容磁椒。但是可以嘗試從表層了解絕大部分內(nèi)容,然后再深入掌握其中幾個技術(shù)玫芦。
以下給各位列出開發(fā)者缺乏的幾個主要技術(shù)能力浆熔,而技術(shù)管理者或架構(gòu)師在招聘這些職位時應(yīng)該熟悉檢查這些要素。
編碼規(guī)范
編碼規(guī)范有助于確保良好的開發(fā)實踐和產(chǎn)品開發(fā)桥帆。要了解一些最重要的編碼規(guī)約:
DRY(不要重復(fù)自己)医增,SOLID 慎皱, TDD , 防御性編程
設(shè)計模式
設(shè)計模式在軟件開發(fā)中是一種常見的叶骨,可重復(fù)使用的解決方案茫多,可解決軟件中的常見問題。軟件開發(fā)者要了解一些常見的Design Partern是非常重要的邓萨,還有更重要的是要能夠識別給定問題的正確設(shè)計模式地梨。如MVC、Singleton缔恳、DAO宝剖、Facade、Proxy歉甚、Adapter万细、Strategy和Absract Factory等一些一流開發(fā)者使用的設(shè)計模式。
服務(wù)器端開發(fā)
在較復(fù)雜的軟件系統(tǒng)中纸泄,后端會有各種各樣的邏輯赖钞。作為后端開發(fā)人員,處理應(yīng)該程序的業(yè)務(wù)邏輯就要面臨很多挑戰(zhàn)聘裁。任何開發(fā)人員都能夠編寫代碼雪营,但是只有有經(jīng)驗的開發(fā)人員才可以寫出具有高性能、可伸縮性和可靠性都好的高質(zhì)量代碼衡便。開發(fā)優(yōu)秀軟件的過程涉及的領(lǐng)域包括大量科學(xué)献起、數(shù)學(xué)、計算機等專業(yè)知識镣陕,有處理的思維和經(jīng)驗非常重要谴餐。
高速緩存
數(shù)據(jù)緩存的各種機制(文件、數(shù)據(jù)庫呆抑、內(nèi)存岂嗓、反向代理、HTTP....)
內(nèi)存管理
Java有一個非常好的垃圾收集器鹊碍,能夠自動管理內(nèi)存厌殉,清理未使用的對象并釋放一些內(nèi)存。但是一個資深的Java開發(fā)者需要對內(nèi)存的工作原因有一個非常透的理解侈咕,這樣才能寫出高性能和優(yōu)化的應(yīng)用程序年枕。
了解以下概念至關(guān)重要:
堆棧,堆乎完,強引用熏兄,弱引用,轉(zhuǎn)義引用,如何引用字符串摩桶,垃圾收集過程桥状,meta空間,垃圾收集器類型硝清。
異常處理
這是一個相當(dāng)重要辅斟,也是一個比較大的話題,我們后續(xù)會再寫關(guān)于它的專門文章÷茫現(xiàn)在士飒,列出一些處理異常的一些良好實踐:
1、遵循“錯誤優(yōu)先”原則使軟件更可靠
2蔗崎、不要捕捉無法恢復(fù)的異常
3酵幕、不要記錄完異常后,又將異常拋出來
4缓苛、選擇正確的層來處理異常(例如:DAO不知道是數(shù)據(jù)庫的故障如何處理芳撒,但是服務(wù)層可以知道)
5、如果無法從異常中恢復(fù)未桥,則優(yōu)先選擇未經(jīng)檢查的異常
IO操作
了解I/O操作的成本以及可能出現(xiàn)的不可預(yù)知的結(jié)果笔刹。
異步編程
使用線程實現(xiàn)Java中的異步編程,它也是Java平臺的基礎(chǔ)部分冬耿,有效使用并發(fā)對于構(gòu)建高性能應(yīng)用程序非常重要舌菜。
比如線程池、死鎖亦镶、生產(chǎn)者-消費者日月、原子性、不可變對象染乌、信號量等等詞匯對資深開發(fā)人員來說不應(yīng)該是新東西山孔。
批處理
在實際場景中懂讯,編寫批量作業(yè)非常普遍荷憋。通常執(zhí)行重要的任務(wù),有一些基本規(guī)則:
1褐望、每個任務(wù)應(yīng)該按輸入勒庄、處理過程與輸出進行劃分;
2瘫里、始終輪詢批量輸入數(shù)據(jù)实蔽;
3、處理器應(yīng)該是線程安全谨读;
4局装、產(chǎn)出物應(yīng)該為原子屬性;
5、存儲工作結(jié)果铐尚;
6拨脉、要考慮EIP模式。
分布式計算
在現(xiàn)代世界中宣增,分布式計算是指使用分布式系統(tǒng)來解決計算問題玫膀。然而,分布式系統(tǒng)與傳統(tǒng)系統(tǒng)不同爹脾,具有非常高的復(fù)雜性帖旨。當(dāng)用戶開始高速增長資源消耗較大時,有分布式系統(tǒng)工作經(jīng)驗的工程師會在此時發(fā)揮作用灵妨。微服務(wù)軟件體系結(jié)構(gòu)是分布式計算以及分布式體系結(jié)構(gòu)所有的優(yōu)點與折衷的一個很好的例子解阅。
而今,微服務(wù)是當(dāng)今軟件工程師之必備技能闷串,就需要我們對分布式系統(tǒng)有豐富的經(jīng)驗瓮钥。
比如容錯性,可用性與一致性烹吵,分布式事務(wù)/事件碉熄、同步與異步通信,分布式認證肋拔,分布式應(yīng)用锈津,共識應(yīng)用程序等非常重要。
數(shù)據(jù)庫
精確掌握與數(shù)據(jù)庫從通信到獲取數(shù)據(jù)中要涉及的所有成本凉蜂,如連接握手琼梆、數(shù)據(jù)傳輸?shù)惹闆r。清楚了解原子事務(wù)以及如何確保數(shù)據(jù)一致性窿吩。因此茎杂,數(shù)據(jù)庫管理是軟件開發(fā)人員的必備技能。
數(shù)據(jù)庫用于管理數(shù)據(jù)纫雁,這是一項艱巨的任務(wù)煌往,即使不考慮將業(yè)務(wù)邏輯添加到數(shù)據(jù)庫中。 在大型IT系統(tǒng)中轧邪,數(shù)據(jù)庫在安全性刽脖,可伸縮性,容量和可用性方面面臨著諸多挑戰(zhàn)忌愚。我們要考慮加密曲管,復(fù)制,分片硕糊,大數(shù)據(jù)等問題院水。 了解數(shù)據(jù)庫的工作方式以及如何優(yōu)化它以及每項處理消耗的成本(例如腊徙,占用內(nèi)存、CPU數(shù))將有助于有效設(shè)計系統(tǒng)的數(shù)據(jù)庫管理檬某。
DevOps
主力開發(fā)工程師要有能推動DevOps的文化理念和實踐的能力昧穿,在所有運維步驟中做到自動化,提高高質(zhì)量和高速度交付應(yīng)用程序與服務(wù)能力橙喘。代碼部署或配置基礎(chǔ)設(shè)施必須為自動化时鸵,且要靈活以及受到監(jiān)控。
一個強大的開發(fā)者應(yīng)該很好地了解從測試厅瞎,發(fā)布到部署和基礎(chǔ)架構(gòu)管理的全開發(fā)生命周期饰潜。需要我們了解云計算,Linux和簸,網(wǎng)絡(luò)彭雾,容器,工程管理等锁保。
代碼管理
鑒于代碼的重要性薯酝,只有主力開發(fā)人員才能夠掌握代碼生命周期,并力促軟件工程最佳實踐爽柒。 為此吴菠,需要你熟諳源代碼管理系統(tǒng),比如Git浩村,對分支策略做葵,版本控制,分布式修訂控制心墅,另外還有代碼質(zhì)量保證工具酿矢,代碼間的通信和依賴管理,配置管理等有清晰的思維怎燥。
安全
Web安全是件很難處理的事情瘫筐,一部分取決于許多外部參數(shù); 軟件工程師需要遵循構(gòu)建安全Web應(yīng)用程序的最佳實踐與準(zhǔn)則。
主力工程師需要對信息安全有較深的理解铐姚,不僅要如何避免構(gòu)建不安全與容易受攻擊的系統(tǒng)策肝,還需要知道保護用戶的隱私。
一個偉大的開發(fā)人員需要能夠創(chuàng)建一個指南來處理前10個Web應(yīng)用程序安全風(fēng)險谦屑。 在Web應(yīng)用程序中驳糯,我們有更多需要工程師關(guān)注安全威脅篇梭,其中包括如下:
1氢橙、上傳文件檢查;
2、密碼暴力破解;
3恬偷、會話到期處理;
4悍手、會話來源驗證;
5、通過網(wǎng)絡(luò)安全通信;
6、安全的Cookie訪問;
7坦康、用戶憑證處理竣付。
前端開發(fā)
前端開發(fā)是軟件開發(fā)重要的一部分,如果您不知道程序設(shè)計與良好用戶體驗的關(guān)系滞欠,則不能成為主力軟件工程師古胆。
在前端世界中,Javas和CSS是軟件工程師必備的筛璧。 在這兩方面掌握掌握并不容易逸绎,但了解它們的工作方式以及兩者如何與HTML連接一起,使我們能夠提供出色的用戶體驗非常重要夭谤。
若要領(lǐng)導(dǎo)一個前端團隊棺牧,你需要知道的不僅僅是如何建立一個漂亮布局,要想前端開發(fā)做得更好朗儒,你需要了解如下:
1颊乘、瀏覽器作為引擎可以構(gòu)建什么?
2醉锄、如何開發(fā)響應(yīng)式網(wǎng)站;
3乏悄、如何提高網(wǎng)站的性能;
4、如何開發(fā)單頁面應(yīng)用程序;
5恳不、如何建設(shè)現(xiàn)代高效的發(fā)展環(huán)境;
6纲爸、熟悉HTML5 API。
7妆够、熟悉React.js或Vue.js框架
為了掌握這些技能识啦,開發(fā)人員需能夠自我激勵,主動學(xué)習(xí)新技術(shù)神妹,并在職業(yè)生涯中給自己扣上很多帽子颓哮。 繼而不斷挑戰(zhàn)自我,然后更好地解決問題鸵荠,這就是編程的本質(zhì)冕茅。 知識很重要,在某些復(fù)雜問題的情況下更是如此蛹找。在變化如此之快的IT技術(shù)領(lǐng)域中姨伤,知識的獲取在任何時候比我們已會的技能更為重要。
需要學(xué)習(xí)庸疾,獲取資料的也可以加下上面推薦的那個群乍楚,希望可以幫助在這個行業(yè)發(fā)展的朋友和童鞋們,在論壇博客等地方少花些時間找資料届慈,把有限的時間徒溪,真正花在學(xué)習(xí)上忿偷。