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