一份軟件工程行業生存指南

現在愈來愈多的人進入軟件工程行業,偶遇一份國外同窗寫的行業生存指南,讀來感受頗值得參考,簡單翻譯過來,分享一下。也許生存指南能更好得讓你在這個行業生存下來,並快速得到成長與發展。程序員


我遭遇了做爲一名軟件工程師的現實:我必須去掌握當時還不知道,但我將會須要的許多技能。回首過往,若是早知道我如今知道的這些事情,確定要好不少。面試

所以,我寫了篇指南,它源自早年我做爲專業人士去輔導程序員的經驗,以及我本人和我一些同事的經驗來幫助其餘人。算法

包括如下內容:編程

  1. 如何充分利用好面試;
  2. 如何在軟件工程師的工做中存活下來並茁壯成長;
  3. 以及在考慮持續改進時須要哪些資源。

1. 面試

當你開始你的軟件工程職業生涯時,你將不得不面對一個不爭的事實。面試糟透了。數組

對每個牽涉其中的人來講都是可怕的。做爲一名面試官和一名應聘者,我能夠證實面試是一個很大的時間無底洞,它包含極度的壓力,而且是一個很是糟糕的將來工做表現的指標。然而,它們是必要的邪惡,以致於你和你的簡歷都最好爲此作好準備。服務器

1.1 準備戰鬥

若是你正在考慮從事軟件工程,必定要學習一些最多見的編程面試問題,好比 「FizzBuzz」:微信

編寫一個將數字從 1 打印到 100 的程序。對於 3 的倍數就打印 ‘Fizz’ 而不是數字,對於 5 的倍數 就打印 ‘Buzz’。對於既是 3 又是 5 的倍數,就打印 ‘FizzBuzz’。數據結構

聽起來足夠簡單,對吧?數據結構和算法

好吧,絕大多數應聘者都沒有經過這個簡單的測試,更不用說其更復雜的變體了。編程語言

我我的見過許多高級職位的候選人在能夠徹底上網的狀況下都沒能經過這道測試。所以,若是你在簡歷中列出了一種編程語言,那麼你至少要知道如何使用它編寫 'FizzBuzz' 程序。不然,你就是在浪費全部人的時間,包括你的時間。

固然,你須要知道的應不止於 'FizzBuzz',才能在面試中倖存下來。你還須要確保你知道:

  • 基本數據結構和算法:例如鏈表、數組、樹和排序;
  • 你選擇的語言中,公共的 「常識」 問題」:例如字符串是否可變,內存是如何管理的;
  • 面向對象的編程概念,好比類和對象,以及繼承。

在你的職業生涯之初,你將須要在這些問題上表現出色,大放異彩,由於你尚未足夠的經驗來證實你會很勝任這份工做。

1.2 給本身額外的優點

有幾件事你能夠作,這會給你一些額外的東西。

首先,學會交流你的經歷。你應該有一個 「電梯演講」(在乘坐電梯的短期內的推薦演講)來把你的簡歷總結成一個連貫且吸引人的敘述。

另外,瞭解你本身的簡歷!這聽起來很傻,但我看到不少應聘者在艱難解釋簡歷上的某一特定項目。你應該可以回答你在簡歷上列出的任何經歷相關的問題,並解釋它如何使你成爲更好的候選人。

接下來,在 GitHub (或其餘公共代碼庫)上擁有代碼示例。

眼見爲實,面試官可以看到你的代碼但是會產生奇蹟的。此外,它還展現了你對代碼版本控制系統的理解。

代碼示例沒必要太複雜,但它們確實須要乾淨,並展現良好的編碼實踐。這是你的機會,在一個沒有時間壓力的編碼面試中展現你會如何編碼。

完成上述全部工做以後,就應該考慮參加一個開源項目了。顯示你能夠在現有的代碼庫中工做,並與其餘程序員協做。

這將是你身處工業編程環境以外,最接近工業編程環境的方法了。這也是迄今爲止最困難和耗時的方法,因此先把它留到最後,直到你把前面那些 「低垂的果實」 都摘了。

1.3 面試你的面試官

在求職的匆忙和壓力下,許多應聘者忘記了面試是雙向的。當公司試圖發現你是否適合這份工做的時候,你也應該弄清楚公司是否適合你。

確保你能夠問下面的一些問題,即便是在後續的電子郵件中。

下面是一些你能夠問的問題:

問題 #1
「對於我來講,一個典型的工做日會是什麼樣子?」

重要的是要明確對某個特定職位的指望,由於軟件工程的不一樣崗位差別很大。例如,你可能須要維護服務器或與客戶直接交談。

紅燈警示:「我不肯定。」 → 這裏的意思是面試你的人不是招聘你的團隊中的人,或者他們尚未一個清晰的認識爲何要僱用你。

問題 #2
「大家是如何測試軟件的?」

理想狀況下,應該使用單元測試、手動測試和自動化測試的組合來驗證代碼的質量。

紅燈警示:「咱們一般不寫 bug,哈哈。」 → 這樣說的傢伙正是寫 bug 的人。

問題 #3
「大家使用什麼版本控制系統?」

版本控制系統對於協做很是有用,沒有任何理由在專業環境中不使用版本控制系統。

紅燈警示 #1:「啊,版本控制系統?」 → (若他們不知道)趕快逃跑,跑得遠遠的。

紅燈警示 #2:一些模糊或自定義的 VCS 系統 → 代表他們極可能跟不上時代,很長時間沒有更新他們的基礎設施了。

問題 #4
「大家是否進行同行評審?」

同行評審,或讓其餘人在你提交到代碼庫前查看你的代碼,是發現愚蠢錯誤的極好方法,也是開始職業生涯時的一個重要的培訓機會。

紅燈警示:「咱們相互信任!」 → 這種狀況極可能是高級開發人員對他們的代碼具備自利的保護性,而不是很樂意收到反饋。

問題 #5
「大家有什麼繼續教育的計劃?」

做爲一名軟件工程師意味着不斷地學習,由於技術以眼花繚亂的速度出現、成熟和過期。所以,許多公司都有一個培訓預算,用於支付大學和在線課程、專業會議或內部講座的費用。

紅燈警示:「你是說在空閒時間上網閱讀東西嗎?」 → 這暗示公司要麼現金緊缺,要麼認爲開發者是可替代的,而不會長期投資。

問題 #6
「大家使用的軟件開發流程是什麼?」

不管實際細節如何,流程對於軟件工程都是相當重要的。關於什麼是最優流程的具體問題,須要進行激烈的辯論,但只要有一種商定的項目工做方式存在,就會盡可能減小混亂,並確保你們達成共識,保持一致。

紅燈警示:「咱們的過程是受自由形式的爵士樂啓發。」 → 代表極可能整個部門都處於消防模式,從緊急狀況跳到緊急狀況,缺少任何明確的目標。

問題 #7
「大家如何處理技術債?」

技術債是代碼庫中的一種過期技術和快但髒的解決方案的累積。解決這個問題對於代碼的長期健康是很重要的,而且應該持續地進行。

紅燈警示:「咱們只關注新特性。」 → 他們的代碼庫可能一團糟,或者它就快變得一團糟了。

問題 #8
「你的公司文化是怎樣的?」

公司文化多是一個很是模糊的概念,但即便是像開放式辦公室和隔間這樣的小事情,也會在很大程度上改變你與同事的平常互動。這裏沒有一般意義上的 「紅燈告警」,但要確保他們的答案可讓你每週忍耐 40+ 小時,並持續數年。

2. 做爲軟件工程師而工做

在這個階段,若是你在面試中表現出色,而且喜歡面試官對你問題的回答,那你極可能會被錄用。

恭喜,你已正式成爲一名軟件工程師了!

如今該談什麼了?是時候從新學習關於編碼和工做的不少事情了。既然咱們是程序員,就讓咱們從討論代碼開始吧。

2.1 好的工業級代碼

好的工業級代碼具備如下屬性,按順序排列:

  • 可讀性,由於代碼被讀取和維護的頻率比編寫要高。在你編寫代碼多年以後,其餘開發人員必須清楚代碼的意圖。

  • 防護性,遵循防護性編碼的最佳實踐。防護性編碼自己就是一個主題,但它的主旨是:你必須確保你編寫的類和方法被不當使用時不會致使軟件崩潰。

  • 優化的,這條在最後是由於大部分時間,你不會真得須要擔憂它。但這並不意味着,當存在線性解決方案時,你應該寫些執行效率爲 O(n³) 的爛代碼。但在有些沒必要要的時候,開發人員會渴望嘗試和過分優化代碼,這一般會損害代碼的可讀性和可防護性。你應該老是能證實作出某種優化而犧牲的可讀與防護屬性是合理的。

如今你已經知道如何編寫良好的工業級代碼了。

2.2 你不會編寫太多代碼

這可能使人驚訝,但大多數狀況下,你不會編寫新代碼,而是:

  • 調試
  • 讀已存在的代碼
  • 開會或者寫郵件
  • 研究該作什麼,這樣就不用編寫代碼了

所以,編碼之外的其餘技能對你的職業生涯也一樣重要。

2.3 調試和閱讀代碼

您須要的不只僅是用 print 語句進行調試。全部普遍使用的語言和技術棧都有各類強大的工具,學會使用它們,由於它們會使調試變得垂手可得,併爲你節省無數的時間。

理解代碼庫。大多數技術棧都有一些代碼圖形生成工具,能夠幫助你理解代碼庫的結構。企業級 IDE 一般內置這樣的功能。

理解產品。你將會驚訝的,在嘗試 「修復」 軟件以前,有多少開發人員不知道軟件應該如何工做。

2.4 整理思緒

因爲你的大部分時間將花在溝通、調研和多任務處理上,你須要一些工具來使得一切有序。

TODO List / 任務列表:你的公司應該已經有某種任務處理軟件了,可是擁有一個針對我的的軟件也是有幫助的。

注意事項:在會議上作筆記,努力改進現有文檔,創建我的知識庫。使用 Evernote、OneNote 或紙質筆記本,就像以往的舊時光同樣。這看起來可能有點過火了,但一年後,當你從新查看那個花了你 3 天的時間纔想出來的費解的設計過程時,你會感謝本身的。我從未見過一個優秀的軟件工程師,他不作大量的筆記。

圖表/可視化:人是視覺動物,建立流程和體系結構圖表將幫助你和其餘人理解複雜的主題。在與非技術同事交流時,圖表特別有用。

2.5 知道什麼時候使用庫

簡短答案:幾乎老是使用。

長篇大論:99% 的時間裏,你不該該從新發明輪子。在大多數軟件工程職位中,實現特定類型的排序徹底是浪費時間。這並不意味着你不該該知道所用的算法和數據結構是如何工做的,由於這將幫助你決定使用什麼以及什麼時候使用。

爲了成爲一名高效的軟件工程師,你須要瞭解可供你使用的庫。大多數流行語言的標準庫很是有用,比你預期的要大。此外,代碼庫還可能利用了額外的專門庫。閱讀他們的文檔,並知道何時使用它們。

若是額外的庫能夠節省時間,那麼你也不該憚於建議使用它們。可是,你須要確保選擇了一個良好的庫供工業級使用。一個好的庫是:

  • 開源,這樣你就能夠本身驗證代碼的質量,並可能修復對你的應用相當重要的 bug。
  • 寬容的許可證,例如 MIT 和 BSD,使用它們你的公司不會遇到任何問題。當心 GPL,以避免意外開源了你的代碼庫。
  • 成熟的,即它已經推出了一段時間,並有一套豐富的功能。
  • 在維護的,新版本常常發佈。
  • 被用於其餘公司或項目,這是一種批准可用的標記,並確保它有行業支持,並持續維護。

3. 持續進步

除了學習能讓你在平常工做中作得更好的技能以外,你還須要不斷地改進你的技能,學習新的技能,以便爲本身創造新的職業機會。

學習的機會不少,其中多數都是負擔得起的。

在線課程:不該錯過以靈活的形式向該領域最好的老師學習的機會。

在線碩士學位:最近在名列前茅的大學中,在線碩士學位是一種靈活的方式來繼續你的正規教育,它們一般也比較便宜。(譯註:國內不知道有沒有了,學位有時是個門檻)

博客:博客是開發人員社區的重要組成部分(這並不奇怪,由於你如今正在閱讀博客)。有時,博客能給你一些關於軟件工程師作什麼以及不作什麼的好想法。

會議:放在最後,但並不是最不重要。會議是一個驚人的學習機會,你必定要利用你公司的培訓預算去參加。

...

最後,但願這篇文章能讓你對做爲一名軟件工程師的職業生涯的起步階段有所瞭解,併爲你提供了在這一使人興奮的旅程中表現出色的工具。


做者:Valeri Alexiev
日期:2018-10-29
原文:A Software Engineering survival guide


寫點文字,畫點畫兒,記錄成長瞬間。
微信公衆號「瞬息之間」,既然碰見,不如同行。

相關文章
相關標籤/搜索