9年當上架構師,我的很多想法變了

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"軟件架構師至今仍被不少人視爲軟件行業的“新興職業”,網上時不時有關於如何成爲軟件架構師的文章,今天我們想分享的則是一位開發者在成爲架構師後學到的重要東西。Tago Fabic有十多年開發經驗,在2019年開始成爲軟件架構師,他近日寫了一篇文章,總結自己在成爲軟件架構師後的所獲所得和心路歷程,以下是他的分享。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在成爲架構師之前,我從軟件開發工程師做到了技術負責人。但就我而言,架構師這個角色並不是一個管理角色:沒有一個人或一個團隊向我彙報,因此,我在技術主管一職中所發揮的一些關鍵能力在這裏並不適用,不過其中有些部分可以適用(例如,指導等)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這類角色的複雜性的確是因組織而異,於我而言,我認爲應該首先確定什麼是軟件架構師,以避免產生混淆。爲此,我們主要依靠 "},{"type":"text","marks":[{"type":"italic"}],"text":"The Software Architect Elevator"},{"type":"text","text":"(暫無中譯本,本文暫譯爲《軟件架構師電梯》)一書作者 "},{"type":"link","attrs":{"href":"https:\/\/architectelevator.com\/","title":"","type":null},"content":[{"type":"text","text":"Gregor Hohpe"}]},{"type":"text","text":" 提出的概念。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(架構師是那些)在大型組織或複雜項目中將架構、技術細節、業務需求和人員聚集在一起的人。——Hohpe"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Adevinta公司首席架構師 "},{"type":"link","attrs":{"href":"https:\/\/www.obren359.com\/","title":"","type":null},"content":[{"type":"text","text":"Željko Obrenović,"}]},{"type":"text","text":"和一位同事(我將他視爲導師)在我們去年的一個峯會上提出了"},{"type":"link","attrs":{"href":"https:\/\/www.enterpriseintegrationpatterns.com\/ramblings\/88_moviestararchitects.html","title":"","type":null},"content":[{"type":"text","text":"架構師是“超級膠水”"}]},{"type":"text","text":"的概念。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Željko 在內部峯會上通過“電梯”的比喻對Hohpe的那句話做了精彩的闡述和分享,以讓大家能更深入地理解(我重繪了一小部分,但概念是相同的)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/14\/14a8661cd3b6752baadc41d0768b945a.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"確認了這個基本概念之後,下面我將繼續核心收穫的分享。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"轉換思維——戰略先行、執行隨後"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在擔任軟件架構師的幾個月中,我需要不斷提醒自己的一件事是,架構師的職責與我以前的角色(技術負責人)的目標有所不同。這兩個角色雖然有很多重合之處,側重點卻大相徑庭。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"身爲團隊中肩負交付任務的技術負責人,當時我的主要目標之一就是確保團隊儘可能有效地履行其承諾,完成任務。我可以把燃盡圖(用於表示剩餘工作量的工作圖表)看做是衡量每個人工作效率的標準,然後自豪地寫下Sprint報告,介紹團隊兩週內的勝利、學習成果和趨勢。而當成爲架構師之後,我需要“從戰壕後退幾步”,才能更宏觀地看到我們向前走的地平線究竟在哪。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"成爲一個團隊的技術負責人是我的“舒適區”——我知道如何去做、怎麼進步,但是架構師需要轉換思維——積極分配時間進行諮詢(沿着各個“電梯”層),着眼於一年、兩年或三年之後的情況,並且清楚地把它闡述出來,以讓每個人都在同一個軌道上前行。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"架構決策記錄用於討論而非批准"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們的團隊採用了架構決策記錄(Architectural Decision Record,ADR)的編寫方式,這確實是我近年來在我們組織中看到的很好的工作變革方式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲什麼這麼說呢?讓我來描述一下采用架構決策記錄之前的情況:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"面對被稱爲微服務的新世界,開發團隊會硬着頭皮開始向左、向右和中心去旋轉服務(包括我在內)。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"當團隊壯大時,應用程序就變成了一個服務森林。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"好幾次,不同的團隊會推出新的服務,但是卻發現它已經重複了另一個服務的目的(或未來的目的),而這個服務是幾個月前創建的、並還在不斷髮展和成熟。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":4,"align":null,"origin":null},"content":[{"type":"text","text":"同樣有幾次,工程師們(包括我自己)會在首次發佈後就停下來,然後繼續下一個服務,而不去做其他必要的管理工作(例如學習如何監控和警報等等)。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"步入架構決策記錄時代"},{"type":"text","text":":爲什麼 ADR 受到我們工程師的青睞?因爲它爲工程師提供了一個工具,使他們能夠盡職地考慮決策的後果,並就組織中不同的專業領域進行有價值的對話。這使工程師們可以清楚地說明他們是怎樣做決定的,比如他們探索了什麼,卻又爲什麼最終認爲這並不是最佳的前進方式等等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在我們採用 ADR 的初期,每一條記錄幾乎都是一件大事:有人將提出將ADR進行面對面的討論,由 20 多名工程師組成的小組就細節進行討論和辯論,我們發現自己在整個會議的一個小時裏都在討論一條記錄。我們知道這種方法不會變得規模化,因此我們轉向 RFC 類型的、代碼審查式的審查,而且這樣做看起來更好。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"像所有其它事情一樣,我們也在不斷地調整這一過程。由於架構決策的結果,我們不希望讓ADR成爲實際交付的瓶頸,因此我們就拉取請求(Pull Requests)中 +1 的最低數量達成了共識。就是說,ADR 不尋求批准,而是針對不同課題做有效討論。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"}],"text":"有一點提示:偶爾,ADR編寫者可能會因爲在決策過程中添加一些並不真正需要的信息而使記錄過長,那麼可以設定一個預期,即ADR不是一個程序規範而是一份指南(也不是標準文檔)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在我看來,沒有什麼是天生不好的決定。只有不徹底、不夠充分的決定。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面羅列一些有關ADR的優秀參考資料:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"來自 Cognitect 的《"},{"type":"link","attrs":{"href":"https:\/\/cognitect.com\/blog\/2011\/11\/15\/documenting-architecture-decisions","title":"","type":null},"content":[{"type":"text","text":"記錄架構決策"}]},{"type":"text","text":"》("},{"type":"text","marks":[{"type":"italic"}],"text":"DOCUMENTING ARCHITECTURE DECISIONS"},{"type":"text","text":")"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"來自 BetterProgramming 的《"},{"type":"link","attrs":{"href":"https:\/\/betterprogramming.pub\/here-is-a-simple-yet-powerful-tool-to-record-your-architectural-decisions-5fb31367a7da","title":"","type":null},"content":[{"type":"text","text":"一款簡單而強大的工具來記錄你的架構決策"}]},{"type":"text","text":"》("},{"type":"text","marks":[{"type":"italic"}],"text":"A Simple but Powerful Tool to Record Your Architectural Decisions"},{"type":"text","text":")——他們稱之爲 LADR(Lightweight ADR,輕量級 ADR),但是我們使用的格式類似。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《軟件架構基礎》("},{"type":"text","marks":[{"type":"italic"}],"text":"Fundamentals of Software Architecture"},{"type":"text","text":")一書也有一個關於架構決策記錄的好章節。"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"“這要視具體情況來看”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"試想還是初級開發者的我要是穿越到現在,向現在的我尋求一些關於解決方案的意見,而現在的我會總說“這要視具體情況來看”,那年輕的我肯定對此會翻白眼,哈哈。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不過這是事實,你接觸到的解決用戶問題的各種方案和方法越多,你就越瞭解一個組織的成功案例可能在某個環境中行得通,也可能行不通(就像我們現在聽到 “速贏” 或 “唾手可得的果實” 或流行語時產生的感覺一樣)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在“這要視具體情況來看”的回答之後,確實有一些開放的問題,以便進一步豐富這項建議的背景和理由。你認爲數據庫查詢的意圖是什麼,或者緩存層是否有好處?需要的數據有多實時呢?認識到不存在銀彈(不管是在解決方案上,還是在運作方式上),總能使問題的解決變得更生動、富有創造力。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"完美是不切實際的"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼並不“關心”它的內聚或解耦程度;人們纔會關心。——"},{"type":"link","attrs":{"href":"https:\/\/www.computer.org\/csdl\/magazine\/so\/1999\/05\/s5040\/13rRUyYBll0","title":"","type":null},"content":[{"type":"text","text":"James Coplien"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"解決方案的完美之處在於接受或者承認,在某些時候,計劃\/投資的改變並沒有給最終用戶帶來更多價值。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"分解單體應用也是如此。我最喜歡的 Kelsey Hightower 的一條"},{"type":"link","attrs":{"href":"https:\/\/twitter.com\/kelseyhightower\/status\/1242887995104964609","title":"","type":null},"content":[{"type":"text","text":"推文"}]},{"type":"text","text":"是這樣寫的:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很榮幸能在 @thenewstack 的 Context 播客上與 @el-bhs 辯論。雖然對單體和微服務存在爭議,但是最終,我們都認爲這兩種架構模式都可以工作,而且對於複雜的組織而言,兩者的混合是不可避免的。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/32\/324ced3363f82600f5eae7b3a8fe0836.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"簡言之,優雅的解決方案始終是適合客戶\/最終用戶需求的解決方案。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"真相存在於代碼中,而非文檔中(或 JIRA Ticket 中,請注意這點!)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這一點,我想確實沒有什麼可解釋的。我們知道文檔會過時,但是我們知道,一個合適且充分的文件還是有必要的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我發現自己通常從文檔開始瞭解情況,然後在代碼中進行驗證,以確定它是否描述了一個準確的“故事”。如果不是,就在必要的時候更新文檔。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有很多策略或建議可供使用來"},{"type":"link","attrs":{"href":"https:\/\/www.nicereply.com\/blog\/documentation-up-to-date\/","title":"","type":null},"content":[{"type":"text","text":"保持文檔最新"}]},{"type":"text","text":",但是最近我發現自己正在構建 Tiny 代碼(非常感謝 GitHub API),它從代碼本身提取信息來收集真相,或者依賴 "},{"type":"link","attrs":{"href":"https:\/\/kiali.io\/","title":"","type":null},"content":[{"type":"text","text":"Kiali"}]},{"type":"text","text":" 等工具的報告來實現流量與應用之間協作的可視化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/01\/01ee7d57b0b6aee3357ad3dca1050b63.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"來自 Kiali 網站的屏幕截圖。能看到流量,這很不錯,並且它還提供了更多信息,比如每個箭頭的延遲等。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"白板會議激發了歡樂(以及驚人的想法和觀點)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/e2\/68\/e2cfee99db4380b2868bcf27d6702168.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":10}}],"text":"就連 Maria Kondo 也認爲她所指的白板可以激發快樂。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"大部分時間裏,我發現自己"},{"type":"link","attrs":{"href":"https:\/\/sketchplanations.com\/rubberducking","title":"","type":null},"content":[{"type":"text","text":"變成了一隻大黃鴨"}]},{"type":"text","text":"(Rubber Duck),工程師們可以在我這擴展或者驗證他們頭腦中的想法。(不是說我一直都是一個沒有生命的物體,如果我們對這個定義有點學究氣的話,哈哈)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我確實很懷念這場疫情爆發之前的一些事情,比如快速的白板會議,可以讓我和工程師們一起充實項目或者想法。我們先用 Slack 進行初步的討論,然後都跑到附近的白板上畫畫並討論解決方案。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"開始居家工作之後,把這個方式變成在線對我來說非常重要——像 "},{"type":"link","attrs":{"href":"http:\/\/miro.com\/","title":"","type":null},"content":[{"type":"text","text":"Miro"}]},{"type":"text","text":"、"},{"type":"link","attrs":{"href":"https:\/\/www.mural.co\/","title":"","type":null},"content":[{"type":"text","text":"Mural"}]},{"type":"text","text":"、"},{"type":"link","attrs":{"href":"https:\/\/excalidraw.com\/","title":"","type":null},"content":[{"type":"text","text":"Excalidraw"}]},{"type":"text","text":"這些工具,甚至是空白的谷歌幻燈片也行。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/7a\/7a1e12f9cbb2ea1dbfb36d67da19ff5b.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"我的個人“大黃鴨”,給它取了個名字“Arthur”。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"成爲一名翻譯和溝通者所需的創造力"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後,我學到的另一件很酷的事情就是,成爲架構師能夠將技術思想或概念進行翻譯,並將其傳遞給非技術受衆。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然我習慣於不斷向技術團隊分享計劃或解決方案,但要讓其他人也參與進來,我需要採取不同的方法。背景,背景,以及更多的背景,思考什麼對你的聽衆很重要(例如,財務團隊不需要知道項目時間表的細目,所以你只需要給一個非常快速的涵蓋里程牌事件的幻燈片,但是要專注於明年的預算要花多少錢等等)。這些年來,我發現自己在演講方面變得更具有創造性:不僅僅是視覺上的,還有如何傳達每一次演講背後的故事。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“你所說的每一句話都會影響到某人,所以要注意你所說的每一句話,”這句話是我幾年前參加領導力培訓時獲知的,這話非常明智,但是我還想補充一點:要知道如何“翻譯”它。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"PS:分享一些我曾經接觸過的書籍\/參考,這些都是我作爲軟件架構師的成長過程中接觸到的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/34\/34a91c6468321a2a2aa2ba113d74e6b9.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.gallup.com\/cliftonstrengths\/en\/strengthsfinder.aspx","title":"","type":null},"content":[{"type":"text","text":"Strengths Finder 2.0"}]},{"type":"text","text":":這本書(以及相應的調查問卷)是我在幾年前參加領導力培訓時推薦給我的。這本書很有見地——特別是當你仔細研究自己的長處時,你可以挖掘並確定那些被認爲是弱點的地方,並利用它們改變你的工作和協作方式。強烈推薦!"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.amazon.com.au\/Accelerate-Building-Performing-Technology-Organizations\/dp\/B07BMB9YY2","title":"","type":null},"content":[{"type":"text","text":"Accelerate: Building and Scaling High Performing Technology Organisations"}]},{"type":"text","text":":隨着這份《DevOps 現狀報告》在某種程度上已經成爲"},{"type":"link","attrs":{"href":"https:\/\/www.thoughtworks.com\/radar\/techniques\/four-key-metrics","title":"","type":null},"content":[{"type":"text","text":"標準"}]},{"type":"text","text":",這本書很好地提醒了我們現在所熟悉的概念的細節,4 項關鍵指標等等。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中最喜歡的一句話:“架構師應該關注工程師和成果,而非工具或技術。”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/samnewman.io\/books\/monolith-to-microservices\/","title":"","type":null},"content":[{"type":"text","text":"Monolith to Microservices"}]},{"type":"text","text":":啊,這可能是我的聖經吧,已經有好一段時間了。顯然,這與我們一直在研究的實際架構有關,但是這本書提供了分解策略的良好指導——但是,在此之前,它會給你一些章節,詢問爲什麼你想開始這麼做,然後給你一個概述,讓你知道計劃如何完成這個任務並不像開發Spring boot 應用程序那樣簡單。這本書與 "},{"type":"link","attrs":{"href":"https:\/\/twitter.com\/kelseyhightower","title":"","type":null},"content":[{"type":"text","text":"Kelsey Hightower 的推文"}]},{"type":"text","text":"搭配簡直就是絕配。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中最喜歡的一句話:“擁有微服務並不能讓你‘贏’。”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.oreilly.com\/library\/view\/fundamentals-of-software\/9781492043447\/","title":"","type":null},"content":[{"type":"text","text":"Fundamentals of Software Architecture"}]},{"type":"text","text":":這本書在導言和基礎章節之後,我確實沒有從頭到尾按順序閱讀,而是來回跳着閱讀關鍵章節,因爲它講述了不同的架構風格。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中最喜歡的章節:(衆多)架構師個性(哈哈)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/teamtopologies.com\/","title":"","type":null},"content":[{"type":"text","text":"Team Topologies"}]},{"type":"text","text":":在我的書庫中,這是一本相當新的書,它探討了思考團隊結構的方法,咳咳,康威法則(Conway's Law),團隊類型不是用規定性的鏡頭,而是鼓勵團隊優先思考的探索性觀點。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中最喜歡的話題:認知負荷。才華橫溢,思維轉變。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.amazon.com.au\/Clean-Architecture-Craftsmans-Software-Structure\/dp\/0134494164","title":"","type":null},"content":[{"type":"text","text":"Clean Architecture"}]},{"type":"text","text":":又一部經典,不是嗎?雖然這是一種更爲實際的書籍討論,但我還是不時地發現它是一個很好的參照點。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中最喜歡的一句話(也是從某處引用的):“如果你認爲好的架構是昂貴的,那就試試壞的架構。”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/","title":"","type":null},"content":[{"type":"text","text":"InfoQ"}]},{"type":"text","text":" 一直是個很好的參考渠道,這沒有什麼好奇怪的。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.deararchitects.xyz\/","title":"","type":null},"content":[{"type":"text","text":"Dear Architects"}]},{"type":"text","text":" 週刊每週都有精彩的文章策劃——每週都有精彩的閱讀。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"作者介紹:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Tago Fabic,主業是軟件開發者和技術負責人,副業是肖像攝影師。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/tagofabic.medium.com\/key-things-i-learned-after-moving-into-a-software-architect-role-dce88f9452a7","title":"","type":null},"content":[{"type":"text","text":"https:\/\/tagofabic.medium.com\/key-things-i-learned-after-moving-into-a-software-architect-role-dce88f9452a7"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"延展閱讀:《"},{"type":"link","attrs":{"href":"https:\/\/www.infoq.cn\/article\/r9vtUb0RoBiOGHJEU5Ti","title":"xxx","type":null},"content":[{"type":"text","text":"從軟件歷史看架構的未來:編程不再是精英們的遊戲"}]},{"type":"text","text":"》"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章