我剛開始工作的頭幾年是緊張學(xué)習(xí)的時間。
我得面對現(xiàn)實,成為軟件工程師需要有很多技能,這些我之前都不知道。回顧過去,顯然學(xué)會那些東西是很好的。
所以我就根據(jù)自己及其他人的經(jīng)驗寫了這篇指南來幫助入行的新人。
本文將覆蓋以下內(nèi)容:
如何盡力做好面試
如何在軟件工程師的角色中生存(及發(fā)展)
考慮持續(xù)改進時可以參考的資源
面試
當(dāng)你開始軟件工程職業(yè)生涯時,你得面對一個無可爭議的事實。面試很惡心。
參與其中的每個人都覺得很惡心。既被人面試過又面試過別人的我可以證明,面試是一項極其耗時、極其有壓力的工作,并且面試其實并不是將來工作表現(xiàn)一個的好的指示器。但不管怎樣,這都是一個必要之惡,你和你的簡歷最好還是做好準(zhǔn)備為妥。
做好戰(zhàn)斗準(zhǔn)備
如果你考慮做軟件過程,確保了解一些最常見的編程面試問題,比如“FizzBuzz”:
寫一個程序打印從 1 到 100 的數(shù)字。但是如果數(shù)字是 3 的倍數(shù)的話則打印“Fizz”,如果數(shù)字是 5 的倍數(shù)則打印“Buzz”。如果同時是 3 和 5 的倍數(shù)則打印“FizzBuzz”。
來自 Coding Horror
聽起來很簡單,是吧?
好吧,但其實絕大部分面試者都沒能通過這一簡單的測試,且不說更復(fù)雜的變種了。
我個人曾經(jīng)見過很多角逐資深崗位的候選人在擁有完全互聯(lián)網(wǎng)訪問的情況下沒能通過這一測試。所以如果你的簡歷上面列有編程語言的話,確保你知道如何用它來編寫實現(xiàn) FizzBuzz 程序。否則的話,你只不過是在浪費所有人的時間,包括你自己的。
當(dāng)然,為了在面試過后生存,你需要知道的不僅僅只有 FizzBuzz。你還需要確保你知道:
基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法:比如鏈表、數(shù)組、樹以及排序。
要知道所選擇語言的常見解決辦法,比如字符串是否恒定,內(nèi)存是如何管理的。
類似類與對象,以及繼承等面向?qū)ο缶幊痰母拍睢?/p>
在職業(yè)生涯開始時,你需要就這些問題做好準(zhǔn)備,因為你并沒有經(jīng)歷去證明自己能做好這份工作。在準(zhǔn)備面試的時候有兩個資源我會經(jīng)常推薦:
《Cracking the Coding Interview(破解面試代碼)》,這是一本非常好的書,里面介紹了很多的編碼問題和解決方案,同時還總結(jié)了解決這些問題需要了解的東西。
CodeWars ,這個網(wǎng)站收集了大量的編程問題,你可以運用各種語言在瀏覽器里面去解決這些問題。最有用的部分是看看別的用戶是如何解決同樣問題的。這樣你就可以看到解決相同問題的不同辦法,并且學(xué)到你所選語言的新工具。
賦予自身額外優(yōu)勢
為了讓自己取得那點額外優(yōu)勢,有幾件事情你可以去做。
首先,學(xué)會如何溝通你的經(jīng)驗。你應(yīng)該進行一次電梯演講來將你的簡歷總結(jié)成連貫的、打動人的個人介紹。
此外,要了解自己的簡歷!聽起來很蠢是吧,但我就見過很多面試者連解釋清楚自己簡歷上的特定事項都很困難。你應(yīng)該能夠回答任何有關(guān)你列上簡歷的經(jīng)歷方面的問題,并且解釋清楚這一經(jīng)歷如何讓你成為本工作更好的候選人。
接著,要在 GitHub(或者其他的公共代碼庫)上面有一些編碼的例子。
眼見為實,面試官能夠看到你的代碼將創(chuàng)造奇跡。此外,這還證明了你對版本控制系統(tǒng)有了解。
你的代碼例子不需要太復(fù)雜,但是一定要整潔,能夠顯示出好的編碼實踐。這是你展示自己在沒有編碼面試所帶來的時間壓力情況下代碼寫得如何的機會。
一旦你做完了上面的事情后,就得考慮參與一個開源項目了。參加開源項目能表明你能夠在已有代碼庫基礎(chǔ)上工作并且可以與其他程序員一些協(xié)作。
這是你在無需實際進入一個行業(yè)環(huán)境的情況下最接近在行業(yè)環(huán)境下編程的方式了。這也是目前為止最難最耗時的一項任務(wù),所以等到你把前面我提到的比較容易取得的果實都摘完之后再干這件事。
面試你的面試官
在找工作的匆忙與壓力之下,很多候選人都忘了面試是一個雙向的過程。在公司努力尋找這份工作的合適人選時,你也應(yīng)該設(shè)法弄清楚這家公司適不適合你。
確保你也要提出以下一些問題,哪怕對方是以電子郵件的形式回復(fù)你。要意識到公司經(jīng)常把不遵循最佳實踐說成是一項技能,所以要體會其言外之意。
以下是一些你可以去提問的例子:
“對我來說典型的工作日會是什么樣的?”
知道特定崗位預(yù)期的樣子很重要,因為軟件工程工作差別相當(dāng)大。比方說你的工作既可能是維護服務(wù)器,也可能是直接跟客戶溝通。
危險信號:“我不大肯定?!?→ 意味著面試你的那個人不在你的團隊,或者他們對為什么要招你并沒有明確的想法。
“你們是如何測試軟件的?”
理想情況下,驗證代碼質(zhì)量應(yīng)該是單元測試、人工測試以及自動化測試的結(jié)合。
危險信號:“我們都寫不出 bug,哈哈?!?→ 那些人正是會寫出 bug 的人。
“你們使用什么樣的版本控制系統(tǒng)?”
版本控制系統(tǒng)對于協(xié)作極其有用,在職業(yè)環(huán)境下沒有理由不使用。
危險信號 #1:“額,版本控制系統(tǒng)?” → 快跑,跑得越遠(yuǎn)越好。
永遠(yuǎn)記得使用版本控制。
危險信號 #2:“《插入不知名的或者定制的 VCS》” → 這表明他們很有可能沒有跟上時代并且很久沒有升級自己的基礎(chǔ)設(shè)施了。
“你們進行同行評審嗎?”
同行評審,或者讓別人看看你的代碼再把它放進代碼庫,這是識別愚蠢錯誤的極好辦法,同時也是開始你的職業(yè)生涯時一個關(guān)鍵的培訓(xùn)機會。
危險信號:“我們相互信任!”→很有可能那些資深開發(fā)者對自己的代碼非常警惕不想給人看也不擅長接受反饋。
“你們的繼續(xù)教育計劃是什么樣的?”
作為一名軟件工程師意味著當(dāng)新技術(shù)出現(xiàn)、成熟并以令人眼花繚亂的速度走向過時的時候要不斷學(xué)習(xí)。因此,很多公司都有培訓(xùn)預(yù)算用來買大學(xué)和在線課程、會議或者內(nèi)部交流。
危險信號:“你是說在閑暇時間讀讀網(wǎng)上的東西?” →這家公司要么資金緊張,要么把開發(fā)者視為可替代的,而不是長期投資。
“你們采用的軟件開發(fā)流程是什么?”
無論實際的細(xì)節(jié)是什么,流程對于軟件工程都至關(guān)重要。至于哪些東西對于優(yōu)化流程做出了貢獻可能大家會有不同的看法,但僅就項目的工作方式達(dá)成一致就能將混亂最小化并且確保每個人都能達(dá)成共識。
危險信號:“我們的流程受到了自由風(fēng)格的爵士的影響?!?→ 很有可能整個部門都處在救火模式,總是不斷地從緊急跳到另一個緊急狀態(tài)而缺乏任何明確的目標(biāo)。
“你們是如何處理技術(shù)債務(wù)的?”
技術(shù)債務(wù)是過時技術(shù)以及代碼庫中臨時應(yīng)急的解決方案的累積。處理好技術(shù)債務(wù)對于代碼的長期健康很重要,這件事情應(yīng)該持續(xù)地做。
危險信號:“我們只關(guān)注新功能?!?→ 他們的代碼庫一團糟或者很快就會一團糟。
“你們的公司文化是什么樣的?”
公司文化也許是個非常含糊的概念,但即便像開放辦公室還是小隔間這樣的小事情都會顯著改變你與同事的日?;?。這方面沒有普遍性的危險信號,但是要確保他們的答案是你可以按照每周 40+ 小時的節(jié)奏持續(xù)相處數(shù)年的東西。
以軟件工程師的身份工作
在這個階段,如果你面試過程中表現(xiàn)不錯并且喜歡面試官回答你問題的方式,你被錄用的可能性就很高了。
祝賀,你正式成為一名工程師了!
那現(xiàn)在又該如何呢?好吧,現(xiàn)在是時候重新學(xué)習(xí)大量編碼和工作方面的東西了。既然我們是程序員,我們就從討論代碼開始。
好的行業(yè)代碼
好的行業(yè)代碼有以下屬性,依序是:
可讀性,因為代碼用來讀和維護的頻次要高于寫。代碼的意圖必須清晰,讓其他開發(fā)者在多年后依然理解。
防御性,就是要遵循防御性編碼的最佳實踐。防御性編碼本身就是一個課題,不過其要義是:你必須確保自己所寫的類和方法的不恰當(dāng)使用不會導(dǎo)致你的代碼搞得軟件都崩潰。
優(yōu)化,位列清單的最后未知,因為大多數(shù)時候你并不需要真正去擔(dān)心這個。這并不意味著你應(yīng)該編寫糟糕代碼,在存在線性解決方案的情況下以O(shè)(n3)的效率去做某個東西。但開發(fā)者通常渴望嘗試并且會在不需要的情況下過度優(yōu)化,卻犧牲了代碼的可讀性和防御性。你永遠(yuǎn)都應(yīng)該能夠證明犧牲了這些屬性的特定優(yōu)化是值得的。
現(xiàn)在你了解了如何去編寫良好的行業(yè)代碼了。
編碼的工作你不會干太多的
說出來也許有點令人吃驚,但是大多數(shù)時候你都不用寫新代碼,而是相反,要做:
調(diào)試
讀已有代碼
開會或者寫電子郵件
研究該怎么做以便不用寫代碼
因此編碼以外的技能對你的職業(yè)一樣關(guān)鍵。
調(diào)試和閱讀代碼
調(diào)試遠(yuǎn)不僅僅是用打印語句。一切使用廣泛的語言和技術(shù)棧都有各種強大的工具。學(xué)會使用它們,因為這些會讓調(diào)試輕而易舉,節(jié)省你無數(shù)的時間。
理解代碼庫。大多數(shù)技術(shù)棧都有某種代碼圖譜生成工具來幫助你理解代碼庫的結(jié)構(gòu)。企業(yè)級的 IDE 通常都內(nèi)置了那種功能。你還可以利用 ReSharper、grep 或者 Sourcegraph 之類的工具來探索代碼。
理解產(chǎn)品。你會對居然有這么多開發(fā)者在試圖“修復(fù)”軟件前不知道軟件應(yīng)該是怎么工作的感到驚訝。先看看文檔再說吧。
組織你的思路
既然你的大量時間都是用在溝通、研究和多任務(wù)上,你需要一些工具來幫助一切井然有序。
TODO 清單/任務(wù)工具:你的公司應(yīng)該已經(jīng)有了某種任務(wù)管理軟件了,但你自己也有類似的個人系統(tǒng)是有幫助的。使用便利貼或者像 Trello 或者 Todoist 之類的軟件。
筆記:開會一定要記筆記,要致力于改進現(xiàn)有文檔并且建立個人的知識庫。使用 Evernote、OneNote 或者筆記本。使用這些工具似乎有用力過度之嫌,但日后在回顧這一耗掉了你 3 天時間才想清楚的晦澀的開發(fā)過程時你會感謝自己的。不做豐富筆記的好的軟件開發(fā)者我一個都沒見過。
圖表/可視化:人是視覺動物,創(chuàng)建流程圖和架構(gòu)可幫助你和其他人理解復(fù)雜的話題。在跟非技術(shù)人員溝通時圖解尤其有用。可使用 Lucidchart、 Visio 或者白板。
知道何時使用庫
簡短回答:隨時都要。
詳細(xì)回答:99% 的時間內(nèi)你都不應(yīng)該重新發(fā)明輪子。在大多數(shù)的軟件工程崗位,實現(xiàn)特定類型的東西都屬于純粹浪費時間。這并不意味著你不應(yīng)該知道所使用的算法和數(shù)據(jù)結(jié)構(gòu)是怎么工作的,因為這可以幫助你決定用什么以及什么時候用。
為了成為一名高效的軟件工程師,你需要理解自己可以任意支配使用的那些庫。大多數(shù)流行語言的標(biāo)準(zhǔn)庫都是極其有用的,其規(guī)模比你想象的要大。此外,代碼庫也許也會利用了額外的特殊庫。閱讀其文檔,知道什么使用去使用它們。
你還應(yīng)該不要害怕去建議額外的庫,如果它們將節(jié)省時間的話。然而,你需要確保自己選擇了一個好的庫供行業(yè)使用。好的庫的標(biāo)準(zhǔn)是:
開源,這樣你就可以驗證自身代碼的質(zhì)量,并有可能修補對應(yīng)用非常關(guān)鍵的 bug。
按照 MIT 和 BSD 等方式進行的授權(quán),這樣你的公司使用起來就不會遇到任何問題。要小心 GPL,因為它會讓你不小心就將整個代碼庫都開源出去。
成熟,比方說出來已經(jīng)有一段時間了,并且功能集非常豐富。
維護性強,新版本推出很密集。
別的公司或者項目也使用,這個可以充當(dāng)品質(zhì)認(rèn)證確保有行業(yè)支持,能持續(xù)維護下去。
持續(xù)改進
為了替自己創(chuàng)建新的職業(yè)機會,除了學(xué)習(xí)會讓你更擅長日常工作的技能以外,你還需要持續(xù)改進自身技能并且學(xué)習(xí)新技能。
其實學(xué)習(xí)的機會有很多,而且其中很多都是你可以負(fù)擔(dān)得起的:
在線課程:向領(lǐng)域內(nèi)最好的教授學(xué)習(xí)的機會,而且方式靈活,不容錯過?,F(xiàn)有技能的補充性教程可以去可以看看 Coursera、 Udacity 以及 edX 等。
在線碩士學(xué)位:在線碩士學(xué)位是最近在頂級大學(xué)流行起來的一個趨勢,這種方式可以靈活地繼續(xù)你的正規(guī)教育。相比之下,這種繼續(xù)教育方式費用沒那么昂貴,修完整個學(xué)位大多數(shù)在 1 萬美元左右。喬治亞理工大學(xué)、UT 以及加州大學(xué)圣地亞哥分校等大學(xué)均提供此類學(xué)位。我個人推薦喬治亞理工大學(xué)的在線碩士虛偽,我去年剛從這里畢業(yè)。
博客:博客是開發(fā)者社區(qū)的重要組成部分。諸如 Coding Horror、Joel on Software 等博客或者甚至更加詼諧的網(wǎng)站如 The Daily WTF 等都可以為你提供信息,了解到作為軟件工程師該干什么不該干什么。瀏覽 Medium、r/programming, HackerNews 等新聞流也能讓你找到好博客和好文章。
會議:最后但并非最不重要的一個,會議時令人贊嘆的學(xué)習(xí)機會,你絕對應(yīng)該利用公司的培訓(xùn)預(yù)算去參加會議。以下是不完全的好會議清單:GOTO(通用), Strange Loop(通用), PyCon (Pytho),CPPCon (C++),DEF CON (安全),F(xiàn)luent (Web 開發(fā))。上述所有的會議在 YouTube 上都有視頻,所以你哪怕不出席也能學(xué)到東西!
希望這篇文章能夠用相關(guān)知識把你武裝起來,讓你了解到作為軟件工程師的職業(yè)生涯伊始應(yīng)該期待什么,并且提供合適的工具給你在開啟這段令人興奮的旅程中助你一臂之力!
-
軟件工程師
+關(guān)注
關(guān)注
8文章
218瀏覽量
21135
發(fā)布評論請先 登錄
相關(guān)推薦
評論