今天給你們帶來一篇本身翻譯的乾貨《軟件架構師之路》。本週Github上升很快的項目。其內容對致力於成爲軟件架構師(不論先後端)的同窗應該都會有極大的幫助。
項目地址:
中文地址 https://github.com/gamedilong...git
原文地址 https://github.com/justinamil...github
若是有看完英文原文,發現本文翻譯內容中存在問題或者錯誤的歡迎到中文Git地址PR,如可以對你們起到必定的幫助也歡迎star數據庫
內容
什麼是軟件架構?
- 軟件架構師是一名軟件開發專家,他能夠進行高層設計選擇並決定技術標準,包括軟件編碼標準,工具和平臺。
(出處: 維基百科:軟件架構師)編程
- 軟件架構(architecture)是一個系統的基本組織,由其組件、它們之間的相互關係和環境以及決定系統設計和演化的原則來表示。
(出處: 軟件架構手冊)後端
軟件架構的層次
軟件架構能夠被抽象的分爲幾個層次,不一樣的層次對技能的要求不一樣。對層次有不少不一樣的劃分,我最喜歡以下這三種劃分:設計模式
- 應用級: 最低層次的架構。聚焦單個具體的應用。 很是注重細節, 底層設計。 溝通僅限入單個開發團隊。
- 解決方案級: 中級別的架構. 聚焦解決業務需求(業務解決方案)的一個或多個應用。進行一些高層次可是主要以低層次的設計爲主,須要在多個開發團隊之間的溝通。
- 企業層級: 最高級別的架構。專一於多種解決方案。高層次的抽象設計,須要將解決方案對應用架構師進行詳細說明。 須要在整個組織溝通。查看 連接 得到更多相關信息。
有時架構師也被看做是不一樣利益相關者之間的「粘合劑」。 三個例子:api
- 水平方向: 架起業務與開發人員或不一樣開發團隊之間的溝通橋樑。
- 垂直方向: 架起開發人員和管理人員之間的溝通橋樑。
- 技術方向: 不一樣的技術棧或應用程序的集成和融合。
軟件架構師的典型工做內容
要了解架構師所需的必要技能,咱們首先須要瞭解架構師平時主要幹什麼。如下是我認爲最重要的一些工做內容:安全
軟件架構師的重要技能
爲了支撐上述工做須要不少重要的能力。就我我的的經驗,每一個軟件架構師應該具有以下十項技能:架構
- 設計能力
- 決策能力
- 化繁爲簡能力
- 編碼能力
- 文檔架構能力
- 溝通能力
- 評估能力
- 平衡能力
- 指導、答疑能力
- 營銷能力
(1) 設計能力
什麼是好的設計?這多是最重要和最具挑戰性的問題。要把理論和實踐區別開來。根據個人經驗,二者兼而有之是最有價值的。讓咱們從理論開始:
- 瞭解基本的設計模式: 設計模式是架構師設計開發可維護、可擴展系統的一項最重要工具。經過設計模式你能夠設計解決通用問題的可重用方案。 由John Vlissides,Ralph Johnson,Richard Helm,Erich Gamma撰寫的《設計模式:可重用面向對象軟件的要素》一書每一個從事軟件開發的人都有必要閱讀一番。儘管上述模式發佈於20多年前,其仍然是現代軟件架構的重要基礎。例如,本書描述了模型-視圖-控制器(MVC)模式,該模式應用於許多領域,也是一些新模式(如MVVM)的基礎。
- 深耕模式和反模式: 若是你已經知道了全部的基本GoF模式,那麼能夠用更多的軟件設計模式擴展你的知識. 或者深刻你感興趣的領域。我最喜歡的應用程序集成相關的內容之一是Gregor Hohpe編寫的「企業集成模式」一書。本書適用於兩個不一樣環境的應用程序須要交換數據時,不管是一些傳統系統的舊式文件交換仍是現代微服務體系結構。
- 瞭解質量測量: 定義架構遠不是終點。指引手冊和編碼標準的定義、應用和管理是有緣由的,這麼作是由於質量和非功能性需求。你想擁有一個可維護、可靠、可適應、安全、可測試、可擴展、可用等的系統,而實現全部這些質量屬性的一個方法就是應用好的架構工做。你能夠在維基百科上了解更多關於質量衡量的信息。理論很重要。若是你不想成爲一名站在空中樓閣上的架構師,那麼實踐一樣重要,甚至更重要。
- 嘗試瞭解不一樣的技術棧: 這是成爲一個更好的架構師的一項重要工做。嘗試新的技術棧並至上而下的學習他們。不一樣的技術能夠給你帶來不一樣的設計理念和模式。對新技術的學習最好不要浮於表面,應該去多實踐深刻感覺解決的痛點和其存在的問題。架構師不只須要涉獵普遍,在某些領域也要有深厚的知識。 固然並不須要掌握全部的技術,你須要對你所在領域最核心的技術有紮實的瞭解。 你也能夠嘗試其餘領域的技術,例如, 若是你深刻SAP R/3,你就應該也去嘗試一下JavaScript,反正亦然。時刻保持好奇心並付諸實踐。還能夠去試一些你討厭了不少年的技術。
- 分析和理解應用模式: 看一下當前的任一比較流行的框架,例如Angular。 能夠在實踐中研究不少模式,例如「觀察者模式」。 嘗試瞭解它如何在框架中應用,爲何要這樣作。 若是真的頗有時間且認真,能夠更深刻地瞭解代碼並瞭解其實現方式.
- 加入一些用戶組. Meetup
(2) 決策能力
架構師須要可以作出決策並將項目或整個組織引導到正確的方向。
(3) 化繁爲簡能力
請記住Occam剃刀的解決問題的原則,它表示更喜歡簡單。我把這個原則解釋爲:若是你對這個問題有太多的假設要解決,那麼你的解決方案多是錯誤的,或者致使沒必要要的複雜解決方案。爲了獲得一個好的解決方案,應該減小(簡化)假設。
爲了簡化解決方案,從不一樣的位置角度評估它們一般有助於清理、規整解決方案。嘗試經過自上而下和自下而上的思考來造成解決方案。若是您有一個數據流或進程,那麼首先考慮從左到右,再從右到左。能夠提出一些問題,好比:「在一個完美的世界裏,你的解決方案會怎麼樣?或者:「X公司/我的會怎麼作?「(其中X可能不是你的競爭對手,而是BAT(百度、阿里、騰訊)之一。)這兩個問題都迫使你減小Occam的Razor建議的假設。
通過激烈和長時間的討論,得出的結果每每是高度複雜的草案。你永遠不該該把這些看做是最終的結果。退一步:再看一眼大局(抽象層面)。仍是有意義的嗎?而後在抽象的層次上再進行一次重構。有時,中止討論並在次日繼續討論會有幫助。至少個人大腦須要一些時間來處理和想出更好、更優雅和更簡單的解決方案
- 分而治之: 把問題分紅小塊來簡化。而後獨立解決。而後驗證這些小塊是否匹配在一塊兒。退一步看一下這個的總體狀況。
- 重構不是壞事: 若是找不到更好的主意,從更復雜的解決方案開始徹底能夠。若是解決方案遇到麻煩,您能夠稍後從新考慮解決方案並應用您的學習。重構不是邪惡的。 可是在開始重構以前,請記住要進行如下工做:(1)進行足夠的自動化測試,以確保系統的正確功能;以及(2)從利益相關者的支持。 要了解有關重構的更多信息,建議閱讀<<重構。 改進現有代碼的設計>>,做者是Martin Fowler。
(4) 編碼能力
即便做爲一個企業級架構師,最抽象的架構層次,你仍然應該知道開發人員天天都在作什麼。若是你不明白這是怎麼作到的,你可能會面臨兩大問題:
- 開發者不會接受你的嘴炮。
- 不瞭解開發人員的實踐需求和麪臨的困難.
(5) 文檔架構能力
架構文檔有時更重要,有時則不重要。重要的文檔例如體系結構決策或代碼指南。在開始編碼以前一般須要初始文檔,而且須要不斷改進。其餘文檔能夠自動生成,由於代碼也能夠是文檔,例如UML類圖。
- 代碼整潔: 若是作對的話,代碼是最好的文檔。 一個好的架構師應該可以區分好的代碼和壞的代碼。 羅伯特·C·馬丁(Robert C. Martin)所著的<<代碼整潔之道>>一書是瞭解更多關於好壞代碼的寶貴資源。.
- 儘量生成文檔: 系統變化很快,很難更新文檔。不管是關於api仍是以CMDBs(配置管理數據庫)形式出現的系統環境:底層信息一般變化太快,沒法手動更新相應的文檔。例如:對於api,若是您是模型驅動的,則能夠基於定義文件自動生成文檔,或者直接從源代碼生成文檔。有不少工具存在,好比Swagger和RAML是一一些不錯的初始選擇。
- 必要而精簡:不管您須要記錄什麼文件(例如決策文件),都應嘗試一次只關注一件事,而且僅包含關於這件事的必要信息。 大量的文檔很難閱讀和理解。 附加信息應存儲在附錄中。 特別是對於決策文件,講一個有說服力的故事而不是僅僅發表大量論據,更爲重要。 此外,這爲您和您的同事節省了不少時間,然後者須要閱讀。 看看您過去作過的一些文檔(源代碼,模型,決策文件等),而後問本身如下問題:「是否包含全部必要的信息才能理解它?」,「確實須要哪些信息,而且 能夠省略嗎?」和「文檔中是否有紅線?」。
- 瞭解有關架構框架的更多信息: 該點也能夠應用於全部其餘「技術」點。 我把它放在這裏,是由於TOGAF或Zachmann之類的框架正在提供「工具」,這些工具在文檔站點上感受很沉重,儘管它們的附加值並不限於文檔。 在這樣的框架中得到認證能夠教會您更系統地解決體系結構。
(6) 溝通能力
根據個人觀察,這是最被低估的技能之一。若是你在設計上很聰明,但不能傳達你的想法,你的想法可能會影響較小,甚至沒法成功。
在會議上進行協做時,知道如何正確的溝通傳達你的想法,將其同步到你的同行是相當重要的。 我發現《 UZMO-用筆思考》是提升我在這一領域技能的好資源。 做爲架構師,你一般不只會參加會議,並且一般須要主持並主導會議。
- 大型的演講: 將你的想法呈現給小型或大型團體應該對您來講可行。 若是對此感到不舒服,請開始向你最好的朋友介紹。慢慢擴大小組。 這是你只能經過離開本身的溫馨區來學習的東西。 請耐心等待,此過程可能須要一些時間。
- 找到合適的溝通方式: 不一樣的利益相關者有不一樣的利益和觀點。它們須要在各自的層面上用不一樣的方式單獨解決。在你交流以前,退後一步,檢查你想分享的信息是否有正確的層次,關於抽象性、內容、目標、動機等。例如:開發人員一般對解決方案的很是小的細節感興趣,而經理則更喜歡知道哪一個選項能節省最多的錢。
- 常常溝通: 若是沒有人知道,再香的架構也是毫無心義的。按期在每一個組織級別上分發目標體系結構及其背後的思想。安排與開發人員、架構師和管理人員的會議,向他們展現所需或定義的方式。
- 透明: 按期交流只能部分緩解缺乏的透明度。 您須要使決策背後的緣由透明化。 特別是,若是人們不參與決策過程,則很難理解和遵循其背後的決策和理由。
- 隨時準備發表演講: 總有人有疑問,你想立刻給出正確的答案。儘可能把最重要的幻燈片放在一個統一的集合裏,你能夠展現和解釋。它爲你節省了不少時間,也給你本身帶來了安全感。
(7) 評估能力
做爲架構師或首席開發人員,您常常被要求估算實現您的想法:多長時間、多少人、多少人、哪些技能等。?固然,若是你計劃引入新的工具或框架,你須要對這些「管理」問題有一個答案。最初,你應該可以給出一個粗略的估計,如天,月或年。別忘了,它不只僅是關於實現,還有更多的因素要考慮,好比需求管理、測試和Bugfix。所以,您應該瞭解所使用的軟件開發過程當中的工做。經過過去的使用數據,你能夠獲得更好的評估,並從中得出你的預測。若是你沒有過去的數據,你也能夠嘗試一些方法,如巴里W鮑姆的COCOMO。若是你被分配在一個敏捷項目中,學習如何正確地進行評估和計劃:Mike Cohn的《敏捷評估和計劃》一書提供了這個領域的一個堅實的概述。
(8) 平衡能力
- 質量是有代價的: 早些時候我談到了質量和非功能性需求。若是過分使用架構,將會增長成本,並可能下降開發速度。你須要平衡架構和功能需求。應避免過分設計。
- 解決矛盾目標:
矛盾目標的典型例子是短時間和長期目標。項目每每傾向於構建最簡單的解決方案,而架構師考慮的是長期的遠景。一般,簡單的解決方案不適合長期的解決方案,而且有可能在之後被丟棄(沉沒成本)。爲了不實施方向錯誤,須要考慮兩件事:
- 開發人員和業務部門須要瞭解長期願景及其好處,以便調整其解決方案。
- 負責預算的經理須要參與進來,以瞭解財務影響。不必定要把100%的長遠眼光直接放在適當的位置,但開發出來的成本大致在預算範圍內。
- 衝突管理: 架構師每每是不一樣背景的多個羣體之間的粘合劑。這可能會致使不一樣層次的溝通衝突。爲了找到一個平衡的解決方案,同時也反映長期的戰略目標,架構師的角色每每是幫助克服衝突。 關於傳播理論的起點是舒爾茨·馮·圖恩的「四耳模型」。 基於此模型,能夠顯示並推論不少。 可是,該理論須要一些實踐,在交流研討會上應該有經驗。
(9) 指導、答疑能力
在諮詢和輔導方面,積極主動多是最好的選擇。若是有人問你,那就太晚了。架構重構是儘可能要避免的。你須要以某種方式預見將來幾周、幾個月甚至幾年,併爲下一步作好準備。
- 有遠見: 若是你參與在一個項目中,不管是傳統的瀑布式方法仍是敏捷方法,你始終須要對要實現的中長期目標有一個願景。 這不是一個詳細的概念,而是針對每一個人均可以落地的路線圖。 因爲沒法一次完成全部工做(這是一段旅程),所以我更喜歡使用成熟度模型。 它們給出了易於使用的清晰結構,而且每次都給出了當前的進度狀態。 對於不一樣的方面,我使用不一樣的模型,例如 開發實踐或持續交付。 成熟度模型中的每一個級別都有明確的要求,這些要求遵循SMART準則,以便輕鬆衡量是否已達到要求。 我發現一個很好的例子是持續交付。
- 創建實踐社區(CoP): 在一個共同興趣小組之間交流經驗和知識有助於分發思想和標準化方法。 例如,你能夠每三個月左右將全部JavaScript開發人員和架構師彙集在一個房間中,討論過去和當前的挑戰以及如何解決它們或採用新的方法論和方法。 架構師能夠共享,討論和調整其願景,開發人員能夠共享經驗並向同行學習。 這樣的交流不只能夠爲企業帶來極大的好處,並且對我的自己也很是有利,由於它有助於創建更強大的網絡並傳播思想。 還能夠查看SAFe框架中的文章實踐社區,該文章在敏捷環境中解釋了CoP概念。
- 進行公開會議: 誤解或模棱兩可的一個緣由是缺少溝通。在固定的時間段內,例如每週30分鐘,與同事交流熱門話題。此次會議沒有議程,一切均可以討論。儘可能當場解決小事。安排對更復雜主題的跟進。
(10) 營銷推廣
你的想法很好,你已經很好地溝通了,可是仍然沒有人願意追隨?那麼你可能缺少營銷技巧。
但請不要過分營銷:從長遠來看,內容是王道。若是你的話沒有實現,從長遠來看,這將損害你的聲譽。
有些時候人們不喜歡你的想法,或者他們太懶了,不喜歡你的想法。若是你真的被本身的想法所說服,你就應該不斷地去追求它們,並「戰鬥」。有時這是必要的。具備長期目標的架構決策一般不是最簡單的:開發人員不喜歡它們,由於它們更復雜。經理們不喜歡他們,由於他們在短時間內更貴。這是你的工做,你要堅持和談判。
- 尋找盟友: 創建或執行你本身的想法多是困難的,甚至是不可能的。努力尋找可以支持和幫助說服他人的盟友。使用你的網絡。若是你尚未,如今就開始建造它。你能夠先和你的(思想開放的)同齡人談談你的想法。若是他們喜歡,或者至少部分喜歡,若是別人問他們,他們極可能會支持你的想法(「X的想法頗有趣。」)。若是他們不喜歡,問爲何:也許你錯過了什麼?或者你的故事不夠有說服力?下一步是找到有決策權的盟友。要求開誠佈公的討論。若是你懼怕討論,記住有時候你須要離開你的溫馨區。
- 重複一遍,相信它: 「[…] 研究代表,反覆接觸某個觀點會令人們相信該觀點更爲廣泛,即便該觀點僅來自一我的也是如此。」(來源:《金融品牌》)若是您常常發佈不多的信息,則能夠幫助您 說服人們更容易。 但請注意:從個人角度來看,應該明智地使用這種策略,由於它可能拔苗助長,成爲糟糕的營銷技巧。
架構師的技術路線圖
相關書籍
- Refactoring. Improving the Design of Existing Code by Martin Fowler
- Enterprise Integration Patterns written by Gregor Hohpe
- Design Patterns: Elements of Reusable Object-Oriented Software by John Vlissides, Ralph Johnson, Richard Helm, Erich Gamma
- Experience and Knowledge Management in Software Engineering by Kurt Schneider
- Clean Code by Robert C. Martin
- UZMO — Thinking With Your Pen
- Agile Estimating and Planning by Mike Cohn