架構師勸退指南

2021-02-13 碼農翻身

這是很多程式設計師的疑問,最近看到Kai Niklas講架構師的一篇文章,其中的真知灼見引起了我的強烈共鳴,尤其是後面的非技術部分。翻譯過來(略有刪減),分享給大家。英文文章請點擊」閱讀原文「。

我事先給一位同學看了一下,他說:當個架構師太難了吧,又要精通技術,還得會溝通,平衡,營銷 我還是爭取做個技術專家吧!

捫心自問,我這個架構師在很多方面也做得遠遠不夠,繼續學習吧!如果你的未來職業目標是架構師,強烈建議仔細閱讀並收藏。

在我們一頭扎入細節之前,我們先得知道軟體架構和架構師到底是什麼:

軟體架構師是一個軟體專家,他可以做出高層的設計決定,規定技術標準,包括編碼標準,工具和平臺 -- Wikipedia

軟體架構是一個系統最基本的組織方式,由其組件,組件之間的關係,組件和環境的關係表達出來。也包括決定設計和系統演化的原則。--Handbook of Software Architecture

架構可以在不同的抽象級別上完成, 不同的級別要求不同技能,有很多分類標準,我最喜歡的是這三個級別:

Application Level (應用級別):架構的最低級別,專注於單個應用,有非常具體的設計,溝通通常局限在開發團隊

Solution Level (解決方案級別) :架構的中間層,需要關注幾個應用來實現一個商業的需求,有部分高層的設計,但大多數還是具體的設計,溝通需要跨越多個開發團隊。

Enterprise Level (企業級別):架構的最高級, 關注多個解決方案,這一層的設計比較抽象,需要解決方案架構師和應用架構師去細化。溝通跨越整個企業組織。

有時候,架構師被看作不同利益相關者之間的粘合劑,比如:

為了理解軟體架構師需要哪些技能,我們得先來看看架構師的日常活動

注: 架構設計是一個持續的活動,所以這些活動會一遍一遍地完成。

根據我的經驗,閱讀的書籍,以及參與的討論,我可以列出這10個技能,每個架構師都必須具備:

設計, 決策,簡化, 編碼, 文檔, 溝通, 估算, 平衡, 諮詢, 營銷

我們一個個來說,對每個技能我都會列出一些我的見解,你應該採取的行動,以便在這個技能領域持續提高。

是什麼造就了好的設計?這可能是最重要,並且最具挑戰性的問題,讓我們先從理論開始。

理解基本的設計模式:為了開發一個可維護的系統,模式絕對是架構師最重要的工具之一,使用模式,你可以復用設計來決定那些通用的問題。「四人幫」的《設計模式:可復用的面向對象軟體基礎》是每個開發人員的必讀書籍。儘管過去20多年了,模式依然是軟體架構的基本單元。

比如書中描述的MVC模式被應用在很多領域,也是很多新模式如MVVM的基礎。

深入挖掘模式和反模式:理解了基本的「四人幫」模式以後,你需要把你知識擴展到更多的軟體設計模式中,或者根據自己的興趣,深入研究,例如Java併發模式。

在應用程式的集成領域, 我最喜歡的是《企業集成模式》,這本書適用於各種領域,只要兩個應用需要交換數據,不管是很古老的基於文件的交換還是現代的微服務架構,都可以參考本書。

了解軟體質量的度量方式:我們希望我們的系統是可以維護的、可靠的、安全的、可以測試的、可以擴展的、可用的. 為了達成這些目標,必須要把系統架構設計好。你可以參考這個:

理論很重要,實踐更加重要,否則你就會變成一個象牙塔架構師。

不斷嘗試和理解不同的技術棧 : 我認為這是成為架構師非常重要的事情, 你很難從抽象的PPT中學到真東西,你得嘗試不同的、新的技術棧,親自感受一下它帶來的好處和引發的「疼痛」。另外也可以嘗試不屬於你所在領域的技術,例如你對SAP R/3 非常擅長,那你應該也試試JavaScript。

分析、理解那些應用良好的模式:看看你當前使用的框架,例如Angular, 你可以研究很多以及付諸實踐的模式,如觀察者。看看它是怎麼在框架中使用的,為什麼要這麼使用。如果你願意投入更多的精力,那就深入原始碼看看它是如何實現的。

保持好奇心,參加一些公司之外的社團活動:比如Java User Group會討論很多主題,從最底層的編碼到高層的架構,我很喜歡這樣的活動,因為它會讓我跳出工作來思考,並且加強個人社交網絡。

架構師需要能夠做出架構決定,引導項目和組織走在正確的方向。

確定優先級:有些決策非常關鍵,如果沒有在早期確定下來,就會出現一些變通的臨時措施,導致後續難以移除,變成維護的噩夢。更差的情況是,程式設計師需要停止工作,等你做出決策。

為了避免這種情況,必須要把這些決策按優先級排序,我建議看一看敏捷軟體開發中非常流行的Weighted Shortest Job First (WSJF) 模型。

了解你的能力:不要在你的能力之外做決定,這非常關鍵,如果你不遵循的話可能會毀掉你架構師的崗位。

所以一定要和你的同伴明確你承擔的職責和你的角色。作為低級別的架構師,你可以提出對高層架構的建議,但是不要擅自做主。我建議要經常和同伴審視那些關鍵的架構決定。

評估多個選項:涉及到決策時,要列出多個選項。在我參與的大多數決策中,都有不止一個可能(好的)選擇。僅僅提供一個選項說明你沒有完成自己的工作,沒法完成決策。各種選項要通過可以度量的事實(如許可證費用,成熟度)而不是個人感情來比較,這樣才能真正完成決策。

要謹記解決問題的奧卡姆剃刀原則:如無必要,勿增實體。

對於一個問題,如果你有太多的假設,很可能會走向一個錯誤的方向,導致不必要的、複雜的解決方案。一定要精簡假設來生成好的解決方案。(可見架構工作也是一門藝術)

「搖動」你的架構設計:為了讓架構設計更加簡單,可以從多個角度去審視解決方案,不但要以自頂向下的方式思考,還要自底向上的方式再來一遍, 如果你有數據流或者業務流程,先從左向右看,然後再從右往左看。

經常問自己:「在一個理想的環境中,架構設計會是怎麼樣呢?」   「如果是那些大公司,它們會怎麼做呢?」 這些問題會促使你減少假設。

退後一步:經常長時間的密集討論,通常會得到一個高度複雜的設計,你絕對不能把它們當作最終結果,退後一步,從抽象的級別看看全局的圖景,這設計還是有意義的嗎?  

有時候停止討論,第二天再繼續會有幫助,至少我的大腦需要時間來處理這些信息,然後提出更好的,更優雅的,更簡單的方案。

分而治之:將大問題分成小塊兒,逐個解決,然後看看小塊兒解決方案能不能匹配起來。

重構並不邪惡:如果找不到更好的設計,從一個複雜的解決方案開始也是可以的。如果後面遇到了問題,你需要回過頭來再想一想,重構並不是邪惡的,但是再開始重構之前要確保 :

(1)足夠的自動化的測試用例,保證系統的功能不被破壞

即使是貴為企業級架構師,也就是抽象級別最高的架構師,你也得知道程式設計師日常工作在做些什麼。否則你會遇到兩個問題:

(2)  你不會理解開發人員面臨的真正挑戰和真正的需要。

做一個副業項目:目的是嘗試新的技術和工具,以了解當前和將來的開發方式。閱讀一些教程確實不錯,但僅僅是「書本」知識。只有自己親自嘗試一遍,體驗一遍,你才能獲得真正的經驗:它為什麼好?為什麼差?你和一門技術呆的時間越長,你的體驗就會越多,就越能幫助你做出好的決策。

找到正確的技術來嘗試:你不可能嘗試所有的東西,我最近發現了ThoughtWorks的技術雷達,它們把技術,工具,平臺,語言和框架分為四類:採用,嘗試、評估和保留。

Clean Code :簡潔優雅的代碼是最好的文檔,架構師一定得能區分開什麼是好代碼,什麼是壞代碼。有一本很好的書來介紹好代碼和壞代碼:

在可能的時候儘量自動生成文檔:對於一些較為詳細的文檔,由於系統變化迅速,很難及時更新,所以儘可能自動生成文檔:如果你是Model Driven的話可以從定義文件中自動生成文檔,SWagger 和RAML都是很好的起點。

該多就多,該少就少:無論是什麼文檔,在同一時刻只應該把注意力放在一件事情上,只包含這件事情的必要信息,額外的信息應該保留在附錄中,因為大量的文字是很難閱讀和理解的。 仔細看看你的文檔,問問自己:「為了理解整個東西,是不是所有的信息都在其中了?」 ,「哪些信息是必須的,哪些是可以忽略的?」

根據我的觀察,這是最被低估技能,如果你在設計方面特別出色,但是卻無法和別人溝通,你的想法就沒啥影響力,很可能失敗。

演講:向一個小組或大組做演講是一個架構師常見的工作,如果你剛開始覺得不舒服,可以從你的最好的朋友開始,慢慢擴大的更多的人,這件事只能通過不斷地實踐來學習, 是個需要花費時間的過程,還需要離開舒適區,所以要保持耐心。

找到正確的溝通級別:不同的人看待事物的角度是不同的,所以你需要在他們的級別和他們交流。比如開發人員對技術細節感興趣,經理更傾向於知道哪個選項更加省錢。

所以在溝通之前,你要看看你想交流的東西是不是在合適的級別,包括抽象度,內容,目標,動機等

經常溝通: 如果無人知曉,一個出色的架構毫無意義,要經常溝通你的架構設計以及背後的想法,定期在每個組織級別(小組,部門,公司)進行溝通,安排和開發人員,架構師,管理人員的會議,展示你的架構思路。

保持透明:定期溝通只能部分緩解缺少的透明度,你還得確保決策背後的原因透明化,特別是對那些不參加決策的過程的人,他們很難理解為什麼要這麼做,有什麼理由。

隨時準備好做一個演講:總會有人問架構師問題,你也想快速地給出正確答案,這該怎麼辦呢?你可以把最重要的PPT挑出來,放在一起,隨時展示並且給他們做展示,避免在一堆資料中找來找去,那樣會浪費太多時間。

理解基本的項目管理原則:作為架構師或者首席開發,你經常會被要求對你的設計進行估算:多長時間能完成?需要多少人?需要什麼技能?

剛開始,你可以提供粗略的估算:幾天,幾個月。請記住估算的時間可不僅僅是編碼實現,要有需求分析,測試,改正Bug。因此你需要知道軟體開發過程中的各個步驟。獲得更好估算的一個方法是基於歷史數據給出預測。如果你沒有歷史數據,可以試試COCOMO方法,如果你在做一個敏捷項目,這本書非常有幫助:

評估架構:作為一個架構師,你應該能夠架構設計在當前和未來上下文中的適應性,這件事不容易,你可以準備一組問題來對架構設計進行「質詢」,例如:

(1) 設計實踐: 架構遵循了哪些模式?是否正確地被使用了?是否有清晰的設計和關注點分離?

(2) 開發實踐: 制定代碼規範了嗎?被遵循了嗎?代碼有版本控制嗎

(3) 質量保證: 自動化測試的覆蓋率如何? 有靜態代碼分析到位了嗎? Peer review做到位了嗎?

(4) 安全: 架構設計中有哪些安全概念? 內置安全性如何? 滲透測試和自動化安全分析是否做到位?是否定期使用?

質量是有代價的:前面聊過系統質量和非功能性需求,如果你在架構設計上做得過度,就會增加開銷,降低開發的速度。你需要平衡架構設計和功能需求,過度設計應該被避免。

解決相互矛盾的目標:一個經典的例子就是短期目標 vs 長期目標。項目通常傾向於構建最簡單的方案,而架構師腦海中有長期的願景。通常,簡單的方案不適合長期的目標,並且有可能被丟棄(沉沒成本)。為了避免走向錯誤的方向,應該注意兩件事情:

(1) 開發人員和業務人員都需要理解長期的願景及其收益。

(2) 負責預算的經理也需要參與其中,了解財務影響。

衝突管理:由於團隊有著不同背景,衝突難免發生,為了找到一個相互能接受的、平衡的解決方案,架構師需要充當粘合劑,來解決這些衝突。關於溝通的理論,我是從Schulze von Thun的Four-Ears Model開始的:


擁有願景 :不管你是在一個什麼樣的項目中,不管是傳統的瀑布模型還是敏捷模型,你必須需要有一個願景,也就是你想獲得的短期和長期目標,並且清晰地傳遞給團隊成員。

由於不可能一下子達成所有的目標,我通常傾向於建立成熟度模型,讓團隊清楚地得知我們當前處於哪一級別。開發有很多方面,得使用不同的成熟度模型,例如開發實踐成熟度模型,持續交付成熟度模型。這些模型的每個級別都有清晰的定義,團隊可以輕鬆地度量自己在什麼級別。

對於持續交付,我個人傾向於這個模型


建立社區:例如,把JavaScript程式設計師和架構師組織起來,每個月討論一次,主題可以是如何解決過去和現在的技術挑戰,新的技術和方法。架構師可以分享、討論他們的願景,程式設計師可以分享他們的經驗,這樣的會議能幫助建立一個更強大的團夥,對企業和個人都極具價值。

進行開誠布公的討論:誤解和模稜兩可的根源是缺乏溝通,所以你可以安排一個固定的時間段,如每周30分鐘,和同伴交換一些熱門的話題,什麼都可以討論,不用刻意安排討論的議程。可以當場解決一些小事,對於複雜的主題,安排後續的跟進。

你的想法很棒,並且和大家做了很好的溝通,但是沒人願意去做,那可能是缺乏了營銷的技巧。

激勵並說服:公司是怎麼說服你購買他們產品的?他們肯定展示了價值和好處,但不僅如此,他們還做了漂亮的包裝,使其儘可能地容易消化

(1) 原型:帶界面的原型非常直觀,會很吸引人。有很多創建軟體原型的工具,如果你喜歡SAP的話可以事實build.me ,使用它可以輕鬆快速地創建漂亮的UI5應用。

(2) 視頻:  除了無聊的PPT之外,用一個視頻可以更好地展示你的想法。但是請不要過度營銷,從長期看,內容為王,如果你滿嘴跑火車,損傷的是你的聲譽。

捍衛你的想法並且堅持不懈:如果你真的對自己的想法深信不疑,你應該捍衛它,為之戰鬥,這是非常必要的,因為具備長期目標的架構決策是不容易被人接受的:開發人員不喜歡它因為開發起來太難, 經理不喜歡它因為短期來看代價太高。所以堅持不懈地去說服是你的本職工作。

找到同盟軍:獨自去建立並且執行你的想法幾乎是不可能的,你需要盟友的支持來說服別人。這時候需要使用你的社交網絡,如果你還沒有的話,馬上去建吧!

你可以先去和那些具備開放心態的同事去談你的想法, 如果他們喜歡(或者部分喜歡),當別人問起的時候,他們很有可能會支持你:X的想法很有趣。  如果他們不喜歡你的想法,問問為什麼,你是不是漏掉了什麼東西?你的故事不夠吸引人?

下一步就是找到具備決策權力的盟友,請求他進行一個開放的討論,如果你害怕這種討論,你需要反思一下,是不是應該離開舒適區了。

重複它,相信它:研究顯示重複的展示一個觀點會使人們相信這是一個普遍的觀點,即使該觀點僅僅來自一個人。如果你經常發過某個消息,更容易說服別人。但是要當心:應該明智地使用這種策略,因為它可能適得其反。

相關焦點

  • 信息架構初學者指南
    目錄什麼是信息架構?共同方法日常任務跟隨的人貿易工具會議和協會IA書籍什麼是信息架構?與許多其他領域相比,信息體系結構是一個更難定義的領域。與內容策略(由內容策略師完成)或互動設計(由設計者完成)不同,信息架構師很少被稱為職務。
  • 如何從軟體開發人員成長為軟體架構師
    從開發人員到軟體架構師的旅程是一條充滿挑戰和懷疑的艱難道路。許多開發人員從初級開始就發展為高級和團隊領導角色。但是,作為一名軟體工程師,有多個發展方向。在本文中,為您提供一些有關成為軟體架構師的想法。軟體架構師是一位軟體專家,負責對給定的數字產品做出有關系統設計,基礎結構和技術標準(包括語言,工具和平臺)的行政決策。軟體架構師設定願景並監督系統的構建。 此外,軟體架構師應該能夠共享技術遠景和技術指導,並根據軟體項目的要求進行計劃。
  • 前端架構師是打雜的麼?前端架構師的核心工作是什麼?
    , 直到聽了 winter 的分享, 結合這些年的經驗, 我突然意識到, 前端架構是有具體的抽象問題域的, 而不是簡單的用降低前端技術的複雜性來解釋, 在回答這個問題之前, 我想先說下客戶端軟體架構師 和 服務端架構師.
  • 架構師學習 java架構師學習需要具備哪些能力
    架構師學習 java架構師學習需要具備哪些能力2020/7/30 15:22:22 來源:法治中國 【字體:大 中 小】【收藏本頁】【列印】【關閉】核心提示:IT行業中沒有人對java不熟悉的,而java架構師是近年來很吃香的,想要進行架構師學習,需要專業的平臺進行系統性的學習才能掌握架構師必備的一些能力
  • 架構師多如過江之鯽,但你真的了解架構師這個工種嗎?
    在今天的網際網路圈,可能隨便遇到一個人遞給你一張名片,title就是某某架構師。
  • 架構師的工作都幹些什麼?!想做架構師必看!
    先給本文中架構師做個定義:第一,能力上達到(似乎是廢話),第二,公司肯承認,不僅能給架構師的頭銜,更能按架構師的標準發工資。對於程式設計師來說,架構師是職業發展的一道坎,如果跨過去了,後面就前途無量了,否則可能一直得做著代碼coding的事情。本文將從「如何升級」和「平時工作內容」兩方面,說下我對架構師的認識。
  • 論架構師的自我修養
    那麼,在出現什麼樣的問題的時候,我們可以將責任歸咎於架構呢?所以,現狀就是:架構師是一個很難做好的職業。但是,從某種意義上來說,又是一個非常容易混的職業。(當然,混是另一種需要持續修煉的高端技能。)因此,架構師也是特別需要強調自我修養與職業道德的職業。什麼是架構?什麼是架構師?
  • 什麼是架構師?有何作用,成為一名架構師需要具備怎樣的能力?
    在比爾· 蓋茨的眾多稱謂中,據說他更偏愛「首席軟體架構師」。同樣,在網易創始人丁磊名字前,也有「首席架構師」這樣的稱謂。由此可見,對於企業來說,架構師就是靈魂的創造者。所以架構師的影響真的是不一般的,而且不僅僅如此。
  • InfoQ:手機QQ瀏覽器架構師將解讀X架構
    2012年8月10日至12日,InfoQ將於深圳大梅沙的萬科國際會議中心召開ArchSummit全球架構師峰會,三天的會議,將有超過40名國內外講師到場。
  • 你是一名軟體架構師嗎?
    架構師是一個角色,而非級別。這是一個演進的過程,在這個過程中你會不斷獲得承擔架構師角色所需的經驗與自信。架構師身上有許多不同的品質,而他們過去的經驗通常是承擔這個角色所需能力的一種很好的度量。架構師角色包括很多方面,因此需要在更深的層次地去理解架構師在不同方面展現出來的參與度、影響力、領導力和責任。
  • 從質量的視角思考架構師的工作
    這樣來看,功能性、可靠性和易用性,其實不就是應用架構師的職責麼;效率、維護性和可移植性不就是系統架構師職責麼?從系統的維度,負責整體系統的架構設計,主要是基礎服務和各系統間協調上,著眼全局不太注重某個應用本身架構,比如關注伺服器負載,可靠性,伸縮,擴展,資料庫切分,緩存應用等方面的基礎架構設計。當然,現實中的架構師往往會身兼數職,而不僅僅是構思架構本身。比如,大部分軟體架構師也會組織軟體團隊、進行一些相關研究,甚至擔負一些行政管理的工作,在此不再延伸贅述。
  • 「架構師專題」雲原生時代,架構師需具備的十大核心能力(上)
    10 年多的工作歷程,讓我有幸經歷了大範圍的技術演變,特別是雲計算和雲原生技術從朦朧到普及,對工程師和架構師的要求也發生了不少變化。趁著自己入職 11 周年的日子,結合我自己在百度的成長曆程,總結下我認為在雲計算特別是雲原生時代,對軟體架構師的核心能力要求,希望幫助大家在通往架構師的路上少走彎路。
  • 在首席架構師眼裡,架構的本質是…… - OSCHINA - 中文開源技術...
    編者按:本文作者王慶友,前 1號店首席架構師,先後就職於 ebay、騰訊、1號店、找鋼網,精通電商業務,擅長複雜系統業務建模和架構分析,目前在中國 B2B 第一電商公司找鋼網擔任首席架構師架構也是如此,如果能領悟架構的本質,就不會拘泥於現有的實踐和理論框框,而以最直接的方式解決問題,無招勝有招。本文的內容包括架構的本質、架構的服務對象、架構師能力模型 、架構境界等。架構的本質任何系統,自然情況下,都是從有序到無序,這是有科學依據的, 按照熱力學第二定律,自然界的一切自發過程都有方向性,一個孤立系統會由有序變為無序,即它的熵會不斷增加,最終寂滅。
  • 架構師培訓內容有哪幾方面
    原標題:架構師培訓內容有哪幾方面不想當架構師的程式設計師不是好碼農,於是架構師的培訓學習被提上了日程,畢竟想要成為架構師不下功夫是不行的,那麼我們在平臺上進行架構師培訓時都有哪些內容要學習呢?
  • 阿里技術大牛:一份架構師成神路線圖!
    架構師職責架構師不是一個人,他需要建立高效卓越的體系,帶領團隊去攻城略地,在規定的時間內完成項目。架構師需要能夠識別定義並確認需求,能夠進行系統分解形成整體架構,能夠正確地技術選型,能夠制定技術規格說明並有效推動實施落地。
  • 《程式設計師必讀之軟體架構》作者Simon Brown:架構師與程式設計師的區別
    自2008年以來的7年時間裡,Simon在全球28個國家做過有關軟體架構、技術領導力及其與敏捷的平衡等主題的百餘場演講,並於2012年8月在中國舉辦的ArchSummit全球架構師峰會上以「鬱悶的架構師」和「如何設計安全的架構」為主題發表演講,深受與會者好評。Simon已為全球20多個國家的軟體團隊提供諮詢和培訓,他的客戶既有小型技術初創企業,也不乏全球家喻戶曉的品牌公司。
  • 架構師成長之路:分布式系統綜述
    作為一個資深架構師,一路走來,發現自己的技術水平很多時候其實是隨著項目的發展被迫成長的。其實,很多時候,自身水平達不到能順利完成架構項目的水平,但是,為了挑戰,為了技術成長,更是為了高薪資,只能咬牙堅持,熬夜學習,最終讓自己能順利設計和把控項目的架構。其中,最為艱難的,就是去設計、架構、規劃一整套,規模大的分布式系統。
  • 編程架構師需要具備哪些特點
    在網際網路行業中,編程架構師需要具備哪些特點呢?Java架構師在網際網路行業中是一個不錯的方向,在不久的將來我們的日常生活也會被大數據引導,生活也會更加方便。編程方面的人才會變得越來越重要,這個職業主要是針對大數據平臺程序架構進行設計,做開發構架規範,進行核心代碼的編寫。
  • AS全球架構師帶你迎接科技拐點,「架構」新時代
    2019年7月12日,千萬IT人期待已久的「ArchSummit全球架構師峰會(深圳站)2019」火熱開啟。一直以來,InfoQ享有全球較高的技術領域影響力,此次Archsummit全球架構師峰會也正是由極客邦科技infoQ中國舉辦。
  • 架構師成長計劃|如何利用雲原生構建一個企業級高可用架構?
    如何利用雲原生實現企業級高可用架構呢?如果你正在思考、探究,亦或被雲原生的落地問題所困擾,那麼,這場技術課程一定不能錯過!!AWS 首席開發者布道師費良宏帶你探索雲原生的更多可能本期英特爾與 Science 聯袂推出的「架構師成長計劃」系列課程的主題,是由 AWS 首席開發者布道師費良宏帶來的——《雲原生架構設計和高可用架構》。