我是如何做軟件工程化的
最近有些忙,就是給團(tuán)隊(duì)里的同事寫的代碼進(jìn)行工程化。 只是這些活對(duì)我而言有些過于體力活,我干起來提不起興致。
這個(gè)過程中也發(fā)現(xiàn)很多人不理解什么是“軟件工程化”。導(dǎo)致的結(jié)果就是,很少人知道我干的事的價(jià)值,也不知道該如何與我配合。所以,有必要正式給大家介紹一下我做的“軟件工程化”指的是什么。
要介紹軟件工程化,我們首先要從程序員寫出來的代碼開始說起。
首先,程序員寫出來的代碼,并不能直接運(yùn)行。不同的編程語(yǔ)言,要運(yùn)行起來,所經(jīng)過的步驟不同,我們以Java來例。Java代碼運(yùn)行起來需要以下幾個(gè)步驟:
1. 下載依賴 2. 編譯 3. 打包 4. 安裝運(yùn)行環(huán)境,即JDK 5. 啟動(dòng)程序
1,2,3步驟,我們通常稱為構(gòu)建過程。Long long a ago,構(gòu)建過程全在程序員自己的開發(fā)機(jī)上完成。后來,想偷懶的程序員發(fā)明了Ant這款工具,將構(gòu)建過程自動(dòng)化了。但是,Ant這款工具本質(zhì)上只定義了一個(gè)基于任務(wù)的DSL(領(lǐng)域特定語(yǔ)言),不利于標(biāo)準(zhǔn)化。這時(shí),Maven出現(xiàn)了。它將1,2,3步驟進(jìn)行標(biāo)準(zhǔn)化。即,構(gòu)建過程標(biāo)準(zhǔn)化。說多一句,在這方面,Gradle相對(duì)Maven其實(shí)是開了倒車。
構(gòu)建過程,除了構(gòu)建工具本身的標(biāo)準(zhǔn)化,我還會(huì)將構(gòu)建環(huán)境標(biāo)準(zhǔn)化。這個(gè)過程就是根據(jù)不同的構(gòu)建環(huán)境創(chuàng)建相應(yīng)的標(biāo)準(zhǔn)化的Docker鏡像。將來,同一個(gè)項(xiàng)目的每一次構(gòu)建都使用相同的構(gòu)建環(huán)境。
構(gòu)建過程的標(biāo)準(zhǔn)化只是軟件工程化的一個(gè)階段。下一個(gè)階段是構(gòu)建過程自動(dòng)化,即,將構(gòu)建過程放到一個(gè)標(biāo)準(zhǔn)化的構(gòu)建環(huán)境中自動(dòng)化執(zhí)行。換句話說,程序員依然在本地可以執(zhí)行1,2,3步驟,只不過,團(tuán)隊(duì)不再使用程序員本地構(gòu)建出來的結(jié)果,而是使用標(biāo)準(zhǔn)化的構(gòu)建環(huán)境中構(gòu)建出來的。
在我做構(gòu)建自動(dòng)化的工作的時(shí)候,常有程序員不屑地說:我在本地電腦就一條命令,就可以把包上傳到制品倉(cāng)庫(kù)了。
這樣的話,我聽了很多了。我想說:是的,你的確可以一條命令解決問題。但是你只是解決了你個(gè)人的問題。你并不沒有解決軟件團(tuán)隊(duì)的問題。軟件工程化要解決的是一個(gè)團(tuán)隊(duì)協(xié)作的問題,而是個(gè)人的問題。你的不屑就像當(dāng)年在福特汽車廠里手工造車的工人,看不上流水線生產(chǎn)汽車。
在對(duì)構(gòu)建過程工程化后,我們就開始對(duì)4,5步驟進(jìn)行工程化了。4,5步驟叫做部署過程。部署過程的工程與構(gòu)建過程的工程化類似,也是先標(biāo)準(zhǔn)化,然后自動(dòng)化。
在沒有Docker之前,運(yùn)行環(huán)境的準(zhǔn)備和啟動(dòng)程序的標(biāo)準(zhǔn)化是非常困難的,每個(gè)公司不一樣,同一個(gè)公司下的不同團(tuán)隊(duì)也大概率不一樣。
有Docker之后,一切都變了。一下子任何語(yǔ)言的程序的部署過程的標(biāo)準(zhǔn)化都變得非常容易了。
在將原來的應(yīng)用改成使用Docker運(yùn)行的過程,是運(yùn)行環(huán)境標(biāo)準(zhǔn)化的過程,也被我們稱之為容器化的過程。
它所帶來的好處是部署過程不用關(guān)心你的運(yùn)行環(huán)境。也就是部署過程與軟件運(yùn)行環(huán)境進(jìn)行了解耦。
部署過程如何做到工程化,我之前的文章已經(jīng)有說明,本文就不再細(xì)說。
這時(shí),你發(fā)現(xiàn),上面我們對(duì)1,2,3,4,5步驟做的,無非就是 把軟件生產(chǎn)工程中,體力的部分進(jìn)行標(biāo)準(zhǔn)化,然后自動(dòng)化。這就是軟件工程化 。關(guān)鍵是,你能否識(shí)別什么是體力部分,什么是腦力部分。
另,腦力部分,還是需要發(fā)揮每個(gè)人創(chuàng)造力。
最后,想想Kubernetes,其實(shí)它是軟件工程化的集大成者。它標(biāo)準(zhǔn)且自動(dòng)化了軟件的構(gòu)建、部署、可觀察性、軟件的運(yùn)行方式。它真正做到了軟件的工程化。
個(gè)人經(jīng)驗(yàn)總結(jié)
- 標(biāo)準(zhǔn)化與自動(dòng)化的順序并不是固定的。有時(shí),你需要先自動(dòng)化,再標(biāo)準(zhǔn)化。因?yàn)椴蛔詣?dòng)化,沒有人力做標(biāo)準(zhǔn)化。
- 標(biāo)準(zhǔn)化涉及很多技術(shù)細(xì)節(jié),在你還不了解何種標(biāo)準(zhǔn)更優(yōu)時(shí),千萬要先松后緊,不要一開始就把標(biāo)準(zhǔn)就定得全面且死板。標(biāo)準(zhǔn)是演化出來的。
- 部署過程的標(biāo)準(zhǔn)化,大多數(shù)人只記得對(duì)應(yīng)用的部署,卻忘記了對(duì)配置也進(jìn)行同樣的標(biāo)準(zhǔn)化部署。
- 工程化需要一個(gè)人知識(shí)面非常的廣,要懂多種語(yǔ)言、多種構(gòu)建工具、多種部署工具、多種監(jiān)控方式。