軟件的精髓在于設(shè)計(jì)

軟件的精髓在于設(shè)計(jì),設(shè)計(jì)是一件費(fèi)腦子的事情,因?yàn)檐浖O(shè)計(jì)背后是權(quán)衡的動作,比如時(shí)間換空間、空間換時(shí)間、TCP還是UDP、同步還是異步、數(shù)據(jù)冗余與一致性、微服務(wù)邊界如何劃分、架構(gòu)中的功能性邏輯與非功能性邏輯等。
但往往很多程序員花在設(shè)計(jì)與權(quán)衡上的時(shí)間太少了,花了大量時(shí)間在寫代碼、重構(gòu)、問題排查。
如果缺少足夠的設(shè)計(jì)思考,一上來就去寫代碼,勢必造成很多瑕疵、隱患與質(zhì)量問題存在,而這部分在未來會變成新的成本、耗費(fèi)精力,殺死你的時(shí)間。
同樣一個(gè)架構(gòu)在早期沒有考慮好其功能性與非功能性的設(shè)計(jì)擴(kuò)展的話,未來的某一天架構(gòu)去解決高性能問題、高可用問題時(shí),因?yàn)槿鄙僮銐虻臄U(kuò)展性,難以快速解決這個(gè)問題,甚至出現(xiàn)推倒重建的情況,這部分依然是個(gè)逃不過的成本。
重構(gòu)是件好事,但頻繁的重構(gòu)是噩夢,頻繁重構(gòu)代表了這個(gè)系統(tǒng)的設(shè)計(jì)者缺少足夠的思考,沒有留有擴(kuò)展性,沒有考慮到業(yè)務(wù)可能的發(fā)展方向,缺少規(guī)劃。不斷重構(gòu)表面上消耗了人力與時(shí)間,背后會讓團(tuán)隊(duì)情緒低落,產(chǎn)生厭倦情緒。
如果你花了時(shí)間在架構(gòu)的設(shè)計(jì)上,比如和業(yè)務(wù)聊了下發(fā)展趨勢與變化,做好了技術(shù)難點(diǎn)細(xì)節(jié)的隔離,推敲了一段設(shè)計(jì)的合理性、風(fēng)險(xiǎn)、復(fù)雜度,看到了設(shè)計(jì)上的缺陷,那你其實(shí)不需要頻繁的重構(gòu),因?yàn)檫@些成本在日常的每一次迭代中被低成本的消化了。后續(xù)你的系統(tǒng)將會越來越輕松,越來越穩(wěn)定。
多些時(shí)間做設(shè)計(jì),不是讓你寫了更多代碼,做了更多迭代,而是考慮到其背后的成本,減少了不必要的冗余,更快更好的交付一個(gè)更好的產(chǎn)品。
代碼的好壞有這幾種級別:
1)可編譯
2)可運(yùn)行
3)可測試
4)可讀
5)可維護(hù)
6)可重用
通過自動化測試的代碼只能達(dá)到第3)級,而通過設(shè)計(jì)的代碼少會在第4)級甚至更高。
導(dǎo)致大家認(rèn)為沒思考時(shí)間的原因有幾個(gè):
1. 項(xiàng)目DDL的壓力:這種情況很多人覺得要在速度和質(zhì)量上做個(gè)權(quán)衡。但偶爾的時(shí)間壓力讓我們非常痛苦是正常的,都會有幾次通宵突擊的情況,但如果這是常態(tài)就不正常了,需要和業(yè)務(wù)方與老板聊聊,背后的原因是什么;
2. 過度的設(shè)計(jì):我們談了要多一些設(shè)計(jì)思考,但往往變成了研發(fā)同學(xué)的過度設(shè)計(jì),一些無關(guān)或成本不可控的場景被復(fù)雜且過度的設(shè)計(jì),出現(xiàn)在一個(gè)本不應(yīng)該投入的地方,導(dǎo)致舍本逐末、買櫝還珠。好的設(shè)計(jì)不是紙上談兵,需要結(jié)合實(shí)踐;
3. 團(tuán)隊(duì)成員水平?jīng)Q定:這其實(shí)是很常見的一種情況,很多同學(xué)缺少建模與面向?qū)ο蟮脑O(shè)計(jì),在職業(yè)發(fā)展初期過多關(guān)注于高并發(fā)的術(shù),反而缺少了業(yè)務(wù)及基礎(chǔ)技術(shù)層面的積累,導(dǎo)致很多過程代碼的出現(xiàn)。團(tuán)隊(duì)是需要培訓(xùn)的,結(jié)合團(tuán)隊(duì)平均能力做合適的設(shè)計(jì),比較再好的設(shè)計(jì)也需要一群人的執(zhí)行,每一個(gè)人都有可能變成木桶的短板,而這個(gè)短板決定了整個(gè)設(shè)計(jì)的下限;
怎么提高設(shè)計(jì)能力呢?
我覺得最重要的方式就是多看,看看好的系統(tǒng)怎么設(shè)計(jì)、好的源碼怎么設(shè)計(jì)、好的書籍中的例子。
比如《大話設(shè)計(jì)模式》,里面的例子看似很簡單,但有時(shí)候簡單就對了,反而沒必要搞那么復(fù)雜。
簡單的面向?qū)ο笞龊萌缦聨讞l:
1. 單一、簡潔、模塊化、封裝;
2. 數(shù)據(jù)與其行為打包封裝;
3. 程序的接口和實(shí)現(xiàn)的解耦;
4. 組合優(yōu)于繼承;
5. 依賴接口而不是依賴實(shí)現(xiàn);
6. 高內(nèi)聚低耦合;
高級一點(diǎn)的就是SOLID原則。
當(dāng)然更推薦《UNIX編程藝術(shù)》。
有時(shí)我們會發(fā)現(xiàn),系統(tǒng)中存在一種膠水層,最開始python、ruby也被叫做膠水語言,這一層用于粘合業(yè)務(wù)邏輯和基礎(chǔ)能力,Unix設(shè)計(jì)哲學(xué)認(rèn)為,膠水層應(yīng)該盡可能的薄,太厚了你將苦苦掙扎。
比如我們對外部RPC、二方j(luò)ar都需要加一層防腐處理,也就是膠水層的意思,網(wǎng)關(guān)API對不同終端的不同數(shù)據(jù)結(jié)構(gòu)要求做不同的處理,也是膠水層發(fā)揮作用,千萬不要把這一層隨時(shí)可以撕掉的膠水放到邏輯層。
