原文鏈接
架構(gòu)漫談是由資深架構(gòu)師王概凱 Kevin 執(zhí)筆的系列專欄慕购,專欄將會以 Kevin 的架構(gòu)經(jīng)驗(yàn)為基礎(chǔ)聊疲,逐步討論什么是架構(gòu)、怎樣做好架構(gòu)沪悲、軟件架構(gòu)如何落地获洲、如何寫好程序等問題。
本文是漫談架構(gòu)專欄的第九篇殿如,作者 Kevin 以鉆木取火為切入點(diǎn)贡珊,深入介紹了技術(shù)、業(yè)務(wù)和架構(gòu)之間的關(guān)系涉馁。正如作者所說门岔,技術(shù)總是在人類解決對業(yè)務(wù)的要求不斷提高的情況下產(chǎn)生,目的也是為了獲取更大更好的利益谨胞。
某天和朋友吃飯正好聊到這個話題固歪。作為架構(gòu)師或者做技術(shù)的人,在開發(fā)軟件時胯努,我們基本上就是在扮演上帝的角色:我們不但要創(chuàng)建出一個個的程序牢裳,還要讓這些程序能夠脫離我們在硬件上獨(dú)立運(yùn)行,以便為這個程序所服務(wù)的群體提供服務(wù)叶沛。當(dāng)這個程序出現(xiàn)問題甚至 bug 的時候蒲讯,我們還得扮演牧師的角色去修復(fù)這些問題。這不正是一個程序的社會嗎灰署? 和人類社會的演變何其相似判帮!那么我們自然也能夠拿人類演變的歷史來指導(dǎo)軟件開發(fā)工作局嘁,以避免再經(jīng)歷一次像人類演變發(fā)展那么痛苦的過程了。由此我們也可以看出晦墙,架構(gòu)師和程序員們都在扮演著多么重要的角色悦昵,如果還在解決自己的問題,怎么扮演好上帝這個角色晌畅?
在軟件設(shè)計(jì)開發(fā)的過程中經(jīng)常會看到但指,很多所謂的架構(gòu)討論實(shí)際上只是在討論某種技術(shù)。在很多人的概念里面抗楔,架構(gòu)和技術(shù)實(shí)際上是等同的棋凳。學(xué)會了幾種技術(shù),就認(rèn)為自己是架構(gòu)師了连躏,甚至是學(xué)習(xí)的技術(shù)越多剩岳,就覺得自己的水平越高。這樣實(shí)際上是對自己很不負(fù)責(zé)任的入热。要知道任何技術(shù)都是為了解決某種問題而存在的拍棕,學(xué)會了技術(shù),并不代表自己能夠解決問題才顿,這一點(diǎn)非常的重要莫湘。學(xué)會的技術(shù)的多少,所帶來的差別只是自己解決問題的手段多了罷了郑气。但是手段多了就一定是好事嗎幅垮? 很多時候,學(xué)習(xí)的技術(shù)越多尾组,越不知道采用哪種技術(shù)好忙芒,所謂“亂花漸欲迷人眼"。
還有另一種很普遍的觀點(diǎn):技術(shù)人普遍看不起業(yè)務(wù)讳侨,認(rèn)為技術(shù)更高端呵萨,而業(yè)務(wù)太低端,并且業(yè)務(wù)往往喜歡給技術(shù)挖坑跨跨。業(yè)務(wù)則覺得技術(shù)眼光高潮峦,但是實(shí)際解決不了問題,總是理解有偏差勇婴,但是又無可奈何忱嘹,因?yàn)樽约翰粫?/p>
本篇文章嘗試從這里入手,分析一下這三個概念到底有什么關(guān)系耕渴,我們應(yīng)該怎么處理業(yè)務(wù)拘悦、技術(shù)還有架構(gòu)的關(guān)系。
什么是技術(shù)
當(dāng)我們一無所有橱脸,或者什么都不會的時候础米,這個時候?qū)嶋H上是沒有技術(shù)的分苇。就好比人類在最早期,什么都得用自己的雙手來干活屁桑。一旦我們在日常生活中無意間發(fā)現(xiàn)某些規(guī)律的時候医寿,我們就可以通過創(chuàng)造條件,讓這個規(guī)律重復(fù)的發(fā)生蘑斧。通過人為創(chuàng)造條件糟红,讓指定的規(guī)律按照人類的意愿發(fā)生,這就是技術(shù)乌叶。
比如取火,最早人類只能靠打雷等自然現(xiàn)象產(chǎn)生火柒爸。取火其實(shí)就是一個業(yè)務(wù)目標(biāo)准浴,要解決的是人類自己的問題,這就是業(yè)務(wù)捎稚,實(shí)際就是人類的利益乐横。這個時候人類沒有生火的技術(shù),只能靠不斷的加木材今野,保持火不熄滅葡公。后來人們發(fā)現(xiàn)了鉆木取火:只要用一個干的木棍,在另一個干木表面快速的轉(zhuǎn)動条霜,就可以生火催什。這個辦法讓人類可以自行創(chuàng)造火源,就產(chǎn)生了鉆木取火的技術(shù)宰睡。
但是雙手快速轉(zhuǎn)動木棍鉆木取火蒲凶,并不是所有人都能夠做得到的,需要很多力量和速度拆内,對人的要求太高旋圆。為了解決快速轉(zhuǎn)動的問題,就有人采用弓弦來提升木棍轉(zhuǎn)動的速度麸恍。
也就是說:
????1灵巧、業(yè)務(wù)目標(biāo)是為了取火,鉆木取火這個技術(shù)的出現(xiàn)解決了這個問題抹沪。
????2刻肄、鉆木取火的效率不高,影響了業(yè)務(wù)(取火)的效率采够,就有了進(jìn)一步改進(jìn)的動機(jī)肄方,改進(jìn)轉(zhuǎn)動木棍的方式,產(chǎn)生了弓弦轉(zhuǎn)動木棍的技術(shù)蹬癌。
技術(shù)與架構(gòu)权她,以及與業(yè)務(wù)之間的關(guān)系
技術(shù)總是在人類解決對業(yè)務(wù)的要求不斷提高的情況下產(chǎn)生虹茶,目的也是為了獲取更大更好的利益。所以:
????1隅要、技術(shù)是為了解決業(yè)務(wù)的問題而產(chǎn)生的蝴罪,沒有了業(yè)務(wù),技術(shù)就沒有了存在的前提步清。
????2要门、有了更好的技術(shù),效率更差的技術(shù)廓啊,就會慢慢的被淘汰欢搜,消失,一切都遵從人類的利益訴求 -- 也就是業(yè)務(wù)谴轮。有人會問炒瘟,不用鉆木取火了,但是弓弦加速轉(zhuǎn)動木棍還可以用暗诓健疮装? 沒錯,因?yàn)楣肄D(zhuǎn)動木棍這個技術(shù)粘都,不是來生火的廓推,是用來加速木棍轉(zhuǎn)動的,所解決的問題不一樣翩隧。但是兩種不同的技術(shù)樊展,合理結(jié)合起來,會更好更有效率的解決業(yè)務(wù)問題堆生。
????3滚局、在解決同一個業(yè)務(wù)問題的前提下,更高效顽频,更低成本的技術(shù)藤肢,會淘汰低效,高成本的技術(shù)糯景。這是人類利益訴求所決定的嘁圈。
????4、一般剛開始解決根本問題的技術(shù)(鉆木取火)的效率是比較低的蟀淮,只是把不可能變成了可能(從這一點(diǎn)上來說最住,技術(shù)才是業(yè)務(wù)的 enabler)。然后就會有提高效率的需求出現(xiàn)怠惶,要求改進(jìn)這個技術(shù)涨缚。這個技術(shù)的低效率部分就會被其他人(或者技術(shù)發(fā)明人自己)加以改進(jìn),這部分就會形成新的技術(shù)策治。
當(dāng)關(guān)系 2 發(fā)生的時候兰吟,這個地方必定會形成一個切分,新技術(shù)會通過某種方式和原有的技術(shù)連接在一起形成一個整體茂翔,讓這個新的技術(shù)可以和原有技術(shù)共同工作混蔼,使得原有的技術(shù)可以用更高的效率解決問題。因?yàn)橐鉀Q的主要問題(生火)并沒有發(fā)生改變珊燎,分拆所形成的是一個樹狀的結(jié)構(gòu)。
按照前面的架構(gòu)定義悔政,這個時候其實(shí)已經(jīng)產(chǎn)生了架構(gòu)晚吞。也就是說谋国,一般是先有技術(shù),才會有架構(gòu)烹卒。這些其他技術(shù)(弓弦拉動木棍)弯洗,是從直接解決問題的初始主要技術(shù)中分拆出來形成的,并通過樹狀結(jié)構(gòu)和主要技術(shù)(鉆木取火)組合在一起牡整。在解決主要問題(生火)之后,再開始逐漸的分拆為更為細(xì)粒度的技術(shù)(弓弦轉(zhuǎn)木棍)逃贝。
而這個細(xì)粒度的技術(shù)(弓弦轉(zhuǎn)動木棍)往往不會和業(yè)務(wù)的主要目標(biāo)(生火)發(fā)生直接的關(guān)系谣辞。不同的技術(shù)沐扳,通過樹狀結(jié)構(gòu),組合在一起沪摄,形成了一個完整的架構(gòu)解決方案躯嫉,共同完成業(yè)務(wù)的目標(biāo)。這就是技術(shù)杨拐,業(yè)務(wù)和架構(gòu)之間的關(guān)系祈餐。很多人把這個過程稱為架構(gòu)的進(jìn)化,我更愿意把這個過程稱為技術(shù)的進(jìn)步所導(dǎo)致的新的架構(gòu)分拆哄陶,因?yàn)檫@個過程內(nèi)在的動力帆阳,更多的是來自技術(shù)對解決業(yè)務(wù)問題的解決。
技術(shù)人員和業(yè)務(wù)人員的關(guān)系
為什么技術(shù)人員總是和業(yè)務(wù)人員發(fā)生沖突呢屋吨? 這是因?yàn)榧夹g(shù)人員很多時候關(guān)心的技術(shù)蜒谤,和業(yè)務(wù)的主要目標(biāo)往往不是直接對應(yīng)的山宾,業(yè)務(wù)也是負(fù)責(zé)某一部分的業(yè)務(wù),也不是和業(yè)務(wù)的主要目標(biāo)直接對應(yīng)的芭逝,都是樹的分支節(jié)點(diǎn)(上文已經(jīng)解釋了為何會發(fā)生這種情況)塌碌。只有直接解決業(yè)務(wù)問題的那個技術(shù)(或業(yè)務(wù))-- 樹的根節(jié)點(diǎn) -- 會和業(yè)務(wù)直接相關(guān)。所以一旦產(chǎn)生沖突旬盯,一般必須兩個根節(jié)點(diǎn)(一般都是領(lǐng)導(dǎo))碰面才能解決問題台妆,就是這個原因 -- 他們都知道業(yè)務(wù)主要目標(biāo)。這也是為什么下層無法理解上層胖翰,而上層都喜歡下軍令狀接剩,要求下層執(zhí)行。人只有盡量去理解上層的問題才能做下層的分拆萨咳。
在軟件行業(yè)懊缺,這個根節(jié)點(diǎn)技術(shù)就是軟件。這也是為什么架構(gòu)師要認(rèn)識什么叫軟件培他,軟件解決誰的問題鹃两,什么問題,軟件本身又是怎么分拆的舀凛,才能夠更好的組合不同的技術(shù)俊扳,完成業(yè)務(wù)的目標(biāo)。而軟件里面和業(yè)務(wù)直接相關(guān)的猛遍,只有 Business Domain 這一部分馋记。
用人來打比方,Business Domain 相當(dāng)于人的大腦懊烤,而 Service梯醒,Repository,Glue Code 等部分所采用的技術(shù)腌紧,全部都是計(jì)算機(jī)自己領(lǐng)域的技術(shù)茸习,都是為了能夠讓程序跑起來,相當(dāng)于人的四肢壁肋。我們大部分開發(fā)人員的工作主要專注于四肢部分逮光。我們真正應(yīng)該投入的是大腦部分。因?yàn)榇竽X能夠決定四肢長什么樣墩划,而不是反過來。很多架構(gòu)師杜漠、技術(shù)人員主要專注于計(jì)算機(jī)相關(guān)的技術(shù),忽略了業(yè)務(wù)本身盼樟,甚至看不起業(yè)務(wù),這也是為什么技術(shù)總是和業(yè)務(wù)沖突的原因晨缴。
架構(gòu)師應(yīng)該承擔(dān)起解決業(yè)務(wù)問題的這個角色來击碗,專注于 Business Domain 和軟件本身的架構(gòu),讓技術(shù)人員致力于為業(yè)務(wù)在計(jì)算機(jī)中跑起來而努力稍途。只有把這兩者很好的結(jié)合起來砚婆,才能更好地完成業(yè)務(wù)的目標(biāo),才會讓軟件更好地服務(wù)于大家坷虑。最終一定會得到一個很好的軟件架構(gòu)埂奈,令軟件開發(fā)團(tuán)隊(duì)和業(yè)務(wù)部門都能夠很好地開展工作并降低成本。
重新發(fā)明輪子
當(dāng)現(xiàn)有已經(jīng)存在很多技術(shù),而這些技術(shù)卻和我們所要解決的問題并不是那么直接對應(yīng)的時候共屈,我們就需要有意識的組織和識別不同的技術(shù),來實(shí)現(xiàn)業(yè)務(wù)的目標(biāo)借宵。這個時候組織的方式有很多種矾削,其中成本最低的方法就是按照要達(dá)成的目的和當(dāng)前的問題,從上到下進(jìn)行架構(gòu)分拆欲间。分拆出來的更細(xì)粒度的問題断部,分解到不同的人來進(jìn)行解決,就形成了業(yè)務(wù)架構(gòu)和組織架構(gòu)她渴。解決這些問題就需要組合很多不同的技術(shù),那么應(yīng)該采用哪些技術(shù)沉唠?還是自己重頭實(shí)現(xiàn)一個? 自己實(shí)現(xiàn)一個—這就是很多人所謂的重新發(fā)明輪子满葛。以下試著分析一下:
????1著拭、當(dāng)技術(shù)所解決的問題和分拆出來要解決的問題,完全匹配的時候乳蛾,這是最完美的鄙币。比如需要提供 web 要訪問的 service,很多 MVC 的 framework 就可以很好的滿足這一點(diǎn)因惭。而這個時候如果非要自己實(shí)現(xiàn)一個绩衷,很有可能就是重新發(fā)明輪子。
????2勿决、當(dāng)技術(shù)所提供的能力遠(yuǎn)遠(yuǎn)超過需要解決的問題時招盲,往往掌握技術(shù)和維護(hù)技術(shù)會成為瓶頸。因?yàn)樵綇?fù)雜的技術(shù)咆繁,成本越高顶籽。如果自己實(shí)現(xiàn)一個僅僅是解決當(dāng)前問題的方案,可能成本反而更低礼饱。這也是為什么很多大型的互聯(lián)網(wǎng)公司不斷地開源出來自己的技術(shù)的原因设拟。而這些技術(shù)對于我們來說是否適用纳胧?他們原本是用來解決誰的問題的帘撰?什么問題?如果不清楚這些核行,就冒然采用蹬耘,可能會導(dǎo)致更高的成本。
????3综苔、當(dāng)技術(shù)所提供的能力和我們所要解決的問題部分匹配時,還是要看成本堡牡。比如當(dāng)我們需要一個錘子的時候杨刨,手邊正好沒有,但是卻有一只高跟鞋芥颈,勉強(qiáng)也可以替代錘子赚抡。但是長期來看,這么用不劃算妇垢,因?yàn)楦吒膬r(jià)格比錘子高很多肉康,耐用性差很多灼舍,維護(hù)成本也高很多。
所以炫乓,準(zhǔn)確識別采用什么技術(shù)的能力,也是架構(gòu)師所要具備的能力之一侠姑。考慮的主要因素也是長期的成本和收益莽红。