作者 | 趙裕
悟已往之不諫,知來者之可追。
從初入職場到現(xiàn)在,已經(jīng)兩年有余,看起來還是前途有限、后患無窮。寫罷此文,聊以自慰,勉過往而勵將來。
長久以來,我一直在思考兩件事情:怎么把過往的經(jīng)歷抽象成可復(fù)用的經(jīng)驗,以及怎么把已有的經(jīng)驗應(yīng)用于將面臨的問題。
本文算是對過去兩年初入職場的一個總結(jié)吧,由于自己身處一個業(yè)務(wù)驅(qū)動的部門,所以“如何在業(yè)務(wù)開發(fā)中實現(xiàn)自我成長”就是過去一段時間最重要的縮影了??赡芸磫栴}還不夠深刻,立意還不夠高遠,但是留下一份快照總是好的。
一、深刻理解業(yè)務(wù)開發(fā)的特點
對于沒有進入這個行業(yè)的人來說,技術(shù)人員的工作可能就是每天坐在電腦前敲代碼,但是對于每個業(yè)務(wù)向的開發(fā)來說,可能每天花在代碼上的時間并不多,大量的時間被瑣碎地分割了,于是我開始反思,必須要認識到業(yè)務(wù)開發(fā)的特點,才能高效地生存在這種環(huán)境中。
1. 兼顧協(xié)作與閉環(huán)
首先說協(xié)作,在真正進入工作之前,我們大部分時候都是在一個人寫代碼(比如刷算法題),但是在實際的業(yè)務(wù)開發(fā)中:我們的代碼往往是為了實現(xiàn)產(chǎn)品/運營的需求,要與客戶端/后臺交互,并由測試同學(xué)進行驗證。這種改變帶來的一個重要認知就是要從不同角色的角度去思考問題,如此才能順暢協(xié)作:
- 產(chǎn)品:重點應(yīng)該是預(yù)期的效果、上線的時間、核心數(shù)據(jù)指標(biāo)等最終輸出物
- 后臺:重點應(yīng)該是協(xié)議的制定、方案的設(shè)計(擴展、復(fù)用、性能等)
- 測試:重點應(yīng)該是用例的設(shè)計、Bug信息的描述(是否必現(xiàn)、設(shè)備信息、日志、錄屏等)
總而言之,一定要跳出自己的技術(shù)棧,站在別人的角度,才能高效協(xié)作。再說閉環(huán)(以客戶端為例),在工作的第一年,我會發(fā)現(xiàn)自己的聯(lián)調(diào)效率很低,比如一個UI上有一個倒計時組件,后臺下發(fā)了一個時間戳是昨天的,我的邏輯顯示的是00:00:00?,而產(chǎn)品預(yù)期可能是已結(jié)束。
后來我就開始意識到客戶端自測的重要性,通過制造假數(shù)據(jù)把所有的邊界問題(如倒計時時間戳遠小于或者遠大于當(dāng)前時間、文案過長、圖片比例不符合預(yù)期等)都自檢,這樣就可以在開發(fā)階段,把一些產(chǎn)品遺漏的邏輯都覆蓋到,大大降低了聯(lián)調(diào)后返工的風(fēng)險。
2. 復(fù)用而非創(chuàng)造
業(yè)務(wù)開發(fā)有一個特點是大部分功能都不是需要從0開始的,往往在項目代碼已經(jīng)有過類似的實現(xiàn),復(fù)用并不僅僅是寫一個方法,以供反復(fù)調(diào)用,方案、策略同樣可以復(fù)用。
所以有一條很重要的經(jīng)驗就是需求確定后、啟動前一定要召集相關(guān)人員評估方案,我自己就曾踩過這種坑:選擇了一個行業(yè)通用的方案,最后要合流的時候卻發(fā)現(xiàn)有更好的做法,不想違背原則(寫爛代碼)只好臨時加班。
所以后來,每每有比較龐大或者自己沒有十足把握的需求時,都會定位到相關(guān)開發(fā),咨詢清楚相關(guān)背景再敲定方案,雖然啟動時間變長了,但保證了合流的代碼質(zhì)量和上線后的效果。簡單來說,提前評估方案可以避免重復(fù)工作、降低返工風(fēng)險、降低事故概率。
3. 嘗試了解業(yè)務(wù)全景
大家常常會自嘲為一顆螺絲釘,大部分時候也確實如此,但這并不妨礙我們?nèi)ヌ鲂枨?、跳出技術(shù)棧,一窺業(yè)務(wù)的全景。比如自己一開始來應(yīng)用寶實習(xí),感覺這個App就是一個下載應(yīng)用的(大部分人的認知),但這只是一個客戶端視角。
如果站在后臺視角,應(yīng)用寶是一個App的分發(fā)平臺;如果站在商業(yè)化團隊的視角,應(yīng)用寶的首頁、搜索頁等可以帶來廣告收入,游戲的分發(fā)可帶來收入分成;還有內(nèi)容化、游戲運營以及和灰產(chǎn)的對抗等等。哪怕只是淺層的了解,多了一些視角,做業(yè)務(wù)、評需求的時候就會多一些維度的思考。
除了業(yè)務(wù)的全景,還有流程的全景,業(yè)務(wù)開發(fā)如果定義為完成一個功能就太狹隘了,自己目前體會到的流程如下:
- 評審:通過產(chǎn)品詳細了解需求的背景、目標(biāo)、價值等
- 方案:具體問題具體分析,但一定要在開發(fā)之前
- 開發(fā):完成自己的邏輯,做好各種邊界測試、異常測試
- 聯(lián)調(diào):自測完備,聯(lián)調(diào)就輕松
- 測試:重點是除了問題能快速定位(制定好日志、調(diào)試工具等)
- 灰度:
- 上線:上線不是終點,涉及統(tǒng)計/結(jié)算的需求一定要持續(xù)關(guān)注,避免背鍋;不管是版本發(fā)布還是動態(tài)發(fā)布都要觀察Crash等技術(shù)質(zhì)量指標(biāo)(本來應(yīng)該流程約束的,自己也要有這種習(xí)慣)
二、發(fā)現(xiàn)問題并解決優(yōu)化
個人感受頗深的是:無論是初入職場還是工作三五年,都會有一些自己的習(xí)慣或者說局限性,有時候甚至自己都沒有覺察。
1. 個人開發(fā)習(xí)慣
開發(fā)習(xí)慣養(yǎng)成的兩個核心是:發(fā)現(xiàn)重復(fù)工作并自動化+通過加深理解尋找最佳實踐。這里舉一些自己經(jīng)歷過的例子:維護別名集合。
比如我會把自己常用的命令都封裝成別名:
# 查看當(dāng)前Activity
alias v_adb_current_activity="adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'"
# 查看Activity堆棧
alias v_adb_activity_stack="adb shell dumpsys activity activities | sed -En -e '/Stack #/p' -e '/Running activities/,/Run #0/p'"
# 觸發(fā)一個uri
alias v_adb_deeplink="adb shell am start -a android.intent.action.VIEW -d"
# 錄屏/截屏
alias v_adb_screen_record="adb shell screenrecord //mnt/sdcard/demo.mp4"
alias v_adb_pull_record="adb pull //mnt/sdcard/demo.mp4"
alias v_adb_screen_cap="adb shell /system/bin/screencap -p /sdcard/screenshot.png && adb pull /sdcard/screenshot.png"
其實大牛們就是這么做的,比如oh-my-zsh就提供了很多有用的別名,常用的git命令別名有:
gup -> git pull --rebase
gcmsg -> git commit -m
gst -> git status
等,完整版見:https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet
另外就是自動化一些工作,比如之前經(jīng)常要做一個zip包發(fā)布,每次都需要先把xml文件里面對lua文件引用修改成對out文件(lua文件編譯后的二進制文件)的引用,手工操作繁瑣且容易出錯,后來做成自動化腳本后頗受好評。
除此之外,對于常用工具也應(yīng)該系統(tǒng)學(xué)習(xí),比如Git、Proguard、Gradle的官方文檔,自己接觸過的幾個項目,混淆腳本和構(gòu)建腳本寫的都比較混亂,本質(zhì)原因就是并非每個開發(fā)都能夠標(biāo)準(zhǔn)地使用這些工具。
比如有一段時間,我發(fā)現(xiàn)有人會把DEBUG=true?提交到倉庫,又或者把一些很劣質(zhì)的代碼帶上去,分析之后發(fā)現(xiàn)他們每次git commit?的粒度都很粗,導(dǎo)致提交前無法用git diff?自己檢查,其實完全可以把一次大修改拆分成多次commit?,在合主干之前確認無誤再合并自己分支的commit記錄,既可以保持提交記錄整潔,又可以在合流前的頻繁修改階段詳細記錄每次修改的原因,可惜很多人對Git的理解并不足以進行這種嘗試。
2. 業(yè)務(wù)研發(fā)流程
對于具體業(yè)務(wù)要具體分析,但都應(yīng)該做到以下幾點:
- 對于核心業(yè)務(wù)要主動輸出文檔,不僅為他人方便,也可以節(jié)省為別人答疑的時間
- 對流程化的東西做好記錄,比如常用的發(fā)布地址、容易忘記的配置項的含義(比如我們動態(tài)化頁面的發(fā)布系統(tǒng)里面,灰度時要選定版本號、版本名、Build號、QUA等字段,很多字段相似難以區(qū)分,最好記錄下來具體含義)
- 解決問題而不是達成任務(wù)。比如一開始的時候,不同的后臺/產(chǎn)品在提供UI元素的協(xié)議字段的時候會有很多差異(比如應(yīng)用名字段有的叫app_name?,有的叫app_title),如果是達成任務(wù),你可以照搬提供的字段;如果解決問題,你就會綜合歷史因素、合理性等制定一個規(guī)范,類似代碼的變量命名規(guī)范。
三、堅持沉淀復(fù)盤輸出
簡單來說,沉淀、復(fù)盤是認知層面的,輸出(分享、寫作)是實踐層面的,前者是必不可少,后者是錦上添花。但把沉淀復(fù)盤的東西以語言文字的方式輸出,我認為有3個不可替代的好處:
- 更加深刻:如果沉淀翻盤僅僅停留在思考層面,往往是碎片的、狹隘的,輸出可以接受他人的反饋(贊許或是挑戰(zhàn)),有更加全面的思考。
- 更加容易感知:思考是虛無且抽象的,輸出一篇文章、做一次分享是更加容易度量的目標(biāo),也更容易讓自己感知到思考的收獲。
- 更加有價值:沉淀復(fù)盤是個人成長,也是知識積累,輸出給大家不僅可以持久化,還可以塑造長久的個人影響力。
無論是業(yè)務(wù)開發(fā)還是基礎(chǔ)架構(gòu),我相信沉淀復(fù)盤都是可以最大化自身收益的,同時也能造福他人。在工作中,寫過的文章/文檔,都會冥冥中造福他人、宣傳自己:
案例一:
案例二:
四、培養(yǎng)代碼之外的能力
作為一個業(yè)務(wù)開發(fā),代碼之外的能力同樣重要,這些能力實在太多了,我自己也一直在學(xué)習(xí),下面分享一二。
1. 溝通協(xié)作
個人認為所謂的話術(shù)、措辭都只是溝通協(xié)作的“表面功夫”,高效溝通協(xié)作的本質(zhì)在于:從全局出發(fā),綜合各方訴求,去解決問題,實現(xiàn)總體最優(yōu)。
如果只考慮自身利益,工作往往最后變成了零和博弈,總有人會不爽(產(chǎn)品怪開發(fā)Delay、開發(fā)怪測試adb都用不熟練......等等)。我導(dǎo)師給我分享的一個技巧讓我印象非常深刻:遇到自己不能解決的問題不要直接拒絕產(chǎn)品,應(yīng)該把問題向上升級,周知到自己的導(dǎo)師/leader。因為拒絕解決不了這個問題本身!
明白了這個問題,工作中很多事情都會有了新的角度。比如產(chǎn)品的需求單里面經(jīng)常對UI元素的命名不標(biāo)準(zhǔn),你就不會去吐槽,而是會去制定規(guī)范、進行引導(dǎo);測試描述Bug不夠清楚,你就不會去抱怨,而是發(fā)現(xiàn)可以用adb connect + Vysor實現(xiàn)遠程調(diào)試,完全接管測試機。
2. 時間管理
長久以來,困擾我的一個問題就是時間管理,尤其是做業(yè)務(wù)開發(fā)的時候,你要和不同工種打交道:需求要和產(chǎn)品對、UI要和設(shè)計對、聯(lián)調(diào)要和后臺對、驗證要和測試對,再加上各種會議,一天有一大半的時間要依賴別人。時間管理真是一個太宏大的話題了,后面打算單獨一篇來講,這里先跳過。
(相關(guān)書籍截圖)
3. 情緒控制
這可能是我做的比較差的一點了,還被我的導(dǎo)師委婉地指出過。以至于有一次我聽說,某個曾經(jīng)合作過的產(chǎn)品說我算是開發(fā)里面脾氣好的,我就很驚訝,后來想想應(yīng)該是當(dāng)時和我合作的后臺更加暴躁吧。
雖然只暴躁過幾次(要么是出了些小問題沒忍住當(dāng)面吐槽、要么是過于生硬地拒絕),但每次都很后悔(畢竟都是打工的,也不想給別人帶來不愉快),后來想了想這個問題的本質(zhì),大概是兩個因素疊加的效果:情緒控制差+風(fēng)險控制差。脾氣好的人不會暴躁,能把工作處理得井井有條的人也不會。
要走出這種困境,除了磨練心性,就是要提供工作技巧,比如前面提到的問題升級、時間管理等。暴躁的本質(zhì)還是無能狂怒。
五、與自己的焦慮共處
長久以來,我能感受到業(yè)務(wù)開發(fā)對自己的一些影響,可能每個開發(fā)都會有一些焦慮:
- 沒有多余的精力學(xué)習(xí)新的技術(shù)
- 工作過于重復(fù),缺乏不可替代性
- 業(yè)務(wù)驅(qū)動,缺乏深度,沒有干貨
- 等等
個人認為,首先可以明確自己的本心,如果實在不能接受業(yè)務(wù)驅(qū)動的開發(fā)就應(yīng)該換個方向,但真正的純技術(shù)崗又有多少呢?技術(shù)的直接作用本就是創(chuàng)造價值。
如果選擇了業(yè)務(wù)開發(fā),就應(yīng)該既來之則安之,發(fā)現(xiàn)業(yè)務(wù)開發(fā)中可優(yōu)化的點,去解決而非抱怨,通過沉淀復(fù)盤輸出建立影響力,甚至可以提供自己的解決方案,進而變成一個不可替代的人、有干貨的人。
六、結(jié)語
工作的一個比較好的狀態(tài)應(yīng)該是:個人成長進步與業(yè)務(wù)價值交付的有機統(tǒng)一、相輔相成。本文是對過去兩年的一個總結(jié),可惜很多事情都沒做好記錄,記憶總是零散而殘缺的,而且局限于技術(shù)棧和業(yè)務(wù)領(lǐng)域,難免有局限性,但希望能引發(fā)一些有價值的思考。
本文中有很多自己的主觀看法,但環(huán)境和心態(tài)總是在不斷變化的,因此,引用列寧在《共產(chǎn)主義》中的話作為結(jié)尾:
他忽略了馬克思主義的精髓,馬克思主義活的靈魂:對具體情況作具體分析。