How I got into Google
tl;dr: 10% luck, 20% skill. 15% concentrated power of will. 5% pleasure, 50% pain.
Bài này tôi viết đã lâu, nay đăng lên đây để cái substack đỡ trống …
The Interview
Lần thử sức đầu tiên với Google của tôi là vào 2019, lúc đó tôi mới ra trường và được 1 cậu bạn refer. Rất tiếc là sau đó headcount của vị trí này bị cắt giảm nên mọi chuyện dừng lại ở đó.
Đến 2021, lần này Google tự liên hệ với tôi (chắc do CV đã nằm trong database của họ kể từ đợt apply trước). Mọi chuyện diễn ra như sau:
Recruiter phone interview: 20 phút - Phone. HR gọi điện và discuss về vị trí công việc, quy trình phỏng vấn. Tôi xin 5 tuần chuẩn bị cho vòng Tech Phone Interview.
Tech phone interview: 45 phút - Google Meet.
Interviewer vào muộn 20ph do có cuộc họp đột xuất. C’mon ... Tôi được hỏi 1 câu liên quan đến stack. Đây là 1 dạng phổ biến trên Leetcode nên tôi đưa ra solution gần như tức thời. Interviewer gật đầu, tôi tiến hành code. Interviewer yêu cầu giải bằng 1 cách khác không dùng thêm bộ nhớ. Tôi mất vài phút để nghĩ ra cách giải, dùng 1 kĩ thuật khá phổ biến khác (Dutch flag patition). Giải thích solution, code, test, done, interview kết thúc sớm 10 phút. Không rõ có phải do vào muộn nên interviewer ra bài dễ không 😆.
Ngày hôm sau, HR thông báo kết quả feedback khả quan, và họ muốn tiến tới đến vòng onsite. Bình thường Google sẽ cover chi phí đi lại, khách sạn để ứng viên đến 1 văn phòng trong khu vực để phỏng vấn, nhưng do Covid nên lần này các vòng onsite sẽ tiến hành online qua GG Meet. Tôi dự là sẽ khó khăn hơn rất nhiều nên xin thêm 4 tuần nữa để chuẩn bị. Kế hoạch tuyển dụng của Google thường theo từng năm hoặc nửa năm nên họ khá thoải mái nếu ứng viên cần thêm thời gian chuẩn bị.Onsite interviews:
ngày 1:
loop 1: 45 phút, có 2 interviewer, 1 người chính, 1 người shadow chỉ ngồi quan sát. Tôi khá run vì câu hỏi lạ hoắc, cố tình đưa ra cách brute-force trước để kéo dài thời gian và cũng là để tự trấn tĩnh lại. Interviewer nhất trí với cách brute-force và như thường lệ yêu cầu improve. Tôi nghĩ ra 1 ý tưởng khác dùng OrderedMap. Interviewer đồng ý cho tôi bắt đầu code. Sai lầm đầu tiên: khi ý tưởng còn khá mơ hồ nhưng đã bắt đầu code dẫn đến lúc code có 1 vài bug và tốn nhiều thời gian debug. Interviewer chỉ ra bug cho tôi và có vẻ mất kiên nhẫn, negative signal ... 😔
loop 2: diễn ra 15 phút sau khi loop 1 kết thúc và tôi vẫn chưa hết run. Interview lần này là 1 bạn ở Singapore, team Google Pay. Tôi được yêu cầu implement 1 stock’s price tracking system. Bài toán có thể chia nhỏ xuống thành 1 vài function cần hỗ trợ với low runtime. Ban đầu tôi nghĩ đến dùng Heap, nhưng chả dẫn đến đâu cả. Lần lượt duyệt qua trong đầu các cấu trúc dữ liệu khác, kết hợp các kiểu thì cuối cùng cũng ra được 1 solution O(logn). Interview gật gù có vẻ hài lòng và đồng ý cho code. Còn cỡ 15 phút nên tôi gõ với tốc độ bàn thờ, vừa gõ vừa giải thích 10 phút sau thì xong. Interviewer chỉ ra 1 điểm nhỏ có thể cải thiện trong code.
loop 3: diễn ra sau bữa trưa, 45 phút. Lúc này thì tôi đã bình tĩnh hơn, interviewer làm Flutter ở Google Pay. Một bài BFS level Hard ở Leetcode, tôi nhanh chóng đưa ra cách giải tối ưu, gì chứ dạng này làm hoài. Sau đó interviewer hỏi thêm 1 vài câu follow up, điều chỉnh đề bài 1 chút, chắc là để check xem có phải tôi học thuộc solution từ trước không. Tôi đưa ra ý tưởng dùng 0-1 BFS. Đến cuối vẫn còn thừa nhiều thời gian nên 2 bên có hỏi han qua lại về công việc, về hồ sơ của tôi. Sau loop 1 khá tệ thì giờ tôi thắp lên 1 chút hi vọng mong manh 😆
ngày 2:
loop 4: HR đã phím trước cho tôi đây là vòng Googleyness and Leadership (behavior interview). Interviewer không xuất hiện vì có sự cố đột xuất. C’mon man.
loop 5: 45 phút sau bữa trưa. 2 interviewers, 1 main, 1 shadow. Lần này tôi được hỏi 1 câu khá dễ về Tree, tôi đoán đây chỉ là màn dạo đầu cho 1 câu follow up khó hơn nên không vòng vo mà trình bày luôn cách tối ưu. Đúng như dự đoán, interviewer tăng độ khó của bài toán lên. Tôi nêu ý tưởng mới, đúng hơn là nói ra suy nghĩ, hướng suy luận chứ lúc đó cũng không chắc là ý tưởng đó đúng hay không. Interviewer chỉ ra 1 lỗi trong ý tưởng đó, cũng may là hướng giải đúng nên chỉ cần điều chỉnh lại 1 chút. Interviewer gật đầu bật đèn xanh. Còn khá nhiều thời gian nên tôi hỏi interviewer là hôm nay mày định hỏi tao mấy câu, mục đích để điều chỉnh tốc độ code . Interviewer bảo là chỉ 2 câu này thôi nhưng nến mày code nhanh thì tao sẽ hỏi thêm câu nữa. Ok, deal! Done, vẫn còn 10 phút, interviewer hỏi mày có muốn thử 1 câu khó hơn nữa không. Ok, thế là bà cho thêm 1 câu khó vđ. Lmao, không giải được =)) biết thế bảo thôi.
ngày 3: redo loop 4, diễn ra 1 tuần sau đó: interviewer nói tiếng Anh không sõi. Cảm tưởng như có 1 danh sách câu hỏi behavior, cứ đọc lần lượt trên xuống dưới rồi ghi lại câu trả lời của tôi. Easy, đạo đức tốt nên tôi trả lời khá nuột =).
Hiring Committee
1 tuần sau, HR contact lại và bảo feedback khá tốt, sẽ gửi hồ sơ lên Hiring Committee (HC) để duyệt.
Nói thêm 1 chút, Google có 1 Hiring Committee riêng để xét duyệt interview feedback, họ là những người sẽ chốt bạn đỗ hay trượt. Google không tin vào số đông nên yêu cầu tất cả mọi thành viên phải đồng ý Hire thì bạn mới pass, chỉ cần 1 người không đồng ý họ sẽ thảo luận với nhau để thống nhất kết quả. Nếu sau khi cãi lộn, họ vẫn không thuyết phục được người kia cho pass thì rất tiếc, hẹn gặp lại lần sau. Theo Gayle Laakmann McDowell, tác giả cuốn Cracking the Coding Interview thì tỉ lệ pass của HC là dưới 10% 😭(https://www.quora.com/What-percentage-of-applicants-that-make-it-to-Googles-hiring-committee-get-approved).
Để làm mạnh thêm cho package của tôi, HR đã liên hệ với 1 Team Lead có hứng thú với hồ sơ của tôi (tức họ sẵn sàng nhận tôi vào team trong trường hợp pass HC), nhờ họ viết 1 support letter; đồng thời yêu cầu tôi nhờ 2 người bạn ở Google viết thư giới thiệu.
Kết quả là HC hold package của tôi lại, tức là 1 vài người trong HC cho pass và ít nhất 1 người đánh trượt, nhưng họ không thể đi đến kết luận cuối cùng nên đã yêu cầu thêm 2 interviews nữa để có thêm dữ kiện. Đến lúc này thì tôi đã hết sức mệt mỏi vì sau loop 5 thì tôi đã bắt đầu xõa, ăn chơi nhảy múa rồi, mà cái giống Algorithm thì vài tuần không động đến là đầu óc kém sắc bén ngay ... Thôi thì còn nước còn tát.Dựa trên feedback, HR phím cho tôi học thêm về binary search, chắc do negative feedback ở loop 1.
Extra rounds: extra round được setup 10 ngày sau đó.
loop 6: Được hỏi 1 bài về ma trận, tôi nhanh chóng nêu cách brute-force O(n^3). Interviewer gật gù yêu cầu cải tiến runtime. Nhớ đến lời HR về binary search, tôi nêu ý tưởng Binary search, cải thiện thành O(n^2logn). Interviewer nhất trí nhưng vẫn mặt lạnh như tiền yêu cầu cải tiến thêm nữa. Surprise motherf***er 😨. Panic, tôi lúng túng nêu ra những gì đang nghĩ trong đầu, nghĩ tới nghĩ lui vẫn lấy gì làm sáng sủa. Interviewer đưa hint, vẫn không bắt được sóng... Còn 10 phút, interviewer đành cho tôi implement cách Binary search. Implement khá dài nên đợt này tôi không giải thích gì nhiều, cố implement phần logic chính, mock 1 vài hàm để đấy nếu còn thời gian sẽ implement sau. Cuối cùng cũng xong. Tốc độ code rất quan trọng.
loop 7: Interviewer người TW, tôi được hỏi 1 bài Hard Leetcode. Một dạng kinh điển tôi đã làm nhiều nên tôi nêu luôn cách tối ưu dùng Binary search, không lòng vòng. Giải thích, code, done. Interviewer chỉ ra bug, damn =)) thôi xong, tôi ngồi chỉnh chỉnh sửa sửa tới lui. Thấy tối bồn chồn, interviewer động viên: mày là 1 trong những ứng viên nghĩ ra cách giải nhanh nhất, should be fine (it is on Leetcode bro 🤣).
Team Matching & Offer
Bẵng đi 2 tuần, HR inbox trên Linkedin thông báo HR đã approve package. Giờ sẽ đến tiết mục Team Matching. Nói thêm 1 chút, HC approve package chỉ có nghĩa là bạn pass tiêu chuẩn tuyển dụng của Google, để thực sự nhận được offer bạn phải tìm được 1 team sẵn sàng nhận bạn.
Do có support letter của Hiring Manager (HM) nên team matching diễn ra khá nhanh. HR set up 1 buổi “fit talk” với HM, trong buổi đó chủ yếu là HM trình bày về team của họ làm gì, văn hóa thế nào, trả lời các câu hỏi của ứng viên ... HM này là người Thụy Sỹ, thoải mái về giờ giấc làm việc nên tôi đồng ý luôn (1 phần vì tôi đã quá ngán phỏng vấn).
Vài ngày sau, HR set up meeting để thảo luận về offer và các bước tiếp theo.
Chuẩn bị
td;dr: Thực sự tôi vẫn nghĩ mình pass GG phần nhiều vì may mắn được các cụ thương interview đúng lúc GG đang overhire.
Hiểu rõ luật chơi: hỏi rõ HR xem vị trí đang apply là level nào. Ở Google, cho level 3, level 4; sẽ chỉ hỏi Algorithm và Googleyness nên tôi dành phần lớn thời gian để luyện phần này.
Algorithm:
Mua tài khoản LC premium: có thể mua lẻ 30$ / tháng hoặc mua dùng chung với bạn bè gói năm. Tôi mua gói năm 129$ (Black Friday sale), dùng chung với 3 người nữa, tính ra chưa đến 3$ 1 tháng. Lợi ích là tốc độ submit nhanh hơn, unlock các bài tập premium, filter theo tag công ty.
Với mỗi dạng bài (phân theo tag) trên LC, tôi sẽ làm 1 vài bài để làm quen trước. Sau khi đã đi qua hết các dạng phổ biến thì tôi chuyển qua ôn random, tức là cứ pick đại 1 bài rồi giải. Mục đích là để luyện phản xạ, vì nếu biết trước dạng bài thì khi interview thật sẽ dễ bị cứng não.
Spaced Practice:
với mỗi bài làm xong, tôi sẽ note lại vào 1 file Google sheet như trên: link bài, category, note, need to review. Những bài toán hay hoặc có tính ứng dụng cao, hoặc khó; tôi sẽ để Need to review thành Yes. Tôi thường luyện giải trong tuần, cuối tuần dành thời gian đọc lại những bài có Need to review là Yes. Đến khi những bài đó trở nên quen thuộc, tôi chuyển Need to review thành No.
Trong vòng 3 tháng chuẩn bị, tôi làm khoảng 500 bài code thiếu nhi, chủ yếu là medium level. Giai đoạn cuối onsite, tôi tập trung vào Hard Level. Sau khi interview xong thì tôi cảm thấy ko cần phải làm nhiều đến vậy.
Lúc giải bài, tôi thường bấm đồng hồ 30ph và cố giải xong trong thời gian đó. Mục đích là để mô phỏng lại áp lực thời gian trong quá trình phỏng vấn, có lẽ vì luyện kiểu này nên tốc độ code của tôi khá nhanh
Mỗi ngày tôi thường dành ra 1-1.5h trước giờ làm, giải 2-3 bài. Buổi tối thêm 2h nữa, cuối tuần thì nhiều hơn. Luyện tập thường xuyên.
1 or 2 problems every day is way better than 20 problems every weekend.
Với mỗi bài, tôi thường tự giải trước, rồi đọc phần discussion. Có rất nhiều technique hay được mọi người share ờ phần discussion. Khi giải được 1 lượng kha khá bài tập, mọi người sẽ thấy có nhiều pattern lặp đi lặp lại; nó sẽ in sâu vào não, thành phản xạ. Tuy nhiên, quan trọng là phải review lại thường xuyên.
Ngoài Leetcode thì tôi còn đọc qua cuốn Elements of Programming Interviews in Java: The Insider's Guide. Cuốn này hay, có nhiều kĩ thuật khó được tác giả giải thích cặn kẽ, độ khó bài tập nặng đô hơn trên LC.
Googleyness
Khác với Amazon nơi các expectation của behavioural interview được ghi ra thành các Leadership Principles, Google không đưa ra một tiêu chuẩn cụ thể nào cho các câu trả lời. Tất cả được gói gọn trong khẩu hiệu: “Do the right thing” hay “Don’t be evil”.
Phần này tôi chỉ dành ra 2-3 ngày để chuẩn bị, chủ yếu là đọc 1 vài chương trong cuốn Software Engineering at Google: Lessons Learned from Programming Over Time để hiểu xem Googleyness là cái quần què gì, các behavior nào là Googley. Việc đọc mấy chương này cực kỳ hữu ích vì trong loop 4 interview, tôi đoán trước được interviewer đang expect cái gì và trả lời gọn ghẽ.
Với các câu hỏi hành vi phổ biến, tôi gõ xuống thành các gạch đầu dòng và đọc thuộc. Cấu trúc 1 câu trả lời theo mô hình S.T.A.R: Situation (bối cảnh), Task (mục tiêu, nhiệm vụ), Action (Hành động), Result (Kết quả và bài học).
Mock Interview
Pramp.com: tôi chủ yếu luyện mock interview ở trang pramp. Đây là 1 platform ghép cặp mock interview, nơi những người đang luyện phỏng vấn sẽ mock interview lẫn nhau, đưa ra đánh giá, giúp nhau cải thiện. Ưu điểm là hàng free, nhược điểm là những người mock cho bạn thường không có nhiều kinh nghiệm phỏng vấn, trình độ thì thượng vàng hạ cám nên đôi lúc cũng thấy phí thời gian. Tôi mock ở pramp tổng cộng 5 lần.
https://expertmitra.com/: nền tảng paid mock interview; 70$ 1 session. Tôi thấy mắc nên chỉ làm 1 shot với 1 thanh niên làm Facebook nhưng khá đáng đồng tiền bát gạo. Mock interviewer đưa ra 1 vài lời khuyên rất hữu ích.
nhờ người quen (hoặc người lạ) mock: tận dụng mạng lưới quan hệ tôi đã nhờ nhiều anh, chị, bạn bè mock interview giúp:
Cường @GG London.
anh Huân @Shopee Sing.
anh Tín @Grab Sing.
anh Bình @GG Zurich.
chị Trang @GG Sydney.
anh Brian @GG Munich, cảm ơn vợ chồng Cindy&Brian, những người xa lạ tôi biết được qua Youtube nhưng đã rất nhiệt tình giúp đỡ.
anh Đạt @GG Sing, một người tôi biết thông qua nhóm BCNV.
“When you want something, all the universe conspires in helping you to achieve it.”
Resource
Software Engineering at Google: Lessons Learned from Programming Over Time
Elements of Programming Interviews in Java: The Insiders' Guide
https://docs.google.com/spreadsheets/d/1Vo2vje2NJAxj1tvpyL75kE4fgF32W262ypYatdELO2M/edit?usp=sharing
https://www.indeed.com/career-advice/interviewing/how-to-use-the-star-interview-response-technique
Thanks anh. Bài viết rất hay ạ.
Anh ghi cái tiêu đề 50% là pain là sao em đọc xong bài vẫn chưa rõ lắm ạ.
Đỉnh quá a zai