【細品架構10/100】架構由術至道的轉變(1)

猿碼道發表於2019-02-22

一直以來,作為一名軟體工程師,都十分嚮往“架構師”的名號,也一直奮鬥在通往“架構師”的路上。但如果要是問他們:什麼是架構師?往往每個人回答的都千奇百怪,也就是說在每一個人的心裡對架構師的認識都互不相同。有的人說,架構師要掌握很多的技術。也有的人說,架構師不必到細節,要巨集觀把控。還有的人說,架構師要有超強的預知能力。等等。就如同盲人摸象,“架構師”一詞太大、太籠統了,如果僅是站在自己認為的角度來看,很難準確定義出“什麼是架構師”。

其實“架構”不是軟體行業的專有名詞,在軟體行業很早之前,架構就已經存在了,比如:建築行業等。所以“架構”並不是侷限在某一行業中,反而它存在於整個人類社會的高效協作之中。要真正的去理解架構,並不能侷限於軟體行業之中,當然了後續會重點講述軟體行業中的架構。

面對“架構”一詞,空杯心態,從起源開始分析“架構”的誕生。為何空杯心態,暫時放棄之前自己認為對架構的認知,從“架構”由無到有的誕生角度來認知,之後再和自己之前的認知,進行碰撞糾正吧。

本文將先從“人”、“組織”、“社會”三個方面來討論架構為何產生、架構為何物、應該如何去做架構?最終會在“軟體”行業方面,根據對架構的認知,來實施架構的落地。


從遠古談起

  1. 在遠古早期,每個人都完全獨立生活,衣、食、住、行等等全部都自己搞定,整個人類都是獨立的個體,不相往來。為了解決人類的延續的問題,自然而然就有男女群居出現,這個時候就出現了分工了,男性和女性所做的事情就會有一定的分工,比如:男性身體強壯擅於捕獵、女性性情溫和善於孕育等。可是人每天生活的基本需求沒有發生變化,還是衣食住行等生活必須品。

    面對問題:人類延續;

    架構形成:男女群居、男女分工;

  2. 然而面對自然災害,生活遭受災害不確定性,所以多人分工配合作為生存的整體,力量就顯得強大多了,所以也自然的形成了族群:有些人種田厲害,有些人制作工具厲害,有些地方適合產出糧食,有些地方適合產出棉花等,就自然形成了人的分群,地域的分群。當分工發生後,實際上每個人的生產力都得到了提高,因為做的都是每個人擅長的事情。

    面對問題:自然災害、個人生產效率低,生活遭受災害不確定性;

    架構形成:多人族群,角色分工;

  3. 整個人群的生產力和抵抗環境的能力都得到了增強。為什麼呢?因為每個人的能力和時間都是有限的,並且因為人的結構的限制,人同時只能專心做好一件事情,這樣不得已就導致了分工的產生。既然分工發生了,原來由一個人幹生存所必需的所有的事情,就變成了很多不同分工的角色合作完成這些事情,這些人必須要通過某些機制合在一起,讓每個人完成生存所必需的事情,這實際上也導致了交易的發生

    面對問題:由於角色分工導致,個人不能生產出生活所有必須品;

    架構形成:交易系統、交易貨幣;

  4. 在每個人都必須自己完成所有生活必須品的生產的時候,是沒有架構的(當然在個人來講,同一時刻只能做有限的事情,在時間上還是可能會產生架構的)。一旦產生的分工,就把所有的事情,切分成由不同角色的人來完成,最後再通過交易,使得每個個體都擁有生活必須品,而不需要每個個體做所有的事情,只需要每個個體做好自己擅長的事情,並具備一定的交易能力即可。

    角色分工產生,生產力提高,更需要具備的是交易溝通能力。只有交易溝通,才能使每個個體擁有生活各方面的必須品。

經過上面四步,這實際上就形成了社會的架構。那麼怎麼定義架構呢?以上面這個例子為例,把一個整體(完成人類生存的所有工作)切分成不同的部分(分工),由不同角色來完成這些分工,並通過建立不同部分相互溝通的機制,使得這些部分能夠有機的結合為一個整體,並完成這個整體所需要的所有活動,這就是架構。


五個動力條件,通過以上的例子,可以歸納出產生架構的五個動力條件

  1. 必須由人執行的工作(不需要人介入,就意味著不需要改造,也就不需要架構了);
  2. 每個人的能力有限(每個人都有自己的強項,個人的產出受限於最短板,並且由於人的結構限制,同時只能專注於做好一件事情,比如雖然有兩隻眼睛,但是隻能同時專注於一件事物,有兩隻手,無法同時做不同的事情。ps. 雖然有少部分人可以左手畫圓右手畫框,但是不是普遍現象);
  3. 每個人的時間有限(為了減少時間的投入,必然會導致把工作分解出去,給擅長於這些工作的角色來完成,見2,從而縮短時間);
  4. 人對目標系統有更高的要求(如果滿足於現狀,也就不需要進行架構了);
  5. 目標系統的複雜性使得個人無法完成這個系統,滿足條件2,3(如果個人就可以完成系統的提高,也不需要別的人參與,也就不需要架構的涉及,只是工匠,並且一般這個工作對時間的要求也不迫切。當足夠熟練之後,也會有一定的架構思考,但考慮更多的是如何提高質量,提高個人的時間效率);

有人可能會挑戰說,如果一個人對目標系統進行分解,比如某人建一棟房子,自己採購材料,自己搭建,難道也不算架構嘛?如果對於時間不敏感的話,是會出現這個情況的,但是在這種情況下,並不必然導致架構的發生。如果有足夠的自覺,以及足夠的熟練的話,也會產生架構的思考,因為這樣對於提高生產力是有幫助的,可以縮短建造的時間,並會提高房子的質量。

當這5個條件同時成立,一定會產生架構。從這個層面上來說,架構是人類發展過程中,由懵懵懂懂的,被動的去認識這個世界,變成主動的去認識,並以更高的效率去改造這個世界的方法。


架構本質是什麼

  1. 根據要解決誰的問題,對目標系統的邊界進行界定
  2. 並對目標系統按某個原則的進行切分。切分的原則,要便於不同的角色,對切分出來的部分,並行或序列開展工作,一般並行才能減少時間。並對這些切分出來的部分,設立溝通機制。
  3. 根據3,使得這些部分之間能夠進行有機的聯絡,合併組裝成為一個整體,完成目標系統的所有工作。

同樣這個思考可以運用到其他行業架構,比如:企業架構、組織架構、軟體架構等等。每一次架構的變革,都是主動對現有問題的解決,對現有環境的適應。

架構實際上就是指人們根據自己對世界的認識,為解決某個問題,主動地、有目的地去識別問題,並進行分解、合併,解決這個問題的實踐活動。

架構的產出物,自然就是對問題的分析,以及解決問題的方案:包括拆分的原則以及理由,溝通合併的原則以及理由,以及拆分,拆分出來的各個部分和合並所對應的角色和所需要的核心能力等。


概念認知

架構實際上是解決人的問題,而概念是人認識並溝通這個世界的基礎,自然概念的認識就非常的重要。

舉個例子:

比如說“什麼是桌子?”其實每個人對其的理解描述都是千奇百怪的,這實際上就導致了做架構的時候,不同角色的溝通會出很多問題,那麼結果也就可想而知了。

所以,在架構中對概念的認知,其實是很關鍵的。那為什麼每個人對概念的理解會千奇百怪呢?其實大部分人對於每天都習以為常的概念,都自以為明白了,實際上都是下意識的認識,並不是主動的認識。所以,對於概念,作為架構師應該主動地進行思考認識。

在古代,概念不叫“概念”,稱之為“名相”。

何為相?

一般我們認為:看到一個東西,比方說杯子,“杯子”就是一個名字,指代的看到的東西就是相,就是事物的相狀。我們一聽到“杯子”這個詞,腦海裡就會浮現出一個杯子的形象。而“杯子”這個詞,是用來指代的是這個相狀的,叫做名。合起來就叫做“名相”。

可是當我們把杯子打碎了的時候,我們還會稱這個碎了的東西叫杯子嗎? 肯定不會,一般會叫“碎瓦片”,如果我們把碎瓦片磨碎了呢,名字又變了,叫做“沙子”。這就奇怪了,同樣一個東西,怎麼會變出這麼多的名字出來?

實際上“相“表達的不是一個具體的東西,如上面所提的一個瓷器杯子,並不是指這個瓷器,而是這個瓷器所起的一個作用:一手可握,敞口(一般不超過底的大小,太大口就叫碗了),並且內部有一個空間可乘東西的這麼一個作用。並不是指這個瓷器本身。這也是為什麼我們從電視上看到一個人拿杯子的時候,我們知道這個是杯子。但是實際上我們看到的都是光影而已。所以說相實際上代表的是這個作用,並不是具體的某個東西,而名是用來標識這個作用的,用來交流的。

所以,其實杯子在打碎、磨碎的過程中,其實作用也被改變、破壞了,自然相也就被改變了,隨之而來,名也就發生了改變。

那為何需要這個作用?

這個作用其實是為了解決人的問題:“人需要一個可單手持握,但是希望避免直接接觸所盛物體”。

所以說,每個概念實際上背後所解決的,還是人遇到的某個特定的問題,我們把解決問題的解決方案,給定了一個名字,這個名字就是對應的某個特定的概念。對於概念這個詞本身,為了統一指代這些名字,我們稱起這類作用的名字稱為“概念”。

同理,為何我們可以在不同的語言間進行翻譯,是因為雖然語言不同,但是人類所面臨的的問題是一樣的,所使用的名不同而已。對於不同的動物之間的翻譯也是同理。

何為抽象?

抽象這個詞代表的含義,實際上是把不同的概念的相似的部分合並在一起,形成一個新的概念。

這個裡面問題很多:首先“相似的部分”在不同的人看來,並不一定那麼相似;其次,抽象之後形成的是一個新的概念,和原來那個概念並不一樣,所解決的問題也不一樣。所以我們不能用抽象來定義一個事物,抽象實際上是一個分類的過程,完全是另一碼事。

再舉一個例子,杯子和容器,很多人認為容器是杯子的抽象,但是實際上杯子是杯子,容器是容器,它們所解決的問題是不一樣的。當我們需要解決裝東西的問題的時候,會說容器;當我們需要解決單手持握要裝東西的時候,會說要一個杯子。

回過頭來,根據架構的定義,要做好架構所首先必須具備的能力,就是能夠正確的認識概念,能夠發現概念背後所代表的問題,進而才能夠認識目標領域所需要解決的問題,這樣才能夠為做好架構打好基礎。

對上述內容,總結一下:

相是一個具體物體的狀態和作用,是來解決具體人的問題。而為了人之間的交流,便根據相有了名,名其實就是一個標記,或理解為簡單的概念。所以概念的背後其實是代表解決人的問題。

而抽象則是對概念或名相似之處的歸類、分類的過程,不同角度來看會得出不同的相似之處,從而會有不同的抽象出來,所以抽象也會產生不同的新的概念。但抽象出來的概念不能夠指具體的事物,而只能做到泛指一類具有相似之處的事物。其實抽象本身也是一個概念,其背後也在解決歸類,分類的問題,但抽象並不是架構的必然產物。

而在解決問題的工程中,會首先有簡單名相(意指解決問題的最原始工具或物體),遇到更高階問題,會有更高階的名相或概念,通過抽象,對名相進行歸類、分類,抽象出新的概念,或者再有更高階的抽象,產生更高階的概念,最後由這些概念會組成架構。


問題識別

按照上面的架構定義,架構就是要不斷解決人遇到的問題,然而做好架構首先需要做的就是識別出需要解決的真實問題。一般來說,如果把真正的問題能夠找到,那麼問題就已經解決了80%。這個能力基本上就決定了架構師的水平。

那麼如何識別出需要解決的真實問題呢?

  1. 識別問題主體
  2. 識別問題邊界

如何識別問題主體呢?

所有的概念基本都有一個很大的問題,就是缺乏主語。而我們大家都心照不宣的忽略這個主語,溝通的時候也都以為大家都懂得對方說的主語是誰,結果大家都一起犯錯誤。識別問題的一個最大的前提就是要搞清楚:是誰的問題。這個搞清楚了,問題的邊界也就跟著確定了,再去討論問題才有意義。

當我們處理問題的時候,如果發現自己正在致力於把自己的工作完成,要馬上警惕起來,因為這樣下去會演變成沒有ownership的工作態度。在面對概念的時候,也會不求甚解,最終會導致沒有真正的理解概念。

作為軟體工程師或者架構師,我們大部分時候是要去解決別人的問題,“別人”是誰,是值得好好思考的。應該問的第一個正確的問題就是:目標問題是誰的問題。

如何識別問題邊界呢?

明白了問題的主體,這個主體就自然會帶來很多邊界約束。我們一定要明白,任何找上架構師的問題,絕對都不是真正的問題。為什麼呢? 因為如果是真正的問題的話,提問題過來的人肯定都能夠自己解決了,不需要找架構師。架構師都要有這個自覺:發現問題永遠都比解決問題來的更加重要

當明白了問題的主體,我們才可能真正的認識問題是什麼。因為問題的主體是問題的隱含邊界,邊界不確定下來,問題就是不確定的。一旦確定了主體,剩下的就是去搞明白主體有哪些問題。

一般來說,從問題暴露的點,一點點去溯源查詢,一定會找出來誰的問題,以及是什麼問題。當問題的主體離架構師越遠,就會讓找出問題主體的過程越加困難。最壞情況就是當我們時間或者能力有限,實在是無法定位出是誰的問題的時候,比如系統出故障,也就意味著我們無法根本解決問題。這時最好的辦法就是去降低問題發生所帶來的成本,儘量去隔離問題影響的範圍。給我們留出時間和空間去識別真正的問題。

總結一下,要正確的認識問題,需要問兩個問題:

  1. 這是誰的問題?
  2. 這有什麼問題?

當得到的回答是支支吾吾的時候,我們就知道正確的方向在哪兒,以及需要做哪些事了。問題1會花比較多的時間,也是支支吾吾最多的地方,因為架構要解決的問題都是人的問題。但是一旦確定了答案,問題2就會變得非常容易。可以這樣說,架構師的能力大部分會體現在問題1的識別上

在實際工作中存在很多的情況,都只是在完成自己的問題或任務,而忽略了問題或任務的根本:誰的問題、什麼問題。作為架構師,不僅是架構師,在面對問題時,而要更多的找出問題是什麼,問題的主體是什麼,從而只有有了主體,才能夠確定問題的邊界,最終才會確定出真正的問題所在。


架構切分

既然現狀存在問題,識別到真正問題之後,需要面臨的就是要解決問題。需要做現狀的調整,那麼就必須要有所動作,做相應的調整。這個調整就是架構的切分

要非常的清楚,所有的切分調整,都是對相關人的利益的調整。我們已經知道,隨著社會的發展,分工是必然的,為什麼呢?這個背後的動力就是每個人自己的利益。每個人都希望能夠把自己的利益最大化,比如:生活的更舒適,更輕鬆,更安全,佔用並享有更多的東西。但是每個人的能力和時間都非常的有限,不可能什麼都懂,所以自然需要舍掉一些自己不擅長的東西,用自己擅長的東西去換取別人擅長的東西。

對比一個人幹所有的事情,結果就是大家都能夠得到更多,當然也產生了一個互相依賴的社會,互相誰都離不開誰。這就是自然而然而產生的架構切分,背後的原動力就是人們對自己利益的渴望。人們對自己利益的渴望也是推動社會物質發展的原動力。

在這個模式下,比較有意思的是,每個人必須要舍掉自己的東西,才能夠得到更多的東西。有些人不願意和別人進行交換,不想去依賴於別人,這些人的生活就很明顯的差很多,也辛苦很多,自然而然的就被社會淘汰了。如果需要在這個社會上立足,判斷標準就變成了:如何給這個社會提供更好更有質量的服務。提供更好的更多的服務,自然就能夠換取更多的更好的生活必需品。實際上這就是我們做人的道理

那麼現狀中一般會存在什麼問題?

當人們認識到要主動的去切分一個系統的時候,毫無疑問,我們不能忘掉利益這個原動力。所有的切分決策都不能夠違背這一點,這是大方向。結合上一篇“識別問題”,一旦確定了問題的主體,那麼系統的利益相關人(用現代管理學語言叫:stakeholder)就確定了下來。所發現的問題,會有幾種情況:

  1. 某個或者某些利益相關人負載太重。
  2. 時間上的負載太重。
  3. 空間上的負載太重,本質上還是時間上的負載太重。
  4. 某個或者某些利益相關人的權利和義務不對等。

架構切分的原則

情況1是切分的原因,情況2是切分不合理而導致的新的問題,最終還是要回到情況1。對於情況1,本質上都是時間上的負載。因為每個人的時間是有限的,怎麼在有限的時間內做出更多的事情?那麼只有把時間上連續的動作,切分成時間上可以並行的動作,在空間上橫向擴充套件。所以切分就要有幾個原則:

  1. 必須在連續時間內發生的一個活動,不能切分。比如孕婦懷孕,必須要10月懷胎,不能夠切成10個人一個月完成。
  2. 切分出來的部分的負責人,對這個部分的權利和義務必須是對等的。比方說媽媽10月懷胎,媽媽有權利處置小孩的出生和撫養,同樣也對小孩的出生和撫養負責。為什麼必須是這樣呢? 因為如果權利和義務是不對等的話,會傷害每個個體的利益,分出來執行的效率會比沒有分出來還要低,實際上也損害了整體的利益,這違背了提升整體利益的初衷。
  3. 切分出來的部分,不應該超出一個自然人的負載。當然對於每個人的能力不同,負載能力也不一樣,需要不斷的根據實際情況調整,這實際上就是運營。
  4. 切分是內部活動,內部無論怎麼切,對整個系統的外部應該是透明的。如果因為切分導致整個系統解決的問題發生了變化,那麼這個變化不屬於架構的活動。當然很多時候當我們把問題分析的比較清楚的時候,整個系統的邊界會進一步的完善,這就會形成螺旋式的進化。但這不屬於架構所應該解決的問題。進化的發生,也會導致新的架構的切分。

原則2是確保我們不能違反人性,因為維護自己的利益,是每個人的本性。只有權利和義務對等才能做到這一點。從原則2的也可以推理,所有的架構分拆,都應該是形成樹狀的結果,不應該變成有向圖,更不應該是無向圖。很多人一談架構,必談分層,但是基本上都沒意識到,是因為把一個整體分拆為了一棵樹,因為有了樹,才有層。

從某種意義上來說,談架構就是談分層,似乎也沒有錯,但是還是知道為什麼比較好。從根節點下來,深度相同的是同一層

當然如果某個節點的能力很強,也可以達到減小樹的高度的結果。技術的提升,也是可以提升每個節點的能力,降低樹的層數

架構切分的輸出實際上就是一個系統的模型,對於一個整體問題,有多少的相關方,每個相關方需要承擔哪些權利和義務,不同的相關方是如何結合起來完成系統的整體任務的。有的時候是從上往下切(企業),有的時候是從下往上合併,有的時候兩者皆有之(人類社會的發展)。而切分的結果最終都會體現在組織架構上,因為我們切分的實際上就是人的利益

對架構切分,總結一下:

架構切分=利益調整,利益調整代表了以人為中心,進行的利益在分配。從時間負載、空間負載觸發架構切分,而架構切分的原則就是以人的利益為本,也可以說不違揹人的本性,切分的過程其實就是分層建模的過程,分層建模就是概念劃分的過程,每個概念背後都代表一個問題,最終會形成樹狀的組織結構,而這種組織結構的調整會涉及到人的組織架構,從而要切實要考慮到人的利益。


架構其實就是在解決人的問題,如上文所述,人的問題會有很多種,比如:生活生存問題、人類延續問題、生產高效問題等等。在面對這些問題時,人逐漸主動會對自然界進行認識,從而產生最初的基本技術、男女分工、角色分工、群居等一些社會架構的形成。

然而在社會架構的形成過程中,通過概念認知、問題識別、架構切分等方式,以人的利益最大化為基礎原則,進行一步步的分解、組合,達到並解決人的問題。

最終,對架構的認知,總結一下:

架構實際上就是指人們根據自己對世界的認識,為解決某個問題,主動地、有目的地去識別問題,總結得出概念,通過概念作為認識溝通的橋樑,對相關事物進行分解、合併,如:人、利益、問題、組織架構等等,解決這個問題的實踐活動。

相關文章