【科技公司Offer拿到手軟】軟體工程師在北美找工作/跳槽的終極武器 |刷題是什麼?

生活沙龍
36 位粉絲
11 觀看·2022年10月30日
哈囉 YouTube 好久不見
沒錯 距離我上次發影片已經過了三個月的時間
那這段時間我們都在幹什麼呢?
除了在家耍廢之外
我還花了時間去準備了一下面試
然後真的去面了幾家公司
結果是出乎意料的還不錯啊
那至於我面了什麼公司 什麼職位
還有我自己的跳槽理念呢
我下次有機會再來跟大家分享
那今天的主題是講
對一個想成為軟體工程師非常重要的祕密武器
或者是說必經之路
那就是刷題
那什麼是刷題呢?
刷題其實顧名思義就是
不斷的去練習那些申請軟體工程師崗位
尤其是在北美這些大的公司裡面
他面試會問的這些題目去準備
就像你考試之前會做模擬考練習那樣子一樣重要
那這些問題到底是什麼題呢?
其實這個問題可以非常的廣
從最基礎的設計一個HashMap
或是Stack
到叫你寫一個算法
你要在一個Ray裡面
找出最優的序列組的排序組合
都有可能出現在一輪45分鐘的面試裡面
其實這個的用意就是判斷一下
你有沒有能力成為一個好的軟體工程師的基礎跟底子
然後這些題目大部分都圍繞在
演算法跟數據結構這兩個topic上面
假如你在學校學的是電腦科學
或是資工這方面的領域
那恭喜你你已經有一定的基礎
因為像例如最基本的Binary Search
HEAP
Quick Sort
或是甚至到比較難比較複雜的Dynamic Programming
這方面的基礎知識
你應該都有接觸過
或是甚至練習過
所以當你重新看到這些東西的時候
應該不會感覺到太陌生
但是假如你跟我一樣上課都在鬼混
這些東西早就已經還給老師了
或者是你不是電腦科學畢業的
也不用太擔心
因為你完全可以在有限的時間內
通過練習達到一模一樣的效果
但是這就比較考驗你的耐心
還有不輕易被挫折打敗的能力
那為什麼要刷題呢
我自己有面過各種大大小小
詭異的公司的面試經驗
並不是所有公司都會正規的考你
算法、數據結構等
到你需要特別去準備那個地步
例如有些公司會考你怎麼設計API
一些基本的REST原理
或是頂多就叫你去Reverse一個Linguist
假如你有電腦科學的基礎
或是一些工作經驗
這些通常都難不倒你
也不需要特別去準備
或甚至我遇過問我某種語言專門的知識
比如說叫我解釋JavaScript的AsyncEventLoop
那確實跟刷題都沒什麼多大的關係
不過根據經驗
通常一家好的
願意支付你高於市場價格薪水的科技公司
都會有至少一到兩輪的這種
算法、數據結構的題目
如果你的Title是Software Engineer
Full Stack Engineer
或是Senior Software Engineer
那練習刷題一定會大大的提升
你在這輪面試中成功的機率
那假如你今天是Manager
這些公司還會考你算法教你寫扣碼
其實是有可能的
我知道很多大公司在面Manager的時候
至少會保留一輪的面試
看你寫扣的基本功還在不在
隨著你的年資跟級別的增長
考這些題的數量跟難度都會慢慢的減少
例如Stack級別的工程師
工資更看重的是你係統設計的能力
還有帶團隊完成項目的人力
一定還會考算法
但是難度跟比重
相對一個L3 L4的工程師來講會低一些
By the way
如果你想知道各種級別的工程師
在矽谷能賺多少錢
你可以來看我之前發的這支影片裡面
有詳細的介紹
在我介紹刷題的方法之前
我想先跟大家聊聊
為什麼這些公司要考
或許實際上面工作不會真正遇到的
這些算法還有數據結構的問題
其實當你在一家大公司工作
尤其是你可能是比較底層的軟體工程師
你頂多就是寫一些application
寫一些API
然後在數據庫那一層寫一些query
或者是在前輩已經寫好的框架上面加一些features
基本上這些工作的九成
都跟這些刁鑽的算法面試題沒什麼兩關係
我到現在都還沒有真的看過
有人在工作上面會自己去需要寫一個try
或是在graph裡面找一個minimum spanning tree
況且要是真的遇到需要這方面的知識
上網Google一下比較好了
當你還保有這些基礎的狀態下
遇到一些特殊的問題
你可以更快去反應
去找到解決問題的方法
舉個例子
我自己就曾經做過一個project
需要用到quadtree來存geolocation
雖然我當時也是直接上網找一個現成的library直接用
但是假如我沒有電腦科學的基礎知識
我可能會沒辦法去理解
為什麼要用quadtree這種高效能的搜索數據結構
而不是簡單的就把所有東西存在一個list裡面就好了
這時候就明顯的體現了一個工程師有沒有這些基礎的區別
再來就是為什麼考演算法
舉一個簡單的例子
從一個array裡面找最大值
或許有十幾種不同的寫法
但是每一種寫法
他的時間跟空間的複雜程度都不一樣
如何在合理的時間範圍內
寫出相對優化的時間跟空間複雜程度的代碼
就可以很容易看出一個工程師他的程度好不好
而且你寫code的style也會非常重要
公司會重視說你寫的code是不是一般人可以看得懂
因為當你進入公司之後
你寫的東西肯定不是隻有你一個人看而已
熟悉刷體的技巧
還有不間斷的練習
都可以大大提升你拿offer的機會
其實大部分的公司都是要刷體這個套路
其實你想想就是一個很死板的考試制度
就是花時間去準備
甚至有些人直接靠著死背幾百道題
就進了Google跟Facebook
但是我覺得這些不斷追求創新創意的高科技公司
到現在還在用這種老舊的考試制度
去面試一個軟體工程師
是有他的原因的
第一個就是我之前提到的技術的基本面評估
再來就是公司希望錄取兩種人
第一種就是天才型的工程師
這種人通常舉一可以反六
他們平常可能不太需要怎麼準備
就可以秒殺大部分的算法面試題
平常的興趣可能就是去讀那些文章
怎麼去優化數據庫的算法
或是他們本身就是算法競賽的選手
閉著眼睛就可以倒背如流
KMP算法的那些人
不過這種人大概在一萬個工程師裡面
可能只存在一個
再來就是像我這種普通智商的普拿疼
但是就是肯勤奮努力去花時間刷體
這就充分體現了一個很重要的人格特質
就是你至少肯努力學習
上進心比較強
這種人在團隊裡面成功的機率
不一定會輸給天生的天才
你要知道一輪45分鐘面試
時間方面是非常有限的
面試官其實很難在這麼短的時間內
全方位的評估這個人是否有能力
在團隊裡面做出傑出的貢獻
還有優秀的團隊合作能力
Google其實做過很多study
這種看似死板的面試方法
其實可以很有效
在短時間內以低成本的方式
找到他們需要的工程師
當然我個人認為
這絕對不是一個最好評估工程師的方法
而且每個公司都應該
根據他們所需要的人才
去設計一個更適合他們去評估工程師的方法
但是假如你的目標是找一個高薪的工作
或是進入這些數一數二科技的大廠
那你就得熟悉他們的遊戲規則
刷體的方法有很多種
其實本質就是你要去多練習這些題庫
然後去熟悉各種題目的解決技巧
還有它背後的思考方式
然後找到一套適合你自己的學習方法
很重要的一個就是
千萬不要死背答案
因為這不僅沒有達到學習的效果
面試官只要稍微把題目改變一下
你可能就不知道怎麼解決問題了
我是有遇到面試官
直接把原題一字不變的複製貼上
但是這種情況真的非常的少
大多數都會把題目變化成
我沒有見過的樣子
但是核心的解決方法
跟吃入其實都是差不多的
只要反覆多練習
掌握這些核心的概念
能夠舉一反三的話
基本上就沒什麼問題了
而且其實能考的東西就是那些
考太難沒有必要
也沒有任何意義
然後你能在有限時間內
提出不同的解法
然後最後實現相對優化的算法
之後有機會我會跟大家分享一些
比較經典的題目
那這些題目到底在哪裡找呢
網路上其實有很多資源
可以讓你免費練習刷題的地方
有些付了錢之後
可以解鎖一些特別的題目
或是特殊的服務
在這邊呢
我沒有打廣告的推薦了Liko
因為它的題庫還有整體的用戶體驗
我覺得是最棒的
在這個平臺上你可以免費註冊一個帳號
不需要付任何的錢
你就可以開始練習大部分的題庫
然後它的online judge也是非常完善的
就是當你把code寫完交上去之後
它會跑各種不同的test cases
告訴你的算法在這一道題裡面
是相對跟其他人遞交的算法的
這個速度跟用的空間
是在多少的percentage裡面
我覺得Liko最有特色的一點就是
它每一道題都有一個討論區
那討論區裡面
大家都會分享自己的算法跟解題的方式
然後大家可以給每個帖子投票
通常最多人upload的那個帖子就是
基本上就是最好的那個算法
或是思路最清楚
你可以點進去看它
並學習它是怎麼去做出這種寫法
因為通常這是最多人贊同的一個做法
對於這道題來說
那通常你在面試中能提出相似的思路
或是正確的把這個code寫出來的話
這一輪很有可能就被面試官設為是
strong hire
另外在Liko平臺上
少數的題目它有提供官方的解答
但是我覺得這些答案的參考價值都不高
我反而更喜歡在討論區看
各路高手的解答思路還有解答方法
除了Liko之外
我還另外推薦兩個平臺
一個叫Linko跟Hackerrank
這兩個平臺呢
其實也是相對類似Liko這樣子的
能讓你練習刷題的地方
那其實你只需要一個就夠了
因為基本上Liko本身自己就已經有
大概快1700道題的題目
那在Linko裡面呢
每一道題都會分三個等級
分別是easy medium跟hard
那我會建議新手先從easy的題目開始做
因為假如你在看easy的題目
都沒辦法提出一個正確的解答方法
或是完整的把code給寫出來的話
那你基本上沒有必要去看
medium跟hard的題目
因為這只會讓你更焦慮
或是更想放棄而已
當你慢慢的把一些easy的題目熟悉之後
可能大概做了30道題50道題之後
你就可以慢慢接觸medium的題目
至於hard的題目的話
我會建議一開始先做一些比較經典的題就好了
因為畢竟hard的題目在真正面試中
其實不常出現
而且解法跟實現相對來講要比較困難
通常你如果沒有看過這道題的話
很難在有限時間內
提出一個相對比較優的解法
甚至把它實現出來
我自己是面過一家公司
他連續兩輪都考我hard的題
那這真的是比較少見
我覺得畢竟大多數的題目都是考在
在medium或是有時候偏easy的範圍之內
所以我推薦最好練習各種難度題目的比例
大概座落在easy可能30%
然後medium就是60%
然後hard就是10%就可以了
至於要做多少道題才夠
這個問題真的是一人而已
有些人悟性非常的高
他可能只要做100道題
他就可以應付90%的面試
以一個正常人來說
我會建議以300道題這個數字為基準
雖然lico他自己本身的題庫已經到達了1700道題
但是當你徹徹底底的做完300道題之後
你會發現你可以掌握大部分的解題技巧了
然後應用這些解題技巧
融會換同時去解決更多的問題
還有一個很重要的一點就是
這300道題不是說你做完一遍就沒事了
第一次刷題的話
你可能會有很多挫折感
或許在你第一次刷這300道題裡面
你就看了290道題的答案
自己真正獨立完成沒看答案的題數
可能手指頭都數得出來
我可以跟你講不用灰心
這是非常正常的
我要你回去重新把這300道題再做一遍
這是試著盡量不要看答案
看你能做多少道題
然後在做題的時候可以自己寫一些筆記
去記錄一下你自己當時的思路是怎麼樣
就這樣重複練習到你能看到題的時候
就想到正確的思路
並且在35分鐘之內把算法給實現出來
我覺得很重要的是
你能把這300道題練習到
深刻體悟到他這題目背後要考你的東西
這遠比馬馬虎虎的邊看答案邊做題
硬著頭皮把1000道題寫完的效果要來強得很多
因為在刷題活動裡面
最最最最最重要的是練習你解題的技巧
還有正確的思路
至於哪300道題呢
假如你用理科的話
他每一道題都有一個編號
從1到1600多到1700
基本上你可以從1到300開始做
我覺得這就是一個很好的開始
那有些題他的這個被考的頻率其實沒有很高
或是你覺得這道題對你沒有特別的有幫助
你可以直接skip掉那一題
還有在理科上面
假如你付錢的話
你可以解鎖一個功能
就是你可以看哪些公司最近剛考的題目有哪些
或是這家公司最熱門的100道題有哪些
這些在你面試前的兩三天去準備
我覺得是非常有幫助的
比如說你今天在面Google之前
你去看一下Google所有的高評題有什麼
但是我個人認為就是
你應該先把基本功打好
而不是先去特別看哪些公司要考什麼
能在面試中被選為strong hire
刷題絕對不是唯一你需要準備的東西
但是絕對是一個比較基礎
並且可以快速提升你在面試中成功機率的葵花寶典
在一輪面試裡面
公司也會非常看重你的soft skill
run實力
例如跟面試官的交流能力
你有沒有可以虛心接受批評的態度
有沒有團隊意識跟合作能力
都是面試裡面評判的標準
再來就是隨著你的級別上升
公司會越來越看重你係統設計的能力
這個其實也是有辦法去準備的
我下次有機會呢
會另外再發一個影片來特別介紹一下
系統設計的面試跟準備
但通常這種系統設計的面試呢
都會需要一些真正的工作經驗累積來加強
不像刷題那樣子
可以靠類似應付考試的方法去準備
好啦我在這邊總結一下
今天講的還有自己的刷題經驗
其實我很羨慕那些在大學的時候
就意識到刷題重要性的那些人
因為我自己不是讀電腦
或是職工這方面的領域
所以我在大學的時候根本就不懂這些東西
我是進入這行之後才發現自己基本功不好
然後靠著自己一點一點
跌跌撞撞摸索出來的
至今呢我大概自己是做了四百道題
其中有80%以上的題目
我大概都做了三四遍以上
其實刷題並不難
難的是在能持之以恆
因為我相信很多都像我一樣
想要去更好的公司
或是拿更好的待遇
但是因為現在自己有本身的工作要做
只有下班的時候纔有時間去刷題準備
然後你下班通常都會很累
然後你可能又有其他亂七八糟的事情你要處理
所以其實真的能做到持之以恆刷題是非常困難的
但是我可以跟你保證
這是一個絕對非常值得的投資
假如你接下來幾年都想要做這個行業
刷題不僅大大的提升我面試的成功率還有自信
也大大的提升了我平常在寫code的功力
我很明顯的感覺到我寫code更簡單
更容易被人家讀懂
而且在review別人的code的時候
我也很自然的可以聯想到一些可以優化的建議
而且以長遠的角度來看
能去更好的公司拿更高的薪水
更快的往上爬
這個報酬遠遠超過幾個月的血汗努力
雖然刷題不是那種
你只要人生做一次就可以完全沒意義的事情
因為假如你今天兩年前刷過一千道題
但是你現在想要換工作
你還是得回去複習一下
因為這些東西其實說真的蠻容易忘記的
但是之前你已經做過了
所以下次複習的時候就不會比上一次做那麼痛苦
只會越來越輕鬆
另外一個還有很重要的就是
當你在真正要面試的前幾天
我會建議你找一個朋友或是有經驗的人
當你的面試官來模擬一下
實際面試的這個體驗跟經驗
然後一定要計時
因為你平常在刷題的時候
絕對沒有你上戰場那種緊張的氣氛
還有時間給你的壓力那種感覺
加上你如果是新手的話
然後面試官又不是非常的友善
那你可能真的會很緊張到
你沒辦法發揮平常練習那種狀態
那就會很可惜
最後我想講的是
像我這樣智商樸糊
以前國高中有時候都是吊車尾的人
也不是資工電腦科學畢業出來的人
通過努力練習
現在可以做到秒殺面試官
連續出hard題的狀態
我相信你也可以
