前言:
最近有好多人問我說:“George,怎樣才能成為公司裡的前線主力架構師,我現在在公式已經幹了快五年了,現在還是一個默默無聞的程式設計師,我也通過很多種渠道來突破我現在瓶疾,但就是走不出來,技術也一直沒有突破上去,我真的是沒有辦法了,通過朋友推薦介紹,說您這裡可以解決我的技術瓶疾,所以我想請你幫我突破一下技術方面上的瓶疾。”
你們是否有也有類似這樣的問題——“天天寫業務程式碼的程式設計師,怎麼成為技術大牛,開始寫技術程式碼?”
今天,我和我之前一起共事的朋友,一起探討出了這麼一個結論:要怎樣努力才可以成為公司主力架構師。
不管是開發、測試、運維,每個技術人員心裡多多少少都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一實現了呢”!正是對技術夢的追求,促使我們不斷地努力和提升自己。
然而“夢想是美好的,現實卻是殘酷的”,很多同學在實際工作後就會發現,夢想是成為大牛,但做的事情看起來跟大牛都不沾邊,例如,程式設計師說“天天寫業務程式碼還加班,如何才能成為技術大牛”,測試說“每天都有執行不完的測試用例”,運維說“扛機器接網線敲shell命令,這不是我想要的運維人生”。
我也是一位程式設計師,所以我希望通過以下基於程式開發的一些例子,幫助大家解決這些困惑。大道理是相通的,測試、運維都可以借鑑。
成為架構師的幾個誤區
第一:拜大牛為師
有人認為想成為技術大牛最簡單直接、快速有效的方式是“拜團隊技術大牛為師”,讓他們平時給你開小灶,給你分配一些有難度的任務。
我個人是反對這種方法的,主要的原因有幾個:
大牛很忙,不太可能單獨給你開小灶,更不可能每天都給你開1個小時的小灶;而且一個團隊裡面,如果大牛平時經常給你開小灶,難免會引起其他團隊成員的疑惑,我個人認為如果團隊裡的大牛如果真正有心的話,多給團隊培訓是最好的。然而做過培訓的都知道,準備一場培訓是很耗費時間的,課件和材料至少2個小時(還不能是碎片時間),講解1個小時,大牛們一個月做一次培訓已經是很高頻了。
因為第一個原因,所以一般要找大牛,都是帶著問題去請教或者探討。因為回答或者探討問題無需太多的時間,更多的是靠經驗和積累,這種情況下大牛們都是很樂意的,畢竟影響力是大牛的一個重要指標嘛。然而也要特別注意:如果經常問那些書本或者google能夠很容易查到的知識,大牛們也會很不耐煩的,畢竟時間寶貴。經常有網友問我諸如“jvm的-Xmn引數如何配置”這類問題,我都是直接回答“請直接去google”,因為這樣的問題實在是太多了,如果自己不去系統學習,每個都要問是非常浪費自己和別人的時間的。
大牛不多,不太可能每個團隊都有技術大牛,只能說團隊裡面會有比你水平高的人,即使他每天給你開小灶,最終你也只能提升到他的水平;而如果是跨團隊的技術大牛,由於工作安排和分配的原因,直接請教和輔導的機會是比較少的,單憑參加幾次大牛的培訓,是不太可能就成為技術大牛的。
綜合上述的幾個原因,我認為對於大部分人來說,要想成為技術大牛,首先還是要明白“主要靠自己”這個道理,不要期望有個像武功師傅一樣的大牛手把手一步一步地教你。適當的時候可以通過請教大牛或者和大牛探討來提升自己,但大部分時間還是自己系統性、有針對性的提升。
第二:業務程式碼一樣很牛逼
有人認為寫業務程式碼一樣可以很牛逼,理由是業務程式碼一樣可以有各種技巧,例如可以使用封裝和抽象使得業務程式碼更具可擴充套件性,可以通過和產品多交流以便更好的理解和實現業務,日誌記錄好了問題定位效率可以提升10倍等等。
業務程式碼一樣有技術含量,這點是肯定的,業務程式碼中的技術是每個程式設計師的基礎,但只是掌握了這些技巧,並不能成為技術大牛,就像遊戲中升級打怪一樣,開始打小怪,經驗值很高,越到後面經驗值越少,打小怪已經不能提升經驗值了,這個時候就需要打一些更高階的怪,刷一些有挑戰的副本了,沒看到哪個遊戲只要一直打小怪就能升到頂級的。成為技術大牛的路也是類似的,你要不斷的提升自己的水平,然後面臨更大的挑戰,通過應對這些挑戰從而使自己水平更上一級,然後如此往復,最終達到技術大牛甚至業界大牛的境界,寫業務程式碼只是這個打怪升級路上的一個挑戰而已,而且我認為是比較初級的一個挑戰。
所以我認為:業務程式碼都寫不好的程式設計師肯定無法成為技術大牛,但只把業務程式碼寫好的程式設計師也還不能成為技術大牛。
第三:上班太忙沒時間自己學習
很多人認為自己沒有成為技術大牛並不是自己不聰明,也不是自己不努力,而是中國的這個環境下,技術人員加班都太多了,導致自己沒有額外的時間進行學習。
這個理由有一定的客觀性,畢竟和歐美相比,我們的加班確實要多一些,但這個因素只是一個需要克服的問題,並不是不可逾越的鴻溝,畢竟我們身邊還是有那麼多的大牛也是在中國這個環境成長起來的。
我認為有幾個誤區導致了這種看法的形成:
(1)上班做的都是重複工作,要想提升必須自己額外去學習
形成這個誤區的主要原因還是在於認為“寫業務程式碼是沒有技術含量的”,而我現在上班就是寫業務程式碼,所以我在工作中不能提升。
(2)學習需要大段的連續時間
很多人以為要學習就要像學校上課一樣,給你一整天時間來上課才算學習,而我們平時加班又比較多,週末累的只想睡懶覺,或者只想去看看電影打打遊戲來放鬆,所以就沒有時間學習了。
實際上的做法正好相反:首先我們應該在工作中學習和提升,因為學以致用或者有例項參考,學習的效果是最好的;其次工作後學習不需要大段時間,而是要擠出時間,利用時間碎片來學習。
如何突破和避免以上幾大誤區
如何突破以上的誤區,那就看你怎麼學習,有沒有一套系統化的學習體系給你學習,有沒有一個學習氛圍的群,有沒有一群是遇到瓶疾一起突破的兄弟姐妹。有麼??????我這裡有。
我向大家推薦一下我認為比較全面且最系統化的學習體系(分解後的,完整的加群可以獲取)
一、原始碼分析
二、分散式架構
三、微服務
四、效能優化
五、Java工程化
以上就是我推薦給大家的最具有系統化的學習體系,若果你想學習以上的知識內容,你可以加這個群獲取:交流學習群:433-540-541裡面會分享一些資深架構師錄製的視訊錄影:有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技術領域中,知識的獲取在任何時候比我們已會的技能更為重要。
需要學習,獲取資料的也可以加下上面推薦的那個群,希望可以幫助在這個行業發展的朋友和童鞋們,在論壇部落格等地方少花些時間找資料,把有限的時間,真正花在學習上。在這裡順便給大家推薦一個架構交流群:617434785,裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化這些成為架構師必備的知識體系。