我國傳統(tǒng)文化上,要做成一件事,講究三個(gè)方面:明道,優(yōu)術(shù),取勢(shì)。在軟件架構(gòu)設(shè)計(jì)方面而言,也是類似的道理:遵循自然規(guī)律以明確大的方向,使用優(yōu)秀的實(shí)操戰(zhàn)術(shù),再根據(jù)實(shí)際情況落地。
這是個(gè)快餐年代,幾乎所有人都只做一件事 -“取勢(shì)”。 幾乎沒有多少人會(huì)去理解一個(gè)Servlet的工作原理,去理解一次HTTP請(qǐng)求的完整流程,因?yàn)橛谐嗫蚣軒湍闫帘瘟诉@里的細(xì)節(jié)。詢問一個(gè)人會(huì)什么技術(shù),回答也往往是我會(huì)Hibernate、Spring、Ibatis、會(huì)PullToRefresh組件、會(huì)使用SDWebimage。不過這些框架(Framework)其實(shí)并不是軟件架構(gòu)。軟件架構(gòu)是一所有生命力的房子,而這些框架只是大一點(diǎn)的板磚。
因?yàn)楣P者水平有限,這里只提一些普遍準(zhǔn)則,也就是”正確的廢話“,以饗視聽。不會(huì)深入到實(shí)操戰(zhàn)術(shù)上,比如怎么用Spring實(shí)施MVC架構(gòu),怎么使用Maven管理依賴,Redis的常用操作,怎么搭建一個(gè)負(fù)載均衡的集群,如何使用阿里巴巴的Dubbo框架進(jìn)行服務(wù)化等等。如果大家有興趣,可以自行搜索,有很多優(yōu)秀的文章可供參考。
不幸的“程序猿”和“程序媛”各有各的痛苦,幸福的程序員都是相似的。其實(shí)說幸福有點(diǎn)言過其實(shí),下面就說說怎么讓他們不那么痛苦。
“At the bottom of every person's dependency, there is always pain, Discovering the pain and healing it is an essential step in ending dependency.” --Chris Prentiss
他們都在一個(gè)相對(duì)穩(wěn)定的軟件架構(gòu)里編碼,自己的代碼不會(huì)依賴很多模塊,不會(huì)因?yàn)樽约何⑿〉母膭?dòng)造成全局的失敗。正如"1984"中的老大哥說的,Ignorance is strength(”對(duì)外界的“無知就是一種力量). 任何一個(gè)模塊都不能有太強(qiáng)的存在感。
曾經(jīng)在一個(gè)大型互聯(lián)網(wǎng)公司里面,任何人只要用到一個(gè)核心模塊的功能,就必須依賴一個(gè)部署在某遠(yuǎn)程服務(wù)器的庫,而且還有IP限制,只能把代碼部署到指定網(wǎng)段才能運(yùn)行起來。導(dǎo)致基本上沒法在本地進(jìn)行單元測(cè)試或者簡單調(diào)試。這個(gè)核心庫的存在感太強(qiáng),就成了開發(fā)的瓶頸,嚴(yán)重的降低了生產(chǎn)力和碼農(nóng)的幸福程度。
在“風(fēng)語者客服+”的架構(gòu)中,每個(gè)碼農(nóng)都可以很方便的在本地把服務(wù)啟動(dòng)起來,一分鐘up and running,隨便做一些改動(dòng)就可以立竿見影的看到效果。這里要?dú)w功于幾個(gè)東西:
1. Git代碼管理
在團(tuán)隊(duì)作戰(zhàn)中,每個(gè)程序員可以取下來完整的最新代碼庫,也可以在本地分支上盡情揮毫潑墨,而不擔(dān)心影響別人的工作。也可以把本地修改先stash起來,review一下別人的代碼,再unstash恢復(fù)回來。要想提高團(tuán)隊(duì)效率,代碼倉庫管理建議盡快遷移到Git上。
2. Maven、Gradle、Cocopods等依賴管理
Maven是一個(gè)管理依賴(Dependency)的工具,現(xiàn)在在Java社區(qū)應(yīng)該是比較普及的,無法想象現(xiàn)在還有團(tuán)隊(duì)直接拷貝jar包來管理依賴。雖然早期沒有Maven的時(shí)候,都是拷貝jar包這么過來的,碰到的問題也是顯而易見的,依賴的jar包作者改了某個(gè)bug,沒能及時(shí)傳導(dǎo)到調(diào)用方。多個(gè)調(diào)用方使用不一致的jar包,導(dǎo)致各種奇異bug。對(duì)應(yīng)的在安卓社區(qū),使用gradle的比較多,iOS的Objective-C開發(fā)中,多采用CocoaPods。