天天看點

從程式員到架構師的成長之路

架構師的内功主要包含三部分:判斷力、執行力、創新力,簡單解釋如下:

判斷力:能夠準确判斷系統的複雜度在哪裡,就像武俠高手一樣,能準确地看出對手的破綻和弱點。

執行力:能夠使用合适的方案解決複雜度問題,就像武俠高手一樣,能選擇合适的招式或者方法打敗對手。

創新力:能夠創造新的解決方案解決複雜度問題,就像武俠世界裡,小一些的創新是創新招式,而武學宗師能夠創立新的武學或者心法,例如張三豐創立太極拳一樣。

是以,要成為一個優秀的架構師,就需要不斷地提升自己這幾方面的内功,而這三方面的能力主要來源于經驗、視野、思考。

經驗:設計過的系統越多、系統越複雜,架構師的内功也就越強,不管是成功的架構,還是失敗的架構,不管是踩坑的經驗,還是填坑的經驗,都将成為架構師内功的一部分。

視野:掌握的知識和技能越多、越深,架構師的内功也就越強,他山之石可以攻玉,站在巨人的肩膀上會看的更高更遠。

思考:經驗和視野都是外部輸入,類似于我們吃的食物,但光吃還不行,還要消化,将其變為我們自己的營養,這就是思考的作用。思考能夠将經驗和視野中的模式、判斷、選擇、技巧等提煉出來為我所用,思考也能促使我們産生新的創意和靈感。

結合上面的分析,從程式員到架構師的成長之路,總的指導原則是:積累經驗,拓寬視野,深度思考。按照這個總的原則為指導,接下來我們看看從程式員到架構師的成長過程中,具體如何實踐。

我把程式員到架構師的技術成長之路分為幾個典型的階段:工程師 - 進階工程師 - 技術專家 - 初級架構師 - 中級架構師 - 進階架構師。雖然總的指導原則是一樣的,但具體的實踐方法有很大差别,如果在正确的階段采取了錯誤的方法,可能會出現事倍功半的問題。

工程師

【階段描述】

成為一個合格的工程師需要 1 ~ 3 年時間,其典型特征是“在别人的指導下完成開發”,這裡的“别人”主要是“進階工程師”或者“技術專家”,通常情況下,進階工程師或者技術專家負責需求分析和讨論、方案設計,工程師負責編碼實作,進階工程師或者技術專家會指導工程師進行編碼實作。

【成長指導】

工程師階段是最原始的“基礎技能積累階段”,主要積累基礎知識,包括程式設計語言、程式設計工具、各類系統的基本使用。以 Java 後端工程師為例,工程師階段需要積累的經驗和技能有:

Java 的文法、基本資料結構的使用。

Eclipse、IDEA、Maven、Linux 指令行等各種工具。

資料庫 CRUD 操作、緩存的基本使用等。

業務系統的基本流程。

工程師階段最好的學習方法就是找經典的書籍系統地學習,而不要遇到一個問題到網上搜搜然後就解決了事。以 Java 為例,《Java 程式設計思想》《Java 核心技術》《TCP/IP 協定》這類大部頭,一定要完整地看一遍,即使裡面很多内容目前工作暫時用不上。

進階工程師

成長為進階工程師需要 2 ~ 5 年時間,其典型特征是“獨立完成開發”,包括需求分析、方案設計、編碼實作,其中需求分析和方案設計已經包含了“判斷”和“選擇”,隻是範圍相對來說小一些,更多是在已有架構下進行設計。以 Java 後端工程師為例,進階工程師需要完成的工作包括:

MySQL 資料庫表如何設計,是設計成兩個表還是三個表?

是否要用緩存,緩存的 Key 和 Value 如何設計,緩存的更新政策是什麼?

産品提出的需求是否合理?是否有更好的方式來滿足?

從普通工程師成長為進階工程師,主要需要“積累方案設計經驗”,簡單來說就是業務目前用到的相關技術的設計經驗。以 Java 後端進階工程師為例,包括:表設計經驗、緩存設計經驗、業務流程設計經驗、接口設計經驗等。當接到一個業務需求的時候,進階工程師能夠組合這些設計經驗,最終完成業務需求。

進階工程師階段相比工程師階段,有兩個典型的差異:

深度:如果說工程師是要求知道 How,那進階工程師就要求知道 Why 了。例如 Java 的各種資料結構的實作原理,因為隻有深入掌握了這些實作原理,才能對其優缺點和使用場景有深刻了解,這樣在做具體方案設計的時候才能選擇合适的資料結構。

理論:理論就是前人總結出來的成熟的設計經驗,例如資料庫表設計的 3 個範式、面向對象的設計模式、SOLID 設計原則、緩存設計理論(緩存穿透、緩存雪崩、緩存熱點)等。

針對技術深度,我的建議還是系統地學習,包括看書和研究源碼。例如,研究 Java 虛拟機可以看《深入了解 Java 虛拟機》、研究 MySQL 可以看《MySQL 技術内幕:InnoDB 存儲引擎》、研究 Memcache 可以去看其源碼。

針對設計理論,由于涉及的點很多,沒有一本書能夠涵蓋這麼多的設計點,是以更多的是依靠自己去網上搜尋資料學習。那我們怎麼知道哪些地方會有設計理論呢?簡單來說,就是假設每個設計環節都有設計理論,然後帶着這種假設去搜尋驗證看看是否真的有很熟的設計理念。

技術專家

成長為技術專家需要 4 ~ 8 年時間,其典型的特征是“某個領域的專家”,通俗地講,隻要是這個領域的問題,技術專家都可以解決。例如:Java 開發專家、PHP 開發專家、Android 開發專家、iOS 開發專家、前端開發專家等。通常情況下,“領域”的範圍不能太小,例如我們可以說“Java 開發專家”,但不會說“Java 多線程專家”或“Java JDBC 專家”。

技術專家與進階工程師的一個典型差別就是,進階工程師主要是在已有的架構架構下完成設計,而技術專家會根據需要修改、擴充、優化架構。例如,同樣是 Java 開發,進階工程師關注的是如何優化 MySQL 的查詢性能,而技術專家可能就會考慮引入 Elasticsearch 來完成搜尋。

從進階工程師成長為技術專家,主要需要“拓展技術寬度”,因為一個“領域”必然會涉及衆多的技術面。以 Java 後端開發為例,要成為一個 Java 開發專家,需要掌握 Java 多線程、JDBC、Java 虛拟機、面向對象、設計模式、Netty、Elasticsearch、Memcache、Redis、MySQL 等衆多技術。常見的拓展技術寬度的方法有:

學習業界成熟的開源方案,例如,Java 開發可以去學習 Redis、Memcache、Netty 等,Android 開發可以去研究 Retrofit、Fresco、OkHttp 等。

研究業界的經驗分享,例如 BAT、FANG 等大公司的經驗,可以通過參加技術大會等方式去近距離了解。

需要注意的是,拓展技術寬度并不意味着僅僅隻是知道一個技術名詞,而是要深入去了解每個技術的原理、優缺點、應用場景,否則就會成為傳說中的“PPT 技術專家”。例如,以 Java 開發為例,知道 Netty 是個高性能網絡庫是遠遠不夠的,還需要學習 Netty 的原理,以及具體如何使用 Netty 來開發高性能系統。

初級架構師

成長為初級架構師需要 5 ~ 10 年時間,其典型特征就是能夠“獨立完成一個系統的架構設計”,可以是從 0 到 1 設計一個新系統,也可以是将架構從 1.0 重構到 2.0。初級架構師負責的系統複雜度相對來說不高,例如背景管理系統、某個業務下的子系統、100 萬 PV 量級的網站等。

初級架構師和技術專家的典型差別是:架構師是基于完善的架構設計方法論的指導來進行架構設計,而技術專家更多的是基于經驗進行架構設計。簡單來說,即使是同樣一個方案,初級架構師能夠清晰地闡述架構設計的理由和原因,而技術專家可能就是因為自己曾經這樣做過,或者看到别人這樣做過而選擇設計方案。

但在實踐工作中,技術專家和初級架構師的差別并不很明顯,事實上很多技術專家其實就承擔了初級架構師的角色,因為在系統複雜度相對不高的情況下,架構設計的難度不高,用不同的備選方案最終都能夠較好地完成系統設計。例如,設計一個日 PV 100 萬的網站,MySQL + Memcache + Spring Boot 可以很好地完成,MongoDB + Redis + Nginx + php-fpm 也可以很好地完成,備選方案設計和選擇并不太難,更多的是看團隊熟悉哪個技術。

從技術專家成長為初級架構師,最主要的是形成自己的“架構設計方法論”,我的架構設計專欄其實就是講述完整的架構設計方法論,包括架構設計目的、架構設計原則、架構設計步驟、架構設計模式等,類似的架構設計方法論還有《恰如其分的軟體架構:風險驅動的設計方法》和《領域驅動設計》等。

要形成自己的架構設計方法論,主要的手段有:

系統學習架構設計方法論,包括訂閱專欄或者閱讀書籍等。

深入研究成熟開源系統的架構設計,這個手段在技術專家階段也會用到,但關注點不一樣,同樣是研究開源系統,技術專家階段聚焦于如何更好地應用開源項目;初級架構師階段聚焦于學習其架構設計原理和思想,例如 Kafka 的文檔中就有關于消息隊列架構設計的分析和取舍。

結合架構設計方法論,分析和總結自己團隊甚至公司的各種系統的架構設計優缺點,嘗試思考架構重構方案。如果在這個基礎上真的能夠推動架構重構,那就更好了,既能夠實踐自己的架構設計方法論,同時積累經驗,又能夠展現自己的技術實力,拿到結果。

中級架構師

成長為中級架構師需要 8 年以上時間,其典型特征是“能夠完成複雜系統的架構設計”,包含高性能、高可用、可擴充、海量存儲等複雜系統,例如設計一個和 Kafka 性能匹敵的消息隊列系統、将業務改造為異地多活、設計一個總共 100 人參與開發的業務系統等。

中級架構師與初級架構師的典型差別在于系統複雜度的不同,中級架構師面對的系統複雜度要高于初級架構師。以開源項目為例,初級架構師可能引入某個開源項目就可以完成架構設計,而中級架構師可能發現其實沒有哪個開源項目是合适的,而需要自己開發一個全新的項目,事實上很多開源項目就是這樣誕生出來的。

從初級架構師成長為中級架構師,最關鍵的是“技術深度和技術理論的積累”,例如:

技術理論:CAP、BASE 是異地多活的設計理論基礎、Paxos 是分布式一緻性的基礎算法、2PC、3PC 是分布式事務的基礎算法等。

技術深度:Kafka 用磁盤存儲還能做到高效是因為磁盤順序寫;Disruptor 高性能是結合 CPU 預讀取機制、緩存行、無鎖設計等基礎技術;Storm 的高效異或确認機制;Flink 的分布式快照算法等。

很多同學對這點可能有疑問,這些技術理論和技術深度的事情不應該是進階工程師階段或者技術專家階段就應該積累的麼?為何到了中級架構師階段反而是成長的關鍵了呢?主要原因在于進階工程師或者技術專家階段即使去學習這些技術,實際上也比較難了解透徹,更加難以有機會去應用,更多的時候隻是了解有這個技術點而已;而到了中級架構師階段,面對高複雜度的系統,很多時候就是幾個關鍵技術細節決定整個架構設計的成敗,或者某個設計方案理論上就是不可行的,如果不深刻了解理論和相關的關鍵技術點,很難設計優秀的架構。

以我做過的異地多活設計方案為例,之前很早我就知道 CAP 理論了,但也僅僅隻是知道幾個概念而已。真正做異地多活的時候,開始的時候還是走了不少彎路,試圖做一個完美的異地多活系統,最終發現這其實是不可能的,某天突然頓悟:其實 CAP 理論已經明确指出來了這點,但最初學習 CAP 理論的時候,很難有這樣深刻的了解。

進階架構師

成長為進階架構師需要 10 年以上時間,其典型特征是“創造新的架構模式”,例如:

谷歌大資料論文,創造了分布式存儲架構、分布式計算 MapReduce 架構、列式存儲架構,開創了大資料時代。

在有 MapReduce 分布式計算架構的背景下,Storm 又創造了流式計算架構。

在虛拟機很成熟的背景下,Docker 創造了容器化的技術潮流。

進階架構師與中級架構師相比,典型差別在于“創造性”,進階架構師能夠創造新的架構模式,開創新的技術潮流。

坦白地說,對于從中級架構師如何才能成長為進階架構師,我并沒有太好的指導,一個原因是我自我評價目前頂多算個中級架構師;另外一個原因是一旦涉及“創造性”,其實和藝術就比較類似了,創造性實際上是很難學會的,也很難由老師教會,更多是天分,或者某種場景下靈感爆發。

參考技術界幾個創造性的架構案例,我總結出幾個可能誕生創造性架構的背景條件:

足夠複雜的業務場景:例如谷歌的大資料、阿裡的雙十一、Facebook 的海量使用者等,業務場景越複雜,給技術帶來的挑戰更大,更有可能産生創造性的技術突破。

足夠強大的技術團隊:絕大部分創造性的架構都來源于大公司,或者知名的研究機構;沒有技術實力支撐,想突破也是心有餘而力不足。

不滿足于現狀的态度:例如虛拟機很成熟但是資源占用太多,是以發明 Docker;MapReduce 難以做到實時運算,是以創造 Storm 流式運算。