揭秘程序員在「外包」、「技術(shù)導(dǎo)向型」和「業(yè)務(wù)驅(qū)動(dòng)型」公司的日常生活
一、寫(xiě)作背景
二、各類型公司的環(huán)境氛圍
三、各類型公司的開(kāi)發(fā)流程規(guī)范
四、如何提高在公司的核心競(jìng)爭(zhēng)力
五、一些中肯建議
一、寫(xiě)作背景
本人在大學(xué)期間有過(guò)三段實(shí)習(xí),大二在一家外包公司,大三去了技術(shù)型公司,現(xiàn)在待在一個(gè)業(yè)務(wù)驅(qū)動(dòng)型公司。認(rèn)識(shí)我比較久的讀者應(yīng)該知道,我經(jīng)歷了一次優(yōu)秀實(shí)習(xí)生,兩次提前轉(zhuǎn)正,最近這份工作原本半年的試用實(shí)習(xí)期,只實(shí)習(xí)了一個(gè)月就提前轉(zhuǎn)正。
寫(xiě)這篇文章有三個(gè)目的:
1. 純粹地分享這三家的工作經(jīng)歷。
2. 分享的同時(shí),給在校生和未在這些公司中從事工作的同學(xué)一些參考。畢竟在自己沒(méi)有真正經(jīng)歷過(guò)之前,都只是別人口中所說(shuō),也是所謂的「圍城」。
3.由于本人有階段性復(fù)盤(pán)的習(xí)慣,對(duì)這三段工作的表現(xiàn)自認(rèn)為還可以,這邊也會(huì)針對(duì)不同類型的公司分享一些提高核心競(jìng)爭(zhēng)力的經(jīng)驗(yàn)。
二、各類型公司的環(huán)境氛圍
①外包
我們當(dāng)時(shí)團(tuán)隊(duì)有10個(gè)人,入駐到一家國(guó)企里面進(jìn)行開(kāi)發(fā),分配給我們的只有一個(gè)小房間,而且這個(gè)房間之前還是倉(cāng)庫(kù),在公司的最角落。
房間里面的氛圍「很符合」開(kāi)發(fā)氣氛,只有到飯點(diǎn)了有人喊吃飯了才有聲音,其他時(shí)候一片寂靜。
這家國(guó)企有自己的食堂,他們的員工都是包餐的,人手一張卡。但是這家企業(yè)給到我們團(tuán)隊(duì)的只有一張卡,也就是我們團(tuán)隊(duì)共用一張卡,所以到食堂之后我們得排在一起輪流刷。吃完飯之后,團(tuán)隊(duì)的每個(gè)人需要給CTO轉(zhuǎn)12元作為中午的飯錢(qián),CTO收完之后統(tǒng)一轉(zhuǎn)給該企業(yè)財(cái)務(wù),也就是我們不包餐。
輪流刷卡,不包餐這些都還好,畢竟外包團(tuán)隊(duì)嘛,也能理解。但是食堂有時(shí)在節(jié)假日特意煮了湯或者其他什么的,一看到我們團(tuán)隊(duì)來(lái)了,就直接說(shuō)我們沒(méi)有。有一次中秋節(jié),人事部在食堂門(mén)口發(fā)禮盒,團(tuán)隊(duì)的老員工要去領(lǐng),人事部的人由于對(duì)我們比較陌生,于是問(wèn)了一下基本信息,一聽(tīng)到我們是技術(shù)部的,趕緊揮了揮手說(shuō)沒(méi)有。
雖然這家外包996,一個(gè)月只發(fā)我800工資,而且還用支付寶轉(zhuǎn)賬,但我還是挺感激給予我這樣的機(jī)會(huì)讓我學(xué)習(xí),沒(méi)有「歸屬感」和「認(rèn)同感」也告訴我僅僅只能實(shí)習(xí),這兩種感覺(jué)相信在外包的朋友都深有體會(huì)。
②技術(shù)導(dǎo)向型
這家公司是真正意義上的技術(shù)型公司,公司產(chǎn)品的核心競(jìng)爭(zhēng)力就是技術(shù),解決市場(chǎng)上其他競(jìng)品解決不了的。
該公司的創(chuàng)始人及管理層全都是技術(shù)人員出身,企業(yè)內(nèi)部還設(shè)了一個(gè)大學(xué),上面有必修課和選修課,上完課之后要參加考試,考試成績(jī)作為年終績(jī)效指標(biāo)之一。上到HR,下到底層研發(fā)人員都得接受大數(shù)據(jù)知識(shí)的洗禮,隨口就是各種Hadoop、Spark。除此之外,公司還會(huì)經(jīng)常外界技術(shù)人士來(lái)公司分享,企業(yè)內(nèi)部也會(huì)經(jīng)常性做分享。
這種技術(shù)氛圍也是每個(gè)技術(shù)人所向往的,遇到什么難題,內(nèi)部員工頭腦風(fēng)暴一下就能解決。
這種企業(yè)里的技術(shù)人員是具備核心地位的,核心部門(mén)也必須是開(kāi)發(fā)部,并且針對(duì)不同的技術(shù),內(nèi)部分工會(huì)分的比較細(xì),具體到哪個(gè)模塊,哪個(gè)功能。
③業(yè)務(wù)驅(qū)動(dòng)型
在這種公司,開(kāi)發(fā)部門(mén)正常都不是核心部門(mén),但同時(shí)又是不可缺少的。拿我現(xiàn)在的電商公司來(lái)說(shuō),數(shù)據(jù)部門(mén)主要是為了給運(yùn)營(yíng)部提供一些數(shù)據(jù)讓他們更好地去定價(jià),定制活動(dòng)等。
公司的核心競(jìng)爭(zhēng)力應(yīng)該是產(chǎn)品,其次是模式,而模式包含著運(yùn)營(yíng)、銷售等。技術(shù)只是作為輔助這種模式建立的一份子,搭建一個(gè)平臺(tái),或者出一些指標(biāo)數(shù)據(jù),都是為了更好服務(wù)業(yè)務(wù)。
市面上大部分互聯(lián)網(wǎng)公司都是業(yè)務(wù)驅(qū)動(dòng)型公司,這類公司會(huì)把部分邊緣業(yè)務(wù)外包出去,重點(diǎn)做核心業(yè)務(wù),對(duì)于核心業(yè)務(wù)的技術(shù)又沒(méi)像技術(shù)型公司一樣苛刻,謀求最佳性價(jià)比。
三、各類型公司的開(kāi)發(fā)流程規(guī)范
①外包
「不管是爛代碼還是冗余代碼,只要能實(shí)現(xiàn)功能的就是好代碼」。大部分的外包公司或者說(shuō)基本所有的外包公司都不會(huì)做code review,只要能把功能實(shí)現(xiàn)交給客戶就行。
大二的時(shí)候,我們團(tuán)隊(duì)雖然駐扎在一家國(guó)企里面,但真正做該企業(yè)項(xiàng)目的只有我一個(gè)人,其他人都在做不同的項(xiàng)目。我那時(shí)既自豪又感概,自豪地跟同學(xué)說(shuō)我自己一個(gè)人搞一個(gè)國(guó)企項(xiàng)目,感慨公司心真大,把一個(gè)國(guó)企項(xiàng)目交給我的一個(gè)實(shí)習(xí)生來(lái)做。
那時(shí)也不懂什么叫好代碼,都是沖著功能實(shí)現(xiàn)去的,各種調(diào)包,copy & paster,if else while for常常寫(xiě)出「死亡三角」,沒(méi)人批評(píng)我說(shuō)代碼寫(xiě)的丑,沒(méi)人讓我封裝,都是夸我功能實(shí)現(xiàn)的快,就是bug多了點(diǎn)。
產(chǎn)品經(jīng)理時(shí)不時(shí)地走到我身邊,跟我說(shuō)要加哪些功能,哪些不要,業(yè)務(wù)邏輯都是freestyle,現(xiàn)場(chǎng)畫(huà)邏輯圖。剛開(kāi)始不懂,認(rèn)真地聽(tīng)產(chǎn)品經(jīng)理說(shuō),然后拿小本本記。后來(lái)我的leader跟我說(shuō):「別聽(tīng)產(chǎn)品經(jīng)理的,有不懂的問(wèn)我就行」,到后來(lái)國(guó)企的運(yùn)營(yíng)部也來(lái)找我提需求,真的是人人都是產(chǎn)品經(jīng)理啊!
團(tuán)隊(duì)里沒(méi)有專門(mén)的測(cè)試同事,都是上線那天一起加班,國(guó)企運(yùn)營(yíng)部的人幫忙測(cè)試,我們開(kāi)發(fā)就在旁邊實(shí)時(shí)解決測(cè)出來(lái)的問(wèn)題,順利的話當(dāng)天發(fā)布,要是有遇到解決不了的bug就結(jié)束加班,明天繼續(xù)。
這個(gè)項(xiàng)目經(jīng)過(guò)我手之后寫(xiě)的是又大又爛,現(xiàn)在的我也看不下去那些代碼了,這個(gè)項(xiàng)目在我走之后也下線了。
在這家公司,我從跟甲方博弈,到跟產(chǎn)品經(jīng)理撕逼,再到前端后臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,全搞了一遍。不得不說(shuō)這也是一個(gè)難得的學(xué)習(xí)機(jī)會(huì),但是我在下一家公司嘗了這家公司帶給我的苦。
②技術(shù)型公司
一年后來(lái)到了這家公司,這家公司是數(shù)倉(cāng)行業(yè)的標(biāo)桿,產(chǎn)品是To B的,客戶都是各領(lǐng)域的KOL,又是中國(guó)的一個(gè)Apache開(kāi)源項(xiàng)目,無(wú)論是技術(shù)還是開(kāi)發(fā)流程規(guī)范說(shuō)領(lǐng)先的應(yīng)該不過(guò)分。
先看看我們的開(kāi)發(fā)流程和規(guī)范:
1.PRD/issue
如果是新功能,而且相對(duì)比較大的,需要產(chǎn)品經(jīng)理畫(huà)出原型圖以及詳細(xì)說(shuō)明清楚;如果是bug或者比較小的功能,需要在github的issue上說(shuō)清楚??陬^說(shuō)的永遠(yuǎn)無(wú)效,如果產(chǎn)品經(jīng)理口頭對(duì)我們說(shuō)什么,我們都會(huì)要求他給文檔、發(fā)郵件或者在issue上說(shuō)明清楚,也是保留證據(jù),防止互相甩鍋。
2.本地Reproduce
本地重現(xiàn)bug。也就是出現(xiàn)bug的時(shí)候,我們開(kāi)發(fā)要進(jìn)行本地重現(xiàn),只有重現(xiàn)出來(lái)才能從根本上解決問(wèn)題。這一步是最難的,也是耗時(shí)最長(zhǎng)的。如果連bug本地重現(xiàn)也重現(xiàn)不出來(lái),后續(xù)工作基本難以進(jìn)行。
3. 定位Root cause
對(duì)于Bug,我們要先找到引起的根本原因,這塊最考驗(yàn)綜合能力。mentor給我的箴言就是:「大膽假設(shè),小心求證」。 把所有可能性列出來(lái),然后一個(gè)個(gè)去證實(shí)。只有定位了Root cause,你才能開(kāi)始去寫(xiě)代碼。
4.Design review
這是代碼架構(gòu)設(shè)計(jì)上的一個(gè)review,是跟mentor或者leader對(duì)接確認(rèn)的,在編寫(xiě)代碼之前完成,避免設(shè)計(jì)不行,被全部推翻。這塊也要寫(xiě)在github的issue,一方面為后人留下痕跡,便于后面維護(hù)或者迭代復(fù)盤(pán)。而且高層也經(jīng)常翻閱issue,design review做的不好,也會(huì)被指出來(lái),及時(shí)發(fā)現(xiàn)問(wèn)題。
5.代碼編寫(xiě)(阿里巴巴手冊(cè),UT,IT)
寫(xiě)好代碼是新手的基本要求,不寫(xiě)低質(zhì)量代碼。這邊要求按照effect java以及阿里巴巴代碼手冊(cè)進(jìn)行約束,以及每寫(xiě)完代碼都要通過(guò)UT或者IT進(jìn)行覆蓋。
6.Test plan
當(dāng)你寫(xiě)完代碼之后,你需要制定一個(gè)測(cè)試計(jì)劃,也就是測(cè)試用例,去解決之前相同操作下會(huì)出現(xiàn)的bug或者驗(yàn)證你的新功能。
7.Test evidence
也就是Test plan制定完之后進(jìn)行實(shí)施,將驗(yàn)證成功的截圖進(jìn)行保留,貼到issue,作為你完成功能的證據(jù)。
8.CI
Continuous Integration-持續(xù)集成服務(wù),它會(huì)自己運(yùn)行構(gòu)建和測(cè)試,反饋過(guò)程中是否存在Bug或者其他問(wèn)題,看是否與我們預(yù)期的結(jié)果一致。我們是在Jenkins上完成的,當(dāng)你的代碼有點(diǎn)改動(dòng)你就需要去跑CI,避免影響到系統(tǒng)的其他模塊。
9.Code review
當(dāng)你寫(xiě)完代碼并且通過(guò)測(cè)試之后,通過(guò)pr的方式先給導(dǎo)師review,導(dǎo)師review完之后提交給leader,對(duì)于一些比較重要的模塊,在leader看完代碼之后還要進(jìn)一步提交給CTO??赐赀@個(gè)你還敢提交爛代碼?別說(shuō)爛代碼了,一個(gè)變量名定義的不好都得被打回來(lái)。
剛開(kāi)始入職的時(shí)候覺(jué)得這些操作很煩,改一行代碼就得去issue上面寫(xiě)一堆,而且也要跑個(gè)幾小時(shí)的CI。當(dāng)后來(lái)吃了幾次虧,真香。別看除了代碼編寫(xiě)還有很多其他操作,其他操作也是為了讓你更好地去編寫(xiě)代碼,幫你梳理整個(gè)開(kāi)發(fā)流程,也不自覺(jué)地提升你工作的嚴(yán)謹(jǐn)性。所以到現(xiàn)在,我來(lái)公司解決的第一個(gè)bug,我都還知道Root cause,以及其他細(xì)節(jié)。其他人也知道,因?yàn)槲叶假N在issue上面。
由于我在第一段工作中養(yǎng)成很多不好的習(xí)慣,比如說(shuō)代碼寫(xiě)的又快又爛,debug各種log亂打,為了實(shí)現(xiàn)功能破壞了設(shè)計(jì)模式等等。所以在第二段工作經(jīng)歷中被罵的狗血淋頭,國(guó)慶7天看了4本關(guān)于代碼設(shè)計(jì)的書(shū)籍并做了總結(jié),對(duì)項(xiàng)目源碼進(jìn)行深入閱讀,學(xué)習(xí)一些設(shè)計(jì)模式等等。
在第二家公司,雖然被懟了很多,但是收獲非常大,可以看我在第三家的表現(xiàn)。
③業(yè)務(wù)驅(qū)動(dòng)型
業(yè)務(wù)驅(qū)動(dòng)型的公司處于外包和技術(shù)型之間,也是以實(shí)現(xiàn)功能為主,又要注重后期維護(hù),對(duì)規(guī)范處于中立狀態(tài),不挖坑,不矯情。
由于我從第二家公司出來(lái)后,對(duì)代碼有一定的潔癖,所以到了第三家公司一有空就重構(gòu)項(xiàng)目代碼,leader也贊同我的行為,經(jīng)常找我聊代碼設(shè)計(jì)和規(guī)范。我也主動(dòng)申請(qǐng)要補(bǔ)充部門(mén)的開(kāi)發(fā)流程規(guī)范,數(shù)據(jù)庫(kù)的字段規(guī)范,并補(bǔ)全項(xiàng)目代碼的UT、IT等等。這也是我能提前轉(zhuǎn)正的原因之一。
四、如何在不同類型的公司提高核心競(jìng)爭(zhēng)力
在外包公司,不能局限于一個(gè)點(diǎn)進(jìn)行開(kāi)發(fā),外包公司需要的是全能型人才,哪里缺哪里補(bǔ)上。在外包公司不需要你技術(shù)多厲害,但需要你會(huì)利用現(xiàn)成的資源以最快的速度完成項(xiàng)目開(kāi)發(fā)。你會(huì)的方面越多,公司需要你的地方也就越多,你得到的也更多。
在技術(shù)型公司,不需要你會(huì)的有多廣,你只需要針對(duì)公司產(chǎn)品的一個(gè)點(diǎn)進(jìn)行深入了解,不斷地進(jìn)行優(yōu)化,這個(gè)點(diǎn)就是你的核心競(jìng)爭(zhēng)力。再由這個(gè)點(diǎn)切入到相關(guān)模塊,技術(shù)深度才是王道。
在業(yè)務(wù)驅(qū)動(dòng)型公司,不能光會(huì)技術(shù),當(dāng)其他開(kāi)發(fā)人員只會(huì)跟老板講技術(shù),而你能將具體技術(shù)落實(shí)到業(yè)務(wù),并且能從業(yè)務(wù)層面反推到技術(shù)實(shí)現(xiàn),老板能不喜歡嗎?但也要記住,技術(shù)是生存之道,別顧此失彼,耍小聰明。
技術(shù)人員的核心競(jìng)爭(zhēng)力終究是技術(shù),但技術(shù)也分廣度、深度、與業(yè)務(wù)結(jié)合的能力,在不同的環(huán)境下,應(yīng)該學(xué)會(huì)取舍。
五、一些中肯建議
1.外包公司能不能去?
在沒(méi)有更好的選擇下,能去,有總比沒(méi)有好。并不是所以的外包公司都是一個(gè)模樣,說(shuō)不定你的leader好,服務(wù)的又是又好又有錢(qián)的甲方,好吃好喝好款待。但大部分的外包還是不咋地,這邊調(diào)查好背景就行。
2.技術(shù)型公司哪里找?
所有開(kāi)源項(xiàng)目背后的公司都是技術(shù)型公司。比如開(kāi)源Kylin的Kyligence,開(kāi)源Dubbo、RocketMQ的阿里、開(kāi)源Flutter的谷歌等等。而像阿里、騰訊這種大公司,每個(gè)BU就是一個(gè)類型的小公司,有些負(fù)責(zé)技術(shù),有些負(fù)責(zé)業(yè)務(wù),有些外包。
3.對(duì)于應(yīng)屆生的選擇?
建議去技術(shù)型公司或者核心技術(shù)部門(mén)。從我的案例就可以看到,技術(shù)型公司對(duì)我一個(gè)整體的塑造幫助最大,可能貫徹職業(yè)生涯。當(dāng)你習(xí)慣了低標(biāo)準(zhǔn)的東西久了,就很難對(duì)高標(biāo)準(zhǔn)產(chǎn)生興趣。
4.我對(duì)于這三種公司的看法?
對(duì)于外包公司來(lái)說(shuō),我覺(jué)得會(huì)缺失「歸屬感」和「認(rèn)同感」,畢竟做的不是自家的產(chǎn)品,還得去客戶現(xiàn)場(chǎng)駐扎,而且對(duì)于外包的技術(shù)也是不太看好。
對(duì)于技術(shù)型公司來(lái)說(shuō),對(duì)于個(gè)人成長(zhǎng)幫助絕對(duì)很大,但在這種公司由于周圍都是level比你高的人,解決的問(wèn)題也都是比較難的,所以無(wú)形中會(huì)有壓力并且會(huì)產(chǎn)生焦慮。
對(duì)于業(yè)務(wù)型公司來(lái)說(shuō),最好是選擇你比較擅長(zhǎng)的并且有相關(guān)工作經(jīng)驗(yàn)的業(yè)務(wù)。我第一段實(shí)習(xí)做的是電商項(xiàng)目,所以我現(xiàn)在的工作也是找的電商,畢竟業(yè)務(wù)邏輯都是相通的,就算之后跳槽,也會(huì)選擇電商行業(yè),畢竟除了技術(shù),行業(yè)知識(shí)也是競(jìng)爭(zhēng)力之一。
選什么類型公司,仁者見(jiàn)仁,可以根據(jù)自己的興趣以及擅長(zhǎng)的地方做選擇。