火絨正在保護(hù)您的電腦,已保護(hù)365天
去年的11月1號(hào)進(jìn)入這家公司,到現(xiàn)在已經(jīng)整整一年了,也從一個(gè)到處闖禍的實(shí)習(xí)生成長到可以獨(dú)立負(fù)責(zé)一些任務(wù)的新手了,如果要對過去一年做個(gè)評(píng)價(jià)的話,
not bad
沒有什么比困難更能考驗(yàn)一個(gè)人,過去的一年里,做過的比較困難的任務(wù),有三個(gè)
第二個(gè)月,第一次獨(dú)立負(fù)責(zé)
現(xiàn)在回想起來,也是噩夢般的經(jīng)歷,我大概做了這些
-
elastic search
,之前只是聽說過這個(gè)框架但是完全不知道是做什么用的,項(xiàng)目結(jié)束之后已經(jīng)靈活使用了(之后又研究了一些高級(jí)特性,比如function score) -
redis
也是第一次使用,當(dāng)時(shí)沒有引入基于redis的分布式鎖框架,就用setnx來做加鎖,項(xiàng)目完成后特地找了點(diǎn)資料研究了一下,對它內(nèi)部的實(shí)現(xiàn)也有了點(diǎn)了解(redis的實(shí)現(xiàn)真的是就算只是一個(gè)bit都要想辦法去優(yōu)化) -
protobuf
同樣第一次使用,剛開始很害怕,寫了一個(gè)之后才明白并不復(fù)雜(至少使用的時(shí)候不復(fù)雜) -
多線程設(shè)計(jì)
當(dāng)時(shí)要做的東西類似于在線ktv,有一個(gè)待唱列表,每個(gè)人都能操作,主持人有更高級(jí)的權(quán)限.對于當(dāng)時(shí)的我來說,挑戰(zhàn)很大,多虧大佬們的講解.自己也是一點(diǎn)一點(diǎn)領(lǐng)悟修改,寫出了一版不完美但是能跑.想一下當(dāng)時(shí)自己傻傻的埋頭苦寫不知道去問,還讓大佬們主動(dòng)來指點(diǎn)我,真是羞愧萬分 -
接口設(shè)計(jì)
接口需要哪些參數(shù)? 有些數(shù)據(jù)是不是后端自己就能獲取? 前端傳遞的數(shù)據(jù)是否可信? 如果要返回的數(shù)據(jù),有一部分是邏輯相關(guān)的,是不是要把他們封裝到一起? 對敏感數(shù)據(jù)用get還是post? 這些是我那段時(shí)間學(xué)到的,這塊是前端大佬們一點(diǎn)一點(diǎn)把我教會(huì)了,十分感激.
最后在兩周延期后有驚無險(xiǎn)的上線了,這次做的并不好,之后一次還坑了大佬一次,唉,羞愧.
之后也想過重構(gòu),忙了七八天,大佬給的評(píng)價(jià)是"你這是重寫,不是重構(gòu)", 為此特地找了幾本重構(gòu)相關(guān)的書,最后意識(shí)到我那確實(shí)是重寫了,哈哈
第六-七個(gè)月,負(fù)責(zé)獨(dú)立的模塊
這次是做兩個(gè)模塊,好友聊天和隨機(jī)匹配,匹配之前老項(xiàng)目里有類似的,自我感覺難度不是很大
允許抄,但是要根據(jù)自身場景做變化,不能死搬硬套
當(dāng)時(shí)我就是死搬硬套,也沒去思考下兩邊有沒有什么區(qū)別,被leader狠狠的批了一頓,這次是真的活該哈哈哈,下去之后仔細(xì)研究了一下修改之后確實(shí)看著更自然也更好做了技術(shù)是為業(yè)務(wù)服務(wù)的,寫的再好效率再高,不能滿足業(yè)務(wù)也是白搭
寫匹配的時(shí)候,考慮過多個(gè)方案,有幾個(gè)可以說是為了效率不顧一切吧哈哈,每次都被斃掉,最后leader說了一些話,大致意思就是上面這些,也就是從那時(shí)候開始自己才真正有這個(gè)意識(shí),做設(shè)計(jì)的時(shí)候也會(huì)仔細(xì)思考一下這塊代碼中要考慮到極端情況
"如果redis掛掉一段時(shí)間你這塊會(huì)怎么處理?","那就掛掉嘍".嗯,不出意外又被diss了.第一次聽說要考慮基礎(chǔ)服務(wù)掛掉代碼如何繼續(xù)運(yùn)行時(shí),我的第一反應(yīng)是基礎(chǔ)服務(wù)都掛掉了,那就都掛了唄,后面自己仔細(xì)想想才體會(huì)到它的真正含義,基礎(chǔ)服務(wù)掛掉并沒有想象的那么罕見,如果是核心邏輯,確實(shí)要考慮到這些情況.不要過早優(yōu)化
當(dāng)時(shí)剛剛看了幾本代碼優(yōu)化方面的書籍,迫不及待的試試手(這些書上是提了不要過早優(yōu)化的),寫完之后才意識(shí)到有些優(yōu)化確實(shí)做得太早了,徒勞無功.
在整體邏輯尚未成型時(shí)所做的優(yōu)化,一般來說時(shí)負(fù)優(yōu)化.前期整體結(jié)構(gòu)還不固定,業(yè)務(wù)隨時(shí)可能變動(dòng),現(xiàn)有的邏輯也不一定正確,在這種基礎(chǔ)上做的優(yōu)化往往是徒勞無功.后面改起來反而更麻煩.但是并不是說不做優(yōu)化
,通用邏輯封裝這些還是可以做的要嘗試?yán)斫庥脩?從用戶的角度去做業(yè)務(wù)
做到好友聊天這塊時(shí),有這個(gè)場景,用戶選擇掛斷,這里可能有并發(fā)問題,可能另外一個(gè)用戶提前點(diǎn)擊了結(jié)束,那么請問這個(gè)操作能報(bào)錯(cuò)嗎?當(dāng)然不能
,從用戶的角度看,我不想聊了,想結(jié)束都結(jié)束不了? 這是不能接受的.
最后附上leader當(dāng)時(shí)說的幾句話,個(gè)人認(rèn)為很有意義,如果業(yè)務(wù)出現(xiàn)了異常情況,按照解決方式從好到壞排列分為 1. 后端能解決 2. 用戶能解決 3. 卡死
一年,開發(fā)核心邏輯
要做一個(gè)游戲,開發(fā)時(shí)間一周.時(shí)間很緊,游戲的主流程是我做來做的,很累.萬幸的是按時(shí)完成了.
-
不要固執(zhí)己見,要聽取別人的意見
因?yàn)橹安涣私庥螒蚪巧漠?dāng)前血量設(shè)計(jì),加上時(shí)間緊(只能說是當(dāng)時(shí)的托詞),沒有聽取前端同事的意見,做到后面果不其然出了問題,最終還是改成了他提的那種設(shè)計(jì),這次教訓(xùn)很慘重,大概浪費(fèi)了半天時(shí)間,如果當(dāng)時(shí)能夠仔細(xì)的詢問一下,思考一下,可能節(jié)省出更多時(shí)間,做一些其他地方的優(yōu)化.(這里大概也有些溝通方面的問題吧,與君共勉) -
不能容忍重復(fù)代碼,要懂得抽離通用邏輯,分離變化與不變
這點(diǎn)是這次自己做的比較好的,還是上面的血量設(shè)計(jì),一共改了兩次設(shè)計(jì),得益于前期封裝的很好,每次更改設(shè)計(jì)改動(dòng)的代碼不超過100行.想一下如果當(dāng)時(shí)偷懶沒做封裝,業(yè)務(wù)邏輯又這么復(fù)雜,肯定不能按時(shí)上線了 -
寫代碼糾結(jié)是好事
有這個(gè)場景,要把map中所有的值自增,為了這個(gè)糾結(jié)了半個(gè)小時(shí)寫了一個(gè)性能和可讀性都還行的設(shè)計(jì),時(shí)間是很緊,但這不是理由,作為一個(gè)程序員,如果沒有對優(yōu)雅代碼的追求,那和咸魚有什么兩樣
-
對于核心流程要考慮要任何可能的情況
參見上面的代碼中要考慮到極端情況
,有一個(gè)場景,玩家死亡時(shí)會(huì)可能會(huì)掉落一些物品,如果氪金了就不會(huì)掉了,因?yàn)榍岸艘@示,所以在死亡時(shí)就要計(jì)算好會(huì)掉什么,如果玩家確認(rèn)重生了才會(huì)扣除(氪金當(dāng)然就不扣了),可能掉落的物品肯定用redis來存了,當(dāng)時(shí)就考慮到如果用戶死亡后,確認(rèn)放棄前.發(fā)生了一些異常情況導(dǎo)致扣除失敗,這種情況是不能報(bào)錯(cuò)的,如果報(bào)錯(cuò)用戶就無法繼續(xù)游戲了,這個(gè)情況是不能接受的,所以對這塊做了處理,不管能不能扣除成功都確保用戶可以重生.之后查看線上日志發(fā)現(xiàn)確實(shí)派上用場了,這點(diǎn)算是這次比較得意的設(shè)計(jì)了,嘻嘻.
這一年我學(xué)到了什么
1. 一定一定一定要跟產(chǎn)品確認(rèn)所有不確定的細(xì)節(jié)
這里不是黑產(chǎn)品,產(chǎn)品想做的和程序員想出來的很可能有很大偏差,如果不做確認(rèn)和可能出現(xiàn)以下兩種情況
- 本來很簡單的東西程序理解的太復(fù)雜,導(dǎo)致做了很多無用功
- 本來很復(fù)雜的東西程序理解的太簡單,導(dǎo)致代碼不可能,最壞的情況就是重寫
另外程序主動(dòng)跟產(chǎn)品確認(rèn)需求還有一個(gè)最大的優(yōu)點(diǎn),對于這個(gè)需求,程序已經(jīng)有自己的理解,并很可能有初步的實(shí)現(xiàn)方案了,而產(chǎn)品可能還不確定自己想做什么,這樣就很有可能將一個(gè)很復(fù)雜的需求簡化
2. 學(xué)習(xí)一項(xiàng)新技術(shù)時(shí),沒有什么是比官方文檔更可靠地
花的時(shí)間去鉆研官方文檔,比漫無目的的看博客好很多.
3. 要懂得請教別人,個(gè)人的思維是有局限的,別人往往能發(fā)現(xiàn)自己的邏輯漏洞
舉個(gè)例子,對于一個(gè)需求,自己想了一下有了大概的設(shè)計(jì),覺得是可行的, 這個(gè)時(shí)候請教一下同事,將自己的設(shè)計(jì)復(fù)述一下,如果對方能理解并且沒有發(fā)現(xiàn)問題,那這個(gè)設(shè)計(jì)就不會(huì)有大的紕漏.可以說是起到及時(shí)止損的作用.(PS.請教時(shí)一定要有禮貌和足夠的尊重,大家都很忙,沒人有義務(wù)去幫你的)
4. 做業(yè)務(wù)時(shí)可以'拿來主義',但是事后要去研究一下
如果一直都是拿來主義,不去自己死磕研究一下,技術(shù)不會(huì)有任何進(jìn)步,就真的變成了日常搬磚了
5. 終身學(xué)習(xí)真的不只是說說,要抽出時(shí)間來學(xué)習(xí)新知識(shí)
工作時(shí)間越長越能感覺到自己的不足,各個(gè)方面的知識(shí)都欠缺的很多,要每天抽出些時(shí)間去讀,去學(xué),去使用.業(yè)務(wù)是做不完的,如何抽時(shí)間就見仁見智了.
6. 運(yùn)動(dòng)! 運(yùn)動(dòng)! 運(yùn)動(dòng)!
每天運(yùn)動(dòng)一下,保證三天至少跑步一次. 運(yùn)動(dòng)很重要,并不只是因?yàn)榻】?運(yùn)動(dòng)可以極大的緩解壓力,補(bǔ)充意志力.每天不用動(dòng)的話,心態(tài)真的會(huì)爆炸的.
7. 要明白自己真正想要什么要對未來保持憧憬
搞技術(shù)是枯燥的,就算對技術(shù)再癡迷,也是會(huì)有困倦的時(shí)候,這時(shí)候你需要明白自己真正想要什么,它一定是和技術(shù)無關(guān),而是和人生相關(guān)的.如果不是想到她,我可能真的無法堅(jiān)持下來.
結(jié)語
終于把這篇總結(jié)寫完了,也算是給自己一個(gè)交代,與諸君共勉.