3歲產(chǎn)品經(jīng)理關(guān)于重構(gòu)系統(tǒng)的心路歷程
編輯導(dǎo)語(yǔ):本文將以3歲產(chǎn)品經(jīng)理的視角,針對(duì)作者經(jīng)歷過(guò)的某系統(tǒng)的重構(gòu)過(guò)程,展開(kāi)一次心路歷程的梳理和分享。從無(wú)到1.0版本的上線,從不知如何下手到那就沖吧……
一、項(xiàng)目概況介紹
本次重構(gòu)的系統(tǒng)是“計(jì)費(fèi)系統(tǒng)”,顧名思義是用來(lái)計(jì)算費(fèi)用或者計(jì)算數(shù)量的系統(tǒng),此系統(tǒng)的定位是根據(jù)客戶請(qǐng)求數(shù)據(jù)產(chǎn)品的接口情況來(lái)完成計(jì)算客戶賬單的流程。
這里具體是哪個(gè)系統(tǒng)不重要,換個(gè)別的系統(tǒng)都一樣樣的,除此之外,要完成出賬單的任務(wù),需要諸多腳本在背后支撐,這部分屬于技術(shù)層面的工作,本文不做過(guò)多的闡述。
二、重構(gòu)原因
1. 客戶計(jì)費(fèi)需求光怪陸離
簡(jiǎn)單來(lái)說(shuō),客戶想要的計(jì)費(fèi)需求如今是千奇百怪,亦或是公司的商務(wù)為了能夠給客戶創(chuàng)造一些讓利空間,研究出了一些奇特的計(jì)費(fèi)想法,然而當(dāng)前的系統(tǒng)并不能夠非常靈活且快速地滿足這類需求,所以一部分特殊計(jì)費(fèi)的要求都是人工通過(guò)臨時(shí)寫(xiě)一些sql語(yǔ)句或者定制化的腳本來(lái)實(shí)現(xiàn)的。
但是這種解決方案顯然不夠高效且風(fēng)險(xiǎn)性較高;另一方面,公司想把這部分的業(yè)務(wù)管理的更加規(guī)范化,進(jìn)而提出讓我們必須通過(guò)系統(tǒng)化的功能來(lái)實(shí)現(xiàn)特殊計(jì)費(fèi)業(yè)務(wù)的要求。
2. 祖?zhèn)鞔a表結(jié)構(gòu)設(shè)計(jì)不夠合理
原計(jì)費(fèi)系統(tǒng)當(dāng)初了趕項(xiàng)目進(jìn)度,在底層架構(gòu)設(shè)計(jì)以及表結(jié)構(gòu)設(shè)計(jì)上不夠合理,這就導(dǎo)致后期的改造成本和維護(hù)成本都比較高,經(jīng)常是研發(fā)人員一邊吐槽一邊改,所以既然業(yè)務(wù)方有新的需求,剛好基于這次機(jī)會(huì)將代碼進(jìn)行重構(gòu),也便于經(jīng)后的管理。
3. 合適的契機(jī)更換計(jì)費(fèi)腳本
說(shuō)起這個(gè)原因,其實(shí)也是為了間接性地解決另外一個(gè)問(wèn)題,那就是當(dāng)前采用跑賬單數(shù)據(jù)的是shell腳本,研發(fā)人員對(duì)于shell腳本不是特別擅長(zhǎng),并且在我們使用過(guò)程中shell腳本報(bào)錯(cuò)頻率有些高,導(dǎo)致我們的賬單數(shù)據(jù)會(huì)存在計(jì)費(fèi)不夠完全準(zhǔn)確的情況。
其實(shí)很早之前就想過(guò)替換成spark腳本,但是替換腳本這件事事關(guān)重大,且日常的業(yè)務(wù)需求的開(kāi)發(fā)任務(wù)也非常重,此問(wèn)題一直沒(méi)能得到解決,說(shuō)到這里作為產(chǎn)品經(jīng)理的我也有些慚愧,應(yīng)該更早地為這個(gè)問(wèn)題爭(zhēng)取時(shí)間和資源,好在這次終于有了這樣一個(gè)時(shí)機(jī)去解決,也算是抓住機(jī)會(huì)去改變吧。
在跟業(yè)務(wù)方多次溝通后,最終確認(rèn)了通過(guò)開(kāi)發(fā)新系統(tǒng)-結(jié)算平臺(tái)來(lái)解決當(dāng)下的問(wèn)題,在這之前我們確實(shí)是在“改造原計(jì)費(fèi)系統(tǒng)”還是“開(kāi)發(fā)新系統(tǒng)”中進(jìn)行衡量和抉擇,考慮的因素?zé)o非是時(shí)間成本和開(kāi)發(fā)成本。
二者的優(yōu)劣也很明顯,如果是改造原系統(tǒng),可以直接開(kāi)始新需求的開(kāi)發(fā)工作,必然是最快且成本最低的方式,但同時(shí)會(huì)錯(cuò)失重構(gòu)的機(jī)會(huì),業(yè)務(wù)方也不會(huì)給比較長(zhǎng)的時(shí)間來(lái)讓我們有時(shí)間做重構(gòu)的工作;如果是打算從頭開(kāi)始做新系統(tǒng),當(dāng)然需要的資源較多、耗時(shí)較長(zhǎng),但是這樣就能夠把整個(gè)系統(tǒng)的架構(gòu)進(jìn)行重新設(shè)計(jì),從長(zhǎng)遠(yuǎn)來(lái)看自然是件好事。
三、項(xiàng)目整體規(guī)劃
既然確定了以新系統(tǒng)的方式來(lái)完成此次任務(wù),那在最開(kāi)始產(chǎn)品經(jīng)理需要規(guī)劃好項(xiàng)目整體的一個(gè)排期進(jìn)度。在確定排期前,首先要明確以下幾點(diǎn):
1. 重構(gòu)內(nèi)容包含哪些?
- 當(dāng)前系統(tǒng)主流程業(yè)務(wù)中哪些邏輯和功能需要調(diào)整
- 原有的哪些表結(jié)構(gòu)設(shè)計(jì)需要調(diào)整
- 與其他的系統(tǒng)之間的交互是否需要調(diào)整
- 新舊系統(tǒng)在并行期間的數(shù)據(jù)該如何處理
- 新業(yè)務(wù)新功能的設(shè)計(jì)方案
在梳理這塊內(nèi)容時(shí),產(chǎn)品經(jīng)理需要認(rèn)真仔細(xì)的確認(rèn)清楚當(dāng)前系統(tǒng)中每個(gè)功能點(diǎn),是否需要進(jìn)行調(diào)整,最好是將原有功能列出一個(gè)比較完整的清單,這樣不易于遺漏一些小的功能點(diǎn)的改造,若是需要調(diào)整,則在清單內(nèi)標(biāo)注好方便后續(xù)的跟蹤。
而我本人在進(jìn)行這項(xiàng)工作時(shí),疏忽了這點(diǎn),可能是覺(jué)得對(duì)于原系統(tǒng)過(guò)于了解,就想當(dāng)然的以為這些點(diǎn)都在腦子里,這就導(dǎo)致在開(kāi)需求評(píng)審時(shí),發(fā)現(xiàn)遺漏了細(xì)節(jié),好在研發(fā)人員是比較熟悉系統(tǒng)的,能夠及時(shí)補(bǔ)充避免了一些問(wèn)題。
2. 優(yōu)先級(jí)排序如何確定?
確定了原有功能需要改造的內(nèi)容后,接下來(lái)需要考慮此次在新系統(tǒng)中的要實(shí)現(xiàn)的新增的功能與原功能在開(kāi)發(fā)中的優(yōu)先級(jí)排序。
這一點(diǎn)蠻重要的,因?yàn)椴灰欢ㄒ劝言δ苋块_(kāi)發(fā)完之后再進(jìn)行新功能,當(dāng)然對(duì)于本次重構(gòu)的系統(tǒng)而言,新功能的使用是強(qiáng)依賴于一部分原功能的。
沒(méi)錯(cuò),只是強(qiáng)依賴于一部分原有功能,也就意味著我們并非需要在最后階段在開(kāi)始新功能的開(kāi)發(fā)。
我為什么會(huì)提到這一點(diǎn),因?yàn)檫@一點(diǎn)對(duì)于整體的排期優(yōu)先級(jí)的順序影響比較大。
大家可以想想,在我們實(shí)際工作中其實(shí)開(kāi)發(fā)時(shí)間是非常緊張的,而我們的需求方也是急于看到一些成果的,原有功能的重構(gòu)自然不是他們最關(guān)心的點(diǎn),所以我們也要比較聰明地把重要的東西往前提。
也就是說(shuō)當(dāng)我們的把必須的原有的主流程開(kāi)發(fā)完后,就直接上手開(kāi)始新功能,這樣能夠把需求方最想看到的東西盡可能早點(diǎn)完成,那剩下的其余功能我們就按照正常的系統(tǒng)迭代節(jié)奏進(jìn)行即可,否則,很可能一直處于被需求方催進(jìn)度的被動(dòng)狀態(tài)。因此重構(gòu)過(guò)程中的優(yōu)先級(jí)排序是需要好好考慮的事情。
3. 開(kāi)發(fā)任務(wù)該如何拆解呢?
總體的優(yōu)先級(jí)確認(rèn)后,我們需要將開(kāi)發(fā)任務(wù)進(jìn)行拆解。在此過(guò)程中可以先按照階段拆解,明確每一階段的主要目標(biāo)是什么,進(jìn)而就能知道在這一階段中需要完成哪些開(kāi)發(fā)任務(wù)。
而一個(gè)階段內(nèi)的開(kāi)發(fā)任務(wù)也需要進(jìn)一步拆解,此時(shí)可以根據(jù)功能模塊劃分,比如一個(gè)菜單欄內(nèi)包含了列表展示、詳情展示、編輯、導(dǎo)出以及一系列的子功能,我們也需要定義一個(gè)優(yōu)先級(jí),決定先做哪些子功能。
最后就是將劃分好的各階段確定出開(kāi)發(fā)完成時(shí)間,也就是提測(cè)時(shí)間,進(jìn)而排期成多個(gè)版本進(jìn)行分批上線,以上的過(guò)程是需要產(chǎn)品和研發(fā)共同敲定的,至于上線時(shí)間需要同測(cè)試人員一起進(jìn)行評(píng)估。
圖為本人當(dāng)時(shí)繪制的排期表,可適當(dāng)參考
四、敲定新功能的設(shè)計(jì)方案
前面已經(jīng)提到過(guò)了,本次系統(tǒng)的重構(gòu)主要分為了兩部分,原有功能的重新搭建和開(kāi)發(fā)新功能支持新的業(yè)務(wù)需求。
后半部分才是這次重構(gòu)工作中最重要的內(nèi)容,也是“業(yè)務(wù)方爸爸們”最在意的工作,但在實(shí)際工作中,我們是先敲定了新功能的業(yè)務(wù)需求和實(shí)現(xiàn)方案,再考慮新系統(tǒng)的整體規(guī)劃方案的,那這里也由此可見(jiàn)我上面所提到的排期時(shí)考慮功能優(yōu)先級(jí)的重要性。
關(guān)于新功能的設(shè)計(jì)方案,這里不會(huì)展開(kāi)來(lái)講,原因也很簡(jiǎn)單,此方案是根據(jù)公司的實(shí)際業(yè)務(wù)情況出發(fā)和落腳的,因此非常定制化。
那我想說(shuō)的其實(shí)是另外一點(diǎn),產(chǎn)品經(jīng)理在設(shè)計(jì)新方案時(shí),不僅僅是需要站在支持業(yè)務(wù)實(shí)現(xiàn)系統(tǒng)化的層面,還要考慮高層領(lǐng)導(dǎo)想要達(dá)成的其他潛在目標(biāo)。
比如,管理制者之所以發(fā)起這樣的新項(xiàng)目,一方面是為了提高運(yùn)整體的運(yùn)營(yíng)的效率,另一方面呢的其實(shí)是想降低研發(fā)人員替換時(shí)所產(chǎn)生的較高的替換成本,因?yàn)楫?dāng)前系統(tǒng)在支持業(yè)務(wù)工作時(shí),有很多場(chǎng)景是需要研發(fā)人員臨時(shí)寫(xiě)sql來(lái)獲取結(jié)果的,這樣的工作對(duì)人的依賴性很大,一旦出現(xiàn)人員變動(dòng),對(duì)業(yè)務(wù)的工作影響是比較大的。
如果一開(kāi)始沒(méi)有想到這一點(diǎn),那么可能就會(huì)像我一樣,在設(shè)計(jì)功能時(shí)會(huì)忽略掉一些點(diǎn),導(dǎo)致方案被一否再否,經(jīng)過(guò)了多次的調(diào)整才得到了業(yè)務(wù)和領(lǐng)導(dǎo)層一致的通過(guò)。
五、項(xiàng)目進(jìn)度跟蹤
當(dāng)進(jìn)入了實(shí)際的產(chǎn)品開(kāi)發(fā)階段后,產(chǎn)品經(jīng)理需要時(shí)刻關(guān)注和跟蹤項(xiàng)目進(jìn)度,這樣可及時(shí)發(fā)現(xiàn)是否有延期風(fēng)險(xiǎn)。
根據(jù)排期規(guī)劃我們拆分出了4個(gè)階段的上線版本,大概歷時(shí)4個(gè)月,涉及3.5個(gè)后端人員和1個(gè)前端人員。同時(shí)我針對(duì)每一階段的版本拆分出了每個(gè)研發(fā)人員按周的計(jì)劃進(jìn)度,每到周四下午我會(huì)與每個(gè)人確認(rèn)本周的實(shí)際進(jìn)度,是否可以按時(shí)完成,若是有其他原因?qū)е卵诱`,則需要立馬定原因,解決延期問(wèn)題,同時(shí)也要提防是否還會(huì)出現(xiàn)相同的狀況。
圖為本人當(dāng)時(shí)繪制的進(jìn)度跟蹤表,比較粗簡(jiǎn)可適當(dāng)參考
那實(shí)際中呢,我確實(shí)也犯了一些小錯(cuò)誤,在最開(kāi)始我們確定了一期的開(kāi)發(fā)任務(wù)后,自認(rèn)為大家都沒(méi)有反饋問(wèn)題那就是沒(méi)有問(wèn)題,因此在進(jìn)入開(kāi)發(fā)后的第一周我也就沒(méi)有過(guò)多的關(guān)心進(jìn)度情況,等到第二周時(shí)發(fā)現(xiàn)原定的進(jìn)度已經(jīng)不能再通過(guò)趕工的方式來(lái)彌補(bǔ)了,結(jié)果就只能是延期提測(cè)了三天。
好在及時(shí)跟測(cè)試人員進(jìn)行了溝通,壓縮了測(cè)試時(shí)間,這才能夠在既定日期完成一期上線。當(dāng)然這里也不提倡通過(guò)壓縮測(cè)試時(shí)間來(lái)達(dá)到目標(biāo),只是一期上線功能較少,原評(píng)估的測(cè)試時(shí)間較長(zhǎng),確實(shí)是有可壓縮的空間,才解決了延期問(wèn)題。
六、第一階段1.0.0版本上線
與大多數(shù)互聯(lián)網(wǎng)公司一樣,上線日是周二和周四,第一期的版本我們定的是周四,原本像這樣的新系統(tǒng),通常是可以不用等晚上再推包上線的,可是我們還是拖到了晚上7點(diǎn)多才開(kāi)始準(zhǔn)備上線。
也正如預(yù)想的一樣,新系統(tǒng)上線問(wèn)題百出,大概的原因主要是測(cè)試環(huán)境和生產(chǎn)環(huán)境配置不相同,以及又遇到了sre資源占用等問(wèn)題,最后的結(jié)果就是直到晚上23:30左右才在生產(chǎn)環(huán)境部署成功。
那針對(duì)這一次的上線問(wèn)題,我們下來(lái)也進(jìn)行了復(fù)盤(pán),從產(chǎn)品角度來(lái)看的話,當(dāng)時(shí)確實(shí)是在上線驗(yàn)收前,我發(fā)現(xiàn)了一些問(wèn)題,并且花了較多的時(shí)間進(jìn)行了再次測(cè)試驗(yàn)證,結(jié)果是問(wèn)題確實(shí)存在,但這也就直接導(dǎo)致直到晚上7點(diǎn)左右才開(kāi)始推包。
其實(shí)針對(duì)這樣的狀況,在我看來(lái)產(chǎn)品經(jīng)理可以果斷一點(diǎn),那就是帶著問(wèn)題先上線,因?yàn)榈谝黄诘纳暇€,也并不會(huì)對(duì)外開(kāi)放使用,主要是為了先跑通正式環(huán)境,如果是這樣的話那天就不用熬到快12點(diǎn)了,這也是我這次學(xué)到的一次教訓(xùn)。
那另外一點(diǎn)經(jīng)驗(yàn)教訓(xùn)是,像這樣的新系統(tǒng)上線,其實(shí)可以先預(yù)上線一次,就是在原定的上線日的時(shí)間,提前一個(gè)上線日先“預(yù)熱”一次,主要是解決環(huán)境部署或者預(yù)發(fā)和生產(chǎn)配置不一致等問(wèn)題,等到正式上線就能避免這些問(wèn)題。
圖為與研發(fā)和測(cè)試復(fù)盤(pán)會(huì)議的總部,可適當(dāng)參考
七、寫(xiě)到最后的小想法
如果對(duì)本次的重構(gòu)工作進(jìn)行個(gè)自我打分的話,我確實(shí)是不太滿意的,只能給自己打6分,也就是剛及格的狀態(tài),這里主要有幾點(diǎn)原因:
第一呢,我覺(jué)得自己還是過(guò)于保守不夠勇敢。主要體現(xiàn)在不太敢于打破原來(lái)的一些邏輯和設(shè)計(jì),在原有功能方面還是盡可能在“復(fù)刻”,一方面是出于用戶習(xí)慣的考慮,另一方面是害怕如果進(jìn)行改變帶來(lái)的不確定的影響范圍。
這可能與我本人的一些工作習(xí)慣和方式相關(guān),更傾向于謹(jǐn)慎地完成工作,當(dāng)然這一點(diǎn)也并非是完全有問(wèn)題的,因?yàn)槲掖_實(shí)需要考慮上面提到兩個(gè)因素,但是也不應(yīng)該就真的被嚇住了。
假設(shè)下如果真的敢于突破,出了一些問(wèn)題,又會(huì)怎樣呢?影響范圍和程度又會(huì)有多大呢?完全不可控了嗎?其實(shí)實(shí)際上可能就真的還好,大不了被多罵幾遍再改回去嘛,只要能掌控住風(fēng)險(xiǎn)大小,那就沖一把嘛~
第二呢,重構(gòu)前的產(chǎn)品準(zhǔn)備工作做的不夠充分。也是體現(xiàn)在兩方面,自身角度沒(méi)能更加深入的去思考這次重構(gòu)怎樣能讓系統(tǒng)和業(yè)務(wù)結(jié)合的更加順暢和緊密,更像是火急火燎、慌慌張張的去完成一項(xiàng)緊急且重要的工作任務(wù),“交好這個(gè)差”。
再就是前期的調(diào)研應(yīng)該多花時(shí)間做做,而實(shí)際中這塊確實(shí)被忽略了,如果說(shuō)調(diào)研做的比較充分,前面沒(méi)能深入思考的問(wèn)題可能就迎刃而解了。
第三呢,產(chǎn)品經(jīng)理爭(zhēng)取資源和時(shí)間的能力真的也是需要好好培養(yǎng)和鍛煉的。客觀來(lái)講,當(dāng)時(shí)在接到重構(gòu)系統(tǒng)任務(wù)時(shí),我同時(shí)在負(fù)責(zé)另外一個(gè)龐大復(fù)雜的賬務(wù)系統(tǒng),日常的需求任務(wù)非常重,也是我們部門(mén)最核心的系統(tǒng)之一,單就負(fù)責(zé)這一個(gè)系統(tǒng)的時(shí)候我都蠻心力交瘁的。
所以這個(gè)時(shí)候公司讓你同時(shí)負(fù)責(zé)多個(gè)系統(tǒng)時(shí),要是沒(méi)有很好的爭(zhēng)取資源和時(shí)間的能力,估計(jì)就會(huì)像我一樣,吭哧吭哧自己加班干活,兩邊都不敢耽誤。雖然最后也能完成得讓業(yè)務(wù)方和領(lǐng)導(dǎo)層基本滿意,但是學(xué)到的東西就比較粗淺也很累人。
最后呢,希望以上的分享能給各位產(chǎn)品經(jīng)理多多少少帶來(lái)一起啟發(fā)或者思考,能吸取我的一些經(jīng)驗(yàn)教訓(xùn),在產(chǎn)品路上大步前行不要慫!
本文由 @Joysaver? 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載
題圖來(lái)自 Unsplash,基于 CC0 協(xié)議
不僅僅是需要站在支持業(yè)務(wù)實(shí)現(xiàn)系統(tǒng)化的層面,還要考慮高層領(lǐng)導(dǎo)想要達(dá)成的其他潛在目標(biāo)。
哈哈哈是這樣的小心思
我公司產(chǎn)品體系中也涉及到結(jié)算,客戶的各種自定義計(jì)算方式也是千奇百怪,我們公司業(yè)務(wù)/研發(fā)/產(chǎn)品/實(shí)施等崗位到的人對(duì)這一塊的認(rèn)知高度不足,認(rèn)為這一塊應(yīng)該往客戶可自定義配置計(jì)算公式方向去做產(chǎn)品設(shè)計(jì),打磨了兩年,結(jié)果也是讓人欣喜的,在企業(yè)住宿/校園住宿/物業(yè)費(fèi)用結(jié)算方面滿足了90%的場(chǎng)景,但是也因?yàn)樽远x配置計(jì)算方式造成了極高的實(shí)施成本,基本上客戶采購(gòu)我們系統(tǒng)后都是由實(shí)施崗的同事去給客戶配置,如果客戶不是在這一快結(jié)算業(yè)務(wù)場(chǎng)景沉浸幾年真的很難自己去配置計(jì)算方式,往往客戶改一個(gè)計(jì)算單位或者計(jì)算標(biāo)準(zhǔn)都需要我們的人去配置,并且要跑一次賬單去測(cè)試精準(zhǔn)性。由于產(chǎn)品設(shè)計(jì)是往自定義配置房型走的,造成了各種計(jì)算規(guī)則的耦合性超強(qiáng),用戶想要單獨(dú)截取部門(mén)計(jì)算結(jié)果是做不到的,現(xiàn)在也是規(guī)劃了重構(gòu),解除各層級(jí)計(jì)算規(guī)則的耦合性,每個(gè)階段都需要生成單獨(dú)的計(jì)算成果,這部分?jǐn)?shù)據(jù)對(duì)于90%的客戶來(lái)說(shuō)可能不關(guān)心,但是剩下10%的客戶可能需要拿這部分?jǐn)?shù)據(jù)導(dǎo)表去進(jìn)行加工以滿足他們企業(yè)的特殊業(yè)務(wù)場(chǎng)景。這樣一搞,表單重寫(xiě)/腳本重新寫(xiě)/功能邏輯優(yōu)化/界面重新設(shè)計(jì)/結(jié)算模塊重新測(cè),這系統(tǒng)重構(gòu)的成本由企業(yè)自己承擔(dān),并且不能影響其他項(xiàng)目的進(jìn)展,對(duì)于剛成立六年的SAAS創(chuàng)業(yè)型公司來(lái)說(shuō)是極其高昂的成本,我也就是報(bào)了個(gè)方案給老板和股東們,老板也意識(shí)到問(wèn)題的嚴(yán)重性,至于干不干就是看大佬們的魄力了,不干的話也能持續(xù)運(yùn)維下去,運(yùn)維成本每月逐步增加,結(jié)算模塊越來(lái)越繁重,實(shí)施成本也是越來(lái)越高。
是這樣的 二八原則 為了10%的業(yè)務(wù)耗費(fèi)了80%的資源和精力
謝謝作者的分享,也能夠提醒其他的產(chǎn)品經(jīng)理能少走一些彎路。
確實(shí),先調(diào)研,匯總,開(kāi)發(fā)個(gè)初始版本,內(nèi)測(cè)跑跑正式環(huán)境,很多問(wèn)題最開(kāi)始可能沒(méi)想到,東西一做出來(lái),跑一遍環(huán)節(jié),就有很多問(wèn)題要調(diào)整,復(fù)盤(pán)的很棒