在這節課里,我想通過對刷題、簡歷、面試這幾方面的探討,跟大家分享自己在面試準備過程中的切身體會和經驗總結,希望能對大家有所幫助。
#### 刷題
刷題是必不可少的環節。
無論你是剛剛畢業的計算機系的學生,還是已經有了很多年工作經驗的工程師,你即將要面對的是高強度的面試。每個公司平均都有好幾輪技術面試,包括電話面試和現場面試,每輪面試的時間是 45 分鐘到 1 個小時,除去聊天談話的時間,每一輪留給你的時間大概就是 30 分鐘,要能拿到優秀的結果,一般都必須解答出兩個算法題,而你要面試的公司可能不止一家。那么,要讓自己始終保持良好的水準,沒有一個強化訓練的輔助,你是很難過關的,因此刷題就是必不可少的環節。
但是在刷題之前,必須要先弄清楚一個問題:你要選擇什么編程語言?
#### 選擇編程語言
這往往取決于你的求職崗位是什么。
如果你要做一名前端的網絡工程師,那么你必須要能熟練地用 JavaScript 去解算法題。如果你要做一名后端的工程師,那么可以選擇的就很多了,其中 Java,Python 和 C++ 都是首選。如果你想要做一名數據分析工程師或者涉及機器學習和人工智能方向的,Pyhton 是不二選擇。
我個人在剛開始刷題的時候用的是 Java,雖然我平時的工作并不用它,但是我發現,用 Java 刷題有幾個好處。
1. Java 是強類型語言,它能幫助我更好地理解輸入輸出的要求,對于每個變量的類型我都要清楚。
2. Java 提供豐富的類庫,比如 Deque、PriorityQueue、LinkedList、Stack 等,有了這些,我可以更加專注于對算法本身的思考,而不用考慮如何去實現這些數據結構。這些庫拿來用就好,節省了我很多時間。
3. LeetCode 上的很多題目都有 Java 的解法,如果一道題目我做不出來,就會看看 LeetCode 的解法,比較方便。
后來我明確地知道自己要做一名前端的網絡工程師,在決定跳槽去大廠的時候,不得不用 JavaScript 去重新刷題,這樣一來,我浪費了不少時間。所以在選擇語言的時候,多考慮自己的求職方向和崗位要求。我的方法是大量聯系大廠的招聘專員,獲取專業的建議。
**刷題方法
**
選擇好了編程語言后,接下來要考慮的就是怎么合理地刷題了。
現在 LeetCode 上面有上千道題目,究竟要刷多少道題才行呢?其實最關鍵的不是量的問題,而是質的問題,而且由時間決定。
首先,根據自己平時的刷題速度,預留足夠的刷題時間。
我在刷題的時候,會給自己至少三個月的時間專心刷題,周一到周五每晚分配 2 個小時,周末也會刷。有時候由于要兼顧工作,平時晚上沒有太多時間,我就會多留點時間到周末,把平時沒有刷的題在周末補回來。根據平時的刷題速度,我可以計算出在這三個月的時間內,自己能一共做多少題。
然后,刷題時可以有選擇性地分類做題。
接下來,我按照 LeetCode 的題目分類去做。先做樹的題目,然后是圖論,因為圖論可以看作是樹的一種擴展,然后是遞歸、回溯,之后是 DFS、BFS,然后是動態規劃,最后是字符串和數組。分類刷題有如下幾個好處。
1. 能有效地鞏固知識點。
2. 幫助整理解題的思路和歸納方法。
3. 能有效地提高解題的速度。
另外,要練習如何在白板上寫代碼。
很多大廠都要求你在白板上寫代碼,大家不要小看了這點,很多人都認為用電腦做了幾百道題之后,還怕在白板上寫代碼么?在白板上寫代碼的感覺跟敲鍵盤是完全不同的,有幾點需要注意。
1. 字跡要清晰。這樣一來面試官才能很好地跟你探討代碼,更重要的是,面試官要記錄下你寫的代碼,然后原封不動地遞交給招聘委員會的成員或者其他人審核,如果因為字跡不清導致記錄失真就很不好了。
2. 間距要把握好。有些白板并不大,要能夠在一塊小白板上擠下很多代碼是不可能的,這就要看你如何規劃代碼的書寫了,這些都要通過不斷地練習。
3. 思路清晰。寫白板,是你和面試官溝通的一個重要環節,你的任務是要清晰地展現自己的思路,將它們轉變為代碼,并且,你要確保面試官能跟上你的節奏。如果你東寫一點函數,西寫一點結構定義,那就會很凌亂。
鍛煉寫白板的能力,最好的方法就是找一塊白板,在它上面練習。一般這個可以在你擁有了一定的刷題量的基礎上進行,不必一開始就這樣練習。另外,也可以在紙上練習,把紙想象成白板,也能達到很不錯的效果,尤其對鍛煉清晰的筆跡有很大的幫助。
為了避免遺忘,養成整理回顧的習慣。
刷題的時候,會出現一種情況,之前刷過的題目一下就忘記了。要克服這種情況的出現,我用下面的辦法。
1. 周末的時候回顧一下這一周做過的題目,主要是整理思路。
2. 把這周里出現的難啃的題目單獨拿出來,記錄到難題筆記里,反復看。
3. 刷題的時候,盡量把思路理清,而不是記代碼。
最后,一定要把自己刷過的題目和最好的解法寫下來。
我的方法是寫到 GitHub 上,這樣可以幫助我反復查閱。如果大家有興趣,可以到我的 GitHub 上看看我的 JavaScript 刷題詳解,鏈接如下。
https://github.com/jeantimex/javascript-problems-and-solutions
以上就是我對刷題的一些經驗。
#### 簡歷
簡歷就是你的門面,好的簡歷能讓你在眾多的求職者中脫穎而出。很多公司的職位都是很有限的,如果招聘人員能夠快速準確地從你的簡歷里找出他們想要的東西,比如你的技術,經驗,或者研究成果等,那么你就會有更大地機會進入到面試的環節,另外,最重要的一點,想一想你為了能面試這家公司,付出了那么多的心血去刷題,最后因為簡歷沒能被看上而與機會失之交臂,那是多么多么的不應該啊!可以說,好的簡歷是打開面試機會的大門。
* [ ] 怎么樣去寫好一份簡歷呢?
一、要有針對性
你的簡歷必須要凸顯出你才是適合這個職務的不二人選。
每個職務的招聘一般都會有一些基本的要求,比如某個職務要招的是前端網絡工程師,要求有 5 年以上的工作經驗,精通 JavaScript,HTML5,CSS3,熟悉 React 框架等,那么你的簡歷必須要想辦法體現出你能滿足上面的基本要求。
可以通過你的工作履歷表來體現出你有 5 年以上的工作經驗,通過羅列出與前端相關的技術名詞作為你所擁有和掌握的技術來體現你適合這個崗位的技術需求。有些人既懂得 Java,SQL,也懂得 JavaScript,但是在簡歷當中卻把 JavaScript 羅列在了后面,有時候會讓人覺得 JavaScript 也許并不是你的強項,也許你更適合做后端的工程師。換句話說,你的簡歷必須要能投其所好。
二、寫好工作履歷
招聘人員會把大部分時間花在閱讀你的工作履歷上。對于一個要謀求軟件工程師職務的人的簡歷,必須要做到以下幾點。
1. 對于以往的每一份工作,都必須寫明公司的名稱,起始時間和終止時間。
2. 針對每份工作,言簡意賅地羅列出自己做過的項目,以及你在項目中扮演的角色。
3. 最好能體現出每個項目最終的結果以及所帶來的影響。
在羅列項目的時候,最好能寫明,你在這個項目中扮演的角色是什么,采用了什么樣架構,使用了什么編程語言,解決了什么問題,達到了什么效果或者產生了什么樣的影響。
三、控制頁數
大廠的招聘人員,一般都會在每天分配出固定的時間來審閱大量的簡歷,你的簡歷一般都是以電子版的形式存儲在系統中,招聘人員通過關鍵字搜索來找出合適的簡歷,然后加以閱讀。通常,你的簡歷最好不要超過兩頁,最好能控制在一頁。
#### 面試
當你拿到面試通知的時候,離成功就差最后一步了,只需要你在面試中好好表現,發揮出你的水平。
面試不光是腦力活,同時也是體力活,如何讓你的腦力和體力都能跟上高強度的大廠技術面試呢?一種比較行之有效的方法就是多拿一些中小型公司練手。
中小型公司有時候比較傾向于考察你的經驗,這是一個鍛煉你跟面試官交流經驗的絕佳機會,更重要的是,通過這些練手,能讓你更好地梳理自己的技術經驗,總結出適合你自己的交談風格,這樣,當你在大廠里被問到工作經驗相關的問題時,就能脫口而出,而且條理清晰,這些其實跟刷題一樣,都是要通過不斷地練習的。
另外,中小型公司也會考察算法題,但是難度一般來說不會特別難,這是一個檢驗你算法和數據結構知識水平以及能不能寫出高質量代碼的難得的訓練機會。有些中小型公司的技術面試也是出了名的難,如果你在這些面試中失敗了,這是好事,你要從中吸取教訓,把答得不好的題反復思考一下,在哪里跌倒就在哪里爬起來。
總之,通過一些真刀真槍地實戰,可以幫助你迅速地調整面試的狀態,記住,你的最終目標是你心儀的公司,不要被中間的一兩個失利的戰斗影響到自己,找出問題所在,為下一個面試做好準備。
下面我想說一下現場面試,現場面試真正要考察的是下面幾個方面。
1. 你的技術水平夠不夠硬。
也就是說,你能不能在 30 分鐘之類寫出一道簡單的題目以及一道中等甚至更難的題目。如果你的知識點不夠牢固,寫題的速度不夠快,是非常難過這關的。但是,只要你努力刷題,一定會有好的結果。
2. 你分析問題的能力。
當面試官給你出問題的時候,他最希望的,并不是看到你拿到題目立即寫出答案,而是希望你能跟他交流,把你的想法說明白。就好比你和面試官是同事,你們在一起討論問題一樣,只不過他對這個問題早已有了自己的想法,他想聽聽你的意見,說不定你的方法更好。
3. 你將思想變為代碼的能力。
如果你和面試官的交流過程中,能始終呈現出一種狀態,迅速地將自己的思考轉變為代碼,然后清晰地寫在白板上。就算你不能完美地寫出一道題目的答案,我相信面試官也一定會滿意的,因為這要比那些只能夸夸其談而寫不出代碼的人要強太多。
4. 檢查和分析代碼的能力。
一般在你寫出了代碼后,面試官會讓你舉幾種情況來考慮看看你的算法是否行得通。最好的做法就是你自己要主動地提出來,然后給出幾個比較有代表性的測試輸入,然后過一遍你的程序,分析出結果。最后,一定要去分析一下時間和空間復雜度。
以上就是我的一些面試經驗。
#### 結語
到這里,我們的算法課正式結束。老話說,“書山有路勤為徑,學海無涯苦作舟“,衷心地祝大家都能如愿以償,找到自己最喜歡的工作!