也算機(jī)緣巧合,一個(gè)不能稱之為機(jī)會(huì)的機(jī)會(huì)讓我再次和國(guó)外現(xiàn)在炙手可熱的F
公司(
由于也不想過(guò)多的說(shuō)這家公司的名字,因此就用F
作為代號(hào)了)
做了一次技術(shù)和公司文化的簡(jiǎn)單交流,這里做個(gè)簡(jiǎn)單的交流分享,希望能夠讓更多的朋友能夠從中找到自己團(tuán)隊(duì)或者公司有幫助的內(nèi)容。但這里還是丑話說(shuō)在前頭,中國(guó)有句成語(yǔ):東施效顰。國(guó)外的月亮多圓我不知道,但是我們需要客觀的看待不同環(huán)境的差異,看到目標(biāo),而不要過(guò)多模仿過(guò)程。下面的闡述將都分成場(chǎng)景和觀點(diǎn),如何做三部分,場(chǎng)景描述了具體的情況,觀點(diǎn)僅僅代表我自己的一些感觸和理解,如何做是對(duì)問(wèn)題Action
提出自己的想法。
場(chǎng)景1:
F公司的任何一個(gè)小Team(業(yè)務(wù)上劃分或者職能上劃分)都需要熟悉整個(gè)系統(tǒng)從前到后從上到下的代碼實(shí)現(xiàn)。例如相冊(cè)團(tuán)隊(duì),從前端腳本,到業(yè)務(wù)邏輯,再到底層的Memcached或者圖片服務(wù)器代碼在必要的時(shí)候都能自己修改和實(shí)現(xiàn)業(yè)務(wù)需求。UserGroup團(tuán)隊(duì)是負(fù)責(zé)對(duì)全球業(yè)務(wù)的用戶做統(tǒng)計(jì)分析的,當(dāng)希望做一些變革能夠嘗試著提升用戶轉(zhuǎn)化率的時(shí)候,首先是考慮自己如何動(dòng)手去修改已有系統(tǒng)的功能,而不是去協(xié)調(diào)各個(gè)團(tuán)隊(duì)去做。
觀點(diǎn):
垂直化的開(kāi)發(fā)模式其實(shí)挑戰(zhàn)了國(guó)內(nèi)很多企業(yè)的橫向細(xì)分化流水線方式的開(kāi)發(fā)模式。從技術(shù)的橫向細(xì)分,到業(yè)務(wù)的模塊化細(xì)分,好處是提高企業(yè)的生產(chǎn)效率,壞處是對(duì)人全方面的培養(yǎng)成為一種制約。最大的問(wèn)題:對(duì)自己上游系統(tǒng)的需求了解不透徹,對(duì)自己依賴系統(tǒng)的實(shí)現(xiàn)完全不理解。
如何做:
橫向切分的方式和縱向的方式都有適應(yīng)的場(chǎng)景,因此可以考慮在互連網(wǎng)企業(yè)中部分部門(mén)中實(shí)施垂直化開(kāi)發(fā)模式,這些部門(mén)人員素質(zhì)較高,能夠從產(chǎn)品層面全局的考慮整體的發(fā)展,通過(guò)實(shí)際的參與各個(gè)業(yè)務(wù)線和各個(gè)層次的技術(shù)中間件開(kāi)發(fā),為橫向切分的部門(mén)工作做出改進(jìn)和建議。這樣在高素質(zhì)人才發(fā)展和網(wǎng)站規(guī)模化整體化發(fā)展之間找到平衡點(diǎn),相互促進(jìn)。
場(chǎng)景2:
F公司的任何一個(gè)技術(shù)框架都可以被挑戰(zhàn)和替換,只要用數(shù)字和測(cè)試結(jié)果作為有效的證據(jù),大家都抱著對(duì)公司負(fù)責(zé)的態(tài)度來(lái)對(duì)待技術(shù)選型。因此在F公司中,技術(shù)的發(fā)展完全是最原始的優(yōu)勝劣汰機(jī)制。
觀點(diǎn):
這點(diǎn)其實(shí)很贊同,首先技術(shù)如果不是用數(shù)據(jù)來(lái)說(shuō)話,采用自上而下的方式來(lái)決定選型,那么就是拍腦袋做事情。另一方面,如果技術(shù)不持續(xù)的按照用戶需求來(lái)優(yōu)化和演進(jìn),那么一定會(huì)爛掉,最好的觸動(dòng)不斷發(fā)展的方式,就是競(jìng)爭(zhēng)。有人會(huì)擔(dān)心技術(shù)競(jìng)爭(zhēng)會(huì)帶來(lái)資源消耗,其實(shí)爛掉的東西在被使用的過(guò)程中一樣在消耗。
如何做:
首先當(dāng)然還是提倡積累,能夠在已有的技術(shù)基礎(chǔ)上不斷積累發(fā)展是最好的,其次也應(yīng)該鼓勵(lì)創(chuàng)新,如果有足夠理由證明成熟的技術(shù)能夠替代現(xiàn)有技術(shù),而現(xiàn)有技術(shù)又沒(méi)有發(fā)展的動(dòng)力時(shí),變革并不是壞事(也許這種壓力就會(huì)迫使原有技術(shù)實(shí)現(xiàn)者去更好服務(wù)客戶),最后就是給每個(gè)人都有改變?nèi)魏我徊糠执a的能力,因?yàn)橐蕾嚨牟环€(wěn)定也決定了上層系統(tǒng)的不穩(wěn)定,作為一個(gè)產(chǎn)品來(lái)看,每個(gè)人是對(duì)產(chǎn)品負(fù)責(zé),而不是對(duì)一個(gè)組件負(fù)責(zé)。
場(chǎng)景3:
沒(méi)有任何文檔。最多寫(xiě)一點(diǎn)wiki。
觀點(diǎn):
設(shè)計(jì)從簡(jiǎn),代碼需要更優(yōu)雅,注釋需要更全面。文檔是代碼的骨架。
如何做:
應(yīng)該有產(chǎn)品需求文檔,理解業(yè)務(wù)需求。技術(shù)文檔多半是總體性設(shè)計(jì)和一些協(xié)議描述,多一些代碼注釋和Demo,更利于學(xué)習(xí)和閱讀。
場(chǎng)景4:
應(yīng)用都被編譯在一個(gè)包里,一臺(tái)機(jī)器就運(yùn)行了諾大一個(gè)網(wǎng)站的所有功能,不存在服務(wù)器間的應(yīng)用服務(wù)調(diào)用,都是本地服務(wù)方法調(diào)用(服務(wù)依賴較少)。
觀點(diǎn):
這和Java類(lèi)型的應(yīng)用還有些差別,Java的第三方依賴較多,版本凌亂復(fù)雜,導(dǎo)致應(yīng)用部署在一臺(tái)機(jī)器上很困難。但很多大型網(wǎng)站的系統(tǒng)設(shè)計(jì)慢慢地就將模塊分的很細(xì),結(jié)果導(dǎo)致服務(wù)調(diào)用和依賴特別復(fù)雜,自身的可用性和穩(wěn)定性變得難以估量。
如何做:
需要審視服務(wù)粒度的合理性及垂直化設(shè)計(jì)在不同系統(tǒng)中的應(yīng)用,需要在可擴(kuò)展和可用性及效率中差別對(duì)待不同系統(tǒng)設(shè)計(jì),同時(shí)降低服務(wù)差異性,減少應(yīng)用服務(wù)器由于應(yīng)用差異導(dǎo)致無(wú)法復(fù)用的問(wèn)題。
場(chǎng)景5:
任何一個(gè)應(yīng)用或者中間件開(kāi)發(fā)完成后,都會(huì)有一個(gè)監(jiān)控應(yīng)用伴隨誕生。(有些是直接通過(guò)已有工具實(shí)現(xiàn),有些獨(dú)立實(shí)現(xiàn))
觀點(diǎn):
1:1的透明化開(kāi)發(fā)比unit test來(lái)的還要重要,因?yàn)檫\(yùn)行期的系統(tǒng)透明化是業(yè)務(wù)分析,系統(tǒng)優(yōu)化,系統(tǒng)監(jiān)控告警最基本的要求。
如何做:
最低代價(jià)就是將監(jiān)控?cái)?shù)據(jù)記錄打點(diǎn),應(yīng)用或者外部系統(tǒng)對(duì)數(shù)據(jù)進(jìn)行計(jì)算和分析,最終提供結(jié)果給外部系統(tǒng)展現(xiàn)和處理。
場(chǎng)景6:
沒(méi)有測(cè)試團(tuán)隊(duì),任何開(kāi)發(fā)都是測(cè)試人員,通過(guò)工具完成頁(yè)面,接口,集成測(cè)試。
觀點(diǎn):
強(qiáng)大的測(cè)試工具框架為開(kāi)發(fā)人員提供了測(cè)試的規(guī)范性和便利性,同時(shí)開(kāi)發(fā)人員自身的責(zé)任感增強(qiáng),也讓開(kāi)發(fā)人員在測(cè)試過(guò)程中總結(jié)和思索開(kāi)發(fā)設(shè)計(jì)的常規(guī)性錯(cuò)誤,理解邊界問(wèn)題。
如何做:
需要有專(zhuān)人專(zhuān)職來(lái)負(fù)責(zé)測(cè)試框架的有效性,當(dāng)然對(duì)于這個(gè)人或者這么一個(gè)小團(tuán)隊(duì)來(lái)說(shuō)要求很高。可以借鑒的是,測(cè)試團(tuán)隊(duì)?wèi)?yīng)該有更加高效的方式自動(dòng)化測(cè)試,同時(shí)應(yīng)該將測(cè)試框架開(kāi)放給開(kāi)發(fā)人員,增強(qiáng)開(kāi)發(fā)人員對(duì)產(chǎn)品質(zhì)量的責(zé)任感。
場(chǎng)景7:
沒(méi)有線下的壓力測(cè)試和極限測(cè)試,線上引流和部分區(qū)域發(fā)布來(lái)做測(cè)試。
觀點(diǎn):
一直認(rèn)為線下的網(wǎng)絡(luò)環(huán)境,用戶數(shù)據(jù)的仿真度都難以模擬線上,因此很多壓力測(cè)試和極限測(cè)試的數(shù)據(jù)基本就不能成為依據(jù)。在數(shù)據(jù)透明化體系完成后,線上的任何改變都可以獲得數(shù)據(jù)的支持,這樣單獨(dú)或者對(duì)比的結(jié)果就是壓力測(cè)試或者AB測(cè)試的結(jié)果。
如何做:
系統(tǒng)透明化工作為基礎(chǔ),結(jié)合Beta發(fā)布或者局部發(fā)布的模式來(lái)驗(yàn)證和測(cè)試不同壓力下的新老系統(tǒng)。
場(chǎng)景8:
Hack Day,一個(gè)晚上通宵做出原型,第二天在全公司面前展現(xiàn)創(chuàng)意,用技術(shù)來(lái)說(shuō)服有興趣的同事一起去做一些有創(chuàng)意的工作。F公司最典型的視頻項(xiàng)目就出自于Hack Day。
觀點(diǎn):
通過(guò)自己努力和時(shí)間的投入,在公司給的平臺(tái)上展現(xiàn),最后取得好的效果。
如何做:
公司給平臺(tái),個(gè)人擠時(shí)間。
場(chǎng)景9:
公司中所有的開(kāi)發(fā)人員都是Engineer,每個(gè)人可能不同Level,但是每個(gè)人的工作都是自己來(lái)考慮,上級(jí)M只是替Engineer去協(xié)調(diào)資源。此時(shí)任何Team的人如果有想法和創(chuàng)意,如果要做,也需要資源,只能靠自己去說(shuō)服同事一起做,而M沒(méi)有權(quán)利否定或者強(qiáng)制Engineer去做任何工作。
觀點(diǎn):
由于考核都是同事之間點(diǎn)到點(diǎn)的評(píng)價(jià),因此其實(shí)M沒(méi)有任何實(shí)質(zhì)性的技術(shù)管理職能在,任務(wù)分配和工作目標(biāo)也是工程師自己需要去考慮的,主動(dòng)權(quán)掌握在自己手中。工程師需要去考慮自己有限的工作時(shí)間中如何做有效的做出最有用的內(nèi)容。能力越大責(zé)任越大,因此原本認(rèn)為束縛工程師的方式,其實(shí)反而給工程師偷懶思考的機(jī)會(huì)。
如何做:
在工程師技術(shù)能力達(dá)到一定階層時(shí),國(guó)內(nèi)的公司可以考慮采用這樣的方式去管理他們,同時(shí)為他們提供更廣闊的技術(shù)空間去創(chuàng)新和滲透到他們希望滲透的產(chǎn)品中。
場(chǎng)景10:
對(duì)于問(wèn)題從效率角度去考慮如何解決,而不是簡(jiǎn)單的從資源角度去考慮。
觀點(diǎn):
公司發(fā)展壯大,業(yè)務(wù)戰(zhàn)線不斷變長(zhǎng),往往第一就考慮需要資源,往往忽略了如何用技術(shù)提升效率。增加資源有時(shí)候反而是增加內(nèi)耗和降低工作效率的誘因。
如何做:
壓力帶來(lái)動(dòng)力,決策者需要判斷和觀察。
場(chǎng)景11:
每個(gè)新人進(jìn)來(lái)都會(huì)進(jìn)入新兵訓(xùn)練營(yíng),每個(gè)人選擇自己有興趣加盟的兩到三個(gè)團(tuán)隊(duì),一個(gè)月內(nèi)完成兩到三個(gè)團(tuán)隊(duì)的一些線上問(wèn)題修復(fù),在熟悉業(yè)務(wù)的同時(shí),也鍛煉了自己的能力,同時(shí)更加明確自己感興趣的團(tuán)隊(duì)究竟是哪一個(gè)。
觀點(diǎn):
這種方式可以最直接的讓新人了解業(yè)務(wù),熟悉將來(lái)的方向,同時(shí)也是檢驗(yàn)一個(gè)人能力的最有效的手段。
場(chǎng)景12:
不同Level的錯(cuò)誤有不同的通報(bào),產(chǎn)生較大問(wèn)題時(shí),全公司郵件通報(bào),但考核并不看問(wèn)題發(fā)生次數(shù)和嚴(yán)重程度(因?yàn)槊總€(gè)人都可以修改各個(gè)層次內(nèi)容,多做多錯(cuò),少做少錯(cuò)這種事情不應(yīng)該鼓勵(lì))。同時(shí),任何過(guò)失需要描述四方面內(nèi)容:現(xiàn)象,問(wèn)題原因,解決方法,防范措施。范例:有一個(gè)同事修改了底層配置系統(tǒng)的部分代碼,結(jié)果導(dǎo)致全站系統(tǒng)2小時(shí)不可用,全公司通報(bào)。遂這個(gè)同事花了幾天時(shí)間全部重寫(xiě)了底層配置系統(tǒng)代碼,為了防止別人和他犯一樣的錯(cuò)誤,后遇人都笑談他重寫(xiě)代碼的事,而不是那次問(wèn)題。
觀點(diǎn):
首先,大家都抱著樂(lè)觀的態(tài)度去看待犯錯(cuò),看到別人的總結(jié),也是審視自己的工作。其次,最重要的是問(wèn)題的解決和預(yù)防,這點(diǎn)是透明化問(wèn)題的關(guān)鍵所在,也是驅(qū)動(dòng)犯錯(cuò)者改進(jìn)自身不足的動(dòng)力。
如何做:
倡導(dǎo)這種氛圍,提升工程師的責(zé)任感。
場(chǎng)景13:
對(duì)于所有代碼的更新時(shí)間有監(jiān)控,很久沒(méi)有更新的代碼將會(huì)被提出來(lái),作為爛掉的代碼告警全團(tuán)隊(duì)。
觀點(diǎn):
很多時(shí)候不是做減法不易,而是沒(méi)人知道什么時(shí)候該減什么。
時(shí)間有限,其實(shí)也沒(méi)談太多技術(shù)內(nèi)部的東西,但是從周邊的這些內(nèi)容聊下來(lái),兩點(diǎn)讓我感覺(jué)和去年自己做的一些工作很類(lèi)似,也很重要。產(chǎn)品責(zé)任感,系統(tǒng)透明化。
不論是業(yè)務(wù)或者技術(shù)的垂直化,測(cè)試工作前移,產(chǎn)品設(shè)計(jì)后移(在另外文章中有提到),技術(shù)工作自我定義,其實(shí)都是在考驗(yàn)一個(gè)工程師對(duì)產(chǎn)品的責(zé)任感,不簡(jiǎn)單的約束自己在某一個(gè)技術(shù)領(lǐng)域,在某一個(gè)產(chǎn)品環(huán)節(jié),在某一個(gè)崗位職責(zé),也許聽(tīng)起來(lái)是一個(gè)較高Level的工程師(國(guó)內(nèi)叫架構(gòu)師)所需要考慮的,但其實(shí)也只有這樣的工程師才會(huì)稱得上是合格的工程師。
不論是1:1系統(tǒng)設(shè)計(jì)方式,線上仿真測(cè)試,豐富的監(jiān)控系統(tǒng),其實(shí)就是要求做每一個(gè)業(yè)務(wù)系統(tǒng)或者技術(shù)框架一定要做好透明化工作,系統(tǒng)透明化是對(duì)當(dāng)前系統(tǒng)負(fù)責(zé),對(duì)依賴這個(gè)系統(tǒng)的外部系統(tǒng)負(fù)責(zé)。當(dāng)一個(gè)網(wǎng)站各個(gè)零部件都能被外部所觀察到的時(shí)候,出現(xiàn)問(wèn)題不為人知,緩慢出現(xiàn)量變病化,業(yè)務(wù)模式AB結(jié)果都將變得一目了然。