掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
科技界的大多數(shù)新生事物都只是一波又一波的潮流:說(shuō)話和做事的模式來(lái)了又走,沒(méi)有留下永恒的印記。微內(nèi)核,IA-64 架構(gòu),對(duì)象請(qǐng)求代理,20 世紀(jì) 90 年代的神經(jīng)網(wǎng)絡(luò),這些東西都已經(jīng)不復(fù)存在,也不會(huì)再回來(lái)了。時(shí)間已經(jīng)證明了哪些東西是曇花一現(xiàn),為了說(shuō)明問(wèn)題,我們必須追溯到很久以前。

為高陵等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及高陵網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站建設(shè)、高陵網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
今天的我們很難想象,在鼎盛時(shí)期,那些技術(shù)有多么的受歡迎。它們有很多極具魅力、真誠(chéng)且聰明的倡導(dǎo)者,倡導(dǎo)者們得到了看似合理的基本原理論證的支持,這些論證證明了他們選擇的技術(shù)必然會(huì)取得勝利。這些潮流催生了運(yùn)動(dòng)、宣言、會(huì)議和公司。但請(qǐng)不要把這些潮流與蓄意欺詐混為一談,后者要少見(jiàn)得多。推動(dòng)這些技術(shù)潮流的動(dòng)機(jī)是發(fā)自內(nèi)心的真誠(chéng),不管它們以何種方式出場(chǎng),二者產(chǎn)生的結(jié)果是完全不同的。
另一方面,一些重要的新技術(shù)是革命性的:它們強(qiáng)大而持久的變化為技術(shù)采用者帶來(lái)了長(zhǎng)期的優(yōu)勢(shì)。面向?qū)ο缶幊?、硬件虛擬化、萬(wàn)維網(wǎng)、公有云、CI/CD 和 20 世紀(jì) 90 年代的神經(jīng)網(wǎng)絡(luò)(深度學(xué)習(xí)的重生)現(xiàn)在成了計(jì)算機(jī)世界永久的組成部分,而它們?cè)?jīng)“混跡”在潮流之中,難以區(qū)分。我們被技術(shù)浪潮所包圍,在它們展露頭角之前,我們并不知道如何用它們來(lái)獲得成功。
與其他科技公司一樣,Slack 希望在正確的時(shí)間采用革命性的技術(shù),避免把過(guò)多的精力浪費(fèi)在追逐潮流上。Slack 采取了什么樣的戰(zhàn)略來(lái)確保做到這一點(diǎn)?這篇文章介紹了 Slack 用來(lái)解決這個(gè)問(wèn)題的方法。
我們不能依靠個(gè)別領(lǐng)導(dǎo)者的直覺(jué)來(lái)區(qū)分哪個(gè)才是贏家。相反,我們要積極地探索新事物,雖然我們也知道這些嘗試大部分都不會(huì)有任何回報(bào)。但為了讓我們的投入偏向于有用的新事物,避免踩太多潮流的坑,我們應(yīng)該在早期就要無(wú)情地扼殺那些沒(méi)有價(jià)值的實(shí)驗(yàn)。我們希望每件事都去嘗試一下,這意味著我們?nèi)匀灰c潮流為伍。我們希望最終能夠乘著潮流到達(dá)彼岸,我們與潮流打交道的經(jīng)驗(yàn)不斷為我們提供積極的回報(bào)。
我們創(chuàng)建了一個(gè)描述性的新技術(shù)采用曲線模型。
這是一條典型的 S 曲線,描述了技術(shù)的采用隨時(shí)間變化的情況。S 形反映了技術(shù)采用的變化。一開(kāi)始,當(dāng)只有幾個(gè)實(shí)驗(yàn)者在做實(shí)驗(yàn)時(shí),我們別無(wú)選擇,只能慢慢地接受。稍后,當(dāng)情況變得清晰的時(shí)候,就會(huì)有更多的人參與進(jìn)來(lái),我們會(huì)在中間陡峭向上傾斜的部分快速地將新技術(shù)應(yīng)用到生產(chǎn)中。當(dāng)大多數(shù)有成果的試驗(yàn)圓滿完成,就會(huì)剩下寥寥無(wú)幾難啃的“硬骨頭”。于是,在周期接近結(jié)束時(shí),采用速度又慢了下來(lái)。
我們把這三個(gè)階段畫(huà)出來(lái):
我們并不是第一波發(fā)現(xiàn)技術(shù)采用遵循這種 S 型曲線的人。Everett Rogers 在 1962 年的《創(chuàng)新擴(kuò)散理論》(diffusion of innovation)一書(shū)中就已提出了這一模型。不過(guò),Rogers 并沒(méi)有提到 Erlang 或者 MongoDB,因?yàn)樗且晃晦r(nóng)村社會(huì)學(xué)家,他觀察的是農(nóng)業(yè)技術(shù)采用的模式。但事實(shí)證明,計(jì)算機(jī)領(lǐng)域與人類活動(dòng)的其他領(lǐng)域并沒(méi)有太大的不同。
為了讓這個(gè)抽象的概念更具象一些,我們將例舉一些已經(jīng)在 Slack 經(jīng)歷了探索、擴(kuò)張和遷移階段的技術(shù)。
從 2015 年發(fā)布第一個(gè)穩(wěn)定版本以來(lái),React 席卷了前端開(kāi)發(fā)領(lǐng)域。虛擬 DOM 和單向數(shù)據(jù)綁定讓它成為開(kāi)發(fā) Slack 桌面用戶界面的一項(xiàng)引人注目的技術(shù)。
在服務(wù)器端,我們從 2016 年開(kāi)始從 PHP 遷移到 Hack。這次遷移的一個(gè)關(guān)鍵部分是在我們的 PHP 代碼中逐步引入類型:
Vitess 是一個(gè)用來(lái)進(jìn)行 MySQL 水平擴(kuò)展的集群系統(tǒng),在進(jìn)行數(shù)據(jù)分片策略演化過(guò)程中,我們選擇了它。
與以上那些經(jīng)歷了各個(gè)采用階段的技術(shù)相比,我們的跨平臺(tái) C++ 客戶端庫(kù)并沒(méi)有走到第三階段,并且最終停止了。
到最后我們并沒(méi)有進(jìn)行全面的遷移。我們將從 LibSlack 中學(xué)到的東西以各種方式應(yīng)用到移動(dòng)和桌面客戶端開(kāi)發(fā)工作中。代碼工件并沒(méi)有被長(zhǎng)期采用,但這個(gè)項(xiàng)目讓我們學(xué)會(huì)了應(yīng)該如何構(gòu)建客戶端以及如何組織我們的工程團(tuán)隊(duì)。
需要注意的是,這個(gè)模型是描述性的,而不是說(shuō)明性的。我們并不是想要強(qiáng)迫人們接受這個(gè) S 型曲線,盡管我們想要這樣。實(shí)際上,這是一個(gè)自然的過(guò)程。早期的探索階段不可能像中期階段那樣迅速地進(jìn)行,最后的階段也不可能像中期階段那樣迅速地進(jìn)行全面采用。這三個(gè)階段并不是任何里程碑、過(guò)程、工具或 Slack 工程人員作用的結(jié)果。它們是技術(shù)變革的一部分,不管我們有沒(méi)有注意到它們,它們都會(huì)存在。
現(xiàn)在,我們已經(jīng)注意到了它們,我們可以利用它們,讓我們的努力更加卓有成效。每個(gè)階段的戰(zhàn)術(shù)和戰(zhàn)略是不一樣的。
第一階段是無(wú)門(mén)檻進(jìn)入。當(dāng)工程師第一次開(kāi)始調(diào)研他們感興趣的技術(shù)時(shí),不需要任何許可授予過(guò)程或儀式。在 Slack,這樣的事情一天可能會(huì)發(fā)生幾十次:有人發(fā)現(xiàn)了新技術(shù),或者發(fā)明了新東西,然后就開(kāi)始研究它們。他們可能是因?yàn)樽x過(guò)關(guān)于 Elixir、Cassandra、WebAssembly 或 TCR 的博文,或者下載了一些軟件,編譯打包,四處看看,瀏覽一些介紹性的材料,還可能嘗試把它們應(yīng)用到日常工作中。
大多數(shù)的探索工作都在這個(gè)階段進(jìn)行。在這個(gè)階段,為了避免在不必要的事情上花費(fèi)太多精力,我們要懂得放棄掉一些東西。不過(guò)確實(shí)還是有一些東西被用到了實(shí)際的工作流程和代碼庫(kù)中。有時(shí),工程師可以直接應(yīng)用某些解決方案,因?yàn)樗鼈兘鉀Q了一些局部問(wèn)題。有時(shí)候會(huì)出現(xiàn)更加令人興奮的結(jié)果:某些解決方案也解決了其他團(tuán)隊(duì)所面臨的問(wèn)題。這個(gè)階段的工程師相信他們知道一些其他人不知道的東西:一些事情可以用更好的方式來(lái)做。一旦他們的工作開(kāi)始影響到其他人,我們就進(jìn)入了第二階段。
進(jìn)入第二階段,工程師就有點(diǎn)可憐了!因?yàn)樗麄儸F(xiàn)在正試圖改變其他工程師的行為,這將涉及溝通、說(shuō)服,如果一切進(jìn)行得順利的話,他們還需要做大量的技術(shù)工作。對(duì)于大多數(shù)項(xiàng)目來(lái)說(shuō),第二階段是最困難、最耗時(shí)、最令人沮喪的階段。在技術(shù)周期中,這是“產(chǎn)品與市場(chǎng)匹配”階段,很多進(jìn)入該階段的項(xiàng)目無(wú)法成功地走完這個(gè)階段。
在 Slack,用戶團(tuán)隊(duì)可以自由選擇是否要依賴你的系統(tǒng),很少有例外。如果你習(xí)慣了“基礎(chǔ)設(shè)施驅(qū)動(dòng)”的公司,那么我們的情況可能會(huì)讓你大吃一驚。在其他公司,領(lǐng)導(dǎo)層會(huì)在第二階段產(chǎn)品市場(chǎng)適應(yīng)得出結(jié)論之前就選出了贏家和輸家。他們之所以這么做,是為了提供清晰的信息(比如未來(lái)會(huì)怎樣、我們應(yīng)該采用哪個(gè)系統(tǒng))和降低成本,因?yàn)樵谶@一階段需要支持更多的做事方式。
雖然這些都是合理的目標(biāo),但 Slack 并沒(méi)有選擇這種方式。我們優(yōu)先考慮的是適應(yīng)潮流的能力,而不是適應(yīng)的速度。因此,我們(有意地)將促進(jìn)其他團(tuán)隊(duì)采用新技術(shù)的主要負(fù)擔(dān)放在了小部分人身上。雖然這可能會(huì)讓這些人感到沮喪,但我們知道沒(méi)有其他更好的辦法。為了清除這一障礙,我們不得不選擇更加有效的方法。如果新技術(shù)真的像我們所希望的那么美妙,那么它們應(yīng)該能夠幫助依賴它們的團(tuán)隊(duì)順利完成工作。反過(guò)來(lái),這種結(jié)果會(huì)促使他們采用和推廣這些新技術(shù)。
第二階段的一些工作更像是產(chǎn)品工作,而不是工程工作。你需要研究用戶,以便確定哪些問(wèn)題是重要的。你需要按照用戶所期望的方式將你的解決方案的價(jià)值與之前的實(shí)踐聯(lián)系起來(lái)。你需要想辦法縮小當(dāng)前實(shí)踐與你正在做出的改變之間的差距,讓用戶更容易接受。
在第二階段取得的成功最終會(huì)導(dǎo)致一些自發(fā)式的采用,用戶可以自由地選擇是否采用新技術(shù)。當(dāng)新系統(tǒng)成為事實(shí)上的標(biāo)準(zhǔn),第二階段就接近尾聲了。偶然性地遇到這種采用情況是很不尋常的,因?yàn)檫@真的很難,而且并不是每個(gè)工程師都具備相關(guān)的技能。
自發(fā)式的采用最終會(huì)逐步減少,最后剩下一些頑固的人,他們似乎很抵制新的做事方式。一些后臺(tái)運(yùn)行的系統(tǒng)尤其沒(méi)有動(dòng)力去做出改變,因?yàn)樗鼈兊拈_(kāi)發(fā)度不夠活躍。在某些情況下,我們到了后期才發(fā)現(xiàn)一些舊系統(tǒng)在某些方面按照舊有方式運(yùn)行會(huì)更好。最后,總是會(huì)有一些頑固的用戶堅(jiān)持使用老方法。
雖然我們一直在討論“技術(shù)采用曲線”,但實(shí)際上在第三階段會(huì)出現(xiàn)一個(gè)分岔口。即使非常成功的項(xiàng)目也不可能徹底采用全新的技術(shù)。例如,在 Slack,我們已經(jīng)廣泛地采用 gRPC 作為內(nèi)部的 API 技術(shù)。但是,我們不太可能構(gòu)建一個(gè)全新的基于 gRPC 的 memcached。memcached 的自定義協(xié)議很不錯(cuò),并得到了客戶端的良好支持。這種例外并不意味著采用 gRPC 是失敗的。
對(duì)于其他一些情況,采用多種技術(shù)的成本(工程師的認(rèn)知負(fù)擔(dān)、運(yùn)行舊系統(tǒng)的負(fù)擔(dān))太高,所以我們有必要徹底采用新技術(shù)。對(duì)于這樣的項(xiàng)目,我們需要制定一個(gè)應(yīng)對(duì)頑固派的計(jì)劃,不同的情況需要采用不同的策略。長(zhǎng)時(shí)間沒(méi)有發(fā)生改動(dòng)的系統(tǒng)可能需要使用代理,并逐步對(duì)其進(jìn)行遷移。如果頑固派的存在是因?yàn)樾孪到y(tǒng)缺乏必要的功能,那就需要增強(qiáng)新系統(tǒng),或者對(duì)新系統(tǒng)進(jìn)行封裝,模擬舊系統(tǒng)的功能。
對(duì)于對(duì)舊系統(tǒng)產(chǎn)生了情感依戀的情況,進(jìn)行面對(duì)面的溝通通常比高風(fēng)險(xiǎn)的公開(kāi)辯論有效得多。請(qǐng)溫柔些,如果你的新系統(tǒng)足夠成功,總有一天它也會(huì)成為舊系統(tǒng)。
作為 Slack 的工程師和工程負(fù)責(zé)人,我們對(duì)彼此的期望是什么呢?
如果有疑問(wèn),請(qǐng)記?。耗阋獙?duì)技術(shù)采用的成功與否負(fù)責(zé),而從長(zhǎng)遠(yuǎn)來(lái)看,這是由你的產(chǎn)品的用戶來(lái)決定的。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流