程序員每天都在修Bug,如何提升自我
作為一個(gè)程序員,我們最經(jīng)常的感覺(jué)就是每天的時(shí)間除了開(kāi)發(fā)需求就是在查bug,每天都過(guò)得很累,但是一年過(guò)去,反而覺(jué)得自己沒(méi)有什么提升。最近有一個(gè)熱門的詞匯,叫做知識(shí)恐慌,特別是程序員,更加恐慌,這個(gè)世界發(fā)展得太快了,技術(shù)的迭代日新月異,很害怕若干年后,就跟不上時(shí)代的腳步,盡管35歲之后可以轉(zhuǎn)行送外賣,但萬(wàn)一到時(shí)候不需要外賣老哥了呢。
在過(guò)去的一年,手里的業(yè)務(wù)經(jīng)歷了快速迭代,有一些業(yè)務(wù)甚至有數(shù)百倍的增長(zhǎng),很多業(yè)務(wù)都出現(xiàn)了不少問(wèn)題,隨之而來(lái)的是各種投訴,每天除了開(kāi)發(fā)開(kāi)發(fā)各種需求,還要處理各種bug。越干越累,惡性循環(huán)。
和大部分公司相似,我們公司是需要開(kāi)發(fā)及時(shí)給客戶反饋的,所以QA會(huì)一直催促你幫用戶看投訴單,畢竟這是他們的KPI,但是查投訴的大多數(shù)情況對(duì)開(kāi)發(fā)其實(shí)是沒(méi)有成長(zhǎng)的,都是機(jī)械性的查日志,修數(shù)據(jù)。那么,如何在這些枯燥無(wú)味地工作中得到成長(zhǎng)呢?一個(gè)很重要的事情,就是做總結(jié)。
投訴大概分為幾類,首先是當(dāng)然是產(chǎn)品邏輯或者是用戶理解的問(wèn)題,有些人可能會(huì)說(shuō)這應(yīng)該是產(chǎn)品經(jīng)理的問(wèn)題,開(kāi)發(fā)只是按照產(chǎn)品的需要去設(shè)計(jì)而已。對(duì)于大部分人來(lái)說(shuō),他們的職業(yè)規(guī)劃當(dāng)然不是做純技術(shù)人員,更多的人,是想做管理,甚至想出去創(chuàng)業(yè)的。那么更要珍惜這些寶貴的機(jī)會(huì),一款產(chǎn)品如何設(shè)計(jì)得更加合理,是你必須考慮的問(wèn)題。當(dāng)然,并不是優(yōu)秀的產(chǎn)品就投訴少,就像每天都有1億人想交張小龍做產(chǎn)品一樣。
第二類的投訴是代碼的bug。有些人很忌諱bug,覺(jué)得這個(gè)就是自己能力不足,其實(shí)是程序就會(huì)有bug。我們應(yīng)該從bug中去進(jìn)一步反思,是設(shè)計(jì)的問(wèn)題,還是開(kāi)發(fā)流程上不規(guī)范造成的。我們還需要對(duì)bug舉一反三,去思考同類型的業(yè)務(wù)是否也有同樣的問(wèn)題,舉一個(gè)例子,最近我們有一個(gè)業(yè)務(wù),需要從數(shù)據(jù)庫(kù)里面讀取大量的臨時(shí)數(shù)據(jù),使用了C++的vector去存儲(chǔ),我們知道,這種不定長(zhǎng)的數(shù)據(jù)結(jié)構(gòu)在申請(qǐng)內(nèi)存的時(shí)候,是會(huì)翻倍申請(qǐng)的,在一些極端數(shù)據(jù)下就會(huì)內(nèi)存不足。我們要反思我們所有的代碼里面是否有類似的情況,不僅是vector,類似stack,hashmap都有這樣的問(wèn)題,我們要一起解決掉。
第三類的投訴往往是性能問(wèn)題,如果你的程序遇到了性能問(wèn)題,那么恭喜你。說(shuō)明你的系統(tǒng)的用戶量到了一定的規(guī)模,系統(tǒng)遇到瓶頸,優(yōu)化他,你會(huì)對(duì)你做的事情有進(jìn)一步的提升。我們?cè)谌粘J褂肁PP的時(shí)候,我們經(jīng)常會(huì)發(fā)現(xiàn)這么一個(gè)事情,很多APP的交互上面都不展示數(shù)據(jù)有多少頁(yè),或者總的數(shù)據(jù)有多少條。這其實(shí)有時(shí)候是一種妥協(xié),因?yàn)榇蟛糠值臄?shù)據(jù)庫(kù),對(duì)處理select count語(yǔ)句都不太友好,性能比較差。最近我們就遇到過(guò)這么一個(gè)例子,在一個(gè)超大的表里面,select語(yǔ)句可以快速的返回,但是select count卻不行。最終排查下來(lái)是因?yàn)樗饕龥](méi)有全覆蓋的問(wèn)題,最后還是要回源到表中掃描數(shù)據(jù),造成效率過(guò)低。
在出現(xiàn)了索引造成的性能問(wèn)題之后,除了優(yōu)化當(dāng)前遇到的系統(tǒng)瓶頸,可以順路地把索引相關(guān)地知識(shí)再進(jìn)一步地進(jìn)行加深跟鞏固,可能以前你對(duì)索引的理解還不夠透徹,再出過(guò)一兩次問(wèn)題之后,再結(jié)合書(shū)本上的知識(shí),一定會(huì)有更深的體會(huì)。
我們常說(shuō),一個(gè)好的程序員不是要解決一個(gè)問(wèn)題,而是解決一類問(wèn)題,那么一類問(wèn)題如何定義,首先要找到這類問(wèn)題的業(yè)務(wù)特點(diǎn)。好的程序員要多總結(jié),為什么先前的代碼設(shè)計(jì)沒(méi)有考慮到這些問(wèn)題?核心的原因是什么,都要考慮清楚。只有做到這一點(diǎn),才可以進(jìn)一步的提升自我,成為某一個(gè)領(lǐng)域的專家。
遇到問(wèn)題其實(shí)不可怕,關(guān)鍵是要想辦法從枯燥重復(fù)的生活中解脫出來(lái),這才是程序員成長(zhǎng)的優(yōu)秀道路。