寫在前面
幾個月之前,偶然看到了老莊的一篇博客——《如何評價一個新技術(shù) 》,討論了docker是一個什么級別的發(fā)明:
上次與霍炬聊天毡熏,霍炬提到他在跟陳皓抬杠,陳皓認為Docker與Java是一個級別的發(fā)明侣诵,第二年就吸引了所有熱門公司的加入痢法。而霍炬認為這太夸張了,畢竟就是個配置管理器嘛窝趣。而我的評價,可能會比陳皓的更高训柴,我認為Docker比Java的級別還要高哑舒。而且,這與有多少公司參與無關(guān)幻馁。甚至可以反過來說:因為Docker極為重要洗鸵,才會有那么多的公司,在第一時間加入進來仗嗦。
文章看過以后最大的感受就是——道理還沒說透膘滨,當時我發(fā)了一條微信朋友圈用來備忘
看來還是要寫篇文章才能討論docker的價值,先說個基本思路——分析這個問題稀拐,至少要從“人與人的協(xié)作方式”這個角度來談才算到位火邓,docker對此的改變甚至超過java,起碼達到linux的水平......詳細討論五一后再寫德撬。
然而真打算寫點東西的時候铲咨,卻發(fā)現(xiàn)這個問題是個大坑,如果從頭講起并交代細節(jié)蜓洪,那遠不是一篇文章能涵蓋的纤勒,加上我又是個懶惰的人,所以拖延至今隆檀。
不過摇天,討論的困難主要在于建立一個客觀合理的評估框架,因此本文的很大篇幅都是在做這件事恐仑,歡迎讀者對這個評估框架本身提出意見泉坐,當然,如果讀者沒有耐心裳仆,也可以跳過前面幾節(jié)坚冀,直接看最后一節(jié)。
明確重點
我們從一個問題說起——分析一個技術(shù)的價值鉴逞,應該怎么入手记某?
我們所說的價值司训,其核心是商業(yè)價值(在現(xiàn)代社會,所有的價值最終都會由市場從商業(yè)角度來體現(xiàn))液南,而商業(yè)活動是否成功壳猜,無非是兩個角度:
- 尋找正確的市場需求
- 用低于同行的成本效益比在競爭中獲勝
技術(shù)對角度二的意義很好理解,因為它可以幫助提升效率或者降低成本滑凉。不過统扳,技術(shù)對角度一也有幫助——本質(zhì)上,商業(yè)活動是一種對未來需求的預測畅姊,但是我們并不能真的未卜先知咒钟,而先進的技術(shù)可以幫助我們盡早而廉價的實現(xiàn)一個商業(yè)雛形,便于盡早獲得市場的反饋若未。
因此朱嘴,這兩個角度中,技術(shù)的作用都是在提升效率或者降低成本粗合。
ok萍嬉,現(xiàn)在明確討論重點——
- 提升效率
- 降低成本
效率問題
說到效率,會有一些人想到軟件的執(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é)热押。最后我意識到西傀,軟件開發(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ā)揮價值——降低邊界上的開銷撑毛,也就是我們下面要說的——
成本問題
說起成本牙躺,人們一般都會想到機器愁憔、房租、員工工資等等孽拷,但是這些東西要么差別不大吨掌,要么不會成為競爭優(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)生團隊間信息不充分的問題蝙泼。這個問題甚至比縱向更嚴重程剥,因為至少從目前看來,縱向的問題還有全棧團隊這條路可以走踱承,而橫向基本無解倡缠,如果能夠降低這個費用哨免,那么總的管理費用將被有效控制茎活。
小結(jié)
根據(jù)上面的分析,我們可以簡單把技術(shù)在軟件系統(tǒng)開發(fā)中的全局性價值歸納為三條:
- 整合流程琢唾,減少生產(chǎn)環(huán)節(jié)载荔,提升個人的控制范圍,以提高單個人在總流程上的生產(chǎn)效率
- 標準化流程上各環(huán)節(jié)之間的協(xié)作采桃,降低溝通成本
- 減少橫向團隊間需要傳遞的信息懒熙,降低溝通成本
對比幾種技術(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應用服務(wù)器規(guī)范迅耘,適用范圍較窄)贱枣,所以java的全局性價值僅僅是第二條。
GNU/Linux
通常所說的Linux應該是包括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的靈魂郊楣。同時,它的標準化為多應用協(xié)作提供了方便瓤荔,多應用背后是多團隊净蚤,這就在實質(zhì)上是為團隊間合作建立了方便之門,因此输硝,它先天就占據(jù)了全局價值的后兩條今瀑,并且比Linux做的還要好。
與此同時点把,Docker提升了個人的能力覆蓋范圍橘荠,由于線上和開發(fā)環(huán)境有可能一致,因此工程師可以用較低的代價實現(xiàn)devops郎逃,這一點對應了全局價值的第一條哥童。
因此我們的結(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的水平