如今越來越多的人進入軟體工程行業,偶遇一份國外同學寫的行業生存指南,讀來感覺頗值得參考,簡單翻譯過來,分享一下。也許生存指南能更好得讓你在這個行業生存下來,并快速獲得成長與發展。
我遭遇了作為一名軟體工程師的現實:我必須去掌握當時還不知道,但我将會需要的許多技能。回首過往,如果早知道我現在知道的這些事情,肯定要好很多。
是以,我寫了篇指南,它源自早年我作為專業人士去輔導程式員的經驗,以及我本人和我一些同僚的經驗來幫助其他人。
包括以下内容:
- 如何充分利用好面試;
- 如何在軟體工程師的工作中存活下來并茁壯成長;
- 以及在考慮持續改進時需要哪些資源。
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
寫點文字,畫點畫兒,記錄成長瞬間。
微信公衆号「瞬息之間」,既然遇見,不如同行。