程式設計師面試金典--筆記(精華篇)

onephone發表於2017-02-01

原文連結:http://codeshold.me/2017/01/cracking_interview.html

《程式設計師面試金典》 1-7章的總結
相關讀物《金領簡歷:敲開蘋果、微軟、谷歌的大門》(Cayle Laakmann McDowell 蓋爾 拉克曼 麥克道爾)careercup.com

面試流程

  1. 篩選面試 screening interview

    • 電話面試的可能性大
  2. 現場面試 on-site interview

  3. 準備時間表

  4. 面試評估流程

    • 一旦進入大型科技公司的面試環節,你之前的工作經驗就不是特別重要了,但它可能會左右面試官對自己的看法
  5. 答題情況

    • 考量最終的解法是否最優,用時多久,程式碼整潔與否
  6. 常見的十大錯誤

    • 只在計算機上練習
    • 不做行為面試題演練(用心回顧以往的專案和經歷)
    • 不做模擬面試訓練
    • 試圖死記硬背答案
    • 不大聲說出自己的解題思路
    • 過於倉促
    • 程式碼不夠嚴謹
    • 不做測試
    • 修正錯誤漫不經心
    • 輕言放棄
  7. 常見問題解答

    • 碰到熟悉的問題應該如是相告?
    • 應該使用哪種程式語言?
    • 面試結束後沒有收到回覆,是被拒了嗎?
    • 被拒之後能否重新申請?可以的

面試揭祕

  1. 微軟面試

  2. 亞馬遜面試

  3. 谷歌面試

  4. 蘋果面試

  5. Facebook面試

    • Etherpad或其他共享文件工具寫些程式碼
  6. 雅虎面試

特殊情況

  1. 有工作經驗的求職者

    • 在系統設計和架構架構方面應在簡歷中突出一些,面試的時候這方面的要求也應該高一些
    • 說說碰到過的棘手的bug?
  2. 測試人員及SDET

  3. 專案經理與產品經理

    • 處理含糊情況(面對含糊情況不會手忙腳亂、不知所措)
    • 以客戶為中心(態度層面)-- 站在客戶角度來判斷問題
    • 以客戶為中心(技術層面)
    • 多層次交流能力(怎麼向祖母及時TCP/IP的問題)
    • 對技術的熱情
    • 團隊合作/領導能力(說說自己是怎麼處理團隊成員沒能按進度完成工作的情況。)
  4. 創業公司

    • 最好的申請方式是內部推薦
    • 簡歷--能夠在創業環境中賣力地工作
    • 大公司注重在軟體開發上的整體職業素養,創業公司更注重自己的個性契合度、技術技能和此前的工作經驗

面試之前

  1. 積累經驗

    • 找實習,“微軟探索者”、“谷歌程式設計夏列營”
    • 開拓一些業務或專案,自己的想法,然後主動的做
  2. 人際網

    • meetup.com
    • 主動和人打招呼
    • 助人為樂
  3. 寫好簡歷

    • 有針對性
    • 一張紙
    • 專案經歷 2-4個
    • 程式語言 java(非常熟練), C++(熟練), JavaScript(有過使用經驗)

行為面試

1. 準備

  • 表格

    |常見問題|專案1|專案2|專案3|專案4| |:-------|:----:|:----:|:----:|:----:| |最難的部分||||| |有什麼收穫||||| |最有意思的部分||||| |最難解的bug||||| |最享受的過程||||| |與團隊成員的衝突|||||

  • 針對問題,回想小故事並將小故事濃縮成幾個關鍵字

  • 專案失敗的經歷
  • 你需要說服團隊成員的事例
  • 你有哪些缺點
    • “有時候我可能對細節不夠重視。好的一方面是我反應迅速、執行力強,但不免會粗心大意而犯錯。有鑑於此,我總會找其他同事幫忙檢查自己的工作,確保不出問題。”
  • 專案中最難處理的問題是什麼
  • 應該問面試官的問題
    1. 真實的問題
      • “你每天有多少時間花在寫程式碼上?”
      • “你一週要開幾次會?”
      • “整個團隊中,測試人員、開發人員和專案經理的比例是多少?他們如何互動的?團隊怎麼做專案規劃?”
    2. 有見地的問題
      • “我注意到你們使用了X技術,請問你們是如何處理Y問題的?”
      • “為什麼你們的產品選擇使用X協議而不是Y協議,對然有……好處,但存在……問題,很多公司並未採用該協議。”
    3. 富有激情的問題
      • “我對可擴充套件性很感興趣。請問你從事過分散式系統方面額工作嗎?有哪些機會可以學習這方面的知識?”
      • “我對X技術不是太熟悉,不過聽上去是個不錯的解決方案。你能給我多講講它的工作原理嗎”

2. 應對

  1. 力求具體,切記自大(具體的故事)

  2. 省略細枝末節

    • “在研究最常用的使用者行為並應用Rabin-Karp演算法後,我設計了一種新演算法,在90%的情況下搜尋操作的時間複雜度由O(n)降至O(logn)”
  3. 回答調理清晰

    • 主題先行(直接先說結果)
    • S.A.R.法(情景、行動、結果)

技術面試

1. 準備

  1. 在紙上寫演算法程式碼,在紙上測試程式碼,將程式碼原樣輸入計算(記錄犯過的錯誤),模擬測試(mock interview, careercup.com)

  2. 必須掌握的知識

    • 資料結構:連結串列、二叉樹、單詞查詢樹(trie)、棧、佇列、向量/陣列列表、雜湊表等
    • 演算法:廣度優先搜尋、深度優先搜尋、二分查詢、歸併排序、快速排序、樹的插入/查詢等
    • 概念t:位操作、單例設計模式、工廠設計模式、記憶體(棧和堆)、遞迴、大O時間
  3. 記憶冪表

    • 2^10, 1K, 近似一千, 1024
    • 2^20, 1MB, 近似一百萬, 1048576
    • 2^30, 1GB, 近似十億
    • 2^40, 1TB, 近似一萬億(trillion)
    • 一個將每個32位整數對映為布林值的雜湊表可以把一臺計算機的記憶體填滿(2^32=4GB)
  4. 其他程式語言知識(參考公司的要求)

2. 應對

  1. 提問

    • 以消除題目的疑義
    • 例如就“設計一種列表的排序演算法”可連續提問
  2. 設計演算法

    • 考慮時間複雜度、空間複雜度
    • 大量資料的情況、演算法的限制
    • 是否善用了“特定資料”(面試官指定的)
  3. 先編寫虛擬碼

  4. 編寫程式碼

    • 多用資料結構
    • 有條不紊、引數檢測
  5. 測試

    • 先理清程式碼失效的原因
    • 極端用例(0、負值、空值、最大值、最小值)
    • 使用者錯誤
    • 一般用例

3. 演算法題解法

  1. 舉例法

    • 求任意時刻時針和分針之間的角度
  2. 模式匹配法

    • 一個有序陣列迴圈移動後,找出其中最小的元素
  3. 簡化推廣法

    • 從一本雜誌裡剪下一些單詞可以拼湊成一封勒索信,如何判斷該勒索信是否由某本雜誌裡的單片語成
  4. 簡單構造法

    • 遞迴,列印某個字串所有可能的排列組合
  5. 資料結構頭男風暴

    • 隨機生成一些數字,並儲存到一個陣列中,如何跟蹤陣列中的中位數

4. 好程式碼的建議

編寫一個函式檢查某個二進位制數(以字串形式傳入)是否等於以字串表示的十六進位制數

  1. 多用資料結構(如多項式的加減)
  2. 適當重用程式碼
  3. 模組化
  4. 靈活、健壯(面試官要求編寫程式碼檢查誰是三連棋的贏家,但可以假定其實NxN的棋盤)
  5. 錯誤檢查

面試結果

  1. 錄用

    • 可申請延長回覆期限(若還在苦等其他公司的迴音)
    • 拒絕錄用,可以闡明自己做當下最佳選擇的原因
  2. 被拒

    • 詢問什麼時候可以再申請
    • 再申請時或下次面試時,需要注意哪些事項
  3. 薪酬

    • 簽約獎金、搬家費及其他一次性津貼(總和除以預期服務的年限)
    • 各地生活成本差異(估算)
    • 年終獎(打聽平均數)
    • 股票期權與補助金(收入除以預期服務年限)
  4. 談判

    • 給出具體的“要價”,具體的金額
    • 開出比預期稍高的價碼
    • 不要只盯著薪水(這往往不好改),可要求更多的期權或簽約獎金
    • 使用合適的方式談判,如電話
    • 先了解公司的等級制度,一定的級別對應一定的薪資範圍
  5. 職業發展

    • 該公司能否增加履歷的份量?
    • 是否提供了切實可行的轉崗通道?
  6. 幸福指數

    • 產品:什麼樣的產品?和哪些人共事?
    • 經理和隊友
    • 企業文化(如何做決策到整體氛圍以及公司的組織架構,問問未來的同時如何描述)
    • 工作時常,每週會有多少,一天能用來寫程式碼的時

入職準備

  1. 指定時間表,不要“溫水煮青蛙”
  2. 打造人際網路
  3. 向經理尋求幫助,開誠佈公的告訴主管自己的心跡

相關文章