最近推薦一個(gè)朋友來網(wǎng)易面試,這哥們?cè)谛S工作6年,研發(fā)經(jīng)驗(yàn)非常豐富,但他卻掛在了技術(shù)終面。
事后和他約了個(gè)飯,深聊了一次發(fā)現(xiàn)他的技術(shù)成長(zhǎng)路徑還是有點(diǎn)問題。
軟件開發(fā)行業(yè)需要經(jīng)驗(yàn),需要時(shí)間來沉淀,但從我個(gè)人發(fā)展情況以及帶過的下屬來看,這種成長(zhǎng)絕非線性成長(zhǎng),而是突變式成長(zhǎng)。
所謂突變式成長(zhǎng)就好比豹變和頓悟,仿佛一下子打開了任督二脈成為高手。而硬幣的另一面是:不少工作10年的人,從經(jīng)驗(yàn)和能力上考量和他剛畢業(yè)1、2年差距不大。
“我們以為我們是工作了10年,其實(shí)卻只有一年的經(jīng)驗(yàn),只不過又重復(fù)用了九年”。
不少朋友雖然工作了很多年,但他們很少學(xué)習(xí)計(jì)算機(jī)體系基礎(chǔ)知識(shí)、很少在debug能力上突飛猛進(jìn)、很少去研究計(jì)算機(jī)底層知識(shí)和原理。除了最初幾年能成長(zhǎng),之后一直停滯不前,而且他們不明白為什么。
這樣的朋友在工作3、5年后,想進(jìn)大廠很難,即便是在中小廠也很難成為架構(gòu)師或者高級(jí)工程師。
而有些同學(xué),才工作1,2年就能在工作中展現(xiàn)出優(yōu)秀的能力、承擔(dān)重要模塊的研發(fā)和攻堅(jiān),甚至能獨(dú)立做一個(gè)大的產(chǎn)品。
今天結(jié)合和這個(gè)讀者朋友的深聊以及過去12年帶團(tuán)隊(duì)的經(jīng)驗(yàn),講講作為程序員我們需要避開的4種表現(xiàn):
1.不重視底層技術(shù)
應(yīng)用層的技術(shù),程序員們?yōu)榱送瓿晒ぷ饕欢〞?huì)大量學(xué)習(xí),但其實(shí)底層技術(shù)同樣重要,甚至更重要。
那么哪些是底層技術(shù)呢?拿windows C++技術(shù)棧舉例:
C++語(yǔ)言高級(jí)特性:運(yùn)算符重載(一元運(yùn)算符、二元運(yùn)算符、運(yùn)算符重載難點(diǎn)、項(xiàng)目開發(fā)中的運(yùn)算符重載)、多繼承及其二義性、虛繼承、多態(tài)、函數(shù)模板、類模板,模板的繼承、程序編譯鏈接機(jī)制、內(nèi)存布局(memory layout)、對(duì)象模型、各種容器的實(shí)現(xiàn)(vector、map、hashmap)等等;
算法和數(shù)據(jù)結(jié)構(gòu):尤其是和C++結(jié)合的算法能力及數(shù)據(jù)結(jié)構(gòu)的應(yīng)用能力,hash map、B+/B-樹、算法在C++容器中的效率應(yīng)用、DP(動(dòng)態(tài)規(guī)劃)等;
網(wǎng)絡(luò)底層:HTTP、HTTPS、DNS、ARP、TCP、IP、ICMP、UDP、FTP、SMTP、的實(shí)現(xiàn)底層;
多進(jìn)程/多線程編程:進(jìn)程通信的方式(共享內(nèi)存、pipe、Socket編程等)、同步、死鎖及解決方案、線程池的實(shí)現(xiàn)、進(jìn)程/線程的操作系統(tǒng)實(shí)現(xiàn)原理、進(jìn)程的狀態(tài)及切換和調(diào)度等;
UI庫(kù)的實(shí)現(xiàn)機(jī)制:WTL的實(shí)現(xiàn)機(jī)制、QT的實(shí)現(xiàn)機(jī)制、Windows C++底層繪制原理(這塊簡(jiǎn)直博大精深)、窗口消息機(jī)制、DUI的實(shí)現(xiàn)機(jī)制等;
很多程序員朋友,完成業(yè)務(wù)開發(fā)沒什么問題,但一遇到系統(tǒng)性疑難雜癥,立馬就失去了方向。原因很多,但最重要的無疑是缺乏底層技術(shù)。
再舉個(gè)應(yīng)用場(chǎng)景的例子:一提到分布式鎖問題,大多數(shù)同學(xué)想到的方案是基于Redis的Master-Slave模式來實(shí)現(xiàn)。這個(gè)實(shí)現(xiàn)方案行不行?分布式鎖本質(zhì)是一個(gè)CP需求,基于Redis的實(shí)現(xiàn)是一個(gè)AP需求,乍一看基于Redis的實(shí)現(xiàn)是無法滿足的。
脫離業(yè)務(wù)場(chǎng)景來談架構(gòu)都是耍流氓。從技術(shù)戰(zhàn)略的需求層面來看,如果分布式鎖在極端情況下獲取鎖的不一致,社交業(yè)務(wù)場(chǎng)景能夠接受,那么基于Redis的實(shí)現(xiàn)是完全可行的。
如果業(yè)務(wù)是交易場(chǎng)景,分布式鎖在極端情況下獲取鎖的不一致性無法接受,那么基于Redis的實(shí)現(xiàn)方案是不可行的。在鎖強(qiáng)一致性的場(chǎng)景下,需要采取基于CP模型的etcd等方案來實(shí)現(xiàn)。
做出以上判斷,需要深度理解底層系統(tǒng)原理。缺乏了這種理解,無法做出正確的架構(gòu)抉擇,也自然會(huì)對(duì)工作造成不利影響。
夯實(shí)的底層技術(shù)還會(huì)讓你具備一通百通的能力,舊文說過:我們要進(jìn)入高手模式,能舉一反三。對(duì)于程序員來說,不清楚底層技術(shù)基本與高手無緣。
底層技術(shù)具備可遷移性,更上層的應(yīng)用技術(shù)卻被特化。
拿我自己舉例,早期積累了深厚的C++底層技術(shù)基礎(chǔ),2011年在cocs2d還沒成熟之際,自己用C++寫了一個(gè)小的游戲引擎,這套代碼應(yīng)用了大量windows C++的思想,這就是底層技術(shù)的可遷移性。
另外,大廠的面試官酷愛考察底層能力水平,諸如上來就讓你手寫算法、通過你的工作經(jīng)歷層層深入問下去,尤其是如何調(diào)優(yōu)之類。
2.不能在錯(cuò)誤中汲取教訓(xùn)
對(duì)于軟件開發(fā)人員來說,在工作中獲得反饋,并通過反饋矯正行為和方向非常重要。
這其中的重點(diǎn)是:在錯(cuò)誤中得到反饋,并汲取教訓(xùn),獲得成長(zhǎng)。
交付產(chǎn)品的BUG、一次code review的結(jié)論、領(lǐng)導(dǎo)對(duì)你提的建議等等,這些你是否記錄了、沉淀了,并力爭(zhēng)在下次得到進(jìn)步和改進(jìn)?
來自業(yè)務(wù)、產(chǎn)品和其他人的反饋,會(huì)讓我們明白自己的短板在哪,應(yīng)該如何針對(duì)性的學(xué)習(xí)和成長(zhǎng)。
很遺憾的是,不少同學(xué)不僅不會(huì)在錯(cuò)誤中成長(zhǎng),反而試圖掩蓋和消弭自己的錯(cuò)誤。
應(yīng)該怎么做:
對(duì)每個(gè)反饋保持積極的態(tài)度。你可以選擇接受或者拒絕,但都應(yīng)該保持平和和學(xué)習(xí)的心態(tài)。
從錯(cuò)誤中學(xué)習(xí)。沒有人能永遠(yuǎn)正確,終身學(xué)習(xí)才能讓自己持續(xù)強(qiáng)大。
3.習(xí)慣寫爛代碼
大部分優(yōu)秀程序員或多或少都有代碼潔癖,這是因?yàn)樗麄儼汛a和交付物當(dāng)作藝術(shù)品而不僅僅是完成一項(xiàng)工作。
關(guān)于這點(diǎn),我們看看曾經(jīng)是程序員大神的雷軍是怎么說的:
“編程的工作和石匠的工作相差不多,是技術(shù)活同時(shí)也是體力活,而編寫優(yōu)秀的軟件,是一件困難的事情。編程不僅僅是技術(shù),更是藝術(shù),也只有具備對(duì)藝術(shù)的追求,才能催生出更多優(yōu)秀的產(chǎn)品。”
缺乏經(jīng)驗(yàn)的程序員很難寫出優(yōu)美代碼,在看他們的代碼總有一種感覺:一不小心就陷入了迷宮,找不到方向和出口。
應(yīng)該怎么做:
在動(dòng)手寫代碼之前,設(shè)計(jì)出代碼框架并用StarUML等軟件繪制出代碼時(shí)序圖和類結(jié)構(gòu)圖;
重視命名規(guī)范和注釋,命名最好能起到部分注釋作用;
定期重構(gòu)代碼,無論是函數(shù)和類的抽離、還是架構(gòu)的優(yōu)化,在不影響業(yè)務(wù)開發(fā)節(jié)奏的基礎(chǔ)上,需要經(jīng)常做。
追求代碼的優(yōu)美還有一個(gè)很明顯的好處:會(huì)幫助你快速獲得結(jié)構(gòu)化能力和思維。
別懷疑,有經(jīng)驗(yàn)的技術(shù)面試官可以很輕松的考察出你的思維是否是結(jié)構(gòu)化的。
4. 盲目追逐新技術(shù)
很多開發(fā)人員總是在談?wù)摷夹g(shù)潮流,當(dāng)有了新的技術(shù)之際,他們總是異常興奮,快速投入這項(xiàng)技術(shù)的懷抱。
過了一段時(shí)間,更新的技術(shù)出現(xiàn)了,他們又拋棄了剛學(xué)會(huì)的前一項(xiàng)技術(shù)。
這就跟狗熊掰玉米一樣,他們總是在學(xué)習(xí)教程,并且總是虛幻的感覺自己都掌握了,但其實(shí)真正要掌握一項(xiàng)技術(shù)需要長(zhǎng)時(shí)間的實(shí)戰(zhàn)應(yīng)用并需要在反饋中前行。
限于公司業(yè)務(wù)的穩(wěn)定性,他們學(xué)習(xí)的新技術(shù)大部分不會(huì)應(yīng)用于線上產(chǎn)品,自然很難得到實(shí)踐和反饋。
應(yīng)該怎么做:
從工作中需要的技術(shù)學(xué)起,再應(yīng)用到工作中,同時(shí)從線上得到反饋并改進(jìn)。
即便學(xué)習(xí)和工作無關(guān)的新技術(shù),也要做一些實(shí)際的應(yīng)用或者小玩意出來。
2008年我剛加入騰訊,發(fā)現(xiàn)我們的QQ游戲大廳調(diào)用游戲程序存在1%左右的失敗率,這之后我深入學(xué)習(xí)了管道通信和共享內(nèi)存通信,并做了一個(gè)調(diào)用失敗立即切換的SDK,替換了原有的多進(jìn)程通信的方式。上線后失敗率下降到1/1000,這個(gè)過程讓我真正掌握了新技術(shù)。
以上四點(diǎn)真正在工作中做到,相信大家的進(jìn)步速度會(huì)明顯加快。另外程序員常見的一些問題也需要規(guī)避下,比如養(yǎng)成工作摸魚的習(xí)慣、傲慢自大(新手在學(xué)到一些知識(shí)之后,很容易站在愚昧之巔)等。
程序員朋友在職場(chǎng)的前5、6年,一定要想辦法進(jìn)大廠,雖然大廠不一定是職場(chǎng)終點(diǎn),但大廠有這些優(yōu)勢(shì):海量用戶量、健全的福利、完整的培訓(xùn)體系、完善的晉升制度,它們會(huì)助力大家的發(fā)展。
本文(含圖片)為合作媒體授權(quán)創(chuàng)業(yè)邦轉(zhuǎn)載,不代表創(chuàng)業(yè)邦立場(chǎng),轉(zhuǎn)載請(qǐng)聯(lián)系原作者。如有任何疑問,請(qǐng)聯(lián)系editor@cyzone.cn。