1. 程式人生 > >阿裏資深架構師私下峰會:了解這幾點,人人皆是優秀架構師

阿裏資深架構師私下峰會:了解這幾點,人人皆是優秀架構師

java 源碼分析 分布式 高可用 高並發

前言:

最近有好多人問我說:“George,怎樣才能成為公司裏的前線主力架構師,我現在在公式已經幹了快五年了,現在還是一個默默無聞的程序員,我也通過很多種渠道來突破我現在瓶疾,但就是走不出來,技術也一直沒有突破上去,我真的是沒有辦法了,通過朋友推薦介紹,說您這裏可以解決我的技術瓶疾,所以我想請你幫我突破一下技術方面上的瓶疾。”

你們是否有也有類似這樣的問題——“天天寫業務代碼的程序員,怎麽成為技術大牛,開始寫技術代碼?”

今天,我和我之前一起共事的朋友,一起探討出了這麽一個結論:要怎樣努力才可以成為公司主力架構師。

不管是開發、測試、運維,每個技術人員心裏多多少少都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一實現了呢”!正是對技術夢的追求,促使我們不斷地努力和提升自己。

然而“夢想是美好的,現實卻是殘酷的”,很多同學在實際工作後就會發現,夢想是成為大牛,但做的事情看起來跟大牛都不沾邊,例如,程序員說“天天寫業務代碼還加班,如何才能成為技術大牛”,測試說“每天都有執行不完的測試用例”,運維說“扛機器接網線敲shell命令,這不是我想要的運維人生”。

我也是一位程序員,所以我希望通過以下基於程序開發的一些例子,幫助大家解決這些困惑。大道理是相通的,測試、運維都可以借鑒。

成為架構師的幾個誤區

第一:拜大牛為師

有人認為想成為技術大牛最簡單直接、快速有效的方式是“拜團隊技術大牛為師”,讓他們平時給你開小竈,給你分配一些有難度的任務。

我個人是反對這種方法的,主要的原因有幾個:

大牛很忙,不太可能單獨給你開小竈,更不可能每天都給你開1個小時的小竈;而且一個團隊裏面,如果大牛平時經常給你開小竈,難免會引起其他團隊成員的疑惑,我個人認為如果團隊裏的大牛如果真正有心的話,多給團隊培訓是最好的。然而做過培訓的都知道,準備一場培訓是很耗費時間的,課件和材料至少2個小時(還不能是碎片時間),講解1個小時,大牛們一個月做一次培訓已經是很高頻了。

因為第一個原因,所以一般要找大牛,都是帶著問題去請教或者探討。因為回答或者探討問題無需太多的時間,更多的是靠經驗和積累,這種情況下大牛們都是很樂意的,畢竟影響力是大牛的一個重要指標嘛。然而也要特別註意:如果經常問那些書本或者google能夠很容易查到的知識,大牛們也會很不耐煩的,畢竟時間寶貴。經常有網友問我諸如“jvm的-Xmn參數如何配置”這類問題,我都是直接回答“請直接去google”,因為這樣的問題實在是太多了,如果自己不去系統學習,每個都要問是非常浪費自己和別人的時間的。

大牛不多,不太可能每個團隊都有技術大牛,只能說團隊裏面會有比你水平高的人,即使他每天給你開小竈,最終你也只能提升到他的水平;而如果是跨團隊的技術大牛,由於工作安排和分配的原因,直接請教和輔導的機會是比較少的,單憑參加幾次大牛的培訓,是不太可能就成為技術大牛的。

綜合上述的幾個原因,我認為對於大部分人來說,要想成為技術大牛,首先還是要明白“主要靠自己”這個道理,不要期望有個像武功師傅一樣的大牛手把手一步一步地教你。適當的時候可以通過請教大牛或者和大牛探討來提升自己,但大部分時間還是自己系統性、有針對性的提升。

第二:業務代碼一樣很牛逼

有人認為寫業務代碼一樣可以很牛逼,理由是業務代碼一樣可以有各種技巧,例如可以使用封裝和抽象使得業務代碼更具可擴展性,可以通過和產品多交流以便更好的理解和實現業務,日誌記錄好了問題定位效率可以提升10倍等等。

業務代碼一樣有技術含量,這點是肯定的,業務代碼中的技術是每個程序員的基礎,但只是掌握了這些技巧,並不能成為技術大牛,就像遊戲中升級打怪一樣,開始打小怪,經驗值很高,越到後面經驗值越少,打小怪已經不能提升經驗值了,這個時候就需要打一些更高級的怪,刷一些有挑戰的副本了,沒看到哪個遊戲只要一直打小怪就能升到頂級的。成為技術大牛的路也是類似的,你要不斷的提升自己的水平,然後面臨更大的挑戰,通過應對這些挑戰從而使自己水平更上一級,然後如此往復,最終達到技術大牛甚至業界大牛的境界,寫業務代碼只是這個打怪升級路上的一個挑戰而已,而且我認為是比較初級的一個挑戰。

所以我認為:業務代碼都寫不好的程序員肯定無法成為技術大牛,但只把業務代碼寫好的程序員也還不能成為技術大牛。

第三:上班太忙沒時間自己學習

很多人認為自己沒有成為技術大牛並不是自己不聰明,也不是自己不努力,而是中國的這個環境下,技術人員加班都太多了,導致自己沒有額外的時間進行學習。

這個理由有一定的客觀性,畢竟和歐美相比,我們的加班確實要多一些,但這個因素只是一個需要克服的問題,並不是不可逾越的鴻溝,畢竟我們身邊還是有那麽多的大牛也是在中國這個環境成長起來的。

我認為有幾個誤區導致了這種看法的形成:

(1)上班做的都是重復工作,要想提升必須自己額外去學習

形成這個誤區的主要原因還是在於認為“寫業務代碼是沒有技術含量的”,而我現在上班就是寫業務代碼,所以我在工作中不能提升。

(2)學習需要大段的連續時間

很多人以為要學習就要像學校上課一樣,給你一整天時間來上課才算學習,而我們平時加班又比較多,周末累的只想睡懶覺,或者只想去看看電影打打遊戲來放松,所以就沒有時間學習了。

實際上的做法正好相反:首先我們應該在工作中學習和提升,因為學以致用或者有實例參考,學習的效果是最好的;其次工作後學習不需要大段時間,而是要擠出時間,利用時間碎片來學習。

如何突破和避免以上幾大誤區

如何突破以上的誤區,那就看你怎麽學習,有沒有一套系統化的學習體系給你學習,有沒有一個學習氛圍的群,有沒有一群是遇到瓶疾一起突破的兄弟姐妹。有麽??????我這裏有。

我向大家推薦一下我認為比較全面且最系統化的學習體系(分解後的,完整的加群可以獲取)

一、源碼分析

技術分享圖片

二、分布式架構

技術分享圖片

三、微服務

技術分享圖片

四、性能優化

技術分享圖片![]
五、Java工程化
技術分享圖片
以上就是我推薦給大家的最具有系統化的學習體系,若果你想學習以上的知識內容,你可以加這個群獲取:交流學習群:744642380裏面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高並發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

那麽問題又來了,學完以上的課程體系後,就能成為公司主力架構師麽?答案是:NO

要想成為主力架構師,還需知道以下知識

要想成為軟件開發的專家,需要我們完整了解軟件開發的流程,並在關鍵部分掌握豐富經驗。

需要我們了解設計模式和算法的細微差別,同時遵循軟件開發的最佳實踐,包括創造性和思考力,為編程問題提供合適的解決方案。

實現這一目標需要掌握服務器端開發、客戶端開發、DevOps運維、雲計算、網頁設計、分布式系統、數據庫、編程規約、代碼管理、基礎設施管理、可擴展性、安全性待方面的能力。

你可能未必全部掌握以上內容。但是可以嘗試從表層了解絕大部分內容,然後再深入掌握其中幾個技術。

以下給各位列出開發者缺乏的幾個主要技術能力,而技術管理者或架構師在招聘這些職位時應該熟悉檢查這些要素。

編碼規範

編碼規範有助於確保良好的開發實踐和產品開發。要了解一些最重要的編碼規約:

DRY(不要重復自己),SOLID , TDD , 防禦性編程

設計模式

設計模式在軟件開發中是一種常見的,可重復使用的解決方案,可解決軟件中的常見問題。軟件開發者要了解一些常見的Design Partern是非常重要的,還有更重要的是要能夠識別給定問題的正確設計模式。如MVC、Singleton、DAO、Facade、Proxy、Adapter、Strategy和Absract Factory等一些一流開發者使用的設計模式。

服務器端開發

在較復雜的軟件系統中,後端會有各種各樣的邏輯。作為後端開發人員,處理應該程序的業務邏輯就要面臨很多挑戰。任何開發人員都能夠編寫代碼,但是只有有經驗的開發人員才可以寫出具有高性能、可伸縮性和可靠性都好的高質量代碼。開發優秀軟件的過程涉及的領域包括大量科學、數學、計算機等專業知識,有處理的思維和經驗非常重要。

高速緩存

數據緩存的各種機制(文件、數據庫、內存、反向代理、HTTP....)

內存管理

Java有一個非常好的垃圾收集器,能夠自動管理內存,清理未使用的對象並釋放一些內存。但是一個資深的Java開發者需要對內存的工作原因有一個非常透的理解,這樣才能寫出高性能和優化的應用程序。

了解以下概念至關重要:

堆棧,堆,強引用,弱引用,轉義引用,如何引用字符串,垃圾收集過程,meta空間,垃圾收集器類型。

異常處理

這是一個相當重要,也是一個比較大的話題,我們後續會再寫關於它的專門文章。現在,列出一些處理異常的一些良好實踐:

1、遵循“錯誤優先”原則使軟件更可靠

2、不要捕捉無法恢復的異常

3、不要記錄完異常後,又將異常拋出來

4、選擇正確的層來處理異常(例如:DAO不知道是數據庫的故障如何處理,但是服務層可以知道)

5、如果無法從異常中恢復,則優先選擇未經檢查的異常

IO操作

了解I/O操作的成本以及可能出現的不可預知的結果。

異步編程

使用線程實現Java中的異步編程,它也是Java平臺的基礎部分,有效使用並發對於構建高性能應用程序非常重要。

比如線程池、死鎖、生產者-消費者、原子性、不可變對象、信號量等等詞匯對資深開發人員來說不應該是新東西。

批處理

在實際場景中,編寫批量作業非常普遍。通常執行重要的任務,有一些基本規則:

1、每個任務應該按輸入、處理過程與輸出進行劃分;

2、始終輪詢批量輸入數據;

3、處理器應該是線程安全;

4、產出物應該為原子屬性;

5、存儲工作結果;

6、要考慮EIP模式。

分布式計算

在現代世界中,分布式計算是指使用分布式系統來解決計算問題。然而,分布式系統與傳統系統不同,具有非常高的復雜性。當用戶開始高速增長資源消耗較大時,有分布式系統工作經驗的工程師會在此時發揮作用。微服務軟件體系結構是分布式計算以及分布式體系結構所有的優點與折衷的一個很好的例子。

而今,微服務是當今軟件工程師之必備技能,就需要我們對分布式系統有豐富的經驗。

比如容錯性,可用性與一致性,分布式事務/事件、同步與異步通信,分布式認證,分布式應用,共識應用程序等非常重要。

數據庫

精確掌握與數據庫從通信到獲取數據中要涉及的所有成本,如連接握手、數據傳輸等情況。清楚了解原子事務以及如何確保數據一致性。因此,數據庫管理是軟件開發人員的必備技能。

數據庫用於管理數據,這是一項艱巨的任務,即使不考慮將業務邏輯添加到數據庫中。 在大型IT系統中,數據庫在安全性,可伸縮性,容量和可用性方面面臨著諸多挑戰。我們要考慮加密,復制,分片,大數據等問題。 了解數據庫的工作方式以及如何優化它以及每項處理消耗的成本(例如,占用內存、CPU數)將有助於有效設計系統的數據庫管理。

DevOps

主力開發工程師要有能推動DevOps的文化理念和實踐的能力,在所有運維步驟中做到自動化,提高高質量和高速度交付應用程序與服務能力。代碼部署或配置基礎設施必須為自動化,且要靈活以及受到監控。

一個強大的開發者應該很好地了解從測試,發布到部署和基礎架構管理的全開發生命周期。需要我們了解雲計算,Linux,網絡,容器,工程管理等。

代碼管理

鑒於代碼的重要性,只有主力開發人員才能夠掌握代碼生命周期,並力促軟件工程最佳實踐。 為此,需要你熟諳源代碼管理系統,比如Git,對分支策略,版本控制,分布式修訂控制,另外還有代碼質量保證工具,代碼間的通信和依賴管理,配置管理等有清晰的思維。

安全

Web安全是件很難處理的事情,一部分取決於許多外部參數; 軟件工程師需要遵循構建安全Web應用程序的最佳實踐與準則。

主力工程師需要對信息安全有較深的理解,不僅要如何避免構建不安全與容易受攻擊的系統,還需要知道保護用戶的隱私。

一個偉大的開發人員需要能夠創建一個指南來處理前10個Web應用程序安全風險。 在Web應用程序中,我們有更多需要工程師關註安全威脅,其中包括如下:

1、上傳文件檢查;

2、密碼暴力破解;

3、會話到期處理;

4、會話來源驗證;

5、通過網絡安全通信;

6、安全的Cookie訪問;

7、用戶憑證處理。

前端開發

前端開發是軟件開發重要的一部分,如果您不知道程序設計與良好用戶體驗的關系,則不能成為主力軟件工程師。

在前端世界中,Javas和CSS是軟件工程師必備的。 在這兩方面掌握掌握並不容易,但了解它們的工作方式以及兩者如何與HTML連接一起,使我們能夠提供出色的用戶體驗非常重要。

若要領導一個前端團隊,你需要知道的不僅僅是如何建立一個漂亮布局,要想前端開發做得更好,你需要了解如下:

1、瀏覽器作為引擎可以構建什麽?

2、如何開發響應式網站;

3、如何提高網站的性能;

4、如何開發單頁面應用程序;

5、如何建設現代高效的發展環境;

6、熟悉HTML5 API。

7、熟悉React.js或Vue.js框架

為了掌握這些技能,開發人員需能夠自我激勵,主動學習新技術,並在職業生涯中給自己扣上很多帽子。 繼而不斷挑戰自我,然後更好地解決問題,這就是編程的本質。 知識很重要,在某些復雜問題的情況下更是如此。在變化如此之快的IT技術領域中,知識的獲取在任何時候比我們已會的技能更為重要。

需要學習,獲取資料的也可以加下上面推薦的那個群,希望可以幫助在這個行業發展的朋友和童鞋們,在論壇博客等地方少花些時間找資料,把有限的時間,真正花在學習上。

阿裏資深架構師私下峰會:了解這幾點,人人皆是優秀架構師