六月婷婷AV,国产偷窥猎奇福利二区,日韩三级片。,好吊色网站,日韩成人中文在线视频,国产亚洲午夜啪啪,亚洲欧美另类国产精品,国产成人av1,任你艹在线观看

研發(fā)天天加班,但總是忙不過(guò)來(lái),為什么這樣,有解嗎?

Jeff Tao

2024-12-16 /

濤思數(shù)據(jù)創(chuàng)業(yè)初期,只有幾個(gè)人,人人都是十倍程序員。但7年之后,隨著組織的龐大以及代碼的增多,研發(fā)效率大為下降,為此我痛下決心,在今年十月份重組了公司最重要的資產(chǎn),研發(fā)部門。重組后,為提升研發(fā)效率和產(chǎn)品質(zhì)量,我強(qiáng)調(diào)一個(gè)原則:一切都要代碼化。今天我將公司的一篇內(nèi)部博客分享出來(lái),供廣大的研發(fā)同學(xué)、研發(fā)管理人員參考。

公司為提升研發(fā)效率,提升產(chǎn)品質(zhì)量,將整個(gè)研發(fā)部門進(jìn)行了重組,并將以前的測(cè)試部門轉(zhuǎn)為研發(fā)平臺(tái)部,這背后的邏輯是什么呢?我在會(huì)上介紹過(guò)緣由,但其中一條就是堅(jiān)決貫徹執(zhí)行“一切都要代碼化”。我想給大家多解釋一下,為什么要這么做?為什么它能提升研發(fā)效率,進(jìn)而提升產(chǎn)品質(zhì)量呢?

研發(fā)效率低下的幾大典型場(chǎng)景

軟件開(kāi)發(fā),在人員規(guī)模就幾個(gè)人的時(shí)候,人效往往很高。但隨著項(xiàng)目本身的復(fù)雜度的增加,要處理的場(chǎng)景越來(lái)越多,代碼量也越來(lái)越大。比如TDengine,第一個(gè)版本不到15萬(wàn)行代碼,但現(xiàn)在已經(jīng)是超過(guò)70萬(wàn)行代碼,測(cè)試代碼都接近一百萬(wàn)行了。到今天,TDengine這個(gè)軟件已經(jīng)不是幾個(gè)人能搞定了。隨著團(tuán)隊(duì)規(guī)模的增加,協(xié)同溝通的成本急劇上升。而且為保證品質(zhì),團(tuán)隊(duì)引入了各種質(zhì)量控制的流程,整個(gè)研發(fā)節(jié)奏慢了下來(lái),人效大為下降。具體可以表現(xiàn)在幾個(gè)場(chǎng)景:

1. 研發(fā)在客戶現(xiàn)場(chǎng)解決了一個(gè)BUG,改了幾行代碼,客戶急著上線,但研發(fā)因?yàn)楦鞣N環(huán)境依賴,無(wú)法在自己筆記本上Build一個(gè)新的可以交付的版本,只能遞交PR,等著發(fā)版負(fù)責(zé)人發(fā)版,然后下載安裝。一般情況下,這一操作需要等待幾個(gè)小時(shí),在現(xiàn)場(chǎng)支持的人只能干著急。

2. 一位新入職的研發(fā)同學(xué),至少要花上好幾天時(shí)間才能自己獨(dú)立的寫(xiě)程序、編譯、測(cè)試,中間還需要不斷的“騷擾”其他同事,問(wèn)這問(wèn)那。如果沒(méi)有人協(xié)助,估計(jì)一周都搞不定。因此新人入職,我們美其名曰“熟悉環(huán)境”。

3. 公司建有CI/CD系統(tǒng),看上去很不錯(cuò),但所有人遞交的PR都需要過(guò)一遍整個(gè)流程,特別是測(cè)試流程。TDengine整個(gè)測(cè)試?yán)呀?jīng)超過(guò)1500個(gè),跑完都要2個(gè)多小時(shí),這樣導(dǎo)致一個(gè)PR的遞交,要等很長(zhǎng)時(shí)間。如果遞交的PR有問(wèn)題,還需要再遞交,因此讓新代碼的遞交效率大大降低。

4. 整個(gè)公司沒(méi)有人能說(shuō)出來(lái)到底有哪些場(chǎng)景的測(cè)試?yán)谂埽m然有測(cè)試設(shè)計(jì)文檔,列出了哪些測(cè)試?yán)?,但?shí)際跑的與文檔上差別太大。而且很多情況下,測(cè)試?yán)鲗?xiě)各的,雖然測(cè)試?yán)臄?shù)量在不斷增長(zhǎng),但測(cè)試有重疊,覆蓋率依然不夠。

5. 要測(cè)試某個(gè)用戶場(chǎng)景,無(wú)論是研發(fā),還是售前、交付,第一件事情就是申請(qǐng)計(jì)算資源。雖然我們已經(jīng)有2600多個(gè)核的測(cè)試機(jī)房,但這些機(jī)器都被人為的分配給了不同的組和個(gè)人。因此要協(xié)調(diào)出新的資源,挺困難,不是鼠標(biāo)點(diǎn)擊一下就能解決的,往往就要開(kāi)會(huì)協(xié)調(diào),幾個(gè)人的一個(gè)小時(shí)就這樣過(guò)去了。

上面描寫(xiě)的五個(gè)場(chǎng)景在TDengine全部存在。整體來(lái)講,我們研發(fā)效率是低下的。如果從我們對(duì)BUG修復(fù)的時(shí)長(zhǎng)以及數(shù)目來(lái)看,與傳統(tǒng)的大公司的研發(fā)相比,效率已經(jīng)高不了多少,但與我們創(chuàng)業(yè)初期相比,1/3都沒(méi)有。由于效率低下,導(dǎo)致我們的投入不夠,也就導(dǎo)致產(chǎn)品的質(zhì)量難以保證。

效率低下的根本原因

隨著團(tuán)隊(duì)規(guī)模的增大,為什么協(xié)同溝通成本就急劇增加?研發(fā)效率就大幅下降呢?仔細(xì)分析,有幾點(diǎn)原因:

1. 好些工作都難重復(fù),都藏在個(gè)人的腦子里。比如開(kāi)發(fā)環(huán)境的依賴,都是各搞各的。每個(gè)人都要下載各種軟件包、各種工具,讀一大堆文檔,按自己的理解做各種配置,最后工作,當(dāng)然很開(kāi)心。另外一個(gè)人,又是要走同樣的路,手腳快的,也許幾個(gè)小時(shí)搞定,但碰上手腳慢的,一天都搞不定,卡在什么地方,還沒(méi)人能幫。

2. 不重視工具、工作流管理的代碼,沒(méi)把他們納入代碼的版本管理。比如發(fā)版工作,本來(lái)應(yīng)該是全自動(dòng)化,而且也確實(shí)做到了。但一旦發(fā)版的工作流做些修改,CI/CD又卡在一個(gè)人手里,取決于這個(gè)人的水平高低,有可能很快,也有可能很慢。但總之,即使水平低,你也沒(méi)辦法,因?yàn)槠渌藳](méi)法上手馬上讓它工作,而且相當(dāng)多程序員往往不屑于寫(xiě)這類程序。因此讓CI/CD跑起來(lái),只有這位“牛人”能做。

3. 文檔與代碼脫節(jié)。比如我們TDengine測(cè)試代碼,就與Testing Spec脫節(jié)。Testing Spec往往是過(guò)期的,初稿review之后再也不會(huì)有人改。新增、修改的測(cè)試?yán)谖臋n里是反映不出來(lái)的。

4. 對(duì)用戶手冊(cè)重視程度不足。雖然 TDengine 的用戶手冊(cè)已經(jīng)遠(yuǎn)遠(yuǎn)好于中國(guó)絕大部分技術(shù)公司,但與全球頂尖的軟件公司比,還有不小的差距。用戶手冊(cè)由于本身的性質(zhì),導(dǎo)致它很容易落后于代碼的更新。而且研發(fā)同學(xué)普遍的共識(shí)是,寫(xiě)用戶手冊(cè)不是研發(fā)工作,無(wú)法體現(xiàn)自己研發(fā)水平,因此投入不夠。在這種情況下,售前、交付、還有用戶的問(wèn)題,都只能依賴我們產(chǎn)品的“專家”來(lái)親自回答,而且有時(shí)自己都拿捏不準(zhǔn),還要問(wèn)周圍同事大半天,才能給用戶一個(gè)精準(zhǔn)的回答。而且因?yàn)樗芑卮鹂蛻舢a(chǎn)品問(wèn)題,理所當(dāng)然,還會(huì)被大家認(rèn)為是高手。

5. 公司計(jì)算、網(wǎng)絡(luò)資源的管理還是原始時(shí)代,完全是靠Excel表格人工在管理。

一切都需要代碼化

全球軟件開(kāi)發(fā)行業(yè)發(fā)展到今天,早有了成熟的方法應(yīng)對(duì)這些效率低下、產(chǎn)品質(zhì)量難以保證的場(chǎng)景,那就是一切都要代碼化。因此我們會(huì)經(jīng)常聽(tīng)到Infrastructure as code, Environment as code, Pipeline as code, Documentation as code, Security as code, Network as code這些詞。這些詞是”as code movement” 在一些具體場(chǎng)景的體現(xiàn)。代碼化的核心目的是讓一切可自動(dòng)化、可重復(fù)、可回溯,每個(gè)研發(fā)不用做低水平的重復(fù)性的工作,從而提升研發(fā)效率,進(jìn)而有更多資源投入來(lái)提升產(chǎn)品的質(zhì)量。針對(duì)TDengine,我們可以明顯看到需要做或改進(jìn)的地方有:

1. Environment as code:即開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境的自動(dòng)化部署。我們不能依賴某個(gè)人腦子的記憶或經(jīng)驗(yàn),依賴研發(fā)同學(xué)快速閱讀第三方工具用戶手冊(cè)、試錯(cuò)的能力,而是要將這些經(jīng)驗(yàn)、能力固化成為代碼。一個(gè)人趟過(guò)所有的坑后,通過(guò)代碼讓其他同事都能享受他工作的結(jié)果,一鍵就能把自己的環(huán)境設(shè)置好,根本不用去了解Maven怎么安裝,MQTT數(shù)據(jù)源怎么設(shè)置等等,而且其他同學(xué)可以在他代碼基礎(chǔ)上做調(diào)整。

2. Pipeline as code:CI/CD的workflow代碼化。我們?cè)缫汛a化,但要把這些代碼納入到正常的版本管理,任何人都可以在現(xiàn)有的代碼基礎(chǔ)上修改、優(yōu)化,增加新的步驟等。而且要保證我們的代碼不能有任何環(huán)境的依賴,比如某臺(tái)具體的測(cè)試機(jī)器,這樣任何人Clone完代碼后,自己一下就能把workflow搭建出來(lái)。同時(shí),整個(gè)workflow包含的內(nèi)容要越來(lái)越多。我們已經(jīng)增加了Release Notes,測(cè)試覆蓋率報(bào)告、性能測(cè)試報(bào)告自動(dòng)生成。今后我們還要看哪些內(nèi)容可以自動(dòng)生成,哪些檢查工具可以加上。

3. Documentation as code:文檔代碼化。除用戶手冊(cè)之外,最重要的是測(cè)試?yán)牧斜?。我們需要從測(cè)試?yán)_本本身自動(dòng)生成測(cè)試?yán)斜?,而且自?dòng)分類。這樣讓任何人,包括售前、交付的同學(xué),一看就知道到底測(cè)試過(guò)哪些場(chǎng)景,針對(duì)某個(gè)具體客戶,是否需要新增場(chǎng)景。用戶手冊(cè)我們已經(jīng)代碼化,但做的還不夠好,因此我們現(xiàn)在對(duì)于一個(gè)新的功能或BUG,研發(fā)負(fù)責(zé)人有項(xiàng)專門的工作,就是合并PR時(shí),檢查用戶手冊(cè)是否有更新。

4. Benchmark as code:對(duì)比測(cè)試代碼化。TDengine與其他時(shí)序數(shù)據(jù)庫(kù)相比,有卓越的性能。但每個(gè)版本我們都要做對(duì)比測(cè)試,而且要不斷增加與其他競(jìng)品的對(duì)比。我們已經(jīng)部分實(shí)現(xiàn),但還不夠徹底,有一定的環(huán)境依賴。

5. Infrastructure as code:即計(jì)算資源的分配要自動(dòng)化。把我們內(nèi)部的服務(wù)器資源的管理完全虛擬化、腳本化,對(duì)于閑置的資源自動(dòng)釋放。自動(dòng)化后,我們一家100人的公司,測(cè)試機(jī)房有2600多個(gè)核,根本不會(huì)存在測(cè)試資源不夠的時(shí)候。要新的計(jì)算資源,幾秒鐘搞定。

對(duì)于研發(fā)團(tuán)隊(duì),現(xiàn)在我能看到無(wú)法完全代碼化的工作是產(chǎn)品設(shè)計(jì)文檔,有一些工具可以幫助大家,但難以100%代碼化。拋開(kāi)設(shè)計(jì)文檔,其他所有工作都是可以,而且必須代碼化的。代碼化后,個(gè)人的經(jīng)驗(yàn)、能力就轉(zhuǎn)化為團(tuán)隊(duì)的經(jīng)驗(yàn)和能力,溝通交流成本大幅下降,一切都是代碼說(shuō)話。這也是我們?yōu)槭裁匆獙?duì)整個(gè)研發(fā)團(tuán)隊(duì)統(tǒng)計(jì)代碼量的原因。代碼量不是絕對(duì),更不是唯一指標(biāo),代碼量大的同學(xué),工作不一定出色,但代碼量一直很低的同學(xué),工作是一定有問(wèn)題的。在我們過(guò)去,有的同學(xué)一個(gè)月都沒(méi)有遞交過(guò)一次代碼,這種情況再也不能發(fā)生。

一切代碼化后的效果

一切代碼化后,很多工作改變了,我們可以明顯的看到如下的結(jié)果:

1. 任何人在自己不聯(lián)網(wǎng)的計(jì)算機(jī)上都可以打包、發(fā)布版本。如果在客戶現(xiàn)場(chǎng)發(fā)現(xiàn)BUG并解決了它,可以馬上給它安裝上自己的版本,而不會(huì)有任何不兼容的事情發(fā)生。

2. 任何人在自己計(jì)算機(jī)上,都可以跑測(cè)試,包括全量測(cè)試、穩(wěn)定性測(cè)試、性能測(cè)試、性能對(duì)比測(cè)試、檢查測(cè)試覆蓋率等,而且不依賴公司的測(cè)試資源。因此完成一項(xiàng)功能或解決一個(gè)BUG,自己就可以全部跑一次,以避免遞交PR時(shí)無(wú)法遞交。

3. 性能優(yōu)化的同學(xué),可以一鍵先在自己計(jì)算機(jī)上跑性能測(cè)試,看性能是否確實(shí)提升了沒(méi)有,而不是直接遞交到測(cè)試平臺(tái),等待結(jié)果之后再看。

4. 新加入的同事,根本不需要熟悉環(huán)境,幾個(gè)小時(shí),就可以配置好開(kāi)發(fā)環(huán)境,Clone代碼,編譯、運(yùn)行、測(cè)試起來(lái)。手快的,就可以馬上開(kāi)始debug了。

5. 客戶、售前、交付同學(xué)關(guān)于產(chǎn)品的問(wèn)題,研發(fā)同學(xué)一律是把用戶手冊(cè)的截圖或鏈接發(fā)給對(duì)方。如果無(wú)法做到,馬上去修改文檔,遞交PR。這樣我們每個(gè)人都不用腦子里記住或記錄一些產(chǎn)品如何避坑的小技巧了。我們留給客戶的印象就是專業(yè),產(chǎn)品沒(méi)有瑕疵,出錯(cuò)全怪我自己,是由于自己沒(méi)細(xì)看文檔。

6. 任何人,包括非研發(fā)團(tuán)隊(duì)的同學(xué),可以清晰的看到每個(gè)發(fā)布的版本,進(jìn)行了哪些具體測(cè)試,發(fā)布的版本是否有任何報(bào)錯(cuò)或報(bào)警。針對(duì)自己客戶的場(chǎng)景,馬上就知道還需要補(bǔ)充哪些測(cè)試用例,才能確保產(chǎn)品上線沒(méi)有問(wèn)題。

7. 需要計(jì)算資源的同學(xué),只要登錄內(nèi)部網(wǎng)站鼠標(biāo)點(diǎn)擊幾下,想要的硬件資源、配置的軟件環(huán)境就馬上準(zhǔn)備好了。

8. 在我詢問(wèn)研發(fā)平臺(tái)組同學(xué)的工作時(shí),如果問(wèn)負(fù)責(zé)發(fā)版的同學(xué),他的回答是“Jeff,我這周又把發(fā)版流程優(yōu)化、調(diào)整了一下,加了更多的檢查,來(lái)保證產(chǎn)品質(zhì)量”,而不是“我這周忙死了,發(fā)了幾個(gè)什么版本”。如果問(wèn)穩(wěn)定性測(cè)試的同學(xué),他的回答是“Jeff,這周我又新增了幾個(gè)破壞性的測(cè)試場(chǎng)景”,而不是“我這周發(fā)現(xiàn)了2個(gè)BUG”。問(wèn)性能測(cè)試的同學(xué),他的回答是“Jeff,這周我新增了幾個(gè)查詢場(chǎng)景的性能測(cè)試”,而不是“我這周完成了性能對(duì)比測(cè)試”。

一切代碼化還可以讓新人迅速進(jìn)入角色,而不是受制于需要長(zhǎng)時(shí)間溝通才能獲取的信息。每個(gè)人需要依靠自己的能力,而不是掌控的信息或資源,來(lái)成為研發(fā)高手。

結(jié)語(yǔ)

一切代碼化充分體現(xiàn)我們倡導(dǎo)的“公開(kāi)、透明”的文化,也充分體現(xiàn)我們強(qiáng)調(diào)的“實(shí)事求是”的工作原則。研發(fā)就必須以代碼說(shuō)話,而不是把很多東西記在腦子里,或者讓自己寫(xiě)下的文檔或代碼生銹長(zhǎng)霉,這樣才能形成團(tuán)隊(duì)的力量,集體的智慧,而且隨著時(shí)間的推移,我們的積累就越來(lái)越多。效率提升之后,我們可以把省出的精力更多的傾注到創(chuàng)造性的工作上去,提升產(chǎn)品的品質(zhì),進(jìn)而提升產(chǎn)品的市場(chǎng)競(jìng)爭(zhēng)力,讓我們獲得商業(yè)成功。

陶建輝

濤思數(shù)據(jù)TDengine創(chuàng)始人