“云、架構(gòu)即代碼、具有API和反脆弱系統(tǒng)的聯(lián)邦架構(gòu),這些軟件系統(tǒng)開發(fā)技術(shù)正迅速成為關(guān)注焦點(diǎn)”。這是Mary Poppendieck在GOTO Berlin 2016大會(huì)上做“軟件工程技術(shù)的未來”演講時(shí)所提出的。
當(dāng)數(shù)據(jù)量大到無法被單機(jī)所管理時(shí),有兩個(gè)解決方案,即縱向擴(kuò)展和橫向擴(kuò)展。縱向擴(kuò)展通過擴(kuò)容單機(jī)的能力實(shí)現(xiàn),Poppendieck指出通常這并非是解決問題的正確方向。很多情況下需要做橫向擴(kuò)展,通過添加更多的計(jì)算機(jī)構(gòu)建集群系統(tǒng)。
Poppendieck在演講中給出了兩種不同的橫向擴(kuò)展方法:
文件的橫向擴(kuò)展。以Google的搜索技術(shù)為例,文件被分割為多個(gè)小塊并分別拷貝到多個(gè)服務(wù)器中。這樣搜索可并行地完成,并通過合并各個(gè)服務(wù)器所給出的結(jié)果得到最終的搜索結(jié)果。
架構(gòu)的橫向擴(kuò)展。以Amazon的做法為例,事務(wù)會(huì)被切分為多個(gè)服務(wù),每個(gè)服務(wù)使用特定服務(wù)器實(shí)現(xiàn)。當(dāng)事務(wù)存在瓶頸時(shí),可在多個(gè)服務(wù)器上復(fù)制服務(wù),并且每個(gè)服務(wù)由一個(gè)半自治的“雙比薩”團(tuán)隊(duì)(譯者注:“雙批薩”原則指團(tuán)隊(duì)規(guī)模不應(yīng)超過兩個(gè)披薩餅還不夠吃的人數(shù))負(fù)責(zé)。
Poppendieck提到,越來越多的系統(tǒng)正在向云上遷移,云就是未來。她指明:
相比于大多數(shù)預(yù)制的數(shù)據(jù)中心,云更便宜、更穩(wěn)定、更安全并且更具擴(kuò)展性。
將已有的應(yīng)用轉(zhuǎn)化為基于云的應(yīng)用是十分具有挑戰(zhàn)性的。Poppendieck引用了IBM的Arthur Cole所說的話:
針對(duì)傳統(tǒng)數(shù)據(jù)架構(gòu)所設(shè)計(jì)的應(yīng)用如果不做大量的代碼重構(gòu)工作,就無法在云中很好地運(yùn)行。
Poppendieckz在演講中給出了幾個(gè)已有的架構(gòu)即代碼解決方案:
使用容器,實(shí)現(xiàn)了過程的標(biāo)準(zhǔn)化和自動(dòng)化。 無服務(wù)器架構(gòu),以更低的價(jià)格提供了靈活的計(jì)算容量。 軟件定義網(wǎng)絡(luò),使用軟件而非硬件實(shí)現(xiàn)了規(guī)模擴(kuò)展。單一的中央數(shù)據(jù)庫會(huì)產(chǎn)生依賴性問題,這是由于所有的應(yīng)用都依賴于數(shù)據(jù),數(shù)據(jù)庫的改變將會(huì)影響到很多的應(yīng)用。Poppendieck指出:“企業(yè)數(shù)據(jù)庫是一個(gè)巨大的依賴性生成器”。由于每個(gè)獨(dú)立團(tuán)隊(duì)的工作必須要和其它共享同一數(shù)據(jù)庫的團(tuán)隊(duì)協(xié)作,這導(dǎo)致每個(gè)團(tuán)隊(duì)都無法實(shí)現(xiàn)自治的部署。聯(lián)邦架構(gòu)是單一數(shù)據(jù)庫的替代技術(shù),它將數(shù)據(jù)分割為適合各個(gè)獨(dú)立模塊或服務(wù)需求的本地?cái)?shù)據(jù)存儲(chǔ),數(shù)據(jù)的存取只能通過API方法。API正在替代中央共享數(shù)據(jù)庫,并使物聯(lián)網(wǎng)成為可能。Poppendieck指出,使用API是軟件工程的必備技術(shù)。API應(yīng)作為有具體團(tuán)隊(duì)負(fù)責(zé)的產(chǎn)品看待,并通過聚焦于API用戶來推進(jìn)和開發(fā)新的功能。
Poppendieck說,沒有必要盡力去實(shí)現(xiàn)系統(tǒng)零故障,我們可以換一種思維。當(dāng)前很多的系統(tǒng)都是脆弱的,雖然它們?cè)趧偵暇€時(shí)都是魯棒的,但是隨著時(shí)間的進(jìn)展,它們變得越發(fā)地難以維護(hù)。Poppendieck提出,當(dāng)今系統(tǒng)需要的是反脆弱,并具有面對(duì)故障的能力。在發(fā)生故障時(shí),系統(tǒng)應(yīng)能限定損害的程度,并從故障中恢復(fù)。
如何獲取反脆弱系統(tǒng)取決于系統(tǒng)測試的方法,即如何通過注入故障產(chǎn)生給定的運(yùn)行錯(cuò)誤。Poppendieck指出,為達(dá)到所期望的可用性和魯棒性等級(jí),系統(tǒng)需要隔離故障并從故障自動(dòng)恢復(fù)。
Poppendieck提到了當(dāng)前開發(fā)軟件的關(guān)鍵事宜,她說,為具備持續(xù)集成的能力,需要一個(gè)部署流水線;為獲得持續(xù)集成所承諾的優(yōu)點(diǎn),需要具有一個(gè)包括產(chǎn)品管理、測試和運(yùn)營的跨功能團(tuán)隊(duì)。部署流水線依賴于自動(dòng)的測試、遷移和部署過程。持續(xù)集成需要所有團(tuán)隊(duì)通過代碼庫做交流,實(shí)現(xiàn)針對(duì)主干分支的持續(xù)集成。團(tuán)隊(duì)?wèi)?yīng)維持軟件時(shí)常處于發(fā)布就緒的狀態(tài),如果事實(shí)并非如此,你必須停下來并做到上述要求。只要實(shí)現(xiàn)了持續(xù)的部署,一旦有用的軟件增量或功能就緒,就可通過切換或轉(zhuǎn)換實(shí)現(xiàn)軟件的增量發(fā)布。
Poppendieck提出,持續(xù)交付提供了必要的端到端反饋。研究顯示在半數(shù)情況下產(chǎn)品經(jīng)理是錯(cuò)的,產(chǎn)品規(guī)格說明中會(huì)有三分之二的特性和功能是沒有必要的。導(dǎo)致這些問題產(chǎn)生的原因在于做實(shí)驗(yàn)驗(yàn)證某個(gè)特性是否可以真正地解決手頭問題之前,就試圖達(dá)成具體開發(fā)特性的細(xì)節(jié)。為確保開發(fā)的解決方案能很好地適用于所需解決問題,需要通過實(shí)際的使用產(chǎn)生快速的反饋,這也正是精益開發(fā)和敏捷開發(fā)實(shí)踐的真正價(jià)值所在。Poppendieck建議將發(fā)布團(tuán)隊(duì)轉(zhuǎn)變?yōu)樵谝欢l件下可解決問題的團(tuán)隊(duì)。
Poppendieck建議在系統(tǒng)開發(fā)的過程中采用基本的工程性過程實(shí)踐、在現(xiàn)實(shí)制約因素的范圍內(nèi)學(xué)習(xí),并且建議從模式或者信號(hào)而非需求或是特性開始。然后聚焦于問題本身并使用假設(shè)去規(guī)劃工作。基于上述方法,開展多個(gè)實(shí)驗(yàn)并使用實(shí)驗(yàn)結(jié)果數(shù)據(jù)決定應(yīng)如何繼續(xù)工作。
查看英文原文:Technologies for the Future of Software Engineering