蓋爾 • 拉剋曼 • 麥剋道爾(Gayle Laakmann McDowell),CareerCup創始人兼CEO,是一位知名軟件工程師,曾在微軟、蘋果與榖歌任職。早先,她自己就是一位十分成功的求職者,通過瞭微軟、榖歌、亞馬遜、蘋果、IBM、高盛等多傢知名企業極其嚴苛的麵試過程。工作以後,她又成為一位齣色的麵試官。在榖歌任職期間,她還是該公司有名的麵試官及招聘委員會成員,其間閱人無數,積纍瞭相當豐富的麵試經驗。除此書外,還著有《産品經理麵試寶典》《金領簡曆:敲開蘋果、微軟、榖歌的大門》。
【譯者簡介】
劉博楠,軟件工程師,畢業於哥倫比亞大學,現居美國紐約,就職於榖歌公司,從事雲計算産品的研發工作,同時在紐約城市大學任兼職講師。對分布式係統、雲計算、數據庫研發有著濃厚的興趣。對超大規模係統架構設計、流程管理、高可用服務運維等領域也有涉獵。
趙鵬飛,畢業於西安電子科技大學,目前在蔚來汽車做開發工作。熱愛技術,愛好開源,曾為流行開源項目OpenFeign貢獻源碼,近來專注於開源項目Spring及Spring Boot。熱愛算法,一直活躍於leetcode、牛客網等算法網站。
李琳驍,主要從事嵌入式Linux內核/驅動開發,並關注IT、開放源碼和安防監控等領域。業餘時間以技術翻譯為樂,翻譯或參與翻譯瞭《Linux命令詳解手冊》《編程人生》《編程大師訪談錄》等圖書。
漆犇,畢業於中國地質大學,擁有十餘年軟件開發、測試及流程管理經驗,熱衷翻譯,已齣版譯作包括《Linux/Unix設計思想》《金領簡曆:敲開蘋果、微軟、榖歌的大門》等書。
第 1 章 麵試流程 1
1.1 為什麼 1
1.1.1 錯過瞭優秀人纔是可以的 2
1.1.2 解決問題的技能很寶貴 2
1.1.3 基礎數據結構和算法知識很有用 2
1.1.4 白闆讓你專注於重要的事情 2
1.1.5 但這並不適用於每個人、每傢公司、每種場閤 3
1.2 麵試問題的來源 3
1.3 一切都是相對的 3
1.4 常見問題 4
1.4.1 麵試結束後沒有立即收到迴復,我是被拒瞭嗎 4
1.4.2 被拒之後我還能重新申請嗎 4
第 2 章 麵試揭秘 5
2.1 微軟麵試 6
2.1.1 必備項 6
2.1.2 獨特之處 6
2.2 亞馬遜麵試 6
2.2.1 必備項 7
2.2.2 獨特之處 7
2.3 榖歌麵試 7
2.3.1 必備項 8
2.3.2 獨特之處 8
2.4 蘋果麵試 8
2.4.1 必備項 9
2.4.2 獨特之處 9
2.5 Facebook麵試 9
2.5.1 必備項 9
2.5.2 獨特之處 10
2.6 Palantir麵試 10
2.6.1 必備項 10
2.6.2 獨特之處 10
第 3 章 特殊情況 11
3.1 有工作經驗的求職者 11
3.2 測試人員和軟件開發測試工程師 11
3.3 産品經理(項目經理) 12
3.4 開發主管與部門經理 13
3.5 創業公司 13
3.5.1 職位申請 14
3.5.2 簽證與工作許可 14
3.5.3 簡曆篩選因素 14
3.5.4 麵試流程 14
3.6 收購與“人纔收購” 14
3.6.1 哪些創業公司需要進行並購麵試,為什麼 14
3.6.2 這些麵試有多重要 15
3.6.3 哪些員工需要麵試 15
3.6.4 如果麵試錶現不好會怎麼樣 15
3.6.5 最優秀和最差的員工或許會令你吃驚 16
3.6.6 被收購方的員工與一般求職者的標準一樣嗎 16
3.6.7 被收購員工對於收購、人纔收購會如何反應 16
3.6.8 收購後的團隊會經曆什麼 16
3.6.9 怎樣為你的團隊準備收購麵試 16
3.7 麵試官 17
3.7.1 不要問與本書完全相同的題目 17
3.7.2 問中等難題或者高難度題 17
3.7.3 使用多重障礙的題目 17
3.7.4 使用高難度題目,而不是艱深的基礎知識 18
3.7.5 避免“嚇人”的問題 18
3.7.6 提供正麵鼓勵 19
3.7.7 深究行為麵試題 19
3.7.8 輔導求職者 19
3.7.9 如果求職者想保持安靜,請滿足 20
3.7.10 瞭解你的模式:完整性測試、質量測試、專業知識和代理知識 20
第 4 章 麵試之前 22
4.1 積纍相關經驗 22
4.2 寫好簡曆 23
4.2.1 簡曆篇幅長度適中 23
4.2.2 工作經曆 23
4.2.3 項目經曆 23
4.2.4 軟件和編程語言 24
4.2.5 給母語為非英語的人及國際人士的建議 24
4.2.6 提防(潛在的)汙名 24
4.3 準備流程圖 25
第 5 章 行為麵試題 28
5.1 麵試準備清單 28
5.1.1 你有哪些缺點 28
5.1.2 你應該問麵試官哪些問題 28
5.2 掌握項目所用的技術 29
5.3 如何應對 29
5.3.1 力求具體,切忌自大 29
5.3.2 省略細枝末節 30
5.3.3 多談自己 30
5.3.4 迴答條理清晰 30
5.3.5 行動是關鍵 31
5.3.6 故事的意義 31
5.4 自我介紹 32
5.4.1 結構 32
5.4.2 興趣愛好 32
5.4.3 展示成功的點點滴滴 33
第 6 章 大Ο 34
6.1 打個比方 34
6.2 時間復雜度 34
6.2.1 大Ο、大θ和大Ω 35
6.2.2 最優、最壞和期望情況 35
6.3 空間復雜度 36
6.4 刪除常量 36
6.5 丟棄不重要的項 37
6.6 多項式算法:加與乘 38
6.7 分攤時間 38
6.8 Log N運行時間 39
6.9 遞歸的運行時間 39
6.10 示例和習題 40
第 7 章 技術麵試題 53
7.1 準備事項 53
7.2 必備的基礎知識 53
7.2.1 核心數據結構、算法及概念 53
7.2.2 2的冪錶 54
7.3 解題步驟 54
7.4 優化和解題技巧 1:尋找BUD 58
7.4.1 瓶頸 59
7.4.2 無用功 59
7.4.3 重復性工作 60
7.5 優化和解題技巧 2:親力親為 61
7.6 優化和解題技巧 3:化繁為簡 62
7.7 優化和解題技巧 4:由淺入深 62
7.8 優化和解題技巧 5:數據結構頭腦風暴法 63
7.9 可想象的極限運行時間 63
7.10 處理錯誤答案 66
7.11 做過的麵試題 66
7.12 麵試的“完美”語言 67
7.12.1 流行度 67
7.12.2 語言可讀性 67
7.12.3 潛在問題 67
7.12.4 冗長 67
7.12.5 易用性 68
7.13 好代碼的標準 68
7.13.1 多多使用數據結構 68
7.13.2 適當代碼復用 69
7.13.3 模塊化 70
7.13.4 靈活性和通用性 70
7.13.5 錯誤檢查 71
7.14 不要輕言放棄 71
第 8 章 錄用通知及其他注意事項 72
8.1 如何處理錄用與被拒的情況 72
8.1.1 迴復期限與延長期限 72
8.1.2 如何拒絕錄用通知 72
8.1.3 如何處理被拒 72
8.2 如何評估錄用待遇 73
8.2.1 薪酬待遇的考量 73
8.2.2 職業發展 73
8.2.3 公司穩定性 73
8.2.4 幸福指數 74
8.3 錄用談判 74
8.4 入職須知 75
8.4.1 製定時間錶 75
8.4.2 打造堅實的人際網絡 75
8.4.3 嚮經理尋求幫助 75
8.4.4 保持麵試狀態 75
第 9 章 麵試題目 76
9.1 數組與字符串 76
9.1.1 散列錶 76
9.1.2 ArrayList與可變長度數組 77
9.1.3 StringBuilder 77
9.2 鏈錶 79
9.2.1 創建鏈錶 79
9.2.2 刪除單嚮鏈錶中的節點 80
9.2.3 “快行指針”技巧 80
9.2.4 遞歸問題 81
9.3 棧與隊列 82
9.3.1 實現一個棧 82
9.3.2 實現一個隊列 83
9.4 樹與圖 85
9.4.1 樹的類型 85
9.4.2 二叉樹的遍曆 87
9.4.3 二叉堆(小頂堆與大頂堆) 88
9.4.4 單詞查找樹(前序樹) 89
9.4.5 圖 90
9.4.6 圖的搜索 91
9.5 位操作 94
9.5.1 手工位操作 95
9.5.2 位操作原理與技巧 95
9.5.3 二進製補碼與負數 95
9.5.4 算術右移與邏輯右移 96
9.5.5 常見位操作:獲取與設置數位 97
9.6 數學與邏輯題 99
9.6.1 素數 99
9.6.2 概率 101
9.6.3 大聲說齣你的思路 102
9.6.4 總結規律和模式 102
9.6.5 略作變通 103
9.6.6 觸類旁通 104
9.7 麵嚮對象設計 105
9.7.1 如何解答 105
9.7.2 設計模式 106
9.8 遞歸與動態規劃 108
9.8.1 解題思路 109
9.8.2 遞歸與迭代 109
9.8.3 動態規劃及記憶法 109
9.9 係統設計與可擴展性 114
9.9.1 處理問題 114
9.9.2 循環漸進的設計 114
9.9.3 逐步構建的方法:循序漸進 116
9.9.4 關鍵概念 116
9.9.5 係統設計要考慮的因素 118
9.9.6 人無完人,係統亦然 119
9.9.7 實例演示 119
9.10 排序與查找 121
9.10.1 常見的排序算法 121
9.10.2 查找算法 124
9.11 測試 126
9.11.1 麵試官想考查什麼 126
9.11.2 測試現實生活中的事物 127
9.11.3 測試一套軟件 127
9.11.4 測試一個函數 129
9.11.5 調試與故障排除 129
9.12 C和C++ 131
9.12.1 類和集成 131
9.12.2 構造函數和析構函數 131
9.12.3 虛函數 132
9.12.4 虛析構函數 133
9.12.5 默認值 134
9.12.6 操作符重載 134
9.12.7 指針和引用 134
9.12.8 模闆 135
9.13 Java 136
9.13.1 如何處理 137
9.13.2 重載與重寫 137
9.13.3 集閤框架 138
9.14 數據庫 139
9.14.1 SQL語法及各類變體 139
9.14.2 規範化數據庫和非規範化數據庫 139
9.14.3 SQL語句 140
9.14.4 小型數據庫設計 141
9.14.5 大型數據庫設計 142
9.15 綫程與鎖 143
9.15.1 Java綫程 143
9.15.2 同步和鎖 145
9.15.3 死鎖及死鎖的預防 148
9.16 中等難題 149
9.17 高難度題 152
第 10 章 題目解法 156
10.1 數組與字符串 156
10.2 鏈錶 170
10.3 棧與隊列 186
10.4 樹與圖 197
10.5 位操作 229
10.6 數學與邏輯題 240
10.7 麵嚮對象設計 254
10.8 遞歸與動態規劃 286
10.9 係統設計與可擴展性 313
10.10 排序與查找 332
10.11 測試 350
10.12 C和C++ 354
10.13 Java 363
10.14 數據庫 370
10.15 綫程與鎖 375
10.16 中等難題 388
10.17 高難度題 450
第 11 章 進階話題 539
11.1 實用數學 539
11.1.1 整數1至N的和 540
11.1.2 2的冪的和 540
11.1.3 對數的底 542
11.1.4 排列 541
11.1.5 組閤 541
11.1.6 歸納證明 541
11.2 拓撲排序 542
11.3 Dijkstra算法 543
11.4 散列錶衝突解決方案 545
11.4.1 使用鏈錶連接數據 545
11.4.2 使用二叉搜索樹連接數據 546
11.4.3 使用綫性探測進行開放尋址 546
11.4.4 平方探測和雙重散列 546
11.5 Rabin-Karp子串查找 546
11.6 AVL樹 547
11.6.1 性質 547
11.6.2 插入操作 547
11.7 紅黑樹 548
11.7.1 性質 549
11.7.2 為什麼這樣的樹是平衡的 549
11.7.3 插入操作 549
11.8 MapReduce 551
11.9 補充學習內容 553
附錄 A 代碼庫 554
附錄 B 提示 560
· · · · · · (
收起)