本文主要是繼續研讀了資深架構師王概凱Kevin執筆的《架構漫談》系列的《架構漫談(二):認識概念是理解架構的基礎》的心得感受。王概凱Kevin結合自己多年的架構經驗,通過不同的視角,重新審視架構的本質,從而產生一力作《架構漫談》系列,作者希望能夠丟擲自己從實踐中得出的一些觀點,並引發大家的一些思考,歡迎大家溝通討論。
如需要閱讀原文,請關注公眾號“聊聊架構”,從歷史文章中獲取《架構漫談》系列。
本文內容結構圖:
如前一篇文章《架構之緣起》所述,架構實際上是解決人的問題,而概念是人認識這個世界的基礎,自然概念的認識就非常的重要
。然而,大部分人對於每天都習以為常的概念,都自以為明白了,但實際上都是下意識的,並不是主動的認識
。
舉個栗子:
比如說“什麼是桌子?”其實每個人對其的理解描述都是千奇百怪的,這實際上就導致了做架構的時候,不同角色的溝通會出很多問題
,那麼結果也就可想而知了。
所以,在架構中對概念的認知,其實是很關鍵的,本文也將嘗試討論下如何認識概念的過程。
首先宣告一下,本系列的文章,都是以人的認識為主體去討論的,解決的都是人的問題,任何沒有具體申明的部分,都隱含這一背景,以免大家誤解。
概念也屬於人認識這個世界並用來溝通的手段
,包括“概念”這個概念,也是一樣的。在古代,不叫“概念”,稱之為“名相”。
何為相?
一般我們認為:看到一個東西,比方說杯子,“杯子”就是一個名字,指代的看到的東西就是相,就是事物的相狀。我們一聽到“杯子”這個詞,腦海裡就會浮現出一個杯子的形象。而“杯子”這個詞,是用來指代的是這個相狀的,叫做名。合起來就叫做“名相”。
可是當我們把杯子打碎了的時候,我們還會稱這個碎了的東西叫杯子嗎? 肯定不會,一般會叫“碎瓦片”,如果我們把碎瓦片磨碎了呢,名字又變了,叫做“沙子”。這就奇怪了,同樣一個東西,怎麼會變出這麼多的名字出來?
那究竟什麼才是相?
實際上“相“表達的不是一個具體的東西,如上面所提的一個瓷器杯子,並不是指這個瓷器,而是這個瓷器所起的一個作用:一手可握,敞口(一般不超過底的大小,太大口就叫碗了),並且內部有一個空間可乘東西的這麼一個作用。並不是指這個瓷器本身。這也是為什麼我們從電視上看到一個人拿杯子的時候,我們知道這個是杯子。但是實際上我們看到的都是光影而已。所以說相實際上代表的是這個作用,並不是具體的某個東西,而名是用來標識這個作用的,用來交流的。
為何需要這個作用?
這個作用其實是為了解決“人需要一個可單手持握,但是希望避免直接接觸所盛物體”這個問題。
所以說,每個概念實際上所解決的,還是人遇到的某個特定的問題,我們把解決問題的解決方案,給定了一個名字,這個名字就是對應的某個特定的概念。對於概念這個詞本身,為了統一指代這些名字,我們稱起這類作用的名字稱為“概念”。
同樣,什麼是“建築”?“建築”實際上解決的就是“人需要獨佔的空間,並還能夠比較流暢的和外部世界溝通”的問題。
再拿前面的“桌子”來舉例,什麼叫“桌子”? 很多人回答,四條腿,或者說有腿,有一個平面,等等,櫃子不也是這樣嗎?為什麼我們看到櫃子,不會認為是桌子呢?即使我們放在櫃子上吃飯,我們看到仍然會問,為什麼在櫃子上吃飯? 不會叫桌子。如果明白了上面的道理,就很簡單了,桌子實際上是為了解決人坐在椅子上,手還能夠支撐在一個平面上繼續開展活動的問題,一般會和椅子配對出現
。
同理,為何我們可以在不同的語言間進行翻譯,是因為雖然語言不同,但是人類所面臨的的問題是一樣的,所使用的名不同而已
。對於不同的動物之間的翻譯也是同理。
在討論桌子這個概念的過程中,很多人會提出抽象這個概念,認為定義桌子實際上就是抽象的一個過程。這裡,有必要要澄清一下抽象這個概念,這個裡面有誤解。
抽象這個詞代表的含義,實際上是把不同的概念的相似的部分合並在一起,形成一個新的概念。
這個裡面問題很多:首先“相似的部分”在不同的人看來,並不一定那麼相似;其次,抽象之後形成的是一個新的概念,和原來那個概念並不一樣,所解決的問題也不一樣。所以我們不能用抽象來定義一個事物,抽象實際上是一個分類的過程,完全是另一碼事。
再舉一個例子,杯子和容器,很多人認為容器是杯子的抽象,但是實際上杯子是杯子,容器是容器,它們所解決的問題是不一樣的。當我們需要解決裝東西的問題的時候,會說容器;當我們需要解決單手持握要裝東西的時候,會說要一個杯子。
回過頭來,根據架構的定義,要做好架構所首先必須具備的能力,就是能夠正確的認識概念,能夠發現概念背後所代表的問題,進而才能夠認識目標領域所需要解決的問題
,這樣才能夠為做好架構打好基礎。
事實上,這一能力,在任何一個領域都是適用的,比如我們如果想要學習一項新的技術,如Hibernate、Spring、PhotoShop、WWW、Internet等等,如果知道這些概念所要解決的問題,學習這些新的技術或者概念就會如虎添翼,快速的入手
;學習一個新的領域,也會非常的快速有效;使用這些概念來解釋問題,甚至發明新的概念都是很容易的事。為什麼強調這個呢,因為做架構的時候,很多時候都是在一個新的領域解決問題,必須要快速進入並掌握這個領域,然後才能夠正確的解決問題
。
總結一下,正如上文所述:
相是一個具體物體的狀態和作用,是來解決具體問題的。而為了人之間的交流,便根據相有了名,名其實就是一個標記,或理解為簡單的概念。所以概念的背後其實是代表解決人的問題。
而抽象則是對概念或名相似之處的歸類、分類的過程,不同角度來看會得出不同的相似之處,從而會有不同的抽象出來,所以抽象也會產生不同的新的概念。但抽象出來的概念不能夠指具體的事物,而只能做到泛指一類具有相似之處的事物。其實抽象本身也是一個概念,其背後也在解決歸類,分類的問題,但抽象並不是架構的必然產物。
而在解決問題的工程中,會首先有簡單名相(意指解決問題的最原始工具或物體),遇到更高階問題,會有更高階的名相或概念,通過抽象,對名相進行歸類、分類,抽象出新的概念,或者再有更高階的抽象,產生更高階的概念,最後由這些概念會組成架構。