想要成爲架構師?你只要滿足這些條件就可以

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"摘要: 本文主要介紹軟件架構的定義,以及要成爲一個軟件架構師所需具備的一些技能,讓你對軟件架構師這一職位有一個更深的瞭解。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"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":"本文分享自華爲雲社區","attrs":{}},{"type":"link","attrs":{"href":"https://bbs.huaweicloud.com/blogs/271857?utm_source=infoq&utm_medium=bbs-ex&utm_campaign=other&utm_content=content","title":"","type":null},"content":[{"type":"text","text":"《想要成爲架構師?先看看這些條件滿不滿足!》","attrs":{}}]},{"type":"text","text":",原文作者:元閏子 。 ","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"前言","attrs":{}}]},{"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":"當你點開一個招聘APP,篩選條件選擇互聯網技術,在列出來的一大堆職位上,往往有那麼幾個帶有“","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"架構師","attrs":{}},{"type":"text","text":"”三個字眼的高薪職位。當你被它的高薪所吸引而點擊查看職位詳情時,又會被它的高要求所勸退。它們往往要求工作年限在5年以上,需要求職者有過3年以上的系統設計經驗,精通各種架構模式和系統框架,反觀自己卻一個條件都不滿足。","attrs":{}}]},{"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":"軟件架構師就是這麼一個讓人嚮往,但又讓人望洋興嘆的一個職位。就像建築設計師總有成爲總設計師的夢想,航天工作者總有成爲總工程師的壯志,相信每一個軟件工程師都有過成爲軟件架構師的想法。引用維基百科裏的定義,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"軟件架構師的職責就是在軟件系統研發中,負責依據需求來確定主要的技術選擇、設計系統的主體框架結構,並負責搭建實施","attrs":{}},{"type":"text","text":"。然而,架構師所需的技能遠遠不止於技術選擇和系統設計。本文主要介紹軟件架構的定義,以及要成爲一個軟件架構師所需具備的一些技能,讓你對軟件架構師這一職位有一個更深的瞭解。","attrs":{}}]},{"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":"文中大部分的觀點來自於《Fundamentals of Software Architecture》一書,想了解更多詳情推薦閱讀原書。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"軟件架構的定義","attrs":{}}]},{"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":"對於","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"軟件架構","attrs":{}},{"type":"text","text":"(Software Architecture),我們通常將它看成是軟件系統的藍圖(blueprint),但是如果要給出一個精確的定義,往往很難。維基百科裏對軟件架構的定義爲,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"有關軟件整體結構與組件的抽象描述,用於指導大型軟件系統各個方面的設計","attrs":{}},{"type":"text","text":"。但是,這種定義也是片面的,軟件架構並不僅僅是系統的整體結構和組件,光有這些還不足以指導設計出好的軟件系統。","attrs":{}}]},{"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":"Mark Richards和Neal Ford在書中,從四個維度上對軟件架構進行了描述,分別是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Structure","attrs":{}},{"type":"text","text":"、","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Architecture characteristics","attrs":{}},{"type":"text","text":"、","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Architecture decisions","attrs":{}},{"type":"text","text":"和","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Design principles","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/6e/6e6a8e544e0135ea274ee9027939257a.jpeg","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":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"​Structure","attrs":{}}]},{"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","attrs":{}}],"text":"Structure描述的是軟件系統所使用的架構風格","attrs":{}},{"type":"text","text":",比如最常見的分層架構(layeredarchitecture)、事件驅動架構(event-driven architecture)、微核架構(microkernel architecture)、微服務架構(microservicesarchitecture)等等。當你去問架構師一個軟件系統使用什麼架構時,如果他告訴你,“系統使用的是微服務架構”,那麼也他僅僅闡明瞭系統的架構風格而已。若想了解整個系統的軟件架構,對architecturecharacteristics、architecture decisions和design principles都要有深入的認識。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/0b/0b689ec72e7c4eee1143601f80511ac1.jpeg","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":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"​Architecture characteristics","attrs":{}}]},{"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","attrs":{}}],"text":"Architecturecharacteristics也就是我們常說的非功能需求","attrs":{}},{"type":"text","text":",比如有可用性(Availability)、可擴展性(Scalability)、可靠性(Reliability)等。Architecturecharacteristics往往容易被軟件新手所忽略,但是它對於軟件系統而言卻是非常的重要。如果說功能需求決定了一個軟件系統的下限,那麼非功能需求則決定了它的上限。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ec/ecddf46a92ec96980ff8f034b862e59a.jpeg","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":"​","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Architecture decisions","attrs":{}}]},{"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","attrs":{}}],"text":"Architecturedecisions描述了開發軟件系統時所必須遵循的規則","attrs":{}},{"type":"text","text":",比如圖中例子,對於一個分層架構風格的系統而言,開發工程師需要遵循以下規則:只有業務層才能直接訪問服務層,表現層不能直接訪問服務層。Architecturedecisions更多的只是一種約束,違反了這種約束可能並不會對系統的功能造成影響,但是卻是系統架構腐化的源頭。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f9/f9c5004c9777ade28759cf2c51cbe7ef.jpeg","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}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Design principles","attrs":{}}]},{"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","attrs":{}}],"text":"Design principles指的是系統設計的原則","attrs":{}},{"type":"text","text":",用於引導開發團隊選擇更符合系統特點的技術方案。Design principles只會給出一個方向,而不是具體的實現方案。比如圖中例子給出的系統設計原則就是:微服務之間應該儘可能通過異步通信來提升系統的性能。至於開發團隊通過REST或者RPC的方式進行異步通信實現,設計原則並未進行限制。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/81/81037c7e8825a03c0972327edf206db4.jpeg","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":"​","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"成爲架構師所需的技能","attrs":{}}]},{"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":"就像軟件架構不僅僅是系統的整體結構和組件一樣,要成爲一個軟件架構師,只會技術選型是遠遠不夠的。一個合格的軟件架構師應該具備以下的幾種技能:","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"進行架構決策","attrs":{}}]},{"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":"An architect isexpected to define the architecture decisions and design principles used toguide technology decisions within the team, the department, or across theenterprise.","attrs":{}}]},{"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":"這是一個架構師所需具備的最基本的技能,需要爲開發團隊給出系統設計的原則和系統開發的約束。","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"架構師在這裏的角色更多的是一個引導者,而不是具體技術方案的制定者","attrs":{}},{"type":"text","text":"。比如,開發團隊要進行前端框架的選型,作爲架構師應該給出的建議是選擇Reactive風格的前端框架(引導團隊在React.js、Angular、Vue.js或者其他Reactive風格的前端框架之間進行選擇),而不是直接建議選擇React.js框架。前者屬於架構決策,而後者則是技術決策。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"持續對系統架構進行分析","attrs":{}}]},{"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":"An architect isexpected to continually analyze the architecture and current technologyenvironment and then recommend solutions for improvement.","attrs":{}}]},{"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":"就像一個軟件系統的生命週期並不止於開發階段的結束,軟件架構也不是一錘子買賣。這就要求架構師能夠持續對系統架構進行分析,並提出改進的建議,使得系統在面對業務和技術的雙重變化時,仍然能夠保持架構良好。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"保持對技術和業界的發展趨勢的敏感","attrs":{}}]},{"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":"An architect isexpected to keep current with the latest technology and industry trends","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲一個架構師必須時刻保持對技術和業界發展趨勢的敏感。在敏捷開發的潮流下,軟件的特性會頻繁的發生變化,但是軟件的基礎架構往往是很少改變的。架構師如果不能把握當前技術和業界發展的趨勢,從而導致設計出來的軟件架構不能夠應付未來幾年的業務和技術變化,這對於一個軟件系統而言將會是災難性的。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"確保團隊按照既定的規則進行開發","attrs":{}}]},{"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":"An architect isexpected to ensure compliance with architecture decisions and designprinciples.","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"架構師不僅僅需要制定設計原則和開發約束,還需要確保團隊能夠一直按照這些規則進行軟件開發。這就要求架構師對開發人員提交的核心代碼進行Code Review,否則系統的架構很容易就腐化掉了。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"擴展知識的廣度","attrs":{}}]},{"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":"An architect isexpected to have exposure to multiple and diverse technologies, frameworks,platforms, and environments.","attrs":{}}]},{"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":"對於一個架構師而言,他並不需要精通每一種框架、平臺和語言,但至少要儘可能多的瞭解它們,這樣才能更好的支撐架構決策。這就要求架構師能夠持續的學習新的知識,不斷地跳出自己的舒適區。最好的情況就是精通2~3種語言和框架,並且熟悉業界各種常用的語言和框架,這樣的知識深度和廣度的結合才能設計出更好的軟件架構。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"擁有一定的領域知識","attrs":{}}]},{"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":"An architect isexpected to have a certain level of business domain expertise.","attrs":{}}]},{"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","attrs":{}}],"text":"所有的技術都是服務於既有的業務,剝離了業務的軟件技術毫無價值","attrs":{}},{"type":"text","text":"。架構師無需像領域專家一樣精通系統的各種業務,但至少也要有一定的業務積累。軟件是用來解決問題的,不懂業務的架構師來做軟件架構設計,就相當於還沒讀懂題目就開始解題,結果往往適得其反。比如一個需要低時延的業務,交給一個不懂業務的架構師來進行系統設計,可能得出來的是一個高吞吐量的架構。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"人際交往的能力","attrs":{}}]},{"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":"An architect isexpected to possess exceptional interpersonal skills, including teamwork,facilitation, and leadership.","attrs":{}}]},{"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":"對於大部分的開發工程師和架構師而言,這可能是最難的一條了要求了。他們很擅長,也很樂意去解決技術上的問題,但是對於與人相關的問題則相當的牴觸。但這對於一個合格架構師來說所必須克服的一點,因爲架構師不僅僅需要制定技術規則,更重要的是領導團隊按照既定規則進行開發,這不可避免地就涉及到領導力和人際交往的能力。","attrs":{}}]},{"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":"當一個開發工程師決定在一次需求開發中採用單例模式,可能團隊裏的其他人並不會有太多的關注。但是當一個架構師決定採用微服務架構來設計系統時,可能就會受到團隊內各類人員的挑戰,比如版本經理可能覺得微服務架構太複雜,會不會影響交付的節奏;開發人員可能覺得分層架構更好實現。這種情況下就要求架構師能夠有很好的人際交往能力,說服各類人員,這樣項目才能更好的進行下去。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"總結","attrs":{}}]},{"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":"軟件架構是一個很抽象的東西,目前對它的定義大部分都是一些很寬泛的描述。《Fundamentals ofSoftware Architecture》從四個維度上對軟件架構進行了描述,讓軟件架構有了一個更加清晰的視圖。在此基礎上,書中也提出了一個合格的軟件架構師所需要具備的幾種技能。總的來說,就是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"想要設計出一個好的軟件架構很難,要成爲一個好的軟件架構師更難","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"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":"另外,書中還提出了軟件架構的兩個準則,很有道理,就是有點抽象。不過沒關係,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"不要試圖理解它,要去感受它","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"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":"1、Everything in software architecture is a trade-off.","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2、Why is more important than how.","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"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://bbs.huaweicloud.com/blogs?utm_source=infoq&utm_medium=bbs-ex&utm_campaign=other&utm_content=content","title":"","type":null},"content":[{"type":"text","text":"點擊關注,第一時間瞭解華爲雲新鮮技術~","attrs":{}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章