技術(shù)大牛養(yǎng)成指南,一篇不雞湯的成功學(xué)實踐
有的人想成為大牛,卻不曾為此努力。有的人辛苦耕耘,卻收獲寥寥。很多時候,你跟成功的差距并不是能力,也不是運氣,或許只是正確的方法?這是一篇不雞湯的成功學(xué)指南,如果你相信且愿意堅持嘗試,未必幫不到你!
1
一碗有勺子的雞湯
我工作已經(jīng)將近12年了(其實12年才混到這個地步,天資實在是一般),在華為做了5年,在UC做了6年,現(xiàn)在主要負(fù)責(zé)阿里游戲的中間件和組件的架構(gòu)設(shè)計和實現(xiàn),包括用戶消息推送、系統(tǒng)異步通知系統(tǒng)等等。
同時我還帶了三四十人的研發(fā)團隊,除了工作以外,我也喜歡寫博客,是CSDN、云棲的社區(qū)之星和博客專家,InfoQ的簽約作者。
總體上來說,我現(xiàn)在雖然還算不上業(yè)界頂級的大牛,但在公司也算一頭小牛了,今天我的分享將綜合自己的成長經(jīng)歷給大家談一談怎么樣成為一個大牛。我現(xiàn)在還在業(yè)界的大牛路上狂奔,但我覺得這些經(jīng)驗和技巧應(yīng)該是每個同學(xué)都可以用到自己的日常工作和生活當(dāng)中的。
2
一鳴驚人背后是1萬小時的不斷練習(xí)
如何成為大牛?這個問題之前有很多人問我:你是怎么成為技術(shù)上的一個大牛的?
最開始的時候我也經(jīng)常跟他們講你要去看看某某某開發(fā)方案,深入學(xué)習(xí)UNIX的開發(fā)等等這些“術(shù)”的東西,后來我在思考,是否有成為一種大牛的“道”上面的東西,也就是說不管你做產(chǎn)品、做運營、做運維、程序員還是測試,通過這個方式都能夠成為一個大牛呢?
通過尋找和思考,后來真的讓我找到了應(yīng)用到所有行業(yè)、所有職業(yè)我稱之為成為大牛的一個道,這是1萬小時理論。
我先簡單介紹一下1萬小時理論,我最初看到1萬小時理論是從《異類》這本書知道的,這是很出名的書,它非常有意思,我建議所有同學(xué)都去看一下,它分析了很多成功人士背后一些我們通常情況下不了解或沒看到的一些現(xiàn)象,得出一些比較令人震撼的結(jié)論,其中有一個理論就是1萬小時理論。
它里面有舉了一些例子,比如說莫扎特,大家都知道他是音樂神童,6歲就開始作曲了,你看完這本書就知道他真正出人頭地是20多歲的時候,也就是說他雖然6歲開始作曲,但他當(dāng)時作的曲也是比較不好的。
所以《異類》這本書里面提到了1萬小時的理論,它對我是很有幫助的,成為世界上頂級的專家唯一的方法就是1萬小時持續(xù)不斷地進行練習(xí),大家要特別注意“唯一”,也就是說絕大部分專業(yè)是沒有什么天才的,所謂的天才只是他一鳴驚人之后我們才這樣覺得,在他成為天才之前至少要經(jīng)過1萬小時持續(xù)不斷的練習(xí)。
我第一次看到1萬小時的理論,覺得沒什么神奇的,我算了算,我工作五年就會成為業(yè)界頂級的專家了,但想想這是不可能的,為什么呢?我反思了一下我自己的工作狀態(tài),對于大部分人來說每天的工作很多時候是重復(fù)勞動,雖然我們一天工作8小時,但是只是重復(fù)以往的經(jīng)驗,并沒有刻意去訓(xùn)練提升自己。
有一個笑話是有一個10年工作經(jīng)驗的人去面試,面試完了之后面試官跟他說其實你只有1年工作經(jīng)驗,你把它重復(fù)了9年。
對于1萬小時理論來說如果你深入思考其實它并沒有那么簡單,這意味著什么呢?意味著你每天要花3小時時間用于提升自己的技能,這樣一直做,要持續(xù)大約10年時間。大家想想每天持續(xù)十年去做一件事情去提升自己,有幾個能做到,所以我們看到雖然有些人工作了10年,但是也不一定能成為業(yè)界的專家。
為什么我要強調(diào)每天3小時?持續(xù)10年提升自己,你不能把你重復(fù)的工作算進去,你要在專業(yè)廣度和深度上面不斷擴展,才能業(yè)界一個頂尖的大?;蛘邔<?。
舉一個例子,一個小孩子每天唱《兩只老虎》,唱10年,你覺得他會成為周杰倫嗎?肯定不會。當(dāng)然1萬小時理論不適合一些領(lǐng)域,尤其是不適合炒股,特別是中國的股市,如果你花1萬小時去炒股,可能會傾家蕩產(chǎn)。
3
如何找到10000小時?碎片化時間管理
1萬小時理論聽起來好像很簡單,每天持續(xù)3小時,也不難,但實際上真正做起來是很難的,就像我們互聯(lián)網(wǎng)的人加班加成狗,感覺身體天天被掏空,時間從哪來,這是一個現(xiàn)實問題,不要說每天抽3個小時提升自己,每天抽1個小時陪女朋友或者找女朋友的時間都不夠。具體怎么做?[!--empirenews.page--]
首先是找到3個30分鐘:
第一個30分鐘就是早上的30分鐘,假設(shè)你習(xí)慣8點起床,明天你把鬧鐘改成7點半,這就多了半個小時。
第二個30分鐘是睡覺前的30分鐘,假設(shè)你習(xí)慣玩游戲到12點,明天晚上你玩游戲就玩到11點半。
第三個30分鐘就是上班到你座位上的30分鐘,有的同學(xué)擔(dān)心說我這30分鐘會不會影響我這一天的工作效率,可能加班完不成,還讓我擠出30分鐘來,這不用擔(dān)心,從我的經(jīng)歷來看擠30分鐘不會影響你整體的工作效率,持續(xù)一兩年,你會發(fā)現(xiàn)自己的收益非常大。
第二點是利用或節(jié)省路途時間
我們每天上下班都是一兩個小時,比如像我這種,怎么去利用時間呢?
首先是可以利用上下班路上的時間去看書、聽書,也是可以做的。如果你覺得上班路上是不能看書的,或者是不可能學(xué)習(xí)的,比如你坐廣州的3號線,這是舉世聞名的擠得要命的,不要說看書了,把手伸出去都不知道去哪了,那就建議大家搬到離公司近一點位置,雖然每個月多幾百塊錢的房租,但是你要相信這個投資節(jié)省下來的時間用于提升自己,它最終的收益是10倍回報都不止的。
第三點是周末4小時
周末還是不用怎么加班的,周末用于放松、睡覺、看電影、娛樂,你也可以在周末里面規(guī)定自己擠出4個小時,也就是每天2個小時,這樣算下來,一天大概就兩個多小時,再加上你在工作中的積累,每天3小時也不是很難。
接下來講一下我是怎么做的,我現(xiàn)在有2個小孩,而且我住的比較遠(yuǎn),應(yīng)該在座的比我忙的也不會很多,看一下我是怎么做的,我是坐廣州的四號線,坐四號線每天來回可以看一個小時的書,每天早晚30分鐘,周末4小時,有的同學(xué)可能會有疑問,周末肯定要帶小孩玩,自己也要休息,哪里有4個小時,其實只要你去找,時間都會有的,我找的方法就是當(dāng)我小孩睡覺的時候,因為小孩子睡覺一般要睡三四個小時,大人一般睡一個小時、半個小時就差不多了,所以通過這種方式,大家可以看到2015年我一共看了84本書,有專業(yè)的,也有非專業(yè)的,人文社科、歷史這些都有。
不過特別提醒一下對于男程序員來說有一個時間千萬不能少,就是陪女朋友的時間,因為對程序員來說找女朋友不容易,別看了這篇文章回去之后女朋友也不要了,就天天回去提升,這也不是我們想要的生活。
4
10000小時理論如何輕松落地?
雖然理論上很簡單,但真正要落地實行也并不那么容易,實行10000小時理論的關(guān)鍵在于堅持,我認(rèn)為堅持的關(guān)鍵在于自己對于所從事的事業(yè)是否有“激情和興趣”。這點當(dāng)然是核心,但如果只靠激情支撐,持續(xù)10年也確實有挑戰(zhàn),正如一個朋友在分享會后問我的“要持續(xù)10年才能成為大牛啊,時間好長啊”!
如果說做一件事要10年后才能修成正果,估計很多朋友就會放棄了,畢竟像唐僧那么堅定的信仰者總是少數(shù),大部分凡夫俗子都還是需要持續(xù)不斷的激勵才能有動力去做一件事,因為我們的大腦在進化的過程中已經(jīng)形成了需要持續(xù)不斷的獎勵才能保持興奮的機制,也就是說相對于在第10年給一個大獎勵,還不如每年給一個小獎勵。
那如何才能在10年漫長的路上讓我們持續(xù)的堅持下去呢?答案其實就是首富的話:“先定一個能達到的小目標(biāo)”!我們來看如何將“10年成為大牛”這個目標(biāo)分解為一個個能達到的小目標(biāo)。我將這個方法歸納為“三段分解法”,即:將一個宏大或者長遠(yuǎn)的目標(biāo)經(jīng)過3次分解,得到一個個短期內(nèi)能達到的小目標(biāo)。具體的分解方法如下。
一段分解:分解“等級”
10年成為大牛的目標(biāo)雖然比較長遠(yuǎn)比較宏大,但并不意味著在沒有成為大牛前,我們一直都是菜鳥。從菜鳥到大牛的過程中,中間其實有幾個關(guān)鍵的里程碑,這些里程碑就是我們的一段目標(biāo)。
以技術(shù)人員為例,技術(shù)人員典型的發(fā)展路徑基本上都是下面的這個模式:
1) 0 ~ 1年:菜鳥,需要別人手把手來教
2)1 ~ 3年:初級,需要別人帶你做
3)3 ~ 5年:高級,能獨當(dāng)一面,可以帶初級技術(shù)人員了
4)5 ~ 8年:資深,能獨擋多面
5)8 ~ 10年:大牛,統(tǒng)籌規(guī)劃,高屋建瓴
通過上面的分解我們可以看到,雖然說10年才能成為大牛,但是3年就可以達到初級水平,5年就可以達到高級水平,8年就可以達到資深水平,在這個過程中我們一直在成長和提升,而不是說沒有成為大牛就是菜鳥;并且對于很多朋友來說,如果目標(biāo)不是像首富那樣要賺就賺1億,能達到高級或者資深水平,其實已經(jīng)可以過得比較滋潤了。
通過這種分解方法,再核對一下自己目前所處的位置,然后先瞄準(zhǔn)下一個目標(biāo),全力以赴其實也就2 ~ 3年時間,這樣來看一段目標(biāo)其實是比較容易達成的。這種目標(biāo)分解的方法除了適合技術(shù)人員外,其它很多領(lǐng)域也都適應(yīng),比如說產(chǎn)品人員、運營人員、甚至公務(wù)員!
二段分解:分解“技能”
經(jīng)過一段分解后,明確自己目前所處的位置和下一個目標(biāo),接下來就要看這個一段目標(biāo)如何實現(xiàn)了。雖然說每個一段目標(biāo)持續(xù)時間在 2~3年,但3年時間說長不長,說短也不短,如果沒有好好利用,可能到了2年多的時候回頭一看,好像什么都沒達成,還是原地踏步。因此,為了更好的利用這3年時間,我們需要進一步分解,這就是“二段分解”。
一段分解的維度是等級,二段分解的維度則不一樣,不能再分等級了,否則等級太細(xì)就沒法區(qū)別了。二段分解的維度變成了“技能”,即:為了達到一段目標(biāo),我需要具備什么樣的技能。
[!--empirenews.page--]還是以技術(shù)人員為例,假設(shè)經(jīng)過自我評估,認(rèn)為自己目前處于初級階段,而且初級階段的事情已經(jīng)做得比較順手和熟練了,那么下一個一段目標(biāo)自然就是達到“高級”水平。“高級”與“初級”相比,有哪些不同的技能要求呢?
這就需要我們根據(jù)各自不同的行業(yè)和方向詳細(xì)列出來了,如果自己想不出來,網(wǎng)上有很多資料都可以搜索到,最方便的就是到一個招聘網(wǎng)站,多看看幾個招聘需求的描述,然后歸納總結(jié)一下。
我們隨便到網(wǎng)上搜索一個,例如拉勾網(wǎng)上滴滴的“高級Java開發(fā)工程師”招聘:
多看幾個類似的職位招聘,基本上我們就能明白“高級Java開發(fā)工程師”的一些基本要求。當(dāng)然實際上的技能要求比招聘需求的描述還要更加細(xì)致,我個人的習(xí)慣是將這些要求整理為一個思維導(dǎo)圖,詳細(xì)列出每個技術(shù)點。例如:
注意:以上這個圖只是示例,并不是說所有Java高級工程師都一定是這個要求,例如互聯(lián)網(wǎng)行業(yè)和電信行業(yè)的要求不一樣)
有了這樣一個思維導(dǎo)圖后,我們就可以開始真正進行二段分解了,分解的方法很簡單:哪里不懂補哪里!例如:我感覺目前我的數(shù)據(jù)庫水平一般,僅僅會寫CRUD語句,其它的東西都不懂,那我就開始專攻數(shù)據(jù)庫這一部分,經(jīng)過一段時間的專攻來提升自己的水平。
二段目標(biāo)持續(xù)時間一般建議是6個月,既不能太短也不能太長。太短容易讓人陷入為了目標(biāo)而做的誤區(qū),沒有真正得到有效提升;時間太長的話,3年時間又不夠完成其它目標(biāo)了,例如要是我定一個目標(biāo)說2年提升數(shù)據(jù)庫,那操作系統(tǒng)怎么辦?網(wǎng)絡(luò)怎么辦?……等等。以6個月為一個周期,基本上剛剛好。
經(jīng)過分解,最終的二段目標(biāo)可以分解為如下的幾個更小的目標(biāo):
1)2016.06 ~ 2017.01:提升數(shù)據(jù)庫水平
2)2017.01 ~ 2017.06:提升Linux水平
3)2017.06 ~ 2017.12:提升網(wǎng)絡(luò)和網(wǎng)絡(luò)編程水平
當(dāng)然,二段分解目標(biāo)并不是一成不變的,很多時候需要根據(jù)我們工作的內(nèi)容進行調(diào)整。例如老大正好安排我來負(fù)責(zé)優(yōu)化系統(tǒng)性能,降低機器負(fù)載,那么我完全可以將“提升Linux水平”安排到“提升數(shù)據(jù)庫水平”之前。
三段分解:分解“行動”
二段分解得到技能的小目標(biāo)后,接下來的關(guān)鍵就是要實現(xiàn)這個目標(biāo),這就是三段分解的主要目的,即:將技能目標(biāo)分解為具體要做的事情,然后按照計劃執(zhí)行。
比如說我的二段目標(biāo)是“提升Linux水平”,那怎么樣才能提升呢?可以上網(wǎng)搜索(知乎是個好地方),也可以去問有經(jīng)驗的朋友。明確要做的事情后,三段分解需要將二段分解的6個月目標(biāo)更加細(xì)化,分為1個月或者兩個月一個目標(biāo)。
以我當(dāng)時加入UC的情況為例,我在華為的時候是在Windows平臺上用VC6進行開發(fā),而到了UC的時候是在Linux平臺上用C++開發(fā),我當(dāng)時定了“提升Linux水平”的目標(biāo),然后通過上網(wǎng)查,找別人問等方法,最終將這個目標(biāo)分解為幾個步驟:
1)1個月:通讀《UNIX環(huán)境高級編程》
2)1個月:通讀《Linux系統(tǒng)編程》
3)2個月:通讀《UNIX網(wǎng)絡(luò)編程 卷1》
4)1個月:Linux常用命令實戰(zhàn):tcpdump、ps、top等
通過這種方法,將6個月的目標(biāo)又進一步分解為1個月的目標(biāo),實施起來就簡單多了,每1 ~ 2個月專注一個具體目標(biāo),每次完成后都很有成就感,既感覺自己的水平有了提升,又佩服自己能夠堅持按計劃按目標(biāo)完成任務(wù),雙重獎賞讓自己更有動力進行下一個目標(biāo)。
我大約花了2年的時間將Linux、網(wǎng)絡(luò)、MySQL三個重點技能從一無所知提升到高級的水平,很多同事都問我之前在華為是不是就是做這方面的,因為他們覺得短時間能達到這個水平是不太可能的。
綜合前面的分析,我們將三段分解提煉一下:一段分解“等級”,二段分解“技能”,三段分解“行動”。通過前面我們的案例就可以看出,原本一個宏大的“10年成為技術(shù)大牛”的目標(biāo),經(jīng)過三段分解,最終得到的是1 ~ 2個月可執(zhí)行的具體行動,通過這種一步一個腳印的行動,最終就可以達成“10年成為技術(shù)大牛”的目標(biāo)。
5
天天寫業(yè)務(wù)代碼,如何成為技術(shù)大牛?幾個典型的誤區(qū) 拜大牛為師
知乎上有人認(rèn)為想成為技術(shù)大牛最簡單直接、快速有效的方式是“拜團隊技術(shù)大牛為師”,讓他們平時給你開小灶,給你分配一些有難度的任務(wù)。我個人是反對這種方法的,主要的原因有幾個:
大牛很忙,不太可能單獨給你開小灶,更不可能每天都給你開1個小時的小灶;而且一個團隊里面,如果大牛平時經(jīng)常給你開小灶,難免會引起其他團隊成員的疑惑,我個人認(rèn)為如果團隊里的大牛如果真正有心的話,多給團隊培訓(xùn)是最好的。然而做過培訓(xùn)的都知道,準(zhǔn)備一場培訓(xùn)是很耗費時間的,課件和材料至少2個小時(還不能是碎片時間),講解1個小時,大牛們一個月做一次培訓(xùn)已經(jīng)是很高頻了。
因為第一個原因,所以一般要找大牛,都是帶著問題去請教或者探討。因為回答或者探討問題無需太多的時間,更多的是靠經(jīng)驗和積累,這種情況下大牛們都是很樂意的,畢竟影響力是大牛的一個重要指標(biāo)嘛。然而也要特別注意:如果經(jīng)常問那些書本或者google能夠很容易查到的知識,大牛們也會很不耐煩的,畢竟時間寶貴。經(jīng)常有網(wǎng)友問我諸如“jvm的-Xmn參數(shù)如何配置”這類問題,我都是直接回答“請直接去google”,因為這樣的問題實在是太多了,如果自己不去系統(tǒng)學(xué)習(xí),每個都要問是非常浪費自己和別人的時間的。[!--empirenews.page--]
大牛不多,不太可能每個團隊都有技術(shù)大牛,只能說團隊里面會有比你水平高的人,即使他每天給你開小灶,最終你也只能提升到他的水平;而如果是跨團隊的技術(shù)大牛,由于工作安排和分配的原因,直接請教和輔導(dǎo)的機會是比較少的,單憑參加幾次大牛的培訓(xùn),是不太可能就成為技術(shù)大牛的。
綜合上述的幾個原因,我認(rèn)為對于大部分人來說,要想成為技術(shù)大牛,首先還是要明白“主要靠自己”這個道理,不要期望有個像武功師傅一樣的大牛手把手一步一步的教你。適當(dāng)?shù)臅r候可以通過請教大?;蛘吆痛笈L接憗硖嵘约?,但大部分時間還是自己系統(tǒng)性、有針對性的提升。
業(yè)務(wù)代碼一樣很牛逼
知乎上有的回答認(rèn)為寫業(yè)務(wù)代碼一樣可以很牛逼,理由是業(yè)務(wù)代碼一樣可以有各種技巧,例如可以使用封裝和抽象使得業(yè)務(wù)代碼更具可擴展性,可以通過和產(chǎn)品多交流以便更好的理解和實現(xiàn)業(yè)務(wù),日志記錄好了問題定位效率可以提升10倍……等等。
業(yè)務(wù)代碼一樣有技術(shù)含量,這點是肯定的,業(yè)務(wù)代碼中的技術(shù)是每個程序員的基礎(chǔ),但只是掌握了這些技巧,并不能成為技術(shù)大牛,就像游戲中升級打怪一樣,開始打小怪,經(jīng)驗值很高,越到后面經(jīng)驗值越少,打小怪已經(jīng)不能提升經(jīng)驗值了,這個時候就需要打一些更高級的怪,刷一些有挑戰(zhàn)的副本了,沒看到哪個游戲只要一直打小怪就能升到頂級的。
成為技術(shù)大牛的路也是類似的,你要不斷的提升自己的水平,然后面臨更大的挑戰(zhàn),通過應(yīng)對這些挑戰(zhàn)從而使自己水平更上一級,然后如此往復(fù),最終達到技術(shù)大牛甚至業(yè)界大牛的境界,寫業(yè)務(wù)代碼只是這個打怪升級路上的一個挑戰(zhàn)而已,而且我認(rèn)為是比較初級的一個挑戰(zhàn)。
所以我認(rèn)為:業(yè)務(wù)代碼都寫不好的程序員肯定無法成為技術(shù)大牛,但只把業(yè)務(wù)代碼寫好的程序員也還不能成為技術(shù)大牛。
上班太忙沒時間自己學(xué)習(xí)
很多人認(rèn)為自己沒有成為技術(shù)大牛并不是自己不聰明,也不是自己不努力,而是中國的這個環(huán)境下,技術(shù)人員加班都太多了,導(dǎo)致自己沒有額外的時間進行學(xué)習(xí)。
這個理由有一定的客觀性,畢竟和歐美相比,我們的加班確實要多一些,但這個因素只是一個需要克服的問題,并不是不可逾越的鴻溝,畢竟我們身邊還是有那么多的大牛也是在中國這個環(huán)境成長起來的。
我認(rèn)為有幾個誤區(qū)導(dǎo)致了這種看法的形成:
1)上班做的都是重復(fù)工作,要想提升必須自己額外去學(xué)習(xí)
形成這個誤區(qū)的主要原因還是在于認(rèn)為“寫業(yè)務(wù)代碼是沒有技術(shù)含量的”,而我現(xiàn)在上班就是寫業(yè)務(wù)代碼,所以我在工作中不能提升。
2)學(xué)習(xí)需要大段的連續(xù)時間
很多人以為要學(xué)習(xí)就要像學(xué)校上課一樣,給你一整天時間來上課才算學(xué)習(xí),而我們平時加班又比較多,周末累的只想睡懶覺,或者只想去看看電影打打游戲來放松,所以就沒有時間學(xué)習(xí)了。
正確的做法正好相反:
首先我們應(yīng)該在工作中學(xué)習(xí)和提升,因為學(xué)以致用或者有實例參考,學(xué)習(xí)的效果是最好的;其次工作后學(xué)習(xí)不需要大段時間,而是要擠出時間,利用時間碎片來學(xué)習(xí)。(參照前文10000小時理論)
正確的做法 Do more
做的更多,做的比你主管安排給你的任務(wù)更多。
我在HW的時候,負(fù)責(zé)一個版本的開發(fā),這個版本的工作量大約是2000行左右,但是我除了做完這個功能,還將關(guān)聯(lián)的功能全部掌握清楚了,代碼(大約10000行)也全部看了一遍,做完這個版本后,我對這個版本相關(guān)的整套業(yè)務(wù)全部很熟悉了。經(jīng)過一兩次會議后,大家發(fā)現(xiàn)我對這塊掌握最熟了,接下來就有趣了:產(chǎn)品討論需求找我、測試有問題也找我、老大對外支撐也找我;后來,不是我負(fù)責(zé)的功能他們也找我,即使我當(dāng)時不知道,我也會看代碼或者找文檔幫他們回答……最后我就成了我這個系統(tǒng)的“專家”了。雖然這個時候我還是做業(yè)務(wù)的,還是寫業(yè)務(wù)代碼,但是我已經(jīng)對整個業(yè)務(wù)都很熟悉了。
以上只是一個簡單的例子,其實就是想說:要想有機會,首先你得從人群中冒出來,要想冒出來,你就必須做到與眾不同,要做到與眾不同,你就要做得更多!
怎么做得更多呢?可以從以下幾個方面著手:
1)熟悉更多業(yè)務(wù),不管是不是你負(fù)責(zé)的;熟悉更多代碼,不管是不是你寫的
這樣做有很多好處,舉幾個簡單的例子:
需求分析的時候更加準(zhǔn)確,能夠在需求階段就識別風(fēng)險、影響、難點
問題處理的時候更加快速,因為相關(guān)的業(yè)務(wù)和代碼都熟悉,能夠快速的判斷問題可能的原因并進行排查處理
方案設(shè)計的時候考慮更加周全,由于有對全局業(yè)務(wù)的理解,能夠設(shè)計出更好的方案
2)熟悉端到端
比如說你負(fù)責(zé)web后臺開發(fā),但實際上用戶發(fā)起一個http請求,要經(jīng)過很多中間步驟才到你的服務(wù)器(例如瀏覽器緩存、DNS、nginx等),服務(wù)器一般又會經(jīng)過很多處理才到你寫的那部分代碼(路由、權(quán)限等)這整個流程中的很多系統(tǒng)或者步驟,絕大部分人是不可能去參與寫代碼的,但掌握了這些知識對你的綜合水平有很大作用,例如方案設(shè)計、線上故障處理這些更加有含金量的技術(shù)工作都需要綜合技術(shù)水平。
“系統(tǒng)性”、“全局性”、“綜合性”這些字眼看起來比較虛,但其實都是技術(shù)大牛的必備的素質(zhì),要達到這樣的境界,必須去熟悉更多系統(tǒng)、業(yè)務(wù)、代碼。
3)自學(xué)
一般在比較成熟的團隊,由于框架或者組件已經(jīng)進行了大量的封裝,寫業(yè)務(wù)代碼所用到的技術(shù)確實也比較少,但我們要明白“唯一不變的只有變化”,框架有可能要改進,組件可能要替換,現(xiàn)有技術(shù)可能已經(jīng)無法滿足業(yè)務(wù)需求,或者你換了一家公司,新公司既沒有組件也沒有框架,要你從頭開始來做。這些都是機會,也是挑戰(zhàn),而機會和挑戰(zhàn)只會分配給有準(zhǔn)備的人,所以這種情況下我們更加需要自學(xué)更多東西,因為真正等到要用的時候再來學(xué)已經(jīng)沒有時間了。
以java為例,大部分業(yè)務(wù)代碼就是if-else加個數(shù)據(jù)庫操作,但我們完全可以自己學(xué)些更多java的知識,例如垃圾回收,調(diào)優(yōu),網(wǎng)絡(luò)編程等,這些可能暫時沒用,但真要用的時候,不是google一下就可以了,這個時候誰已經(jīng)掌握了相關(guān)知識和技能,機會就是誰的。[!--empirenews.page--]
以垃圾回收為例,我自己平時就抽時間學(xué)習(xí)了這些知識,學(xué)了1年都沒用上,但后來用上了幾次,每次都解決了卡死的大問題,而有的同學(xué),寫了幾年的java代碼,對于stop-the-world是什么概念都不知道,更不用說去優(yōu)化了。
特別是很多開源軟件,更加需要自己平時去自學(xué),例如Nginx、Redis、Mongodb、ElasticSearch等,在合適的時機引入這些技術(shù),能夠帶來很大的價值。
Do better
要知道這個世界上沒有完美的東西,你負(fù)責(zé)的系統(tǒng)和業(yè)務(wù),總有不合理和可以改進的地方,這些“不合理”和“可改進”的地方,都是更高級別的怪物,打完后能夠增加更多的經(jīng)驗值。識別出這些地方,并且給出解決方案,然后向主管提出,一次不行兩次,多提幾次,只要有一次落地了,這就是你的機會。
例如:
重復(fù)代碼太多,是否可以引入設(shè)計模式?
系統(tǒng)性能一般,可否進行優(yōu)化?
目前是單機,如果做成雙機是否更好?
版本開發(fā)質(zhì)量不高,是否引入高效的單元測試和集成測試方案?
目前的系統(tǒng)太龐大,是否可以通過重構(gòu)和解耦改為3個系統(tǒng)?
阿里中間件有一些系統(tǒng)感覺我們也可以用,是否可以引入 ?
只要你去想,其實總能發(fā)現(xiàn)可以改進的地方的;如果你覺得系統(tǒng)哪里都沒有改進的地方,那就說明你的水平還不夠,可以多學(xué)習(xí)相關(guān)技術(shù),多看看業(yè)界其它公司怎么做,BAT都怎么做。
我2013年調(diào)配到九游,剛開始接手了一個簡單的后臺系統(tǒng),每天就是配合前臺做數(shù)據(jù)增刪改查,看起來完全沒意思,是吧?如果只做這些確實沒意思,但我們接手后做了很多事情:
解耦,將一個后臺拆分為2個后臺,提升可擴展性和穩(wěn)定性;
雙機,將單機改為雙機系統(tǒng),提高可靠性;
優(yōu)化,將原來一個耗時5小時的接口優(yōu)化為耗時5分鐘
還有其它很多優(yōu)化,后來我們這個組承擔(dān)了更多的系統(tǒng),后來這個小組5個人,負(fù)責(zé)了6個系統(tǒng)。
Do exercise
在做職業(yè)等級溝通的時候,發(fā)現(xiàn)有很多同學(xué)確實也在嘗試Do more、Do better,但在執(zhí)行的過程中,幾乎每個人都遇到同一個問題:光看不用效果很差,怎么辦?
例如:
學(xué)習(xí)了jvm的垃圾回收,但是線上比較少出現(xiàn)FGC導(dǎo)致的卡頓問題,就算出現(xiàn)了,恢復(fù)業(yè)務(wù)也是第一位的,不太可能線上出現(xiàn)問題然后讓每個同學(xué)都去練一下手,那怎么去實踐這些jvm的知識和技能呢?
Netty我也看了,也了解了Reactor的原理,但是我不可能參與Netty開發(fā),怎么去讓自己真正掌握Reactor異步模式呢?
看了《高性能MySQL》,但是線上的數(shù)據(jù)庫都是DBA管理的,測試環(huán)境的數(shù)據(jù)庫感覺又是隨便配置的,我怎么去驗證這些技術(shù)呢?
框架封裝了DAL層,數(shù)據(jù)庫的訪問我們都不需要操心,我們怎么去了解分庫分表實現(xiàn)?
諸如此類問題還有很多,我這里分享一下個人的經(jīng)驗,其實就是3個詞:learning、trying、teaching!
1)Learning
這個是第一階段,看書、google、看視頻、看別人的博客都可以,但要注意一點是“系統(tǒng)化”,特別是一些基礎(chǔ)性的東西,例如JVM原理、Java編程、網(wǎng)絡(luò)編程,HTTP協(xié)議。。。。。。等等,這些基礎(chǔ)技術(shù)不能只通過google或者博客學(xué)習(xí),我的做法一般是先完整的看完一本書全面的了解,然后再通過google、視頻、博客去有針對性的查找一些有疑問的地方,或者一些技巧。
2)Trying
這個步驟就是解答前面提到的很多同學(xué)的疑惑的關(guān)鍵點,形象來說就是“自己動手豐衣足食”,也就是自己去嘗試搭建一些模擬環(huán)境,自己寫一些測試程序。例如:
Jvm垃圾回收:可以自己寫一個簡單的測試程序,分配內(nèi)存不釋放,然后調(diào)整各種jvm啟動參數(shù),再運行的過程中使用jstack、jstat等命令查看jvm的堆內(nèi)存分布和垃圾回收情況。這樣的程序?qū)懫饋砗芎唵?,簡單一點的就幾行,復(fù)雜一點的也就幾十行。
Reactor原理:自己真正去嘗試寫一個Reactor模式的Demo,不要以為這個很難,最簡單的Reactor模式代碼量(包括注釋)不超過200行(可以參考Doug Lee的PPT)。自己寫完后,再去看看netty怎么做,一對比理解就更加深刻了。
MySQL:既然有線上的配置可以參考,那可以直接讓DBA將線上配置發(fā)給我們(注意去掉敏感信息),直接學(xué)習(xí);然后自己搭建一個MySQL環(huán)境,用線上的配置啟動;要知道很多同學(xué)用了很多年MySQL,但是連個簡單的MySQL環(huán)境都搭不起來。
框架封裝了DAL層:可以自己用JDBC嘗試去寫一個分庫分表的簡單實現(xiàn),然后與框架的實現(xiàn)進行對比,看看差異在哪里。
用瀏覽器的工具查看HTTP緩存實現(xiàn),看看不同種類的網(wǎng)站,不同類型的資源,具體是如何控制緩存的;也可以自己用Python寫一個簡單的HTTP服務(wù)器,模擬返回各種HTTP Headers來觀察瀏覽器的反應(yīng)。
還有很多方法,這里就不一一列舉,簡單來說,就是要將學(xué)到的東西真正試試,才能理解更加深刻,印第安人有一句諺語:I hear and I forget. I see and I remember. I do and I understand,而且“試試”其實可以比較簡單,很多時候我們都可以自己動手做。
當(dāng)然,如果能夠在實際工作中使用,效果會更好,畢竟實際的線上環(huán)境和業(yè)務(wù)復(fù)雜度不是我們寫個模擬程序就能夠模擬的,但這樣的機會可遇不可求,大部分情況我們還真的只能靠自己模擬,然后等到真正業(yè)務(wù)要用的時候,能夠信手拈來。
3)Teaching
一般來說,經(jīng)過Learning和Trying,能掌握70%左右,但要真正掌握,我覺得一定要做到能夠跟別人講清楚。因為在講的時候,我們既需要將一個知識點系統(tǒng)化,也需要考慮各種細(xì)節(jié),這會促使我們進一步思考和學(xué)習(xí)。同時,講出來后看或者聽的人可以有不同的理解,或者有新的補充,這相當(dāng)于繼續(xù)完善了整個知識技能體系。
這樣的例子很多,包括我自己寫博客的時候經(jīng)常遇到,本來我覺得自己已經(jīng)掌握很全面了,但一寫就發(fā)現(xiàn)很多點沒考慮到;組內(nèi)培訓(xùn)的時候也經(jīng)常看到,有的同學(xué)寫了PPT,但是講的時候,大家一問,或者一討論,就會發(fā)現(xiàn)很多點還沒有講清楚,或者有的點其實是理解錯了。寫PPT、講PPT、討論PPT,這個流程全部走一遍,基本上對一個知識點掌握就比較全面了。
[!--empirenews.page--]6
后記
成為技術(shù)大牛夢想雖然很美好,但是要付出很多,不管是Do more還是Do better還是Do exercise,都需要花費時間和精力,這個過程中可能很苦逼,也可能很枯燥,這里我想特別強調(diào)一下:前面我講的都是一些方法論的東西,但真正起決定作用的,其實還是我們對技術(shù)的熱情和興趣!