團(tuán)隊(duì)里的程序員張三豐要離職,領(lǐng)導(dǎo)讓你接手他的工作,叮囑你一定要盡快掌握張三豐的代碼。你的心兒撲通撲通地跳動(dòng),你的腦海里縈繞著三個(gè)選擇:是拒絕呢,還是拒絕呢,還是拒絕呢?你強(qiáng)顏歡笑但實(shí)際上心煩意亂怨氣縱橫——接手別人的代碼,那可是程序員要面對(duì)的最痛苦最可怕的事啊。
你記起江湖前輩黃藥師說(shuō)過(guò)的一句話:如果你恨他,就讓他去接手別人的代碼。
你的內(nèi)心是拒絕的,可是你卻不由自主地說(shuō)出了“可以啊”三個(gè)字,于是你悲催的旅程拉開(kāi)了序幕。
這,就是程序員的工作啊~~~~你有什么辦法……你特別擔(dān)心自己會(huì)被別人的代碼玩兒死,你憂心忡忡卻無(wú)計(jì)可施……真真是此情無(wú)計(jì)可消除,才下眉頭卻上心頭……
我能理解你的感受,因?yàn)檫@樣的事情,我經(jīng)歷了沒(méi)十回也有八回。你不是一個(gè)人在戰(zhàn)斗,想想這個(gè)你也許能得到些安慰,再不行,就看看下面的故事吧。
>> 鐵中棠不堪老代碼的摧殘而離職
下面的故事發(fā)生在我做流媒體產(chǎn)品的時(shí)候。
那一年我招募了一個(gè)有三年工作經(jīng)驗(yàn)的程序員,叫鐵中棠(借用一下古龍《大旗英雄傳》中的主人公的名字)。我讓鐵中棠接管產(chǎn)品代碼里的網(wǎng)絡(luò)傳輸模塊(P2P協(xié)議實(shí)現(xiàn)),我告訴他這個(gè)模塊很重要,公司的視頻點(diǎn)播產(chǎn)品最關(guān)鍵的就是這塊代碼,掌握了這塊代碼,就掌握了軟件的關(guān)鍵。
然后我又告訴鐵中棠,現(xiàn)在的代碼前后有四個(gè)人維護(hù)過(guò),可能有些凌亂,讀起來(lái)有一定難度,如果遇到問(wèn)題,隨時(shí)可以來(lái)問(wèn)我。我還告訴他可以用SourceInsight來(lái)讀代碼,效率比較高。
鐵中棠面色凝重,沒(méi)有說(shuō)什么,只是點(diǎn)了點(diǎn)頭,回到自己的工位,打開(kāi)了Qt Creator,開(kāi)始看代碼了。
一個(gè)星期后,我問(wèn)鐵中棠代碼看得怎么樣,他面露難色,但卻什么困難也沒(méi)說(shuō),只說(shuō)正在看,正在了解。我再次叮囑他,有問(wèn)題隨時(shí)問(wèn)我,因?yàn)槲乙簿S護(hù)過(guò)那塊代碼,對(duì)代碼的邏輯有所了解。
又過(guò)了一個(gè)星期,鐵中棠找到我,猶猶豫豫地說(shuō)覺(jué)得自己不太適合做軟件開(kāi)發(fā),準(zhǔn)備離職。我大驚,難道別人的代碼真的像江湖傳言那樣能夠殺人于無(wú)形嗎?像鐵中棠這樣堅(jiān)毅果決、鐵血無(wú)雙的大英雄、大豪杰居然也會(huì)被代碼殺死?
我問(wèn)鐵中棠是不是覺(jué)得代碼太難懂了,他說(shuō)確實(shí)有點(diǎn)兒難,但也不是因?yàn)榇a難懂就要離職,而是通過(guò)接手別人的代碼讓他意識(shí)到自己其實(shí)不太適合做開(kāi)發(fā),所以決定轉(zhuǎn)行,離開(kāi)軟件開(kāi)發(fā)了。
我心如刀割卻無(wú)話可說(shuō)。
鐵中棠離職后,我又招了一個(gè)剛畢業(yè)的大學(xué)生陽(yáng)頂天,聰明絕頂,意氣風(fēng)發(fā),我打算把P2P協(xié)議這模塊交給他。陽(yáng)頂天看了幾天代碼,說(shuō)現(xiàn)在的代碼雖然有點(diǎn)凌亂有點(diǎn)兒難懂,但自己有把握重構(gòu)好它。我和他討論了重構(gòu)計(jì)劃,他就開(kāi)始重構(gòu)了。
過(guò)了半年,陽(yáng)頂天還在重構(gòu),重構(gòu)的代碼還不能正常和服務(wù)器通信,而且他不看老代碼而是通過(guò)抓取并分析老程序的網(wǎng)絡(luò)報(bào)文來(lái)琢磨怎么寫新代碼!于是我和他進(jìn)行了一次艱難的談話,結(jié)果差點(diǎn)兒吵起來(lái)。再后來(lái),陽(yáng)頂天離開(kāi)了公司,出國(guó)了……
>> 怎樣才能不被玩兒死
卡夫卡說(shuō):一切障礙都可以粉碎我。這話如果從鐵中棠口中說(shuō)出來(lái),就是:任何代碼都可以玩兒死我。
你估計(jì)不愿意像鐵中棠那樣被別人的代碼玩兒死。So,假如你真的要接手別人的代碼,怎樣才能不被玩兒死呢?
雖然你可能會(huì)說(shuō),聽(tīng)了很多道理,依然交接不好代碼,可作為經(jīng)常被別人的代碼玩兒的欲仙欲死的老司機(jī),我有些話如鯁在喉,不吐不快。
當(dāng)你被要求接管要離職的程序員的代碼時(shí),如果能注意以下幾點(diǎn),就有可能活著從他的代碼里爬出來(lái),而那些不能將你擊潰的代碼,都將成為你成長(zhǎng)的墊腳石。南寧網(wǎng)站開(kāi)發(fā)
1. 產(chǎn)品需求與業(yè)務(wù)流程文檔
產(chǎn)品需求與業(yè)務(wù)流程文檔,這些是你先要找到的,你接手的代碼,必然和某個(gè)產(chǎn)品需求相對(duì)應(yīng),必然實(shí)現(xiàn)了某個(gè)業(yè)務(wù)流程,先了解產(chǎn)品需求和業(yè)務(wù)流程,才能更好的讀代碼。
假如你的團(tuán)隊(duì)就是沒(méi)文檔,Ok,也可以要求離職或轉(zhuǎn)移戰(zhàn)線的這位程序員把需求描述出來(lái),把業(yè)務(wù)流程畫出來(lái)。
2. 測(cè)試環(huán)境
了解了產(chǎn)品需求和業(yè)務(wù)流程,最好能體驗(yàn)一下軟件,從用戶的角度來(lái)理解軟件的使用。這個(gè)時(shí)候你要么需要生產(chǎn)環(huán)境,要么需要測(cè)試環(huán)境。哪個(gè)環(huán)境不重要,重要的是,你需要一個(gè)能Run,能體驗(yàn)的軟件。
3. 業(yè)務(wù)流程在代碼層面的體現(xiàn)
負(fù)責(zé)交接代碼給你的那位同事,要么在辦離職,要么已經(jīng)介入了其他產(chǎn)品,眼下很可能已無(wú)心戀戰(zhàn),但你心里要清楚,只有他才能提供代碼層面的東西,比如
類圖
模塊劃分說(shuō)明
數(shù)據(jù)流圖
時(shí)序圖
狀態(tài)圖
所以,你需要他整理一些文檔和圖表出來(lái)。你可以告訴領(lǐng)導(dǎo)你需要上面的東西,讓領(lǐng)導(dǎo)和他溝通,讓他在離開(kāi)之前準(zhǔn)備好這些文檔給你,并留一些時(shí)間以便你熟悉。
4. 讀代碼,不死不休
有了產(chǎn)品需求,有了業(yè)務(wù)流程,有了代碼設(shè)計(jì)相關(guān)的文檔和圖表,接下來(lái)你就該死磕代碼了:
5. 開(kāi)發(fā)環(huán)境與調(diào)試
有的產(chǎn)品需要比較復(fù)雜的開(kāi)發(fā)環(huán)境配置,一定要提前做好,讓即將離開(kāi)的同事輔導(dǎo)你搭建好開(kāi)發(fā)環(huán)境,這樣你就可以利用“調(diào)試”這個(gè)強(qiáng)大的武器來(lái)快速理解代碼了。
6. 調(diào)試
調(diào)試是接手別人代碼時(shí)的利器,如果你看不明白一個(gè)業(yè)務(wù)在代碼層面是怎么體現(xiàn)的,也看不懂代碼之間的調(diào)用關(guān)系,那最好的辦法就是調(diào)試。從一個(gè)業(yè)務(wù)的起點(diǎn)所對(duì)應(yīng)的代碼開(kāi)始調(diào)試,一步一步跟進(jìn)去,就能快速理清函數(shù)調(diào)用鏈。
7. 樹(shù)立可實(shí)現(xiàn)可衡量的目標(biāo)
程序員的工作交接,尤其是代碼交接,怎樣才算順利完成呢?
這簡(jiǎn)直就是一個(gè)謎!
沒(méi)人說(shuō)得清楚。南寧網(wǎng)站建設(shè)
所以,你最好給自己梳理一些可衡量的、可實(shí)現(xiàn)的目標(biāo)。比如讀懂A、B、C三個(gè)業(yè)務(wù)流程……
最好,找一個(gè)Bug或者一個(gè)新增的功能,帶著目的去讀代碼、修改代碼,有目的,有目標(biāo),有時(shí)間盒,就容易投入,容易讀進(jìn)去,容易掌握與Bug或新增功能相關(guān)的代碼的邏輯與流程。
8. 輸出、分享與重構(gòu)
你在讀代碼時(shí),如果能撇開(kāi)給你交接工作的程序員提供的文檔,按自己的理解,自己繪制類圖、數(shù)據(jù)流圖、時(shí)序圖、關(guān)鍵業(yè)務(wù)流程對(duì)應(yīng)的函數(shù)調(diào)用關(guān)系鏈等,就能更快的掌握別人的代碼。
如果你還能將你理解到的東西,講給其他人聽(tīng),并且講明白,那Ok,你真的理解了別人交接給你的代碼。
再進(jìn)一步,如果你在理解現(xiàn)有代碼的基礎(chǔ)上,可以識(shí)別出哪些部分實(shí)現(xiàn)得邏輯不清晰或有待改善,然后可以結(jié)合業(yè)務(wù)與自己的理解將其重構(gòu),那就真的是完全接手了別人的代碼,別人的代碼與你的代碼就沒(méi)有差別了,它們終將成為你的代碼。
>> 最重要的事兒
如果你總是看見(jiàn)代碼多就發(fā)愁,看見(jiàn)代碼臟亂差就詛咒埋怨,看見(jiàn)代碼邏輯復(fù)雜就頭疼,搞不清調(diào)用關(guān)系就放棄,那你可能永遠(yuǎn)也變不成代碼的主人,只能一次又一次被代碼蹂躪。
所以,其實(shí)交接代碼最重要的事兒,就是:
不要被浩渺如煙并且陌生怪誕的代碼嚇得不敢動(dòng)彈,現(xiàn)在就開(kāi)始讀,立刻,馬上,堅(jiān)持十分鐘,再堅(jiān)持十分鐘,你就能妙悟真諦。