本文章為何存在
在以往學習程式開發的數年,我從個菜鳥逐漸變成了個「略懂一二」的碼農。
而在這過程中,有幾個以前想不通的問題,或是迷思,在這過程中也因緣際會的被打破,比如:
當我們想設計/學習一個大軟體系統,像是 Linux, 或只是 Kafka 時,他們有那~麼多的交互與功能,感覺不花一輩子不可能設計出來,要學也根本無從開始理解啊(難道他們程式碼不會因為功能變多,而每個 if/else branch 都有上百個 condition 嗎?)
「架構師」這個職位總感覺好高大上啊,好像拿一份需求就可以「一眼定奪」,洋洋灑灑的羅列出這裡需要個 MQ、這裡需要個 OLAP DB、這裡需要被定義個新的 layer。到底是怎麼學才能到那程度的,並且身為整天用框架的「調參俠」,難道一輩子就與架構設計無緣嗎?
以上這些問題,不只本科剛畢業的 Jr. 會有,甚至在行業數年的 Sr. 也不一定回答的出來。
但,軟體架構就真的是如此虛無飄渺,高大上。並且任何「設計決策」都必然是「精英帶領雜兵」下做出來的嗎?這是上個月我讀「鳳凰架構 - 单体系统时代」所得到的感觸。
少量的技术专家很难阻止大量螺丝钉式的程序员或者不熟悉原有技术架构的外包人员,在某个不起眼的地方犯错并产生全局性的影响,并不容易做出整体可靠的大型系统。
保持著此疑問,我簡單草稿了一個研究計畫,是試想回答「What exactly is Software Architecture?」
Problem Statement #1 「架構」此名詞的過度使用
第一個學習者會碰到的問題,那就是「架構」到底是什麼啊?我們參考以下名詞
3 layer architecture - 三層式架構
hexagonal architecture
Von Neumann architecture - 馮紐曼架構
ARM architecture
Kappa Architecture
Clean Architecture
其中,1. 與 2. 明顯的與程式碼抽象的設計與約束有關。3. 與 4. 更接近實作、生態系與 specification。5. 更像是一種實作的風格。6. 就又與以上幾項有很大差別了,甚至還有人會說「“Clean Architecture” is not actually architecture itself」
混亂點 A — 架構跟 tech stack 有關聯嗎?
在日常的 system design 面試,當面試官請你設計出一套「架構」時,我們總預期能洋洋灑灑的講出 PostgreSQL + Kafka + CDN 可以支撐多少 QPS。
但當我們仔細研究以上數個架構,會發現好像沒人把「技術選型」當成架構的唯一決策,跟技術選型,好像還是比較次級的要素?!(與我們常讀 blog post、system design 在想 something doesn’t scale,差好多啊)
混亂點 B — 連程式碼,你也要管嗎?
在以上名詞其中,3 layer 和 hexagonal architecture,很明顯的又像亂入的二五仔,他們不但與技術選型不相干,還很大程度只管「程式碼怎麼寫啊!」
但在學校的印象裡,「程式碼怎麼寫」,不是 Design Pattern 或 Programming Language 這些「軟工」學科在管的嗎?架構連怎麼寫程式都要管到,這豈不是與「高層設計」相違背了😮
Problem Statement #2 沒有任何能夠循序漸進,學習架構的方式?
Roadmap.sh 真的很有意思,儘管初衷是想幫助新手能線性的找到學習方向。但後來的 roadmap 總是越畫愈多,關聯也不那麼明確,反而既勸退又暴露出該領域缺乏系統化。
光是以上的圖,就是架構距離感的一個縮影了吧。只看這篇幅,就很容易讓人聯想到「難道想做出架構決策,要先成為架構百科學書、各個 stack 都略懂一二、design pattern、商業都要精通?」
(想了就頭痛)
研究方式草案 — 對架構使用多面擊破吧!
為了回答此問題,我設計了一小個研究草案 + 社群發想,試著「透過交互閱讀不同領域的觀點,來定義架構(對我)該是什麼」
以下是數個打算切入的觀點與教材
切入觀點 #1 架構的學術研究
Architectural Styles and the Design of Network-based Software Architectures - REST 是少數一篇我有念過的教材,而 Architectural Blueprints — The “4+1” View Model of Software Architecture 則影響了 C4 model 的設計與架構的描述方式。
挑選原因:學術論文對某事物的定義通常會較嚴謹、對場景認真看待及多給 reference,對打下知識基礎有幫助
切入觀點 #2 行業慣例、常用開發套路
挑選原因:不置可否的,在業界/日常開發上,對架構的理解及使用就很像 design pattern 俠一樣 — 「套就對了」
而事實上,這在許多場景竟是有效的!透過這類應用型的教材,希望能逐個比對不同架構的差異,也作為知識擴充
切入觀點 #3 Similar Topics
Design Patterns
Tech stack/Infrastructure
Architectural Style/Patterns
挑選原因:此分類包含了數個與架構相似,但又似乎有細微不同的幾個領域
切入觀點 #4 Human factor
The Pragmatic Programmer
Staff Engineer: Leadership beyond the management track
切入觀點 #5 Clean Architecture
切入觀點 #6 Domain Driven Design
以上這些閱讀素材都為待定,是基於我當下的認知所做出的分類,很可能會隨著裡解過程增減
結語
能夠下定決心,把以往懵懵懂懂的素材整理起來,十分令人期待。
往後的更新,我預期在 discord server 上的 探索 Software Architecture 的 many meaning & definitions 做持續更新,也期待抱持類似興趣的人來一同交流。