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