? 前言
? ? ? 系統(tǒng)架構(gòu)師是近幾年來在國內(nèi)外迅速成長(zhǎng)并發(fā)展良好的一個(gè)職位,它的重要性及給互聯(lián)網(wǎng)行業(yè)所帶來的影響是不言而喻的。很多程序員把成為一名優(yōu)秀的架構(gòu)師作為自己職業(yè)生涯奮斗的目標(biāo),但很多人努力卻用不對(duì)地方,前段時(shí)間我與在阿里的P7架構(gòu)師談到了這個(gè)問題,并且整理出來,希望對(duì)在迷茫期的程序員有所幫助。
1、問:阿里的技術(shù)專家P7從招聘層面上來說,比如工作年限、項(xiàng)目經(jīng)歷、技術(shù)能力等需要達(dá)到什么樣的要求?
答:工作年限是5-10年,在技術(shù)上有扎實(shí)的基礎(chǔ)能力,有技術(shù)亮點(diǎn),用過的框架要知道其技術(shù)原理,具備分布式系統(tǒng)的開發(fā)經(jīng)驗(yàn),能獨(dú)立解決各種技術(shù)問題,比較強(qiáng)的實(shí)戰(zhàn)能力。
阿里的P5要求能獨(dú)立負(fù)責(zé)一個(gè)模塊,P6要求能獨(dú)立負(fù)責(zé)一個(gè)系統(tǒng),P7要求能架構(gòu)和負(fù)責(zé)多個(gè)系統(tǒng),并規(guī)劃系統(tǒng)的未來能力,在某個(gè)領(lǐng)域達(dá)到專家水平,可以是某個(gè)業(yè)務(wù)領(lǐng)域,也可以是某個(gè)技術(shù)領(lǐng)域。
2、問:工作中,產(chǎn)品方案設(shè)計(jì)的時(shí)候,經(jīng)常會(huì)存在多方分歧,有分歧就會(huì)存在妥協(xié),如何合理地堅(jiān)持自己的觀點(diǎn),如何合理地做出妥協(xié)?
答:方案沒有對(duì)錯(cuò),每個(gè)方案都有它的優(yōu)點(diǎn)和缺點(diǎn),要分析別人方案的優(yōu)缺點(diǎn),先肯定對(duì)方方案的優(yōu)點(diǎn),再針對(duì)缺點(diǎn)提出如何解決這個(gè)問題,還是說不解決這個(gè)缺點(diǎn)。一起討論出最合適的方案,而不是要爭(zhēng)論誰對(duì)誰錯(cuò)。
3、問:我就是在業(yè)務(wù)團(tuán)隊(duì),偏技術(shù),框架聽起來很酷但遙遠(yuǎn),能否分享幾個(gè)知識(shí)點(diǎn)?
答:在業(yè)務(wù)團(tuán)隊(duì)也可以做很多框架,比如可配置化支持業(yè)務(wù)的框架、自動(dòng)生成添加刪除修改頁面的框架、業(yè)務(wù)數(shù)據(jù)校驗(yàn)的框架,只要多思考如何快速支持業(yè)務(wù),就能找到合適的業(yè)務(wù)框架??梢詮膸讉€(gè)點(diǎn)出發(fā):配置化支持業(yè)務(wù)、頁面自動(dòng)生成、流程標(biāo)準(zhǔn)化等。
4、問:最近在學(xué)習(xí)Spring源碼,看了幾本書,可以跟著作者的思路看源碼,但是看完不久就忘了,其實(shí)是沒有太多的應(yīng)用場(chǎng)景,對(duì)于看源碼,有什么好的方法嗎?
答:可以用這個(gè)思路,比如讓你來設(shè)計(jì)一個(gè)Spring框架你會(huì)如何來設(shè)計(jì),Spring Core最重要的就是IOC和AOP。自己可以嘗試實(shí)現(xiàn)下簡(jiǎn)單的IOC和AOP功能,然后再去對(duì)比看下Spring是如何實(shí)現(xiàn)的,這樣即使忘記了Spring的代碼,但是仍然能基礎(chǔ)其實(shí)現(xiàn)原理。
5、問:對(duì)于三十歲的程度員,如果還想再深入做技術(shù),有什么建議?
答:技術(shù)人員一定要有危機(jī)感,無論多大年紀(jì)仍然要持續(xù)地學(xué)習(xí),我也已經(jīng)三十多了,每周會(huì)花點(diǎn)時(shí)間學(xué)習(xí)點(diǎn)技術(shù)。但是年紀(jì)大了,其實(shí)時(shí)間不會(huì)那么多,所以要提高學(xué)習(xí)的效率,掌握一些學(xué)習(xí)方法,并且要靜下心來學(xué)習(xí)。
學(xué)技術(shù)什么時(shí)間都不晚,因?yàn)榭傆行录夹g(shù)冒出來,但是一些永遠(yuǎn)不變的技術(shù)可以優(yōu)先學(xué)習(xí),比如各種協(xié)議(TCP,HTTP,一致性hash協(xié)議)、實(shí)現(xiàn)原理、算法等。
6、問:自己也實(shí)現(xiàn)過IOC和AOP的一些小案例,但是實(shí)現(xiàn)比較簡(jiǎn)單,IOC是基于一個(gè)Map來實(shí)現(xiàn)的,AOP使用CgLib實(shí)現(xiàn),但是再看Spring Core的源碼時(shí),還是感覺很吃力,嵌套層次太多,Debug多次,還是比較吃力,怎么辦?
答:技術(shù)人員一定要有個(gè)特質(zhì)就是死磕,有的技術(shù)人員可能花2個(gè)星期解決一個(gè)技術(shù)BUG,就是對(duì)著源碼一點(diǎn)點(diǎn)看,要能入定,帶著問題去看源碼會(huì)更輕松。
另一方面,要給自己制定學(xué)習(xí)計(jì)劃,比如要學(xué)習(xí)哪些技術(shù)、每天學(xué)習(xí)什么、達(dá)到什么程度。工作中用一些方法減少雜亂無難度的工作內(nèi)容,比如白天不答疑,或只在固定的時(shí)間答疑,寫FAQ減少答疑,少參與一些會(huì)議,不實(shí)時(shí)去回即時(shí)通訊軟件。
7、問:你覺得成為一個(gè)架構(gòu)師應(yīng)該具備什么樣的技能?
答:我結(jié)合自己多年的項(xiàng)目經(jīng)驗(yàn)總結(jié)出來的技能體系,希望能幫助迷茫的程序員,找到正確的學(xué)習(xí)路線,學(xué)習(xí)方向大概有七點(diǎn)。
構(gòu)成架構(gòu)師的技能體系
一、源碼知識(shí)點(diǎn)
? ? ? 源碼分析對(duì)于很多人來說很枯燥,生澀難懂,下圖詳細(xì)介紹了源碼中所用到的經(jīng)典設(shè)計(jì)思想及常用設(shè)計(jì)模式,幫助大家找到分析源碼的切入點(diǎn),了解大牛是如何寫代碼的。
二、分布式架構(gòu)
? ? ? 分布式系統(tǒng)的任務(wù)是把多臺(tái)機(jī)器有機(jī)地組合、連接起來,讓其協(xié)同完成一件任務(wù),可以是計(jì)算任務(wù),也可以是存儲(chǔ)任務(wù)。
? ? ? 從分布式架構(gòu)原理,到分布式架構(gòu)策略、分布式架構(gòu)中間件,最后在加上分布式架構(gòu)實(shí)戰(zhàn),讓程序員可以在技術(shù)深度和技術(shù)廣度上得到飛躍的提升。但分布式系統(tǒng)是一個(gè)復(fù)雜且寬泛的研究領(lǐng)域,學(xué)習(xí)一兩門在線課程,看幾本書是不能完全覆蓋其所有內(nèi)容的。
三、微服務(wù)架構(gòu)技能
? ? ? 當(dāng)今微服務(wù)架構(gòu)非常流行,其核心思想是服務(wù)拆分與解耦,降低復(fù)雜性。微服務(wù)強(qiáng)調(diào)將功能合理拆解,盡可能保證每個(gè)服務(wù)的功能單一, 根據(jù)各個(gè)服務(wù)自身資源需求,單獨(dú)布署,單獨(dú)作橫向擴(kuò)展,將各個(gè)服務(wù)做到靈活、可復(fù)用。
? ? ? 微服務(wù)架構(gòu)解決了傳統(tǒng)單體式架構(gòu)的弊端,但其實(shí)施的本身面臨很多陷阱和挑戰(zhàn),涉及到設(shè)計(jì)、開發(fā)、測(cè)試、部署、運(yùn)行和運(yùn)維等各個(gè)方面,一旦使用不當(dāng),則會(huì)導(dǎo)致整個(gè)微服務(wù)架構(gòu)改造的效果大打折扣,甚至失敗。對(duì)于這些問題,我總結(jié)出微服務(wù)需要學(xué)習(xí)的知識(shí)點(diǎn),如下圖所示:
?四、并發(fā)編程
? ? ? 并發(fā)編程幾乎是所有互聯(lián)網(wǎng)公司面試必問問題,并發(fā)編程是Java程序員最重要的技能之一,也是最難掌握的一種技能。它要求編程者對(duì)計(jì)算機(jī)最底層的運(yùn)作原理有深刻的理解,同時(shí)要求編程者邏輯清晰、思維縝密,這樣才能寫出高效、安全、可靠的多線程并發(fā)程序。目前網(wǎng)上沒有系統(tǒng)的全面的并發(fā)編程學(xué)習(xí)大綱,我搜集了很多資料總結(jié)出一個(gè)較全面的學(xué)習(xí)大綱:
五、性能優(yōu)化
? ? ? 大家都知道,性能一直是讓程序員比較頭疼的問題。當(dāng)系統(tǒng)架構(gòu)變得復(fù)雜而龐大之后,性能方面就會(huì)下降,如果想成為一名優(yōu)秀的架構(gòu)師,性能優(yōu)化就是你必須思考的問題。
? ? ? 必須要明白的是:沒有兩個(gè)應(yīng)用程序可以使用相同的優(yōu)化方式,也沒有完美的優(yōu)化 java 應(yīng)用程序的參考路徑,,堅(jiān)持采用適當(dāng)?shù)姆绞教幚硇阅軆?yōu)化。想要達(dá)到最高的性能優(yōu)化,作為一個(gè) Java 開發(fā)人員,需要對(duì) Java 虛擬機(jī)(JVM)和底層操作系統(tǒng)有正確的理解。而在此之前要理解性能優(yōu)化的知識(shí)體系,如下圖所示:
六、實(shí)踐一個(gè)雙十一電商項(xiàng)目
? ? ? 電商項(xiàng)目目的是把所學(xué)的分布式、微服務(wù)、性能調(diào)優(yōu)等知識(shí)運(yùn)用起來,只有在項(xiàng)目中你才能鞏固知識(shí),提升自己。實(shí)踐電商項(xiàng)目會(huì)利用云服務(wù)器搭建真實(shí)的開發(fā)和部署環(huán)境,讓你從零到項(xiàng)目實(shí)戰(zhàn),體驗(yàn)真實(shí)的企業(yè)級(jí)項(xiàng)目開發(fā)過程,讓你具備獨(dú)立開發(fā)和搭建分布架構(gòu)系統(tǒng)的能力。
七、Java開發(fā)必知工具
古語云:工欲善其事必先利其器,不管是小白,還是資深開發(fā),都需要先選擇好的工具。特別是一名優(yōu)秀的架構(gòu)師必須有適合自己的工具,工程化專題的學(xué)習(xí)能幫助你和團(tuán)隊(duì)提升開發(fā)效率,讓自己有更多時(shí)間來思考。
Git:可以更好地管理你和你團(tuán)隊(duì)的代碼。
Maven:可以更好地管理jar包和項(xiàng)目的構(gòu)建等。
Jenkins:可以更好地持續(xù)編譯,集成,發(fā)布你的項(xiàng)目。
Sonar:一個(gè)開源的代碼質(zhì)量分析平臺(tái),便于管理代碼的質(zhì)量,可檢查出項(xiàng)目代碼的漏洞和潛在的邏輯問題(提升代碼的質(zhì)量,更加高效地提升開發(fā)效率)。
如何學(xué)習(xí)才能快速入門并精通呢?
當(dāng)真正開始學(xué)習(xí)時(shí)難免不知從何入手,從而導(dǎo)致效率低下影響繼續(xù)學(xué)習(xí)的信心。
但最重要的是不知道需要重點(diǎn)掌握哪些技術(shù),學(xué)習(xí)時(shí)頻繁踩坑,最終浪費(fèi)大量時(shí)間。
為了讓學(xué)習(xí)變得輕松高效, 現(xiàn)在給大家提供一個(gè)學(xué)習(xí)平臺(tái),讓你在實(shí)踐中積累經(jīng)驗(yàn)掌握原理。主要方向是JAVA架構(gòu)師,在這里你可以學(xué)習(xí)Java工程化、高性能及分布式、深入淺出、性能調(diào)優(yōu)、Spring,MyBatis,Netty源碼分析和大數(shù)據(jù)等知識(shí)點(diǎn)??梢约尤?b>Java后端技術(shù)群:819940388,群里有阿里大牛直播講解技術(shù),或是關(guān)注微信公眾號(hào):Java資訊庫,回復(fù)“架構(gòu)”,免費(fèi)的大型互聯(lián)網(wǎng)Java技術(shù)視頻分享給大家。