李建業(yè),前阿里巴巴員工(花名:李福),2002年本科畢業(yè),之后一直從事軟件開發(fā),涉及辦公自動(dòng)化、電信網(wǎng)管/增值業(yè)務(wù)系統(tǒng)以及互聯(lián)網(wǎng);2009年12月加入淘寶的廣告應(yīng)用開發(fā)團(tuán)隊(duì);從2011年底開始,關(guān)注軟件研發(fā)本身,主要工作包括運(yùn)維自動(dòng)化系統(tǒng)和持續(xù)集成服務(wù)平臺(tái)。
寫在前面
幾個(gè)月之前,偶然看到了老莊的一篇博客——《如何評(píng)價(jià)一個(gè)新技術(shù) 》,討論了docker是一個(gè)什么級(jí)別的發(fā)明:
上次與霍炬聊天,霍炬提到他在跟陳皓抬杠,陳皓認(rèn)為Docker與Java是一個(gè)級(jí)別的發(fā)明,第二年就吸引了所有熱門公司的加入。而霍炬認(rèn)為這太夸張了,畢竟就是個(gè)配置管理器嘛!而我的評(píng)價(jià),可能會(huì)比陳皓的更高,我認(rèn)為Docker比Java的級(jí)別還要高。而且,這與有多少公司參與無關(guān)。甚至可以反過來說:因?yàn)镈ocker極為重要,才會(huì)有那么多的公司,在第一時(shí)間加入進(jìn)來。
當(dāng)時(shí)我發(fā)了一條微信朋友圈用來備忘:
看來還是要寫篇文章才能討論docker的價(jià)值,先說個(gè)基本思路——分析這個(gè)問題,至少要從“人與人的協(xié)作方式”這個(gè)角度來談才算到位,docker對(duì)此的改變甚至超過java,起碼達(dá)到linux的水平…詳細(xì)討論稍后再寫。
然而真打算寫點(diǎn)東西的時(shí)候,卻發(fā)現(xiàn)這個(gè)問題是個(gè)大坑,如果從頭講起并交代細(xì)節(jié),那遠(yuǎn)不是一篇文章能涵蓋的,加上我又是個(gè)懶惰的人,所以拖延至今。
不過,討論的困難主要在于建立一個(gè)客觀合理的評(píng)估框架,因此本文的很大篇幅都是在做這件事,歡迎讀者對(duì)這個(gè)評(píng)估框架本身提出意見。
當(dāng)然,如果讀者沒有耐心,也可以跳過前面幾節(jié),直接看最后一節(jié)。
1. 明確重點(diǎn)
我們從一個(gè)問題說起——分析一個(gè)技術(shù)的價(jià)值,應(yīng)該怎么入手?
我們所說的價(jià)值,其核心是商業(yè)價(jià)值(在現(xiàn)代社會(huì),所有的價(jià)值最終都會(huì)由市場(chǎng)從商業(yè)角度來體現(xiàn)),而商業(yè)活動(dòng)是否成功,無非是兩個(gè)角度:
尋找正確的市場(chǎng)需求
用低于同行的成本效益比在競(jìng)爭(zhēng)中獲勝
技術(shù)對(duì)角度二的意義很好理解,因?yàn)樗梢詭椭嵘驶蛘呓档统杀?。不過,技術(shù)對(duì)角度一也有幫助——本質(zhì)上,商業(yè)活動(dòng)是一種對(duì)未來需求的預(yù)測(cè),但是我們并不能真的未卜先知,而先進(jìn)的技術(shù)可以幫助我們盡早而廉價(jià)的實(shí)現(xiàn)一個(gè)商業(yè)雛形,便于盡早獲得市場(chǎng)的反饋。
因此,這兩個(gè)角度中,技術(shù)的作用都是在提升效率或者降低成本。
ok,現(xiàn)在明確討論重點(diǎn)——
提升效率
降低成本
2. 效率問題
說到效率,會(huì)有一些人想到軟件的執(zhí)行效率,然而這不是我關(guān)注的地方:
軟件的執(zhí)行效率最多只是用戶要關(guān)心的非功能需求,而且它的影響只是一部分軟件和系統(tǒng)(甚至對(duì)這些軟件和系統(tǒng)而言,也不是所有用戶都關(guān)注執(zhí)行效率),不是全局性質(zhì)的問題。
而另外一種效率,生產(chǎn)效率,則不然,這是影響所有軟件和系統(tǒng)研發(fā)的問題,是全局性的(這也符合我們上面對(duì)商業(yè)成功的討論)。當(dāng)然,在軟件和互聯(lián)網(wǎng)企業(yè),我們說的生產(chǎn)效率一般就是研發(fā)效率。
因此,能夠直接提升研發(fā)效率的技術(shù)就顯得特別有價(jià)值。例如:
語言的自動(dòng)內(nèi)存管理減輕了程序員的工作量,以及各種抽象技術(shù)成倍甚至在數(shù)量級(jí)上減少了開發(fā)同樣功能所需的代碼行數(shù),這些都是很好的例子。
Docker在這方面能做什么呢?無能為力,因?yàn)檫@不是Docker的發(fā)力點(diǎn)。
Docker這種技術(shù),不能直接提升研發(fā)效率,它的價(jià)值是間接體現(xiàn)的,重點(diǎn)在對(duì)研發(fā)流程上各環(huán)節(jié)的優(yōu)化整合。
記得剛用Rails的時(shí)候我震驚于它的開發(fā)效率,曾經(jīng)和前公司(不是阿里)老板有過一次討論(老板是做技術(shù)出身,對(duì)研發(fā)很了解)。
這次討論中,老板和我一起分析了一個(gè)功能從需求到用戶使用的各個(gè)環(huán)節(jié)。最后結(jié)果低于預(yù)期。我同時(shí)意識(shí)到:
軟件開發(fā)環(huán)節(jié)只是所有工作的一部分,即使這塊提升效率,對(duì)總時(shí)間的提升比例也并沒有我想得那么大。
這并不是說Rails這樣的技術(shù)沒有用。但是,這確實(shí)啟發(fā)我考慮研發(fā)的整個(gè)流程,從這個(gè)角度看效率才能更全面,判斷才更清楚。
本系列前幾篇文章中已經(jīng)提到過,開發(fā)、測(cè)試、運(yùn)維三個(gè)主要環(huán)節(jié)存在信息不一致的情況,Docker對(duì)此有比較好的解決辦法。
現(xiàn)在我們從提升研發(fā)效率的角度再看這件事,你會(huì)發(fā)現(xiàn),解決了信息不一致的問題以后,下一步改進(jìn)的重點(diǎn)會(huì)很自然的是:加強(qiáng)研發(fā)測(cè)試。
因?yàn)橹暗拈_發(fā)沒有動(dòng)力做太多的測(cè)試,沒有條件進(jìn)行更大粒度的測(cè)試,更不可能推進(jìn)自動(dòng)化聯(lián)調(diào)。
而由于Docker的出現(xiàn),開發(fā)一方面需要了解線上環(huán)境,另一方面則可以借助新的變化直接進(jìn)行原來只有測(cè)試才會(huì)進(jìn)行的一些大粒度的自動(dòng)化測(cè)試,更由于已經(jīng)轉(zhuǎn)變?yōu)閐evops,線上變更變得更簡(jiǎn)單可信,上線周期也能得到壓縮。
測(cè)試前置的結(jié)果就是提升研發(fā)流程整體效率,線上變更周期縮短更是能顯著影響軟件特性的交付效率。
上面說的內(nèi)容很容易會(huì)讓人想到“精英團(tuán)隊(duì)”、“全棧工程師”甚至是“個(gè)人代替團(tuán)隊(duì)”這些話題,不過也有人對(duì)此不感冒:
因?yàn)椴⒉皇侨魏螘r(shí)候我們都能用小團(tuán)隊(duì)解決問題,有些場(chǎng)景的分工是不可避免的。
這時(shí)候我們有可能借助技術(shù)來提升個(gè)體的工作效率嗎?
很遺憾,分工導(dǎo)致的單個(gè)成員效率下降是個(gè)普遍規(guī)律,理論上就不太可能用技術(shù)的手段改變它。
不過,對(duì)于分工的場(chǎng)景,技術(shù)卻能在另一個(gè)方面發(fā)揮價(jià)值——降低邊界上的開銷,也就是我們下面要說的——
[page]3. 成本問題
說起成本,人們一般都會(huì)想到機(jī)器、房租、員工工資等等,但是這些東西要么差別不大,要么不會(huì)成為競(jìng)爭(zhēng)優(yōu)勢(shì)(因?yàn)榻梃b起來比較容易),所以不是關(guān)鍵。
真正可以成為企業(yè)核心競(jìng)爭(zhēng)力的成本,是企業(yè)為了發(fā)揮每個(gè)人的價(jià)值而需要付出的代價(jià):
有時(shí),企業(yè)通過技術(shù)革新可以降低某些方面的成本——比如優(yōu)化算法降低機(jī)器數(shù)量,但是這里的競(jìng)爭(zhēng)優(yōu)勢(shì)并不是機(jī)器成本,而是企業(yè)的持續(xù)創(chuàng)新能力,說白了,是員工持續(xù)的創(chuàng)造力,因此我把這種競(jìng)爭(zhēng)優(yōu)勢(shì)歸為員工能力,此時(shí)的關(guān)鍵依然是發(fā)揮員工價(jià)值。
企業(yè)是什么?是將一個(gè)一個(gè)思想不同、看法各異、技術(shù)習(xí)慣不同的人凝聚起來的組織。而人與人的相互配合、密切協(xié)作,往往需要一些(廣義上的)管理手段,這都需要人力物力投入。
另外,某些管理手段還會(huì)對(duì)個(gè)人生產(chǎn)力產(chǎn)生壓制,這些是要付出的代價(jià),在經(jīng)濟(jì)學(xué)上一般稱之為“管理費(fèi)用”:
這個(gè)“管理費(fèi)用”基于一個(gè)根本問題——“一個(gè)企業(yè)用什么方式將人凝聚起來”,回答這個(gè)問題會(huì)受限于每個(gè)企業(yè)的不同風(fēng)格(也有人稱之為企業(yè)文化),很難借鑒和仿效,因此可以成為企業(yè)的競(jìng)爭(zhēng)優(yōu)勢(shì)。
聽起來這是個(gè)純粹的組織和管理問題,其實(shí)不然,人與人之間的協(xié)作,最大的困難就在于邊界不清,信息費(fèi)用高昂,而這是技術(shù)可以有所發(fā)揮的地方。
這包括縱橫兩個(gè)方面:
縱向:軟件研發(fā)的鏈路上,至少包括三個(gè)主要環(huán)節(jié)——開發(fā)、測(cè)試、運(yùn)維,分工以后,這些環(huán)節(jié)之間的扯皮和信息不暢就是增加管理費(fèi)用的一大原因,因此標(biāo)準(zhǔn)化這些環(huán)節(jié),將有機(jī)會(huì)降低溝通成本,提升溝通效率。
橫向:即團(tuán)隊(duì)協(xié)作,軟件和系統(tǒng)擴(kuò)張的過程中必然發(fā)生團(tuán)隊(duì)分裂,這時(shí)就會(huì)產(chǎn)生團(tuán)隊(duì)間信息不充分的問題。這個(gè)問題甚至比縱向更嚴(yán)重,因?yàn)橹辽購哪壳翱磥恚v向的問題還有全棧團(tuán)隊(duì)這條路可以走,而橫向基本無解,如果能夠降低這個(gè)費(fèi)用,那么總的管理費(fèi)用將被有效控制。
4. 小結(jié)
根據(jù)上面的分析,我們可以簡(jiǎn)單把技術(shù)在軟件系統(tǒng)開發(fā)中的全局性價(jià)值歸納為三條:
整合流程,減少生產(chǎn)環(huán)節(jié),提升個(gè)人的控制范圍,以提高單個(gè)人在總流程上的生產(chǎn)效率;
標(biāo)準(zhǔn)化流程上各環(huán)節(jié)之間的協(xié)作,降低溝通成本;
減少橫向團(tuán)隊(duì)間需要傳遞的信息,降低溝通成本。
5. 對(duì)比幾種技術(shù)的價(jià)值
基于上面的討論框架,我們下面看看幾種技術(shù):
強(qiáng)調(diào)一下,一個(gè)技術(shù)的價(jià)值是多樣的,在其發(fā)展的不同階段還會(huì)有變化,而本文目前討論的僅限于“全局性”的和主要發(fā)展階段中體現(xiàn)的價(jià)值。
Java(tm)
java的全局性價(jià)值來自于它的跨平臺(tái)能力,當(dāng)它出現(xiàn)以后,程序員可以很容易在windows上開發(fā)一些運(yùn)行在linux上的軟件系統(tǒng)。
關(guān)于跨平臺(tái)
其實(shí)很多語言都可以進(jìn)行某種角度的跨平臺(tái),但代價(jià)不同(比如c/c++需要重新編譯),而且在java之前,幾乎所有的語言都遇到不同OS的庫不同的情況,這為跨平臺(tái)設(shè)置了很大的障礙。
java是第一個(gè)“一次編譯,到處運(yùn)行”的工程語言,并且自帶的jdk與平臺(tái)無關(guān)(由于jni很難用加上java社區(qū)語言純潔性的文化影響,各種第三方的java庫也是平臺(tái)無關(guān))
在java出現(xiàn)的年代,windows平臺(tái)上有很多優(yōu)秀的IDE,形成了對(duì)其它OS平臺(tái)的壓倒性優(yōu)勢(shì),加上windows GUI對(duì)新手的友好性,很多人的工作平臺(tái)都是windows。
而另一方面,unix/linux在server端的優(yōu)勢(shì)也很明顯,這使得研發(fā)工作和軟件運(yùn)行的基礎(chǔ)平臺(tái)產(chǎn)生了割裂。
在此背景下,java的跨平臺(tái)就導(dǎo)致了一個(gè)結(jié)果——整合了(在windows上進(jìn)行的)開發(fā)活動(dòng)和(在linux上進(jìn)行的)運(yùn)維活動(dòng)。
但是java平臺(tái)一開始沒能做到跨語言,因此對(duì)橫向的團(tuán)隊(duì)協(xié)同幫助有限(協(xié)作主要局限在同樣采用了java技術(shù)棧的團(tuán)隊(duì)間,基于J2EE應(yīng)用服務(wù)器規(guī)范,適用范圍較窄),所以java的全局性價(jià)值僅僅是第二條(標(biāo)準(zhǔn)化流程上各環(huán)節(jié)之間的協(xié)作)。
GNU/Linux
通常所說的Linux應(yīng)該是包括GNU的(Linux內(nèi)核補(bǔ)上了GNU計(jì)劃的短板),不過我們這里簡(jiǎn)稱為L(zhǎng)inux,它使得各種UNIX的差異逐漸退出市場(chǎng),在服務(wù)端領(lǐng)域,程序員只要開發(fā)兼容它的代碼即可。
各種linux發(fā)布版也會(huì)有差異,但是這些差異已經(jīng)不是難以克服的了
這個(gè)變化的好處是,不同的服務(wù)端開發(fā)團(tuán)隊(duì)可以比較容易的交流,本團(tuán)隊(duì)培養(yǎng)的工程師理解其它團(tuán)隊(duì)的線上環(huán)境也簡(jiǎn)單了很多。
此時(shí),Linux的價(jià)值是體現(xiàn)在上述全局價(jià)值的第三條(減少橫向團(tuán)隊(duì)間需要傳遞的信息)。
接著,Linux/GNU進(jìn)一步發(fā)展,甚至在一部分程序員群體中開始成為主要工作平臺(tái),對(duì)于開發(fā)、測(cè)試、運(yùn)維三環(huán)節(jié)開始有了一體化支持的征兆,這樣讓Linux的價(jià)值又?jǐn)U展到了上述的第二條全局價(jià)值。
然而這個(gè)價(jià)值要打折扣:
各種服務(wù)端技術(shù)雖然都使用Linux作為基準(zhǔn)的OS,但是運(yùn)維和管理方法還是有很多差異,導(dǎo)致有時(shí)橫向協(xié)作還是會(huì)有影響。
使用Linux作為開發(fā)平臺(tái)的程序員還是比較有限,而且有一部分工程師并沒有掌握這個(gè)平臺(tái),用Linux做桌面并沒有改善對(duì)測(cè)試和線上環(huán)境的熟悉程度,因此各環(huán)節(jié)的溝通成本依然較高。
因此總的來說,Linux占據(jù)了全局價(jià)值的后兩條,但有不足。
docker
說到這里,其實(shí)已經(jīng)不必再對(duì)Docker浪費(fèi)過多的筆墨,它算是秉承了Linux的靈魂。同時(shí),它的標(biāo)準(zhǔn)化為多應(yīng)用協(xié)作提供了方便,多應(yīng)用背后是多團(tuán)隊(duì),這就在實(shí)質(zhì)上是為團(tuán)隊(duì)間合作建立了方便之門。
因此,它先天就占據(jù)了全局價(jià)值的后兩條,并且比Linux做的還要好。
與此同時(shí),Docker提升了個(gè)人的能力覆蓋范圍,由于線上和開發(fā)環(huán)境有可能一致,因此工程師可以用較低的代價(jià)實(shí)現(xiàn)devops,這一點(diǎn)對(duì)應(yīng)了全局價(jià)值的第一條(整合流程,減少生產(chǎn)環(huán)節(jié))。
因此我們的結(jié)論是,Docker的價(jià)值不是在于某個(gè)點(diǎn)上的突破,它改變的是人與人之間的協(xié)作方式,這包括:
個(gè)人:Docker提高了個(gè)體戰(zhàn)斗力,使個(gè)人有可能結(jié)合云技術(shù)實(shí)現(xiàn)以前需要多人完成的工作,消除部分協(xié)作。
縱向:Docker對(duì)軟件研發(fā)三環(huán)節(jié)建立了協(xié)作基礎(chǔ),通過標(biāo)準(zhǔn)化,環(huán)節(jié)之間的扯皮被降低,節(jié)省了溝通成本,提升了溝通效率。
橫向:由于Docker對(duì)各種技術(shù)棧提供了統(tǒng)一的管控方式,降低了團(tuán)隊(duì)間協(xié)作成本。
綜上,最后再重復(fù)一下我的結(jié)論——
Docker研發(fā)的價(jià)值超過java,起碼達(dá)到Linux的水平。
如何一起愉快地發(fā)展
高效運(yùn)維系列微信群是國內(nèi)高端運(yùn)維圈子、運(yùn)維行業(yè)垂直社交的典范?,F(xiàn)有會(huì)員1000余名,其中運(yùn)維總監(jiān)及以上級(jí)別會(huì)員300多名。
“高效運(yùn)維”公眾號(hào)值得您的關(guān)注,作為高效運(yùn)維系列微信群的唯一官方公眾號(hào),每周發(fā)表多篇干貨滿滿的原創(chuàng)好文:來自于系列群的討論精華、運(yùn)維講壇線上/線下活動(dòng)精彩分享及部分群友原創(chuàng)。“高效運(yùn)維”也是互聯(lián)網(wǎng)專欄《高效運(yùn)維最佳實(shí)踐》及運(yùn)維2.0官方公眾號(hào)。
提示:目前高效運(yùn)維兩個(gè)微信主群僅有少量珍貴席位,如您愿意,可添加蕭田國個(gè)人微信號(hào) xiaotianguo 為好友,進(jìn)行申請(qǐng);或申請(qǐng)加入我們技術(shù)交流群(技術(shù)討論為主,沒有主群那么多規(guī)矩,更熱鬧)。