標籤:

再談什麼是軟體架構

「什麼是軟體架構」,這個主題在這個專欄中已經談過一次了:

什麼是軟體架構 - 知乎專欄

其實看你從什麼角度入題了,這個問題可以談很多次。這次我們從分析現有軟體的的角度討論什麼是「軟體架構」。我們從這個博客討論的問題說起:

RancherOS架構分析 - 知乎專欄

下面有人問到:「什麼是軟體架構?你寫的這些知識又是如何獲取的呢?」

從我寫那個分析的思路上說,我定義軟體架構是:所有可以左右軟體發展方向的事實的集合。

我準備引入一個軟體,投入一起開發一個軟體,我需要看到一個軟體會不會把自己給弄死了,或者它最終會不會走向我期望它走向的方向。這一方面來自這個軟體的全部維護者的「理想」,另一方面來自這個軟體已經進入的現實。所以架構分析,就要弄清楚這些人的理想和現實,綜合判斷它是否可以支持我的個人理想的實現。

所以,我分析這個軟體,第一反應是它的維護者是如何定義這個軟體本身的,這通過看它的主頁就可以了:

我看到兩個關鍵字:Management和Production。現在我看它賣什麼,靠什麼賺錢,公司有多少人,這決定了它的投資模式(實際上這部分我藏了私,我沒有放在博客中,這也是NDA的要求)。

然後我就發現它是個開源項目,所以,我git clone了它的代碼(當然我們都知道,開源項目和一個公司要賣的東西不一定一樣)。然後查看它的版權聲明,編程語言,代碼量等。

到此為止, 我從「理想」角度,對這個軟體有了一個基本的認識。在進一步了解軟體已經建成的狀態以前,我需要先自行建一個邏輯:如果我來干這件事,我會怎麼干:

我簡單設想,我會Rebase一個已有的發行版(我很可能選擇Debian,因為我熟悉Debian,而且我可以利用Debian的升級基礎來實現我的版本的持續維護),然後我會寫一組命令,用於在Container的基礎命令之外執行經常會執行的動作。Debian的安全按一般定製發行版的方式實現,命令用Python來組織(用Python是因為我熟悉Python,同時它提供了足夠的腳本能力),最後就是我可能會自己創建一個Registry來提供我自己認證的Image服務。

然後我會從這個角度來對它的實現進行對照,這個我可以通過在虛擬機中安裝和查看這個產品來達成。

所以我按它的手冊的建議安裝了一個系統,首先在它的Host上用tree來看它大部分的文件分布和文件來源。這樣很容易就可以發現如下重要的事實:

1. 它的基礎發行版用的是busybox+uclibc,這個,作為一個有發行版組織經驗的人,你應該清楚,這很可能直接可以用ucblic本身的buildroot就可以實現了,而且很容易實現多版本的支持。唯一的工作量是把docker的命令集成進去。也知道它每次生成一個啟動的iso的工作量有多大了。

2. 然後看看它額外增加的busybox之外的命令的版本和使用的庫,就可以知道它是基於uclibc的工具鏈進行每個獨立編譯得到的

3. 然後我們用ps看正常運行的系統的進程表,可以看到Host上提供了什麼服務

4. 接著安裝兩個典型的Image(我裝的是CentOS和Ubuntu),一個安裝了一個Apache,一個編譯了一個Linux Kernel。大概了解一下它的成熟度和使用的Registry

5. 最後,從源代碼最後看一次ros命名的功能和大概組成,通過strace跟蹤一兩個命名設計的系統文件和系統調用,就可以知道有什麼額外的信息需要了解。

這樣之後,能否維護,未來這個方案會如何發展,就有初步的理解了。

順便說一句,在分析的過程中,我其實還通過mount看了一下它的文件系統layout,對/etc/hostname被mount到/dev/sda1上非常不理解,所以我花了一點時間看了一下mount的手冊和對應的代碼,然後總結成一個獨立的描述:mount --bind 可以算是ln一個目錄么? 。我手上有無數這種分析,一般我會寫在evernote上,但前天正好在機場等飛機,寫的時候手邊訪問evernote不方便,所以就改寫到知乎上了。我舉這個例子是說,其實架構師手邊是有大量的分析數據的,但必須能保證這些分析不會隨意進入主分析鏈,避免目標被沖淡了。所以,你看到一點點的決策或者判斷,實際上可能背後都是大量的工作。


推薦閱讀:

停下來,歇口氣,造輪子
從微服務聊起
不要嘗試同步代碼和設計文檔
超實用極簡客戶端Failover方案
知不知上——控制調查範圍

TAG:软件架构 |