歷史回顧
為了能夠更好的理解什么是DevOps晴玖,我們很有必要對當(dāng)時(shí)還只有程序員(此前還沒有派生出開發(fā)者读存,前臺(tái)工程師,后臺(tái)工程師之類)這個(gè)稱號(hào)存在的歷史進(jìn)行一下回顧呕屎。
如編程之道中所言:
老一輩的程序員是神秘且深?yuàn)W的让簿。我們沒法揣摩他們的想法,我們所能做的只是描述一下他們的表象榨惰。
清醒的像一只游過水面的狐貍
警惕的像一位戰(zhàn)場上的將軍
友善的像一位招待客人的女主人
單純的像一塊未經(jīng)雕琢的木頭
深邃的像一潭幽深洞穴中漆黑的池水
程序員開發(fā)了機(jī)器語言拜英,機(jī)器語言又產(chǎn)生了匯編語言,匯編語言產(chǎn)生了編譯器琅催,如今的語言已經(jīng)多不勝數(shù)居凶。每一種語言都有其各自的謙卑用途。每一種語言都表達(dá)出軟件的陰和陽藤抡。每一種語言都在此道之中有其一席之地侠碧。
遙想當(dāng)年,軟件程序員的大部分辦公司那時(shí)還被稱作實(shí)驗(yàn)室缠黍,程序員那時(shí)還叫做科學(xué)家弄兜。為了開發(fā)出一套優(yōu)秀的軟件,程序員們必須深入了解他們需要的應(yīng)用相關(guān)的所有問題瓷式。他們必須清楚知道這個(gè)軟件應(yīng)用在什么場合替饿,這個(gè)軟件是必須在什么系統(tǒng)上運(yùn)行。本質(zhì)上說贸典,程序員對所要開發(fā)的軟件的所有環(huán)節(jié)都有透徹的了解视卢,從規(guī)格說明書編寫、到軟件開發(fā)廊驼、到測試据过、到部署、再到技術(shù)支持妒挎。
過了不久绳锅,人類(客戶)貪婪的特性就開始表現(xiàn)出來,他們開始不斷的進(jìn)行更多的索求酝掩。更快的速度鳞芙,更多的功能,更多的用戶,更多的所有所有原朝。
作為一類謙虛闯割、謙卑、且平靜的生物竿拆,我們的老一輩程序員們將很難在這種爆發(fā)性的過度的需求索取中幸存宙拉。最好的取勝辦法就是往不同的方向進(jìn)化成不同的新物種。很快丙笋,程序員這個(gè)稱號(hào)就開始絕跡于江湖谢澈,而那些叫做開發(fā)者、軟件工程師御板、網(wǎng)絡(luò)管理員锥忿、數(shù)據(jù)庫開發(fā)者、網(wǎng)頁開發(fā)者怠肋、系統(tǒng)架構(gòu)師敬鬓、測試工程師等等更多的新物種就開始誕生◇细鳎快速進(jìn)化和快速適應(yīng)外界的挑戰(zhàn)成為了他們的DNA的一部分钉答。這些新的種族可以在幾個(gè)星期內(nèi)就完成進(jìn)化。網(wǎng)頁開發(fā)者很快就能進(jìn)化成后臺(tái)開發(fā)者杈抢,前臺(tái)開發(fā)者数尿,PHP開發(fā)者,Ruby開發(fā)者惶楼,Angular開發(fā)者…多得讓人側(cè)目右蹦。
很快他們就都忘卻了他們都是起源于程序員這個(gè)共同的祖先的事實(shí),忘卻了曾經(jīng)有過這么一個(gè)單純且平靜的歼捐,想要讓這個(gè)世界變得更好的科學(xué)家何陆。然后他們開始不斷的劍拔弩張,都聲稱自己才是“程序員”的純血統(tǒng)繼承人豹储。
隨著時(shí)間的轉(zhuǎn)移贷盲,各門各派開始獨(dú)占山頭,很少進(jìn)行交流互動(dòng)颂翼,只有在迫不得已的時(shí)刻才會(huì)進(jìn)行溝通晃洒。他們開始不再為同源的遙遠(yuǎn)的同宗兄弟們的成功而歡呼雀躍慨灭,甚至再也不會(huì)時(shí)把的遙寄張明信片進(jìn)行噓寒問暖。
但是在深夜仰望星空的時(shí)候氧骤,他們還是會(huì)發(fā)現(xiàn)他們的心底深處的程序員基因還是會(huì)不停的閃爍著呻疹,期盼著這閃爍的火花能照亮整個(gè)銀河系并帶來和平。
在這場自私且以自我為中心的欲征服世界的賽跑旅程里筹陵,程序員的子孫們早把他們真正的工作目標(biāo)置之腦后-為客戶解決問題刽锤。面對一拖再拖的項(xiàng)目交付日期镊尺,昂貴的開發(fā)代價(jià),甚至最終失敗的項(xiàng)目并思,客戶們開始對這種情況深惡痛絕庐氮。
偶爾,也會(huì)有一個(gè)閃亮的明星站出來宋彼,靈機(jī)一動(dòng)的提供一種辦法來嘗試結(jié)束這種混亂并帶來和平弄砍。所以瀑布開發(fā)流程就應(yīng)運(yùn)而生了。這是一個(gè)非常了不起的創(chuàng)意输涕,因?yàn)樗昧瞬煌瑘F(tuán)隊(duì)的開發(fā)者們只在必須的時(shí)候才進(jìn)行溝通的這個(gè)事實(shí)音婶。當(dāng)一個(gè)團(tuán)隊(duì)完成了他們的工作的時(shí)候,它就會(huì)和下游的團(tuán)隊(duì)進(jìn)行交流并把任務(wù)進(jìn)行往下傳莱坎,如此一級(jí)接一級(jí)的傳遞下去衣式,永不回首。
這種方式在一段時(shí)間內(nèi)發(fā)揮了效用檐什,但很快碴卧,一如既往,貪婪的人們(客戶)又開始提出更多的訴求乃正。他們希望能夠更多地參加到整個(gè)軟件的開發(fā)流程中來螟深,不時(shí)的提出他們的建議,甚至在很晚的時(shí)候還提出改需求這種喪心病狂的事情來烫葬。
結(jié)果就是如大家有目共睹的事實(shí)一樣界弧,軟件項(xiàng)目非常容易失敗這個(gè)說法已經(jīng)作為一個(gè)行業(yè)標(biāo)準(zhǔn)被人們所接受。數(shù)據(jù)表明超過50%的項(xiàng)目最終都是以失敗告終的搭综。更可悲的是垢箕,在當(dāng)時(shí)看來,人們對這種情況是束手無策兑巾。
值得慶幸的是条获,每一個(gè)時(shí)代總會(huì)有那么幾個(gè)思想開放的英雄如漆黑中的螢火蟲般冒出來。他們知道這些不同團(tuán)隊(duì)的開發(fā)者們必須要找到一個(gè)可以協(xié)同工作帅掘、進(jìn)行交流堂油、并且能夠彈性的向客戶保證對方將會(huì)拿到最優(yōu)的解決方案的方式府框。這種嘗試最早可以追溯到1957年,偉大的約翰·馮·諾依曼和同行們的努力院峡。但是我們最終卻是等到2001年才收獲到革命的果實(shí)发魄,當(dāng)時(shí)行業(yè)的十多個(gè)精英創(chuàng)造出了如今聞名世界的“敏捷宣言”俩垃。
敏捷宣言基于以下十二條原則:
我們的首要任務(wù)是通過盡早地吆寨、持續(xù)地交付可評(píng)價(jià)的軟件來使客戶滿意啄清。
樂于接受需求變更辣卒,即使是在開發(fā)后期也應(yīng)如此。敏捷過程能夠駕馭變化想帅,從而為客戶贏得競爭優(yōu)勢港准。
頻繁交付可使用的軟件浅缸,交付間隔越短越好衩椒,可以從幾個(gè)星期到幾個(gè)月毛萌。
在整個(gè)項(xiàng)目開發(fā)期間阁将,業(yè)務(wù)人員和開發(fā)人員必須朝夕工作在一起冀痕。
圍繞那些有推動(dòng)力的人們來構(gòu)建項(xiàng)目言蛇。給予他們所需的環(huán)境和支持宵距,并且信任他們能夠把工作完成好婿斥。
與開發(fā)團(tuán)隊(duì)以及在開發(fā)團(tuán)隊(duì)內(nèi)部最快速民宿、有效的傳遞信息的方法就是像鸡,面對面的交談志群。
可使用的軟件是進(jìn)度的主要衡量指標(biāo)蛔钙。
敏捷過程提倡可持續(xù)發(fā)展吁脱。出資人兼贡、開發(fā)人員以及使用者應(yīng)該總是共同維持穩(wěn)定的開發(fā)速度。
為了增強(qiáng)敏捷能力讲衫,應(yīng)持續(xù)關(guān)注技術(shù)上的杰出成果和良好的設(shè)計(jì)涉兽。
簡潔——最大化不必要工作量的藝術(shù)——是至關(guān)重要的枷畏。
最好的架構(gòu)拥诡、需求和設(shè)計(jì)都源自自我組織的團(tuán)隊(duì)。
團(tuán)隊(duì)?wèi)?yīng)該定期反思如何能變得更有戰(zhàn)斗力冗懦,然后相應(yīng)地轉(zhuǎn)變并調(diào)整其行為。
敏捷宣言是為銀河系帶來和平以及維護(hù)各自的平衡所邁出的很重要的第一步没讲。在很長的時(shí)間里礁苗,相比此前基于流程和機(jī)械化的方式贰谣,這是第一次基于文化和“人性”來將不同的關(guān)鍵項(xiàng)目關(guān)系人連接在一起的方式吱抚。人們開始互相交流秘豹,進(jìn)行基本的碰頭會(huì)議既绕,并開始不斷的交流意見和看法凄贩。他們開始意識(shí)到他們是有著很多比想象中還多的共同點(diǎn)的疲扎,客戶也開始成為他們之中的一員椒丧,而不再是像以往一樣只是往項(xiàng)目砸錢然后開始求神拜佛祈求一切順利如愿。
盡管前面還是有不少的障礙需要克服浦译,但是未來已經(jīng)光明了許多。敏捷意味著開放和擁抱(需求)改變谜酒。但是她肯,如果改變過多的話,人們就很難專注到最終的目標(biāo)和交付上來康嘉。此時(shí)精益軟件開發(fā)就開始破土而出了。
因?yàn)閷孳浖_發(fā)的著迷以及為了達(dá)成放逐和驅(qū)趕風(fēng)險(xiǎn)的目的枝哄,一些程序員的子孫們就開始探首窗外众羡,開始向軟件之外的行業(yè)進(jìn)行取經(jīng)粱侣。他們從一家主要的汽車生產(chǎn)商身上找到了救贖。豐田生產(chǎn)系統(tǒng)在精益上面的成就是不可思議的稠茂,同時(shí)它們的精益生產(chǎn)的經(jīng)驗(yàn)也是很容易應(yīng)用到軟件開發(fā)上來的睬关。
精益有以下7個(gè)原則:
杜絕浪費(fèi)
內(nèi)建質(zhì)量
創(chuàng)建知識(shí)(放大學(xué)習(xí))
延遲決策(盡量延遲決定)
快速交付
尊重人員(團(tuán)隊(duì)授權(quán))
全局優(yōu)化
將這些放到敏捷上去的話该肴,精益原則就能讓人們在從精神上關(guān)注做正確的事情匀哄,同時(shí)還能夠讓整個(gè)開發(fā)流程擁有足夠的彈性阱州。
一旦敏捷和精益軟件開發(fā)被軟件開發(fā)團(tuán)隊(duì)采納法梯,那么下一步就是把這一套原則應(yīng)用到IT團(tuán)隊(duì)上來苔货。把IT也納入到整體戰(zhàn)略上,然后我們就來到了DevOps跟前了立哑!
進(jìn)入DevOps – 高速公路的三條車道
老一派的軟件開發(fā)團(tuán)隊(duì)成員會(huì)包含業(yè)務(wù)分析員夜惭,系統(tǒng)架構(gòu)師,前端開發(fā)者铛绰,后端開發(fā)者诈茧,測試員,等等捂掰。優(yōu)化如敏捷和精益原則等的軟件開發(fā)流程的關(guān)注點(diǎn)就在這些地方敢会。比如,軟件一旦達(dá)到”可以生產(chǎn)“的程度,就會(huì)發(fā)到系統(tǒng)工程師卧土、發(fā)布工程師、DBA、網(wǎng)絡(luò)工程師,安全專家這些“運(yùn)維人員”的手上。這里該如何將橫在Dev(開發(fā))和Ops(運(yùn)維)之間的鴻溝給填平郭计,這就是DevOps的主要關(guān)注點(diǎn)了庐杨。
DevOps是在整個(gè)IT價(jià)值流中實(shí)施精益原則的結(jié)果各吨。IT價(jià)值流將開發(fā)延伸至生產(chǎn),將由程序員這個(gè)遙遠(yuǎn)的祖宗所繁衍的所有子孫給聯(lián)合在一起欺冀。
這是來自Gene Kim的對DevOps的最好的解析职车,如果你還沒有看過他的《鳳凰項(xiàng)目》這本書的話积瞒,我建議你真的該好好花時(shí)間看看庐船。
你不應(yīng)該重新招聘DevOps工程師,且DevOps也不應(yīng)該是一個(gè)IT的新部門毛嫉。DevOps是一種文化仙粱,一種理念,且是和IT糅合成一整體的。世間沒有任何工具可以把你的IT變成一個(gè)DevOps組織,也沒有任何自動(dòng)化方式可以指引你該如何為你的客戶提供最大化的效益楔脯。
DevOps通常作為下面這三個(gè)方式而為人所熟知淹办,而在我眼里我是把它們看成是一條高速公路上的三條車道恐疲。你從第一條車道開始漱凝,然后加速進(jìn)入到第二條車道绅项,最終在第三車道上高速行駛比肄。
車道1 – 系統(tǒng)級(jí)別的整體效率考量是最主要的關(guān)注點(diǎn)掀亥,這超過對系統(tǒng)中任何一個(gè)單獨(dú)個(gè)體元素的考慮
車道2 – 確保能提供持續(xù)不斷的反饋循環(huán)撮竿,且這些反饋不被忽視授账。
車道3 – 持續(xù)的學(xué)習(xí)和吸取經(jīng)驗(yàn)刨啸,不停的進(jìn)步,快速的失敗悉稠。
車道1 – 獲取速度
要采納DevOps的原則宫蛆,理解整個(gè)運(yùn)作系統(tǒng)的重要性并對工作事項(xiàng)進(jìn)行合適的優(yōu)先級(jí)排序是組織首先要學(xué)的事情。在整個(gè)價(jià)值流中不能允許任何人產(chǎn)生瓶頸并降低整個(gè)工作流程的猛。
確保工作流程的不可中斷是身處流程中的所有成員的終極目標(biāo)耀盗。無論一個(gè)成員或者團(tuán)隊(duì)的角色是什么,他們都必須力圖對整個(gè)系統(tǒng)進(jìn)行深入的理解卦尊。這種思維方式對質(zhì)量會(huì)有著直接的影響叛拷,因?yàn)槿毕萦肋h(yuǎn)不會(huì)被下放到“下游“中,這樣做的話將會(huì)導(dǎo)致瓶頸的產(chǎn)生猫牡。
確保整個(gè)工作流程不會(huì)被瓶頸堵塞住還不夠胡诗。一個(gè)高產(chǎn)的組織應(yīng)該時(shí)车讼撸考慮該如何提升整個(gè)工作流程。有很多方法論可以做到這一點(diǎn)煌恢,你不妨去看下“約束理論”骇陈,“六西格瑪”,精益瑰抵,或者豐田生產(chǎn)系統(tǒng)你雌。
DevOps原則不關(guān)心你身處哪個(gè)團(tuán)隊(duì),你是否是系統(tǒng)架構(gòu)師二汛,DBA婿崭,QA,或者是網(wǎng)絡(luò)管理員肴颊。相同的規(guī)則覆蓋所有的成員氓栈,每個(gè)成員都應(yīng)該遵循兩個(gè)簡單的原則:
保持系統(tǒng)運(yùn)作流程不可中斷
隨時(shí)提升和優(yōu)化工作流程
車道2 – 換擋加速
不可中斷的系統(tǒng)流程是定向的,且預(yù)期是從開發(fā)流向運(yùn)維婿着。在一個(gè)理想的世界中授瘦,這就意味著快速的開發(fā)出高質(zhì)量的軟件,部署竟宋,并為客戶提供價(jià)值提完。
但是,DevOps并非烏托邦式的理想國丘侠。如果單向的交付方式是可行的話徒欣,我們的瀑布模式早就能勝任了。評(píng)估可交付產(chǎn)品和整個(gè)流程中的交流對確保質(zhì)量是至關(guān)重要的蜗字。這里首個(gè)必須實(shí)現(xiàn)的”面向上游”的交流通道是從Ops到Dev打肝。
我們獨(dú)自意淫是件非常容易的事情,但是獲取別人的反饋和提供反饋給別人才是探究事實(shí)真相的正確方法秽澳。下游的每一步(反饋)都必須緊跟著有一個(gè)上游的確定闯睹。
你如何建立反饋循環(huán)機(jī)制并不重要。你可以邀請開發(fā)人員加入技術(shù)支持團(tuán)隊(duì)的會(huì)議担神,或者將網(wǎng)絡(luò)管理員放到Sprint計(jì)劃會(huì)議中去。一旦你的反饋機(jī)制就緒始花,反饋能夠被接收并被處理妄讯,你就已經(jīng)可以說是走到了DevOps高速車道上來了。
車道3 – 飛速前進(jìn)
DevOps這條快速車道并不適合意志脆弱的人酷宵。為了進(jìn)入這條車道亥贸,你的組織必須要足夠的成熟。這里充滿了冒險(xiǎn)和對失敗教訓(xùn)的學(xué)習(xí)浇垦,不斷的嘗試炕置,并認(rèn)同屢敗屢戰(zhàn)和不斷的實(shí)踐是走向成功這條康莊大道的前提條件。在這里你應(yīng)該會(huì)經(jīng)常聽到”套路“這個(gè)詞,這是有原因的朴摊。不斷的訓(xùn)練和重復(fù)所以能培養(yǎng)出大師默垄,是因?yàn)槠渥審?fù)雜的動(dòng)作常規(guī)化。
但是在你要將這些復(fù)雜的動(dòng)作連接起來之前甚纲,你很有必要先去掌握好每一個(gè)單獨(dú)步驟口锭。
“適合大師的動(dòng)作并不適合新手,脫胎換骨之前你必須先要明白道的真諦介杆【椴伲“
DevOps的第三個(gè)方式/快速車道包括每天分配時(shí)間來持續(xù)的進(jìn)行試驗(yàn),時(shí)常的獎(jiǎng)勵(lì)敢于冒險(xiǎn)的團(tuán)隊(duì)春哨,并將缺陷特意引入到運(yùn)作系統(tǒng)上來以增加系統(tǒng)的抗擊打能力荆隘。
為了確保你的組織能夠消化好這些方法,你必須在每個(gè)團(tuán)隊(duì)之間建立好頻繁的反饋循環(huán)赴背,同時(shí)需要確保所有的瓶頸都能夠及時(shí)的被清理掉臭胜,并確保整個(gè)系統(tǒng)的運(yùn)作流程是不可中斷的。
實(shí)施好這些措施可以讓你的組織時(shí)刻保持警惕癞尚,并能夠快速且高效的應(yīng)對挑戰(zhàn)耸三。
概要 – DevOps清單
下面是一張你可以用來檢驗(yàn)?zāi)愕慕M織對DevOps的應(yīng)用情況的清單。當(dāng)然你也可以在文章評(píng)論后面給出你的觀點(diǎn)浇揩。
開發(fā)團(tuán)隊(duì)和運(yùn)維團(tuán)隊(duì)之間沒有障礙仪壮。兩者皆是DevOps統(tǒng)一流程的一部分。
從一個(gè)團(tuán)隊(duì)流到另一個(gè)團(tuán)隊(duì)的工作都能夠得到高質(zhì)量的驗(yàn)證
工作沒有堆積胳徽,所有的瓶頸都已經(jīng)被處理好积锅。
開發(fā)團(tuán)隊(duì)沒有占用運(yùn)維團(tuán)隊(duì)的時(shí)間,因?yàn)椴渴鸷途S護(hù)都是處于同一個(gè)時(shí)間盒里面的养盗。
開發(fā)團(tuán)隊(duì)不會(huì)在周五下午5點(diǎn)后把代碼交付進(jìn)行部署缚陷,剩下運(yùn)維團(tuán)隊(duì)周末加班加點(diǎn)來給他們擦屁股
開發(fā)環(huán)境標(biāo)準(zhǔn)化,運(yùn)維人員可以很容易將之?dāng)U展并進(jìn)行部署
開發(fā)團(tuán)隊(duì)可以找到合適的方式交付新版本往核,且運(yùn)維團(tuán)隊(duì)可以輕易的進(jìn)行部署箫爷。
每個(gè)團(tuán)隊(duì)之間的通信線路都很明確
所有的團(tuán)隊(duì)成員都有時(shí)間去為改善系統(tǒng)進(jìn)行試驗(yàn)和實(shí)踐
常規(guī)性的引入(或者模擬)缺陷到系統(tǒng)中來并得到處理。每次學(xué)習(xí)到的經(jīng)驗(yàn)都應(yīng)該文檔化下來并分享給相關(guān)人員聂儒。事故處理成為日常工作的一部分虎锚,且處理方式是已知的
總結(jié)
使用現(xiàn)代化的DevOps工具,如Chef衩婚、Docker窜护、Ansible、Packer非春、Troposphere柱徙、Consul缓屠、Jenkins、SonarQube护侮、AWS等敌完,并不代表你就在正確的應(yīng)用DevOps的原則。DevOps是一種思維方式概行。我們所有人都是該系統(tǒng)流程的一部分蠢挡,我們一起分享共同的時(shí)光和交付價(jià)值。每個(gè)參加到這個(gè)軟件交付流程上來的成員都能夠加速或減緩整個(gè)系統(tǒng)的運(yùn)作速度凳忙。系統(tǒng)出現(xiàn)的一個(gè)缺陷业踏,以及錯(cuò)誤配置的團(tuán)隊(duì)之間的“防火墻”,都可能會(huì)使得整個(gè)系統(tǒng)癱瘓涧卵,
所有的人都是DevOps的一部分勤家,一旦你的組織明白了這一點(diǎn),能夠幫你管理好這些的工具和技術(shù)棧就自然而然的會(huì)出現(xiàn)在你眼前了柳恐。