軟件工程師花費(fèi)大量時(shí)間通過練習(xí)leet code問題和完善簡(jiǎn)歷來獲得更好的面試通過可能水评。一旦他們最終被谷歌著隆、亞馬遜或其他公司錄用昼伴,他們可能會(huì)發(fā)現(xiàn):過去用來得到這份工作的技能與他們?nèi)粘9ぷ髦行枰募寄懿⒉黄ヅ洹?/p>
我們的團(tuán)隊(duì)受到 TechLead 創(chuàng)建的高效程序員七項(xiàng)技能的啟發(fā)茶袒。我們想提供我們自己對(duì)這個(gè)話題的看法。以下是我們總結(jié)的高效程序員的七項(xiàng)技能哈蝇。
1. 學(xué)習(xí)如何閱讀別人的代碼
除了你棺妓,每個(gè)人寫的代碼都是垃圾?實(shí)際上炮赦,能夠在別人的代碼之上繼續(xù)工作是一項(xiàng)有多重好處的偉大技能怜跑。
不管以前工程師的代碼是多么混亂或者考慮不周,您仍然需要能夠擴(kuò)展它。畢竟性芬,這是你的工作峡眶。同時(shí),這個(gè)“以前的工程師”也可能是一年前的你植锉。
這項(xiàng)技能在兩個(gè)方面對(duì)你有益辫樱。第一,能夠閱讀他人的代碼是一個(gè)了解什么是糟糕設(shè)計(jì)的好機(jī)會(huì)俊庇。當(dāng)你瀏覽別人的代碼時(shí)狮暑,你會(huì)知道什么是有效的,什么是無效的辉饱。更重要的是搬男,您可以了解什么類型的代碼對(duì)于其他工程師來說是容易擴(kuò)展的,以及什么類型的代碼難以擴(kuò)展彭沼。
你需要確保在閱讀他人代碼時(shí)盡可能多地找出問題所在缔逛。這樣,其他的工程師就會(huì)知道你是一個(gè)多么優(yōu)秀的工程師溜腐。確保您提出了關(guān)于可維護(hù)代碼和良好注釋的重要性觀點(diǎn)。這進(jìn)一步顯示了你在編程領(lǐng)域的優(yōu)勢(shì)瓜喇。
您的代碼應(yīng)該設(shè)計(jì)得非常好挺益,不需要任何文檔。事實(shí)上乘寒,如果你是一個(gè)好的程序員望众,你不需要任何文檔來說明你的任何代碼。這只是浪費(fèi)時(shí)間伞辛,更需要你花時(shí)間的是編碼和開會(huì)烂翰。
能夠閱讀別人亂七八糟的代碼的話,也使得在需要更新的時(shí)候變得容易蚤氏。這有時(shí)意味著更新您缺乏經(jīng)驗(yàn)的代碼甘耿。例如,我們?cè)?jīng)將一個(gè)腳本從 Powershell 更新到 Python 再到 Perl竿滨。我們?cè)赑erl方面的經(jīng)驗(yàn)有限佳恬,但我們?nèi)匀挥凶銐虻谋尘爸R(shí)來弄清楚這段腳本到底做了什么,并做出必要的改變于游。
這一切都來自于對(duì)所有代碼的良好理解以及能夠閱讀以往的代碼毁葱。閱讀別人的代碼會(huì)讓你變得有價(jià)值,因?yàn)檫@項(xiàng)技能甚至可以讓你接手那些讓別人難堪的過度工程化的系統(tǒng)贰剥。
2. 對(duì)壞項(xiàng)目的感覺
有許多技能需要花時(shí)間去學(xué)習(xí)倾剿。我們認(rèn)為值得了解的技能之一是理解什么項(xiàng)目不值得做,什么項(xiàng)目顯然是行尸走肉蚌成。
大公司總是有非常非常多的項(xiàng)目在進(jìn)行(老板自己都不知道有多少)前痘,其中有些項(xiàng)目可能永遠(yuǎn)都不會(huì)完成凛捏,即時(shí)完成了,可能對(duì)公司也沒有什么有利的影響际度。有些可能本身就沒有任何商業(yè)意義(至少對(duì)你來說不是) 葵袭,還有一些項(xiàng)目可能存在管理不善的問題。這并不是說當(dāng)你不認(rèn)可一個(gè)項(xiàng)目時(shí)乖菱,你應(yīng)該立即拒絕這個(gè)項(xiàng)目坡锡。最嗨還是看看項(xiàng)目干系人是如何看待這個(gè)項(xiàng)目的,如果他們自己都不能正確地解釋他們對(duì)這個(gè)項(xiàng)目的最終成果會(huì)怎么樣的窒所,那么可能這個(gè)項(xiàng)目就不值得做鹉勒。
此外,有些項(xiàng)目可能過于專注于技術(shù)而不是解決方案吵取,以至于從一開始就很清楚不會(huì)有太多的影響禽额。這個(gè)技能需要你在知道一個(gè)糟糕的項(xiàng)目到底是什么之前做很多糟糕的項(xiàng)目。所以皮官,不要過早地花費(fèi)太多時(shí)間試圖辨別每個(gè)項(xiàng)目脯倒。
在你職業(yè)生涯的某個(gè)時(shí)刻,你會(huì)擁有良好的直覺與意識(shí)捺氢。
3. 避免不必要的會(huì)議
無論您是軟件工程師還是數(shù)據(jù)科學(xué)家藻丢,會(huì)議都是必不可少的,因?yàn)槟枰軌蚺c項(xiàng)目經(jīng)理摄乒、最終用戶和客戶達(dá)成共識(shí)悠反。然而,也有一種傾向馍佑,會(huì)議會(huì)突然接管你的整個(gè)時(shí)間表斋否。這就是為什么學(xué)會(huì)如何避免不必要的會(huì)議是很重要的。
也許一個(gè)更好的詞是管理拭荤,而不是避免茵臭。這里的目標(biāo)是確保你把時(shí)間花在能夠推動(dòng)決策和幫助你的團(tuán)隊(duì)前進(jìn)的會(huì)議上。
最常見的方法就是每天抽出兩個(gè)小時(shí)的時(shí)間舅世,這是一個(gè)持續(xù)不斷的會(huì)議笼恰。通常,大多數(shù)人會(huì)在他們認(rèn)為有益的時(shí)候定期召開會(huì)議歇终。他們會(huì)利用這段時(shí)間來趕上他們的開發(fā)工作社证。
另一個(gè)避免開會(huì)以便完成工作的方法是在別人之前出現(xiàn)。就我個(gè)人而言评凝,我們喜歡早到追葡,因?yàn)橐话銇碚f,辦公室比較安靜。大多數(shù)早到的人和你一樣宜肉,只是想把工作做完匀钧,這樣就不會(huì)有人打擾你了。
這對(duì)個(gè)人貢獻(xiàn)者來說很重要谬返,因?yàn)槲覀兊墓ぷ餍枰覀兗凶⒁饬Φ臅r(shí)間之斯,而且我們不會(huì)和其他人交談。 是的遣铝,有時(shí)候你可能需要解決問題佑刷,你可能想和其他人一起工作。但是一旦你解決了阻塞問題酿炸,你只需要編碼瘫絮。它是關(guān)于進(jìn)入那個(gè)區(qū)域,在那里你不斷地在你的頭腦中有許多關(guān)于你正在做的工作的復(fù)雜的想法填硕。 如果你總是停下來麦萤,很難從中斷的地方重新開始。
4. 使用Git
一些計(jì)算機(jī)專業(yè)的學(xué)生在他們出道的那天就開始使用 Git 了扁眯。他們不需要專業(yè)人士指導(dǎo)就可以理解每一個(gè)命令和參數(shù)壮莹。其他人在他們的第一份工作中第一次體驗(yàn)到 GitHub。 對(duì)他們來說姻檀,Github 是一個(gè)地獄般的地方命满,充斥著混亂的命令和進(jìn)程。他們永遠(yuǎn)都不是100%的確定自己在做什么(備忘錄之所以流行是有原因的)施敢。
無論您的公司使用什么倉庫系統(tǒng)周荐,如果您正確使用它狭莱,該系統(tǒng)都是有用的僵娃,如果使用不當(dāng),則是一個(gè)障礙腋妙。一個(gè)簡(jiǎn)單的commit或push就可以讓你花上幾個(gè)小時(shí)來理清一些由多個(gè)分支合并組成的大雜燴默怨。此外,如果您經(jīng)常忘記使用倉庫的最新版本骤素,那么您還將處理不那么好玩的合并沖突匙睹。
如果您需要一個(gè) Git 命令備忘單,那么就做吧济竹。只要能讓你的生活更簡(jiǎn)單痕檬。
5. 編寫簡(jiǎn)單可維護(hù)的代碼
年輕的工程師可能會(huì)有一種傾向,那就是試圖將他們所知道的一切都實(shí)現(xiàn)到一個(gè)解決方案中送浊。有一種愿望梦谜,那就是把你對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)模式和新技術(shù)的理解用到你編寫的每一個(gè)代碼中唁桩。然后闭树,你就很有可能創(chuàng)建了一個(gè)不必要的復(fù)雜性,因?yàn)樗苋菀走^度依附于您過去使用過的解決方案或設(shè)計(jì)模式荒澡。
在復(fù)雜的設(shè)計(jì)概念和簡(jiǎn)單的代碼之間取得平衡报辱。設(shè)計(jì)模式和面向?qū)ο笤O(shè)計(jì)應(yīng)該盡可能的去簡(jiǎn)化宏觀計(jì)劃中的代碼。進(jìn)程越是被抽象单山、封裝和黑盒化碍现,就越難以調(diào)試和維護(hù)。
6. 學(xué)會(huì)說不饥侵,分清主次
這一條適用于團(tuán)隊(duì)中的任何角色鸵赫,不管你是財(cái)務(wù)分析師還是軟件工程師。但對(duì)于技術(shù)角色似乎每個(gè)人都更需要學(xué)會(huì)這一條躏升。如果您是一名數(shù)據(jù)工程師辩棒,您可能會(huì)被要求做更多類似開發(fā)方向的事情。一些團(tuán)隊(duì)需要數(shù)據(jù)提取膨疏,其他團(tuán)隊(duì)需要儀表盤一睁,其他團(tuán)隊(duì)又需要新的數(shù)據(jù)分析對(duì)接。
區(qū)分事情的優(yōu)先順序和說不佃却,是兩種不同的技能者吁,但它們緊密地交織在一起。優(yōu)先級(jí)區(qū)分意味著你只花時(shí)間在對(duì)公司有很大影響的事情上饲帅。然而复凳,說不有時(shí)只是意味著回避應(yīng)該由其他團(tuán)隊(duì)來處理的工作。對(duì)于所有角色而言灶泵,它們經(jīng)常同時(shí)出現(xiàn)育八。
這可能是一個(gè)很難獲得的技能,因?yàn)槟憧偸窍M米约旱姆绞饺M足每一個(gè)請(qǐng)求赦邻。尤其是你剛從大學(xué)畢業(yè)髓棋。你想避免讓任何人失望,而且你總是能得到大量的工作惶洲。但是按声,在大公司里總是有無窮無盡的工作量,所以一定要抓住關(guān)鍵:只承擔(dān)能做的事情恬吕。
有很多技能在面試中是沒有辦法測(cè)試和驗(yàn)證的签则,甚至在大學(xué)里都沒有教過。通常情況下铐料,這更多的是環(huán)境的限制渐裂,而不是缺乏讓學(xué)生暴露在真實(shí)環(huán)境中發(fā)展成長(zhǎng)的愿望侨颈。
7. 場(chǎng)景化思維
有一種技能在面試中很難測(cè)試,在大學(xué)學(xué)習(xí)時(shí)也很難復(fù)制芯义,那就是思考最終用戶可能會(huì)如何錯(cuò)誤地使用你的軟件哈垢。我們通常將其稱為場(chǎng)景化操作思維。
由于大部分編程都是維護(hù)性的扛拨,因此它通常意味著更改與其他代碼高度耦合的代碼耘分。即使是簡(jiǎn)單的更改也需要跟蹤對(duì)象、方法和 API的每一個(gè)可能存在引用的地方绑警。否則求泰,很容易意外地打破你沒有意識(shí)到的模塊連接。即使您只是更改數(shù)據(jù)庫中的數(shù)據(jù)類型计盒。
它還包括在進(jìn)入開發(fā)之前通過邊緣案例和整體化的高級(jí)設(shè)計(jì)進(jìn)行思考渴频。
對(duì)于開發(fā)新模塊或者微服務(wù)的場(chǎng)景就更加復(fù)雜,花時(shí)間去考慮所構(gòu)建的操作場(chǎng)景非常重要北启。想想未來的用戶可能需要如何使用您的新模塊卜朗,他們可能會(huì)如何不正確地使用它,可能需要什么參數(shù)咕村,以及未來的程序員是否會(huì)以不同的方式需要您的代碼场钉。
簡(jiǎn)單的編碼和編程只是問題的一部分。創(chuàng)建一個(gè)在你的電腦上運(yùn)行良好的軟件是很容易的懈涛。但是部署代碼可能出錯(cuò)的方式就會(huì)有很多逛万。一旦進(jìn)入生產(chǎn)環(huán)境,就很難說代碼將如何使用批钠,以及哪些其他代碼將附加到原始代碼中宇植。五年后,未來的程序員可能會(huì)對(duì)你的代碼局限性感到沮喪埋心。