美國軟體工程師求職指南 – 面試技巧

Coding Interview:

參考Cracking the coding interview這本書 https://www.crackingthecodinginterview.com/

如果是video interview,記得多用打字,不管是在一開始講解暴力法, 或是講解準備要implement的方法,以及最後再驗證每一步時,都把目前的變數寫出來,並且驗證到哪了。

  1. Listening carefully
    • 仔細聽到題目給的線索 ex: sorted array
    • 可以把可能的線索先寫在白板上,確保記得,晚點要優化的時候再來看是否都用到這些線索
  2. Draw some example:
    • 不用太大的example,
    • 但盡可能把所有的情況都想到,透過跟面試官討論,
    • 以及多問一些題目的限制,比如說元素有沒有重複,等等
    • 多列舉example可以輕鬆看出題目要解什麼問題
    • 列舉example的過程邊跟面試官確認input and output
    • 把所有example都討論出來後,再開始想演算法。
  3. State a brute force
    • 先說出暴力法,分析其time and space complexity
    • 不用寫code
    • 並重此方法開始優化
  4. Optimization
    • 回頭看有沒有什麼線索沒用到
    • 或用一些小的Example去找規律,
      • 類似小問題可以組成大問題等等 ex:permutation, generate parenthemes
      • do it yourself,可以實際操作看看現有的example,可能找出本能上最優化的步驟
    • 看可不可以預先處理,
      • 比如先排序
      • 先算一些值, 例如先算linked_list的長度
      • 原本的data要前後各放一個測資,讓等等程式可以簡化
    • 找到BUD(Bottleneck, Unnecessary work,Duplicate work )
      • Bottleneck是在哪,等等可以思考換了什麼資料結構可以解決此bottleneck
      • Unnecessary work是什麼,看可以不可以簡化
      • Duplicate work是什麼,看可以不可以簡化
    • 空間換時間,看可不可以用什麼資料結構,
      • 通常hash table是很好的出發點
      • 活用其他資料結構
        • heap的insert是logn,如果不用知道整體的排序,只需要最大或最小,或是中間(用min-heap and max-heap
        • Binary Search tree,insert 花O(logn)時間複雜度,但這會是有一個整體排好序的結構,看題目需不需要,因為找尋也會需要花O(logn)
        • deque,最前面可以存最大的,不需要此最大的時候可以從前面pop,新的可以從後面Insert,比新的小可以直接從後面pop
        • hash配double linked list,ex: LRU
        • queue,ex: BFS
        • stack,ex: mono stack 或是 找longest increasing squence問題
    • BCR(Best Conceivable Runtime):
      1. 從暴力法開始: O(n^2)
      2. 架設BCR是O(n),表示可能有方法變成O(nlogn) 到 O(n)
      3. 這時候就用前面那些方法,看有哪些方法可以看出如何優化
      4. 任何小於目前bigO的pre handle都可以嘗試,因為不會影響到最後的結果
  5. walk through:
    • 找到優化後,先別急著寫code
    • 先試著走一次,用草稿,pseudocode都可以,感覺一下架構會長怎樣,變數會有哪些
    • 切記,如果還沒很透徹就開始寫,只會越來越糟
  6. Implement:
    • modularized code:
      • 可以先寫一個funtion,到時候再實作他,可以讓自己思緒不中斷,可以讓程式有架構
    • 一些error handling
      • don’t make assumptions about the input
      • 比較複雜的checking可以留TODO,等等有空再來寫
    • 有些小的資料結構,可以先假設有了,等等有空再實作他,或是資料結構裡的method可以等等在實作,先使用,確保思緒維持住
    • Great naming
    • 如果寫到一半卡住了,代代看剛剛的測資,確保沒有偏離原先想法。
  7. Self Testing before submitting
    • 先看一下每一段在幹嘛,是不是自己要的
    • 驗證的時候,讓測試資料給面試官知道,
      • 讓面試官知道現在在驗哪裡,現在測資是什麼,ex: idx = 多少,value = 多少
      • 也讓面試官知道我的驗證步驟是不是哪裡有錯誤
    • 看一些特殊邊界條件, ex:
      • start從1開始,為什麼不是0開始
      • end為什麼是len(array)-2,不是len(array)-1
      • 或是partitiony = (x+y)//2 – partitionx,這種特殊的計算
      • 或是一些length減了多少變成某index,或是某index加了多少等於另一個index等等一些shift的操作
    • Hot spot區
      • node會不會是None,又對他存取
      • recursive的終止條件,會不會無限循環
      • array or string會不會超出界
    • 開始帶入真的測資:
      • 先帶入正常小一點的測資即可
      • 再帶入一些特殊測資看會不會有例外狀況
    • 找到bug,別急著修,看一下為何會有此bug,找到root cause並確認準備要修的修法是最好的修法

System Design:

相關知識點可以參考

How to prepare for System Design Interview 系統設計面試準備

大概的面試流程:

  1. 先問使用情境,把user如何使用這個系統先理清楚
  2. 多少客戶,多少流量,會產生多大的資料,是持續增長的資料還是一直維持在那的資料,算出QPS
  3. 選定要用什麼機器後,可以用QPS推出大概要多少機器。
  4. 選定Design Goal: CAP theorem, C or A, write heavy or read heavy。
  5. Abstract Design,畫出大架構
    • 大致的API有哪些
    • 以gift card 系統為例大概會有三種API
      1. 一開始讓user 寫入序號,
      2. 要使用這個禮物卡時,要讀這個序號,對應到多少錢。
      3. 最後用完這個禮物卡,要把這個序號標記用過了。
  6. Deep Dive, 例如有些跟地圖相關的設計,牽扯到比較複雜的 quadtree algorithm或是其他的演算法,這一部分通常可以提到這個知識即可,畢竟在30~40分鐘裡面通常無法講得很深,所以這一部分在短時間的面試通常可以跳過。
  7. How to scale up, fault tolerance

Behavior Interview:

可參考Behavior Interview指南

發表留言