前面通過四篇文章嫂拴,把什么是架構(gòu),如何做好架構(gòu)等必要的概念澄清了一下贮喧。這些概念對于在各種不同的領(lǐng)域都應(yīng)該也是有用的筒狠,需要讀者自行思考,并應(yīng)用到自己所在的領(lǐng)域中箱沦。在這篇文章開始窟蓝,我們用同樣的思考,來看看軟件是怎么回事饱普,以及如何運(yùn)用架構(gòu)思維凸舵,更好的設(shè)計(jì)和實(shí)現(xiàn)軟件惹苗。
馮諾依曼結(jié)構(gòu)蔓涧,圖靈機(jī)惶凝,以模擬人為目標(biāo)
軟件的歷史,實(shí)際上可以說是用機(jī)器模擬人的歷史冯袍。不管大家(包括在這個(gè)歷史過程中的參與者)有沒有意識到匈挖,我們都有意無意的在計(jì)算機(jī)上模仿人類的行為碾牌。從馮諾依曼結(jié)構(gòu)開始,程序邏輯開始脫離硬件儡循,采用二進(jìn)制編碼舶吗。加上存儲,配合輸入輸出择膝,一個(gè)簡化的大腦就出現(xiàn)了誓琼。圖靈機(jī)則是模擬大腦的計(jì)算,用數(shù)學(xué)的方式把計(jì)算的過程定義了出來肴捉,著名的邱奇-圖靈論題:一切直覺上能行可計(jì)算的函數(shù)都可用圖靈機(jī)計(jì)算腹侣,反之亦然。軟硬件兩者一結(jié)合齿穗,一個(gè)可編程的大腦出現(xiàn)了傲隶,這也是現(xiàn)在為什么我們把計(jì)算機(jī)叫做電腦。在硬件上編寫出的程序窃页,就是軟件跺株,是用來控制硬件的行為的。
成本為王
在初期脖卖,軟件使用二進(jìn)制編寫的乒省,從硬件到軟件,成本都非常的高胚嘲。隨著半導(dǎo)體技術(shù)的進(jìn)步作儿,硬件的成本越來越低洛二,性能越來越高馋劈,甚至出現(xiàn)了摩爾定律:當(dāng)價(jià)格不變時(shí),集成電路上可容納的元器件數(shù)目晾嘶,約每隔18-24個(gè)月增加一倍妓雾,性能提升一倍。軟件方面垒迂,為了簡化難度械姻,開始采用匯編,進(jìn)一步出現(xiàn)了類似于人類的語言的高級語言机断,比如C/C++/Java等楷拳,這使得人類可以用類似于人的語言來和計(jì)算機(jī)溝通。軟件工程師慢慢越來越多吏奸,開發(fā)軟件的成本也越來越低欢揖。計(jì)算機(jī)就好像是一個(gè)只需要電,不需要休息的人奋蔚,可以無休無止的工作她混。
人們越來越愿意把原來只有人才能做的事情烈钞,交給計(jì)算機(jī)來做。結(jié)果就導(dǎo)致軟件越來越豐富坤按,能夠做的事情也越來越多毯欣,成本也越來越低〕襞В可以這么說酗钞,成本是我們?yōu)槭裁床捎密浖闹饕獎(jiǎng)恿Γ梢怨?jié)省大量的人員培訓(xùn)谢鹊,減少雇員的數(shù)目算吩。隨著互聯(lián)網(wǎng)的發(fā)展,人類社會也開始軟件化了佃扼。原來必須實(shí)體店來進(jìn)行售賣的偎巢,搬到互聯(lián)網(wǎng)上,開店成本更低兼耀,并且能夠接觸到更多的人压昼。想象一下,一個(gè)門店每天的人流達(dá)到百萬級別是很恐怖的瘤运,由實(shí)體空間大小來決定窍霞。但是在互聯(lián)網(wǎng)上,訪問量千萬級別都不算什么拯坟。最終的結(jié)果就變成但金,每個(gè)人能夠負(fù)擔(dān)的工作越來越多,成本越來越低郁季。這也是為什么軟件這么熱的原因冷溃。
軟件扮演的角色
隨著軟件的規(guī)模的變大,做好一個(gè)軟件也變得越來越難了梦裂。早期的程序員寫程序似枕,主要是為了幫助自己研究課題。這些程序員熟練了之后年柠,提高了自己的生產(chǎn)力凿歼,并發(fā)現(xiàn)還可以幫助別人寫程序,慢慢軟件就變成了一個(gè)獨(dú)立的行業(yè)冗恨。程序從早期由一個(gè)人完成答憔,也逐漸變成了由很多不同角色的人共同合作來完成。以下討論的前提掀抹,都是基于幫助別人寫程序虐拓,多人合作的基礎(chǔ)上的。結(jié)論對于單人為自己寫程序也適用渴丸。
在沒有軟件之前侯嘀,每個(gè)人干自己的工作另凌,自行保存自己的工作結(jié)果。人們面對面或者通過電話等溝通戒幔,如下圖所示吠谢。
有了軟件之后,實(shí)際上诗茎,我們是把我們?nèi)粘I钪兴龅氖虑楣し唬ㄎ覀冏约罕救硕家黄鹛摂M化到了計(jì)算機(jī)中。而人則演化成了敢订,通過計(jì)算機(jī)的輸入輸出設(shè)備王污,控制計(jì)算機(jī)中的自己,來完成日常的工作楚午,以及與其他人的溝通昭齐。也就是說,軟件一直以來的動力矾柜,始終都是來模擬人和這個(gè)社會的阱驾。比如模擬大氣運(yùn)動(天氣預(yù)報(bào)),模擬人類社會(互聯(lián)網(wǎng)社交)怪蔑,模擬交易里覆,包括現(xiàn)在正在流行的VR,人工智能等等缆瓣。模擬的對象越來越高級喧枷,難度越來越大。
不管如何發(fā)展弓坞,模擬人的所有行為都是一個(gè)大的趨勢隧甚。也就是說,軟件的主要目的昼丑,還是把人類的生活模擬化呻逆,提供更低成本夸赫,高效率的新的生活菩帝。從這個(gè)角度來看,軟件主要依賴的還是人類的生活知識茬腿。軟件更多的是扮演一個(gè)cost center呼奢,這也是為什么會出現(xiàn)很多的軟件代工。
軟件開發(fā)的架構(gòu)演變
軟件工程師是實(shí)現(xiàn)這個(gè)模擬過程的關(guān)鍵人物切平,他必須先理解人是怎么在日常生活中完成工作的握础,才能夠很好的把這些工作在計(jì)算機(jī)中模擬出來°财罚可是軟件工程師需要學(xué)習(xí)大量的計(jì)算機(jī)語言和計(jì)算機(jī)知識禀综,還需要學(xué)習(xí)各行各業(yè)的專業(yè)知識简烘。軟件工程師本身的培養(yǎng)就比較難,同時(shí)行業(yè)知識也要靠時(shí)間的積累定枷,這樣就遠(yuǎn)遠(yuǎn)超出了軟件工程師的能力了孤澎。所以軟件開發(fā)就開始有分工了,行業(yè)知識和業(yè)務(wù)的識別欠窒,會交給BA覆旭,系統(tǒng)的設(shè)計(jì)會交給架構(gòu)師,設(shè)計(jì)的實(shí)現(xiàn)交給架構(gòu)師岖妄,實(shí)現(xiàn)的檢驗(yàn)交給測試型将,還有很多其他角色的配合。為了組織這些角色的工作荐虐,還有項(xiàng)目經(jīng)理七兜。這就把原來一個(gè)人的連續(xù)工作,拆分成了不同角色的人的連續(xù)配合福扬,演化成了不同的軟件開發(fā)的模式惊搏。然后慢慢演變出專門為別人開發(fā)軟件的軟件公司。
軟件架構(gòu)的出現(xiàn)
如同前面描述的架構(gòu)的定義忧换,軟件架構(gòu)的出現(xiàn)也是同樣的恬惯。一開始是懵懵懂懂的去寫軟件,后來慢慢的就有意識的去切分亚茬,演變成了不同的架構(gòu)酪耳。這個(gè)背后的動力也是一樣的,就是提升參與的人的利益刹缝,降低成本碗暗。導(dǎo)火索也是軟件工程師的任務(wù)太重,我們需要把很多工作拆分出來梢夯。拆分的原則也是一樣的言疗,如何讓權(quán)責(zé)一致。同樣颂砸,這個(gè)拆分也是需要組織架構(gòu)的調(diào)整噪奄,來保證架構(gòu)的落地。具體如何分拆人乓,如何調(diào)整勤篮,我們將在另外一篇中著重討論。
以上通過簡單的描述計(jì)算機(jī)和軟件的發(fā)展歷史色罚,闡明軟件的本質(zhì)碰缔,其實(shí)就是通過把人類的日常工作生活虛擬化,減少成本戳护,提升單個(gè)人員的生產(chǎn)力金抡,提升人類自己的利益瀑焦。軟件工程師的職責(zé)在這個(gè)浪潮中,不堪重負(fù)梗肝,自然而然就分拆為不同的角色蝠猬,形成了一個(gè)獨(dú)特的架構(gòu)體系。這一切的背后统捶,仍然是為了提升人類自己的利益榆芦,解決人類自己的問題。