我們來(lái)看這么一個(gè)安裝app的操作過程:
如果我們將這個(gè)操作流程記錄下來(lái)的話涩蜘,大致就可以得到這么一幅圖:
也就是說边琉,當(dāng)我們?nèi)ド痰晗螺d安裝一個(gè)app的時(shí)候抑进,它是需要經(jīng)過這么的一個(gè)過程戈泼,而編程就是在一步步地實(shí)現(xiàn)這么一個(gè)過程骂倘。產(chǎn)品經(jīng)理也好齐婴,程序員也好,都是在對(duì)一個(gè)功能或是一個(gè)操作流程進(jìn)行分析然后拆分稠茂,再一步步地去實(shí)現(xiàn)柠偶,最后串聯(lián)起來(lái)去實(shí)現(xiàn)出這個(gè)功能或是這個(gè)流程。
我覺得這應(yīng)該是逆推法睬关,先知道我們要實(shí)現(xiàn)的效果诱担,再反推回去需要什么樣的步驟。
這里面有兩個(gè)主要的流程电爹,一個(gè)是下載蔫仙,一個(gè)是安裝。我們可以看到丐箩,要想“下載結(jié)束”摇邦,得有個(gè)“下載中”的過程,而要有個(gè)“下載中”的過程屎勘,就需要有個(gè)“開始下載”的起點(diǎn)施籍,只有這幾個(gè)串聯(lián)起來(lái),才是一個(gè)完整的”下載“功能(我們忽略下載失敗等意外情況)概漱;安裝也是同樣的道理丑慎。那么我們就可以看到這里面是有個(gè)相互依賴的東西。
接下來(lái)我們把下載和安裝放在一起來(lái)看瓤摧,其實(shí)它們是互不干擾的竿裂,安裝只需要知道下載的結(jié)果而已,如果成功就安裝照弥,不成功就不安裝腻异,它不需要去知道究竟下載這個(gè)功能里是怎么操作的,它只關(guān)心結(jié)果这揣,那么這里我們就看到了一個(gè)相互獨(dú)立的東西悔常。
因此我們把上圖做進(jìn)一步的抽象:
在生活中的生產(chǎn)也是一個(gè)這樣的道理敢会,福特公司發(fā)明了流水線后,把汽車的組裝過程進(jìn)行拆分这嚣,在生產(chǎn)車間里每個(gè)人都只做自己的那個(gè)步驟鸥昏,車間與車間之間也只關(guān)注結(jié)果,不需要去知道上一個(gè)車間的操作過程姐帚,這樣讓效率有了提升吏垮,也降低了干擾。
解耦
那么這里有一個(gè)詞罐旗,叫“解耦”膳汪。
“耦”這個(gè)字在百度百科上的解釋有雙數(shù),成對(duì)的意思九秀,同“偶”遗嗽。
“耦合”在物理學(xué)上指兩個(gè)或兩個(gè)以上的體系或兩種運(yùn)動(dòng)形式之間通過各種相互作用而彼此影響以至聯(lián)合起來(lái)的現(xiàn)象。
所以“解耦”就是分開這兩種東西鼓蜒,降低它們之間互相的作用痹换。
這個(gè)詞在編程里常常會(huì)提到的,主要是讓一些功能獨(dú)立開來(lái)都弹,之間不要產(chǎn)生過多的黏性娇豫,不然就會(huì)導(dǎo)致改動(dòng)起來(lái)麻煩,也就是所謂的“牽一發(fā)而動(dòng)全身”畅厢。
所以解耦是一個(gè)好的軟件架構(gòu)里的一個(gè)標(biāo)準(zhǔn)冯痢,在開發(fā)的過程中要有這種思想或意識(shí),把各個(gè)功能模塊都獨(dú)立開來(lái)框杜,需要的話在一個(gè)個(gè)地放進(jìn)去浦楣,之間通過一些接口進(jìn)行聯(lián)系即可。
我們只差一個(gè)程序員了
現(xiàn)在我們把兩幅圖放在一起來(lái)看:
可以看出右圖抽象后的流程應(yīng)該是更為容易被大眾所接受和理解的咪辱。但由于專業(yè)和工作性質(zhì)的問題振劳,程序員是傾向于看到左邊的更為細(xì)致的流程圖,因?yàn)橹懒艘粋€(gè)更加具體的細(xì)節(jié)(當(dāng)然實(shí)際開發(fā)過程中需要知道的細(xì)節(jié)不止這樣梧乘,可能還需要更多的一些技術(shù)細(xì)節(jié)等澎迎,這里只是一個(gè)參考)庐杨。
所以這里就引出了一個(gè)溝通的問題选调,像類似的“我們只差一個(gè)程序員了”,“做個(gè)支付的功能”灵份,“像Google那樣的搜索”這樣的說法仁堪,往往就會(huì)帶來(lái)誤會(huì)。因?yàn)閰⒖忌厦鎯蓤D的對(duì)比我們可以看出填渠,右圖是被屏蔽了眾多細(xì)節(jié)后呈現(xiàn)給大眾看到后的結(jié)果弦聂,而為了實(shí)現(xiàn)這個(gè)效果是需要前面的分析鸟辅,設(shè)計(jì),開發(fā)等一系列的流程才能得到的莺葫。