Sunday, June 16, 2019

Architecture: Cut horizontally v.s. Cut vertically

關於 software architecture ,我最近發現了有一塊,過去我總是沒有想得很清楚的地方: cut horizontally 與 cut vertically 的比較。仔細想想,這個也不是什麼太新的觀念。一般來講,像公司內部的分工,也有類似的兩種概念

cut vertically 近似於公司切分事業部的概念: A 部門負責 a 產品,所以 A 部門就盈虧自負。在 software 就是切分出 Component, bounded context 。也可以稱之為 package by component/ package by feature

cut horizontally 比較近似於公司內統一採購、發包的概念: 公司完成工作,有時會透過與第三方協力廠商共同完成。與第三方的關係,會透過統一的採購、發包專人來做。這在 software 就是切分出 Application, Adapter 的層次。可稱之 package by layer 。 cut horizontally 比較難找到很巧妙的類比,不過,對照 cut vertically 之後,應該比較容易想象。

無論是 cut vertically 或是 cut horizontally ,都要設法讓 components 或是 module 可以解耦(decoupled)

在 cut horizontally 的情況,應用的技巧,主要是 Dependency Injection 。
然而在 cut vertically 的情況,應用的技巧則是 events/shared kernel 等。