深夜生產(chǎn)事故,人工多線程來(lái)救場(chǎng)!
有一個(gè)讀者問(wèn)我:你認(rèn)為一個(gè)程序員具備什么樣的能力,才算得上是厲害的程序員?
我答:擁有解決問(wèn)題的能力的程序員。
這個(gè)回答貌似有點(diǎn)抽象,不要緊看下面的文章你會(huì)慢慢有所了解。
一、解決問(wèn)題的能力
很多年前,當(dāng)我還是一個(gè)小菜鳥(niǎo)的時(shí)候,我的領(lǐng)導(dǎo)經(jīng)常告訴我,解決問(wèn)題的時(shí)候,不要局限于技術(shù)本身,并且形象的給我舉了一個(gè)例子。
有一次兩個(gè)程序員一直討論,如何判斷兩臺(tái)服務(wù)器之間是否網(wǎng)絡(luò)正常,爭(zhēng)爭(zhēng)吵吵了很久。旁邊的一個(gè)測(cè)試說(shuō),Ping 一下不就知道了嗎?就這樣他們用 Java 代碼實(shí)現(xiàn)了 Ping 操作解決了這個(gè)問(wèn)題。
多年以后,雖然我知道有更優(yōu)雅的方式來(lái)解決這個(gè)問(wèn)題,但是我仍然覺(jué)得之前的那個(gè)測(cè)試人員很聰明。后面我們持續(xù)打過(guò)一年交道,她能力真的很強(qiáng),在小公司相當(dāng)于產(chǎn)品經(jīng)理+測(cè)試的職能。
需要給大家說(shuō)明的是:解決問(wèn)題的能力和技術(shù)能力是兩個(gè)能力區(qū)間,我見(jiàn)過(guò)很多程序員源碼玩得一溜,生產(chǎn)出現(xiàn)問(wèn)題的時(shí)候仍然不知道如何去解決問(wèn)題。
生產(chǎn)出現(xiàn)問(wèn)題的時(shí)候,是考驗(yàn)一個(gè)程序員的最高水準(zhǔn),在面對(duì)高強(qiáng)度高壓力下,動(dòng)作不變形,能夠冷靜思考、分析、解決問(wèn)題,能達(dá)到這個(gè)水平的程序員,這在古代可以拜為上將軍。
我一直非常喜歡能夠快速解決問(wèn)題的程序員,我也樂(lè)于在各種生產(chǎn)出現(xiàn)問(wèn)題的時(shí)候,第一時(shí)間去研究去分析。說(shuō)一句不厚道的話,好程序員都是在解決問(wèn)題中鍛煉出來(lái)的,特別是生產(chǎn)環(huán)境出現(xiàn)問(wèn)題時(shí),能夠站出來(lái)的程序員。
二、給大家分享一個(gè)深夜技術(shù)故事
01. 老平臺(tái)和新平臺(tái)
公司有一個(gè)老系統(tǒng),一個(gè)新系統(tǒng)。
老系統(tǒng)使用了很多年,早已經(jīng)超出了它能支持的極限,最早在2013年上線這套系統(tǒng)的時(shí)候,預(yù)估每天的交易量在一兩個(gè)億,實(shí)際上現(xiàn)在每天已經(jīng)跑出了 40 億的交易量。
從2013-2017年,技術(shù)團(tuán)隊(duì)做了很多努力,老系統(tǒng)使用的是 Oracle 數(shù)據(jù)庫(kù),為支持最大的交易量,讀寫(xiě)分離分庫(kù)分表+各種最強(qiáng)硬件搞上;系統(tǒng)拆分、重構(gòu)、優(yōu)化了很多次,仍然滿(mǎn)足不了公司日益增長(zhǎng)的交易量。
說(shuō)實(shí)話,團(tuán)隊(duì)能把一個(gè)老系統(tǒng)整成這個(gè)樣子,也確實(shí)不易。最初的架構(gòu)設(shè)計(jì)不合理,縫縫補(bǔ)補(bǔ)終究解決不了大問(wèn)題。研發(fā)新平臺(tái)成為公司發(fā)展必須要做的一件事情,新平臺(tái)一期設(shè)計(jì)可以支撐日百億的交易量,最重要的是支持后期日千億的擴(kuò)展。
經(jīng)過(guò)兄弟們的艱苦奮站,新平臺(tái)終于上線了。新平臺(tái)上線是成功的一小半,后面的數(shù)據(jù)遷移才是最最重點(diǎn)的事情。
運(yùn)行了好幾年的老系統(tǒng),使用的是傳統(tǒng)的垂直架構(gòu),(架構(gòu)演進(jìn)可以參考這篇文章:從架構(gòu)演進(jìn)的角度聊聊Spring Cloud都做了些什么?),各種業(yè)務(wù)、政策、活動(dòng)、風(fēng)控都揉在了一起。
新平臺(tái)使用的微服務(wù)架構(gòu),光微服務(wù)就搞了上百個(gè),數(shù)據(jù)庫(kù) MySQL HA。兩個(gè)系統(tǒng)在架構(gòu)設(shè)計(jì)上隔了一代,在設(shè)計(jì)時(shí)為了兼容老系統(tǒng)的部分功能,還做了部分沉余設(shè)計(jì),反正這兩個(gè)系統(tǒng)就不是一個(gè)時(shí)代的產(chǎn)物。
遷移的要求是,從老平臺(tái)遷移到新平臺(tái)的時(shí)候,不能影響到商戶(hù)的正常交易。打個(gè)比喻就相當(dāng)于,你開(kāi)著車(chē)在高速公路上跑,在行駛的過(guò)程中換掉車(chē)輪,而這個(gè)過(guò)程還得讓坐車(chē)的你還不能有任何感覺(jué)。
于是我們研發(fā)了一套遷移系統(tǒng),本來(lái)計(jì)劃著一批一批的遷移,給新平臺(tái)一次切一兩個(gè)億的交易量,慢慢看看效果再根據(jù)節(jié)奏來(lái)走,但是突然來(lái)的一次政策(活動(dòng))打亂了這個(gè)節(jié)奏。
02. 新政策帶來(lái)的變化
對(duì)于第三方支付公司來(lái)講,經(jīng)常會(huì)隨著市場(chǎng)環(huán)境推出一些新政策(活動(dòng)),有些政策比較簡(jiǎn)單,但大多數(shù)政策很復(fù)雜,往往需要很大的開(kāi)發(fā)量。
當(dāng)時(shí)新平臺(tái)已經(jīng)切換了一段時(shí)間,大家慢慢對(duì)新平臺(tái)有了一定的信心,就決定在這個(gè)新政策在新平臺(tái)實(shí)施。計(jì)劃在執(zhí)行政策的當(dāng)天晚上,把其中一個(gè)老平臺(tái)上剩余的商戶(hù)全部遷移到新平臺(tái)。
方案定下來(lái)之后,各部門(mén)開(kāi)始各司其職,運(yùn)營(yíng)中心對(duì)外發(fā)通知,我們要在元旦的時(shí)候搞個(gè)大動(dòng)作,可能會(huì)有什么樣的變化;營(yíng)銷(xiāo)中心負(fù)責(zé)聯(lián)系各代理進(jìn)行分批培訓(xùn);商務(wù)部門(mén)開(kāi)始出公司的紅頭文件,下發(fā)各分公司。
我們提前和客服、運(yùn)營(yíng)部門(mén)做好溝通,可能會(huì)面臨哪些問(wèn)題提前做預(yù)案;公眾號(hào)、公司官網(wǎng)、App、郵件對(duì)外通知政策變化,公布開(kāi)始執(zhí)行日期;產(chǎn)品中心負(fù)責(zé)政策落地需求梳理,研發(fā)中心開(kāi)發(fā)新政策確定的方案。
最最最重要的是,要確保元旦晚上可以把剩余幾百萬(wàn)的商戶(hù),一次性平穩(wěn)的遷移到新平臺(tái)。
03. 半夜開(kāi)始遷移
遷移程序之前已經(jīng)執(zhí)行了很多次,所以大家對(duì)這塊相對(duì)比較放心,但仍然和主要負(fù)責(zé)遷移的同事確認(rèn)了好多次,開(kāi)發(fā)環(huán)境提前兩周必須測(cè)試完畢,UAT環(huán)境需要在遷移一周前測(cè)試完畢,研發(fā)和測(cè)試雙驗(yàn)證。
直到距離遷移還有三天的時(shí)候,我還專(zhuān)門(mén)找到負(fù)責(zé)遷移的那名程序員了解進(jìn)展,問(wèn)有沒(méi)有在生產(chǎn)上進(jìn)行過(guò)模擬測(cè)試。確認(rèn)沒(méi)有問(wèn)題后,根據(jù)主負(fù)責(zé)人反饋的時(shí)間預(yù)估三四個(gè)小時(shí)可以遷移完畢,這樣凌晨 1:00 開(kāi)始,凌晨 4:00-5:00 之間可以遷移完畢。
在真正執(zhí)行遷移的前一天,又拉著各部門(mén)做了一次溝通會(huì),大家一起討論可能出現(xiàn)的各種情況,以及各部門(mén)需要留守的人員。開(kāi)完會(huì)之后,大家感覺(jué)都還不錯(cuò),靜等晚上這一場(chǎng)大戰(zhàn)!
當(dāng)天晚上留下來(lái)十幾名開(kāi)發(fā)和兩名測(cè)試,以及一些其它部門(mén)的同事,大概二十幾人左右,12點(diǎn)之前大家說(shuō)說(shuō)笑笑,打打游戲靜等凌晨 1 刻遷移,因?yàn)閯偤檬窃?,辦公室一片過(guò)節(jié)的感覺(jué)。
時(shí)間過(guò)得很快,凌晨1點(diǎn)的北京,窗外星光點(diǎn)點(diǎn),辦公室內(nèi)一片緊張。
十幾名同事都圍在了主要負(fù)責(zé)遷移的這名程序員旁邊,能明顯感覺(jué)到這名程序員很有壓力(哈哈,我估計(jì)這種事情放誰(shuí)身上都會(huì)有壓力)。不過(guò)他還是熟練的按照之前多次測(cè)試的那樣,核查了多遍數(shù)據(jù)之后,點(diǎn)擊遷移按鈕。
首先在生產(chǎn)環(huán)境遷移一個(gè)代理商,看看數(shù)據(jù)是否正確,執(zhí)行完畢后相關(guān)人員開(kāi)始核驗(yàn)數(shù)據(jù)。運(yùn)維人員核查日志,開(kāi)發(fā)人員確認(rèn)相關(guān)節(jié)點(diǎn)正常、數(shù)據(jù)庫(kù)工程師核對(duì)遷移數(shù)據(jù);測(cè)試人員在運(yùn)營(yíng)平臺(tái)查詢(xún)數(shù)據(jù)核驗(yàn)、測(cè)試 Pos 刷卡測(cè)試,一切正常!
試了兩個(gè)代理商都沒(méi)有問(wèn)題,下面就準(zhǔn)備 All In 了,剩下幾百萬(wàn)商戶(hù),上千個(gè)代理商就計(jì)劃一把梭了。負(fù)責(zé)遷移的程序員,將所有代理商編號(hào),配置到執(zhí)行程序中,點(diǎn)擊了執(zhí)行按鈕,生產(chǎn)跟蹤了一下日志,一切正常。
留下幾個(gè)人監(jiān)控?cái)?shù)據(jù),其他人就散了,等遷移完成后再進(jìn)行后續(xù)工作。我也回到了工位,點(diǎn)起了一根煙,想著今晚還比較順利。
04. 突發(fā)事故
凌晨的夜晚比較困,當(dāng)我點(diǎn)起第三根煙的時(shí)候,負(fù)責(zé)遷移的這位程序員,急匆匆的跑過(guò)來(lái)找我了。
“強(qiáng)哥,出現(xiàn)問(wèn)題了!”
心中一驚,猛吸一口煙,把煙掐滅,忙問(wèn)到:“出現(xiàn)啥問(wèn)題?”
原來(lái)這位程序員在遷移程序執(zhí)行后,就一直在跟蹤遷移的進(jìn)展,發(fā)現(xiàn)過(guò)了半小時(shí)才遷移了10萬(wàn)商戶(hù),老平臺(tái)總共幾百萬(wàn)商戶(hù),按照這個(gè)速度,全部執(zhí)行完需要幾天后。
這個(gè)事可大了!
如果在上午8:00 之前不搞定這個(gè)事情,那就完全是重大事故了。
先不說(shuō)怎么處理新老平臺(tái)數(shù)據(jù)割裂,如果公司政策推遲執(zhí)行,怎么在這么短的時(shí)間內(nèi)把信息通知到幾百萬(wàn)商戶(hù)、幾千個(gè)代理商,就是一個(gè)不可能完成的工作量。
可以想象第二天都會(huì)出現(xiàn)什么樣的狀況,客服400電話被打爆、運(yùn)營(yíng)人員溝通到吐血,因政策推遲執(zhí)行可能導(dǎo)致的公司損失,針對(duì)代理商的補(bǔ)償行為...
如果這個(gè)問(wèn)題我們沒(méi)有在一個(gè)小時(shí)內(nèi)解決掉,就需要立刻上報(bào)公司副總經(jīng)理,然后估計(jì)連夜公司所有的管理層,都需要來(lái)公司開(kāi)會(huì)商量后續(xù)處理方案。
大腦中雖然閃過(guò)遷移失敗后的嚴(yán)重后果,但眼前還需要壓下所有的想法,先分析到底是哪里出現(xiàn)了問(wèn)題,有沒(méi)有什么樣的降級(jí)方案或者補(bǔ)救方法。
分析原因:
經(jīng)過(guò)查詢(xún)?nèi)罩?、核?duì)數(shù)據(jù)基本查明了原因,開(kāi)發(fā)人員在生產(chǎn)測(cè)試的時(shí)候,都使用的是中小型代理商進(jìn)行的測(cè)試;但忽略了公司不同代理商規(guī)模之間差異極大,最大的核心代理商一家的數(shù)據(jù),可能占平臺(tái)整體交易量的5%-6%。
所以根據(jù)中小型代理商評(píng)估的時(shí)間肯定是不準(zhǔn)確的,事已至此先不說(shuō)誰(shuí)的問(wèn)題。如何快速解決問(wèn)題才是接下來(lái)的關(guān)鍵,大家都一起想解決方案,有什么辦法可以讓遷移速度更快一點(diǎn)。
補(bǔ)救方案:
比如先同步核心數(shù)據(jù),其它內(nèi)容后續(xù)再進(jìn)行處理,先保障第二天的交易;比如可不可以全部使用人工導(dǎo)表來(lái)處理,數(shù)據(jù)庫(kù)工程師聽(tīng)到這個(gè)方案的時(shí)候,差點(diǎn)哭暈過(guò)去,上千多張表,關(guān)系極為復(fù)雜;其它各種各樣的方案..
在大家七嘴八舌討論優(yōu)化方案的時(shí)候,才發(fā)現(xiàn)遷移程序的主流程沒(méi)有使用多線程來(lái)遷移。
遷移程序提供了一個(gè)界面,每次遷移的時(shí)候開(kāi)發(fā)人員會(huì)在頁(yè)面填寫(xiě)需要遷移的代理商編號(hào),后臺(tái)接收到頁(yè)面?zhèn)鬟f的參數(shù)后,開(kāi)始 for 循環(huán)執(zhí)行遷移。
雖然代理商下的商戶(hù)使用了多線程遷移,但是遷移代理商的主程序入口,卻沒(méi)有使用多線程,因此大家想是否把代理商這塊也用多線來(lái)加快遷移速度。
05. 人工多線程救場(chǎng)
大家討論之后,覺(jué)得多線程來(lái)遷移代理商應(yīng)該是目前比較好的一個(gè)方案,但是如果讓現(xiàn)場(chǎng)寫(xiě),沒(méi)有經(jīng)過(guò)測(cè)試直接就生產(chǎn)執(zhí)行,風(fēng)險(xiǎn)還是比較大。
那還有什么不用改程序就可以實(shí)現(xiàn)這種代理商并發(fā)遷移的效果嗎?確實(shí)有!
大家知道我們平時(shí)開(kāi)發(fā)的 Web 應(yīng)用,前臺(tái)的每一次請(qǐng)求到后端就會(huì)分配一個(gè) Servlet 來(lái)處理響應(yīng),這個(gè) Servlet 其實(shí)就是一個(gè)獨(dú)立的線程。那么每次多打開(kāi)幾個(gè)頁(yè)面,同時(shí)執(zhí)行遷移請(qǐng)求不就實(shí)現(xiàn)了多線程遷移代理商的效果嗎?
說(shuō)干就干,把之前的遷移程序停掉之后,選擇十幾個(gè)代理商進(jìn)行多線程遷移測(cè)試,同時(shí)打開(kāi)了4個(gè)頁(yè)面,每個(gè)頁(yè)面輸入不同的代理商,開(kāi)始遷移測(cè)試,測(cè)試后發(fā)現(xiàn)一切正常。
開(kāi)始加大測(cè)試量,使用幾十個(gè)代理商,在不同的頁(yè)面輸入后,先后點(diǎn)擊了遷移程序,在第二次并發(fā)遷移的過(guò)程突然發(fā)現(xiàn)不時(shí)的會(huì)報(bào)一些錯(cuò)誤。
停止遷移程序,開(kāi)始尋找原因,根據(jù)報(bào)錯(cuò)的原因發(fā)現(xiàn)是出現(xiàn)共享數(shù)據(jù)了。
我們知道 Servlet 是線程不安全的,當(dāng)出現(xiàn)多線程訪問(wèn)的時(shí)候,如果有全局共享變量就會(huì)出現(xiàn)線程安全問(wèn)題。
這個(gè)問(wèn)題好解決,使用 ThreadLocal 來(lái)修飾就行,ThreadLocal 為每個(gè)使用該變量的線程提供獨(dú)立的變量副本,所以每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)影響其它線程所對(duì)應(yīng)的副本。
這個(gè)問(wèn)題解決之后就繼續(xù)打開(kāi)多個(gè)頁(yè)面執(zhí)行,但同一個(gè) Tomcat 并行超過(guò) 6 個(gè)線程的時(shí)候,機(jī)器負(fù)載就會(huì)比較高,因?yàn)槊總€(gè)線程內(nèi)還會(huì)再次調(diào)起另外的線程池來(lái)處理商戶(hù)、業(yè)務(wù)員的遷移邏輯。
于是就立刻安排運(yùn)維人員,在生產(chǎn)環(huán)境找十臺(tái)服務(wù)器,在這十臺(tái)服務(wù)器上都部署上遷移的主調(diào)度程序。為了防止開(kāi)發(fā)人員手抖出現(xiàn)問(wèn)題,我讓運(yùn)維給我開(kāi)了權(quán)限。
于是在我的電腦上(我使用了多個(gè)屏幕),分別打開(kāi)了十臺(tái)服務(wù)器上的遷移程序頁(yè)面,把所有需要遷移的代理商按照每次十五個(gè)分組,每次在一個(gè)頁(yè)面輸入一組代理商來(lái)遷移,如此循環(huán)依次在每臺(tái)服務(wù)器開(kāi)始遷移代理商。
當(dāng)我循環(huán)執(zhí)行了6次的時(shí)候,數(shù)據(jù)庫(kù)工程師檢測(cè)到明顯數(shù)據(jù)的遷移速度加快,就這樣我用了兩個(gè)小時(shí),在頁(yè)面把所有的代理商分別進(jìn)行了遷移。
大概到凌晨 4 點(diǎn)的時(shí)候,我的工作基本上搞完了,剩下的就讓程序慢慢跑了;凌晨 5 點(diǎn)的時(shí)候,大部分商戶(hù)數(shù)據(jù)都已經(jīng)遷移過(guò)來(lái),只剩下兩臺(tái)服務(wù)器還在繼續(xù)跑;到了凌晨 6 點(diǎn)的時(shí)候,十臺(tái)服務(wù)器的遷移程序全部跑完。
安排把所有相關(guān)數(shù)據(jù)一一進(jìn)行了核對(duì)后,大家長(zhǎng)長(zhǎng)的舒了一口。
早上 7 點(diǎn)一起下來(lái)吃早餐的時(shí)候,大家還在說(shuō),感覺(jué)昨天晚上差點(diǎn)就過(guò)不去了。開(kāi)玩笑說(shuō),如果凌晨2、3點(diǎn)的時(shí)候,給我們老板打電話,老板會(huì)是什么樣的感覺(jué)。
那時(shí)候想,出現(xiàn)這么大的事故,老板把我們開(kāi)除了都是小事,如何收?qǐng)霾攀俏覀冏铌P(guān)心的。工作丟了可以再找,事情不管怎樣都是需要我們這批人來(lái)解決處理的。
上午 9 點(diǎn)打開(kāi)交易后,又陸陸續(xù)續(xù)出現(xiàn)了一些小問(wèn)題,但都是小面積的、不影響交易的問(wèn)題,整體范圍可控,晚上遷移的這幫人,幾乎都堅(jiān)持到了下午沒(méi)有太大問(wèn)題了才回去睡覺(jué)。
事后回想時(shí),大家都一種劫后余生的感覺(jué)。
三、事件回顧
事后我們開(kāi)復(fù)盤(pán)會(huì)的時(shí)候,總結(jié)了這里面疏漏的很多點(diǎn),但這些都不是本文的重點(diǎn)。我們還是回到文章的開(kāi)頭,什么是厲害的程序員?
大家可以看到這個(gè)問(wèn)題并不是特別的復(fù)雜,處理時(shí)需要的技術(shù)手段也比較簡(jiǎn)單,但最關(guān)鍵是解決了當(dāng)時(shí)最最緊迫的問(wèn)題。所以說(shuō)技術(shù)沒(méi)有什么高低之分,學(xué)習(xí)技術(shù)的本質(zhì)也是為了解決各種各樣的問(wèn)題,不要對(duì)技術(shù)迷之自信,能用起來(lái)才是最好。
技術(shù)人要學(xué)會(huì)享受壓力,因?yàn)閴毫褪莿?dòng)力,壓力就是讓你去成長(zhǎng)的,越早遇到成長(zhǎng)得越快。人在高壓高強(qiáng)度的環(huán)境中,哪怕很簡(jiǎn)單的動(dòng)作可能都會(huì)變形,從而有可能引發(fā)更大的二次事故。
在高強(qiáng)度、高壓力的環(huán)境下穩(wěn)定保持一顆冷靜分析的心,只有你自己沉靜下來(lái)才能真正的發(fā)現(xiàn)問(wèn)題解決問(wèn)題。很多技術(shù)人,出現(xiàn)問(wèn)題時(shí)你看他在忙,其實(shí)是沒(méi)有思路在那瞎操作。
冷靜下來(lái),仔細(xì)分析整個(gè)鏈條,設(shè)想哪個(gè)地方可能會(huì)出現(xiàn)問(wèn)題,然后通過(guò)查詢(xún)?nèi)罩净蛘呦嚓P(guān)命令,一步一步去排查、驗(yàn)證問(wèn)題的根源在哪里,只有真正找到了問(wèn)題的根源,你解決的時(shí)候才可以胸有成竹。
當(dāng)天晚上留守遷移的程序員,都是我司最核心的一批程序員,但是誰(shuí)有能力上誰(shuí)有能力下,在這一晚上很容易就能發(fā)現(xiàn),優(yōu)秀的程序員就像金子一樣,關(guān)鍵的時(shí)刻它會(huì)發(fā)光的。
很多人遇到問(wèn)題就自然的就會(huì)后退幾步,有的人遇到問(wèn)題就喜歡沖上去。不管你平時(shí)源碼研究得多牛逼,不管你的 PPT 寫(xiě)得有多好,公司需要的是遇到問(wèn)題的時(shí)候,有人能夠頂上去把問(wèn)題解決掉。
凡是能夠在關(guān)鍵時(shí)刻頂上去的程序員,基本上后面都很容易走上管理崗位。人和人其實(shí)就是在不斷磨合中建立信任的,領(lǐng)導(dǎo)在選擇提拔員工時(shí),主要考慮就是能不能放心把事情交給你。
所以大家平時(shí)研究技術(shù)的時(shí)候,不要走偏,源碼、設(shè)計(jì)模式這些東西是應(yīng)該研究,但更應(yīng)該考慮的是研究后如何去應(yīng)用,多專(zhuān)注一些實(shí)戰(zhàn)型的知識(shí),這些東西關(guān)鍵時(shí)刻可以救你的命(職場(chǎng))。
四、如何做一名有能力的程序員
那么作為一名程序員,如何培養(yǎng)自己解決問(wèn)題的能力呢?實(shí)踐!實(shí)踐!實(shí)踐!平時(shí)的技術(shù)學(xué)習(xí)只是一種強(qiáng)力輸入,如果不進(jìn)行實(shí)踐,這些能力就會(huì)很快流失了。
那如何實(shí)踐呢,多做項(xiàng)目,如果公司的項(xiàng)目用不到此技術(shù),可以自己業(yè)余時(shí)間寫(xiě)寫(xiě)代碼自己去調(diào)試一番;另外同事出現(xiàn)問(wèn)題的時(shí)候多去幫忙解決問(wèn)題,公司出現(xiàn)問(wèn)題的時(shí)候,主動(dòng)去幫忙解決問(wèn)題;解決各種各樣的問(wèn)題,是提升能力的最快方式。
實(shí)踐完成之后,最好還能復(fù)盤(pán)總結(jié)一番,把總結(jié)的內(nèi)容作為日志或者博客記錄下來(lái)。記錄下來(lái)的內(nèi)容就會(huì)成為你的一個(gè)知識(shí)寶庫(kù),以后遇到類(lèi)似問(wèn)題的時(shí)候,檢索一下即可解決,如此不斷豐富自己解決問(wèn)題的經(jīng)驗(yàn)。
最后,愿你成為一名真正的技術(shù)大拿!