前言:前端
最近有好多人問我說:「George,怎樣才能成爲公司裏的前線主力架構師,我如今在公式已經幹了快五年了,如今仍是一個默默無聞的程序員,我也經過不少種渠道來突破我如今瓶疾,但就是走不出來,技術也一直沒有突破上去,我真的是沒有辦法了,經過朋友推薦介紹,說您這裏能夠解決個人技術瓶疾,因此我想請你幫我突破一下技術方面上的瓶疾。」程序員
大家是否有也有相似這樣的問題——「每天寫業務代碼的程序員,怎麼成爲技術大牛,開始寫技術代碼?」算法
今天,我和我以前一塊兒共事的朋友,一塊兒探討出了這麼一個結論:要怎樣努力才能夠成爲公司主力架構師。shell
無論是開發、測試、運維,每一個技術人員內心多多少少都有一個成爲技術大牛的夢,畢竟「夢想老是要有的,萬一實現了呢」!正是對技術夢的追求,促使咱們不斷地努力和提高本身。數據庫
然而「夢想是美好的,現實倒是殘酷的」,不少同窗在實際工做後就會發現,夢想是成爲大牛,但作的事情看起來跟大牛都不沾邊,例如,程序員說「每天寫業務代碼還加班,如何才能成爲技術大牛」,測試說「天天都有執行不完的測試用例」,運維說「扛機器接網線敲shell命令,這不是我想要的運維人生」。編程
我也是一位程序員,因此我但願經過如下基於程序開發的一些例子,幫助你們解決這些困惑。大道理是相通的,測試、運維均可以借鑑。後端
成爲架構師的幾個誤區設計模式
第一:拜大牛爲師瀏覽器
有人認爲想成爲技術大牛最簡單直接、快速有效的方式是「拜團隊技術大牛爲師」,讓他們平時給你開小竈,給你分配一些有難度的任務。緩存
我我的是反對這種方法的,主要的緣由有幾個:
大牛很忙,不太可能單獨給你開小竈,更不可能天天都給你開1個小時的小竈;並且一個團隊裏面,若是大牛平時常常給你開小竈,不免會引發其餘團隊成員的疑惑,我我的認爲若是團隊裏的大牛若是真正有心的話,多給團隊培訓是最好的。然而作過培訓的都知道,準備一場培訓是很耗費時間的,課件和材料至少2個小時(還不能是碎片時間),講解1個小時,大牛們一個月作一次培訓已是很高頻了。
由於第一個緣由,因此通常要找大牛,都是帶着問題去請教或者探討。由於回答或者探討問題無需太多的時間,更多的是靠經驗和積累,這種狀況下大牛們都是很樂意的,畢竟影響力是大牛的一個重要指標嘛。然而也要特別注意:若是常常問那些書本或者google可以很容易查到的知識,大牛們也會很不耐煩的,畢竟時間寶貴。常常有網友問我諸如「jvm的-Xmn參數如何配置」這類問題,我都是直接回答「請直接去google」,由於這樣的問題實在是太多了,若是本身不去系統學習,每一個都要問是很是浪費本身和別人的時間的。
大牛很少,不太可能每一個團隊都有技術大牛,只能說團隊裏面會有比你水平高的人,即便他天天給你開小竈,最終你也只能提高到他的水平;而若是是跨團隊的技術大牛,因爲工做安排和分配的緣由,直接請教和輔導的機會是比較少的,單憑參加幾回大牛的培訓,是不太可能就成爲技術大牛的。
綜合上述的幾個緣由,我認爲對於大部分人來講,要想成爲技術大牛,首先仍是要明白「主要靠本身」這個道理,不要指望有個像武功師傅同樣的大牛手把手一步一步地教你。適當的時候能夠經過請教大牛或者和大牛探討來提高本身,但大部分時間仍是本身系統性、有針對性的提高。
第二:業務代碼同樣很牛逼
有人認爲寫業務代碼同樣能夠很牛逼,理由是業務代碼同樣能夠有各類技巧,例如可使用封裝和抽象使得業務代碼更具可擴展性,能夠經過和產品多交流以便更好的理解和實現業務,日誌記錄好了問題定位效率能夠提高10倍等等。
業務代碼同樣有技術含量,這點是確定的,業務代碼中的技術是每一個程序員的基礎,但只是掌握了這些技巧,並不能成爲技術大牛,就像遊戲中升級打怪同樣,開始打小怪,經驗值很高,越到後面經驗值越少,打小怪已經不能提高經驗值了,這個時候就須要打一些更高級的怪,刷一些有挑戰的副本了,沒看到哪一個遊戲只要一直打小怪就能升到頂級的。成爲技術大牛的路也是相似的,你要不斷的提高本身的水平,而後面臨更大的挑戰,經過應對這些挑戰從而使本身水平更上一級,而後如此往復,最終達到技術大牛甚至業界大牛的境界,寫業務代碼只是這個打怪升級路上的一個挑戰而已,並且我認爲是比較初級的一個挑戰。
因此我認爲:業務代碼都寫很差的程序員確定沒法成爲技術大牛,但只把業務代碼寫好的程序員也還不能成爲技術大牛。
第三:上班太忙沒時間本身學習
不少人認爲本身沒有成爲技術大牛並非本身不聰明,也不是本身不努力,而是中國的這個環境下,技術人員加班都太多了,致使本身沒有額外的時間進行學習。
這個理由有必定的客觀性,畢竟和歐美相比,咱們的加班確實要多一些,但這個因素只是一個須要克服的問題,並非不可逾越的鴻溝,畢竟咱們身邊仍是有那麼多的大牛也是在中國這個環境成長起來的。
我認爲有幾個誤區致使了這種見解的造成:
(1)上班作的都是重複工做,要想提高必須本身額外去學習
造成這個誤區的主要緣由仍是在於認爲「寫業務代碼是沒有技術含量的」,而我如今上班就是寫業務代碼,因此我在工做中不能提高。
(2)學習須要大段的連續時間
不少人覺得要學習就要像學校上課同樣,給你一成天時間來上課纔算學習,而咱們平時加班又比較多,週末累的只想睡懶覺,或者只想去看看電影打打遊戲來放鬆,因此就沒有時間學習了。
實際上的作法正好相反:首先咱們應該在工做中學習和提高,由於學以至用或者有實例參考,學習的效果是最好的;其次工做後學習不須要大段時間,而是要擠出時間,利用時間碎片來學習。
在此我向你們推薦一個交流學習羣:685--1676--72 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
如何突破和避免以上幾大誤區
如何突破以上的誤區,那就看你怎麼學習,有沒有一套系統化的學習體系給你學習,有沒有一個學習氛圍的羣,有沒有一羣是遇到瓶疾一塊兒突破的兄弟姐妹。有麼??????我這裏有。
我向你們推薦一下我認爲比較全面且最系統化的學習體系(分解後的,完整的加羣能夠獲取)
1、源碼分析
2、分佈式架構
3、微服務
4、性能優化
5、Java工程化
以上就是我推薦給你們的最具備系統化的學習體系,若果你想學習以上的知識內容,你能夠加這個羣獲取:交流學習羣:68-51-67-67-2 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
那麼問題又來了,學完以上的課程體系後,就能成爲公司主力架構師麼?答案是:NO
要想成爲主力架構師,還需知道如下知識
要想成爲軟件開發的專家,須要咱們完整了解軟件開發的流程,並在關鍵部分掌握豐富經驗。
須要咱們瞭解設計模式和算法的細微差異,同時遵循軟件開發的最佳實踐,包括創造性和思考力,爲編程問題提供合適的解決方案。
實現這一目標須要掌握服務器端開發、客戶端開發、DevOps運維、雲計算、網頁設計、分佈式系統、數據庫、編程規約、代碼管理、基礎設施管理、可擴展性、安全性待方面的能力。
你可能未必所有掌握以上內容。可是能夠嘗試從表層瞭解絕大部份內容,而後再深刻掌握其中幾個技術。
如下給各位列出開發者缺少的幾個主要技術能力,而技術管理者或架構師在招聘這些職位時應該熟悉檢查這些要素。
編碼規範
編碼規範有助於確保良好的開發實踐和產品開發。要了解一些最重要的編碼規約:
DRY(不要重複本身),SOLID , TDD , 防護性編程
設計模式
設計模式在軟件開發中是一種常見的,可重複使用的解決方案,可解決軟件中的常見問題。軟件開發者要了解一些常見的Design Partern是很是重要的,還有更重要的是要可以識別給定問題的正確設計模式。如MVC、Singleton、DAO、Facade、Proxy、Adapter、Strategy和Absract Factory等一些一流開發者使用的設計模式。
服務器端開發
在較複雜的軟件系統中,後端會有各類各樣的邏輯。做爲後端開發人員,處理應該程序的業務邏輯就要面臨不少挑戰。任何開發人員都可以編寫代碼,可是隻有有經驗的開發人員才能夠寫出具備高性能、可伸縮性和可靠性都好的高質量代碼。開發優秀軟件的過程涉及的領域包括大量科學、數學、計算機等專業知識,有處理的思惟和經驗很是重要。
高速緩存
數據緩存的各類機制(文件、數據庫、內存、反向代理、HTTP....)
內存管理
Java有一個很是好的垃圾收集器,可以自動管理內存,清理未使用的對象並釋放一些內存。可是一個資深的Java開發者須要對內存的工做緣由有一個很是透的理解,這樣才能寫出高性能和優化的應用程序。
瞭解如下概念相當重要:
堆棧,堆,強引用,弱引用,轉義引用,如何引用字符串,垃圾收集過程,meta空間,垃圾收集器類型。
異常處理
這是一個至關重要,也是一個比較大的話題,咱們後續會再寫關於它的專門文章。如今,列出一些處理異常的一些良好實踐:
一、遵循「錯誤優先」原則使軟件更可靠
二、不要捕捉沒法恢復的異常
三、不要記錄完異常後,又將異常拋出來
四、選擇正確的層來處理異常(例如:DAO不知道是數據庫的故障如何處理,可是服務層能夠知道)
五、若是沒法從異常中恢復,則優先選擇未經檢查的異常
IO操做
瞭解I/O操做的成本以及可能出現的不可預知的結果。
異步編程
使用線程實現Java中的異步編程,它也是Java平臺的基礎部分,有效使用併發對於構建高性能應用程序很是重要。
好比線程池、死鎖、生產者-消費者、原子性、不可變對象、信號量等等詞彙對資深開發人員來講不該該是新東西。
批處理
在實際場景中,編寫批量做業很是廣泛。一般執行重要的任務,有一些基本規則:
一、每一個任務應該按輸入、處理過程與輸出進行劃分;
二、始終輪詢批量輸入數據;
三、處理器應該是線程安全;
四、產出物應該爲原子屬性;
五、存儲工做結果;
六、要考慮EIP模式。
分佈式計算
在現代世界中,分佈式計算是指使用分佈式系統來解決計算問題。然而,分佈式系統與傳統系統不一樣,具備很是高的複雜性。當用戶開始高速增加資源消耗較大時,有分佈式系統工做經驗的工程師會在此時發揮做用。微服務軟件體系結構是分佈式計算以及分佈式體系結構全部的優勢與折衷的一個很好的例子。
而今,微服務是當今軟件工程師之必備技能,就須要咱們對分佈式系統有豐富的經驗。
好比容錯性,可用性與一致性,分佈式事務/事件、同步與異步通訊,分佈式認證,分佈式應用,共識應用程序等很是重要。
數據庫
精確掌握與數據庫從通訊到獲取數據中要涉及的全部成本,如鏈接握手、數據傳輸等狀況。清楚瞭解原子事務以及如何確保數據一致性。所以,數據庫管理是軟件開發人員的必備技能。
數據庫用於管理數據,這是一項艱鉅的任務,即便不考慮將業務邏輯添加到數據庫中。 在大型IT系統中,數據庫在安全性,可伸縮性,容量和可用性方面面臨着諸多挑戰。咱們要考慮加密,複製,分片,大數據等問題。 瞭解數據庫的工做方式以及如何優化它以及每項處理消耗的成本(例如,佔用內存、CPU數)將有助於有效設計系統的數據庫管理。
DevOps
主力開發工程師要有能推進DevOps的文化理念和實踐的能力,在全部運維步驟中作到自動化,提升高質量和高速度交付應用程序與服務能力。代碼部署或配置基礎設施必須爲自動化,且要靈活以及受到監控。
一個強大的開發者應該很好地瞭解從測試,發佈到部署和基礎架構管理的全開發生命週期。須要咱們瞭解雲計算,Linux,網絡,容器,工程管理等。
代碼管理
鑑於代碼的重要性,只有主力開發人員纔可以掌握代碼生命週期,併力促軟件工程最佳實踐。 爲此,須要你熟諳源代碼管理系統,好比Git,對分支策略,版本控制,分佈式修訂控制,另外還有代碼質量保證工具,代碼間的通訊和依賴管理,配置管理等有清晰的思惟。
安全
Web安全是件很難處理的事情,一部分取決於許多外部參數; 軟件工程師須要遵循構建安全Web應用程序的最佳實踐與準則。
主力工程師須要對信息安全有較深的理解,不只要如何避免構建不安全與容易受攻擊的系統,還須要知道保護用戶的隱私。
一個偉大的開發人員須要可以建立一個指南來處理前10個Web應用程序安全風險。 在Web應用程序中,咱們有更多須要工程師關注安全威脅,其中包括以下:
一、上傳文件檢查;
二、密碼暴力破解;
三、會話到期處理;
四、會話來源驗證;
五、經過網絡安全通訊;
六、安全的Cookie訪問;
七、用戶憑證處理。
前端開發
前端開發是軟件開發重要的一部分,若是您不知道程序設計與良好用戶體驗的關係,則不能成爲主力軟件工程師。
在前端世界中,Javas和CSS是軟件工程師必備的。 在這兩方面掌握掌握並不容易,但瞭解它們的工做方式以及二者如何與HTML鏈接一塊兒,使咱們可以提供出色的用戶體驗很是重要。
若要領導一個前端團隊,你須要知道的不只僅是如何創建一個漂亮佈局,要想前端開發作得更好,你須要瞭解以下:
一、瀏覽器做爲引擎能夠構建什麼?
二、如何開發響應式網站;
三、如何提升網站的性能;
四、如何開發單頁面應用程序;
五、如何建設現代高效的發展環境;
六、熟悉HTML5 API。
七、熟悉React.js或Vue.js框架
爲了掌握這些技能,開發人員需可以自我激勵,主動學習新技術,並在職業生涯中給本身扣上不少帽子。 繼而不斷挑戰自我,而後更好地解決問題,這就是編程的本質。 知識很重要,在某些複雜問題的狀況下更是如此。在變化如此之快的IT技術領域中,知識的獲取在任什麼時候候比咱們已會的技能更爲重要。