首先聲明,這一篇文章並非完全原創,它的靈感來源於一篇我最近在Medium上讀到的英文博客:ABC: Always Be Coding。我在這篇文章的基礎上做了一些修改以及加入了一些我個人的感受,大家如果英文OK想要直接感受原文的,可以點擊閱讀原文跳轉。
首先,我們來做一個簡單的測試,測試一下大家的面試情況。x是你拿到offer的數量,y是你進入到二輪面試的數量,我們來根據一下公式來計算一下分數:
本文當中包含很多建議,這些建議大概可以分為技術建議(Technical Tips)以及總體建議(General Tips)兩個部分,我們一個一個來看,首先是大家最關心的技術建議。
這個很好理解,和practice makes perfect是一個意思,即孰能手巧。編程既然是一門技術活那麼一定的訓練量就是必須的,也一定會有一個熟能生巧的過程。一段代碼或者是一個算法第一次寫起來非常費勁是正常的,經過多次練習之後,會迅速熟悉起來,之後再來寫就要容易多了。
但是由於不同的語言以及不同的人學習曲線可能不同,所以很多人會在自己進入熟練階段之前就放棄,這無疑是非常可惜的。最好的練習方式就是專注練習,也就是有明確的目標,知道練習的對象以及目的是什麼。這樣有兩個好處一個是不會陷入迷茫,第二個可以通過記錄練習的結果來清晰地獲得反饋,既可以調整練習的頻率以及強度,也可以對自己的進度有所了解。
這一塊大家應該都有所了解,就不多贅述了。
首先解釋一下多範式的含義,範式是編程當中經常出現的一門術語。看起來很玄乎,但是它表示的意思非常簡單就是編程所使用的方法,比如面向對象就是一種編程範式,同樣函數式編程也是一種範式,面向過程也是一種範式。所以多範式語言也就是擁有多種編程範式的語言,比如我們常用的C++、Java、Python等都是多範式語言。
這裡的英文原文用的單詞是master,這也是我翻譯成精通的原因。也就是說對於這一門語言僅僅是粗淺的會使用以及熟悉是不夠的,必須要對語言的方方面面都有所了解,一些常用特性更是了如指掌,這樣才稱得上是精通。精通一門語言的好處非常多,既可以幫助我們學習其他以這門語言為基礎的技術,並且也會大大提升我們的開發能力以及學習其他語言和特性的能力,是非常非常重要的。
當然C++除外,因為沒有人能精通C++,就連C++的作者也覺得自己只精通了80%。
很多人會在面試之前瘋狂在網上搜索麵經,這是非常好的行為,可以幫助我們了解到應聘公司的提問範圍以及面試風格。但是這應當是準備階段做的事,而不是面試前臨時抱佛腳做的。相比於死記硬背面試的時候可能會出現的題目,我們更應該打好我們的編程(算法)基礎。
夯實基礎的一個表現是搞清楚常用算法的複雜度,大家可以看下下方的cheatsheet,當中包含了所有常用算法的複雜度以及一些其他的基本信息。
www.bigocheatsheet.com
當然僅僅知道複雜度還是不夠的,還需要自己親手實現一下這些算法,比如Dijkstra算法,Floyd-Warshall算法、旅行商問題、A*算法、布隆過濾器、BFS、DFS以及各種排序算法、最近點對問題等等。想要做點這些沒有其他任何取巧的辦法,只有剛才說的always be coding.
另外,適當的練習也是必不可少的。這裡作者推薦了著名的編程競賽網站TopCoder,我個人感覺TopCoder的曲線略微陡峭,可以使用codeforces代替,LeetCode中的題目質量沒有大家想像的那麼高,不要過度依賴LeetCode。作者提到刷題至少需要40小時以上的時間,並且需要涵蓋各種算法。比如遞歸、模式匹配、貪心、動態規劃、圖論等等。
Heck提到他花了兩周的時間投入在TopCoder當中,就是簡單的重複重複再重複。兩周結束之後他甚至可以做到單手閉眼寫出Dijkstra算法(當然是玩笑)。但這裡面的道理是明確的,就像Eric Schmidt說的那樣,Repetition doesn't spoil the prayer,重複永不辜負。
不要依賴語言當中現成的各種數據結構的庫,儘可能自己動手實現一下。
對於這一點我也非常贊同,雖然現在各種庫都非常完善,但是只會使用它們和真正了解掌握它們其實是兩碼事。很多細節和道理是只有親自實現一下才能get到的,比如hashmap為什麼不是線程安全的,為什麼hashmap的數組長度永遠是2的冪?這些問題如果不親自動手,單單看博客文章是很難理解深刻的。即使記住了,過後也很容易忘記。
我之前也在公眾號當中使用Python實現過各種各樣常用的算法和數據結構,感興趣的同學可以翻一翻算法數據結構專題回顧一下。
對於工程師來說編程可能是整個工作當中最簡單的部分,因為在開始編碼之前你需要對項目以及功能進行設計,甚至還需要對架構進行設計。這需要你對相關領域有著非常豐富的經驗以及了解,在編碼完成了之後,可能需要對性能進行測試,對項目投入使用進行維護,這當中一定會出現大量的問題需要解決和修復。這兩點都比單純的編碼要困難,所以不要讓自己害怕編碼,編程其實是很單純的工作,可以讓人全身投入,要儘量學會享受這個過程。
其次是訓練自己白板編程的能力,其實不只是谷歌,現在各大公司都越來越喜歡在面試中添加白板編程的環節。對於許多人來說在面試官的注視並且沒有IDE的幫助下進行白板編程並不是那麼一件容易的事情,這是需要訓練的。如果大家想要去外企以及一些比較著名的公司,那麼白板編程的能力是必不可少的。
如果你在面試的時候你對於正在面試的公司,他們的業務,他們現在做的事情,以及目標一無所知的話,那麼最好放棄。
如果是大公司可能還好,但如果是小公司的話,這種情況一定會扣不少分。對自己未來可能的僱主做基本的了解也是職業素養之一,這除了可以體現我們的專業性之外其實對我們自己的職業生涯的發展也是非常有幫助的。我們對未來僱主的了解越多,其實也說明了我們對於自己職業生涯規劃越清晰,知道自己下一份工作是什麼樣的。長遠來看,這是非常關鍵的。
如果一些問題不是百分百確定,不要想當然,一定要查閱資料或者是找人求證。無論是在面試還是在實際工作當中都是如此,對此我也非常非常贊同。
很多人會習慣性地對一些問題做假設,尤其是不是非常熟悉或者是了解的事情。比如遇到了某一個報錯信息,通過某一個命令解決了,他們就會下意識地覺得這個命令就是針對這個報錯信息的,而不去細究這其中的原理究竟是什麼。很有可能之後因為其他原因遇到了同樣的報錯信息,他們就歇菜了。
所以對不是完全了解的事情不要做假設,不知道就去了解、學習,千萬不能想當然。
如果你自己對一件事情不在意,別人也同樣不會在意,因此保持熱情非常重要,它可以讓你充滿了幹勁。因為人往往只能在自己有熱情的領域做出成績,所以問一問自己,我們有讓自己充滿了熱情的事情嗎?
比如說想要自己做一個個人網站或者是APP?比如說想要自己做一臺無人機?還是想要做好自己的一個技術博客呢?其實對什麼有熱情不重要的,重要的是讓自己找到這麼一個充滿熱情的領域。
看到這裡,如果我告訴你們Heck沒有讀過大學,大家會不會感到很震驚呢?
其實我倒不覺得意外,因為從字裡行間我能感覺到這是一個對於技術以及自己有著非常高要求的人,並且對於生活和編程充滿了熱情。有熱情它並不一定可以讓我們把一件事情做好做成功,但是它可以推動著我們朝著成功的方向不斷努力,路途遠並不可怕,可怕的是沒有動力了。
最後,讓我們再回顧一下那一句經典的忠告吧:
Always be coding.
今天的文章就到這裡,衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支持吧~(點讚、在看、轉發)