Người viết: RR
Trong bài viết này mình muốn chia sẻ kinh nghiệm phỏng vấn Google của mình. Mình tên là RR, hiện đang làm Software Engineer ở Google. Trong thời gian làm ở Google, mình đã refer (giới thiệu) hơn 100 bạn vào Google. Mình cũng đã từng phỏng vấn khoảng 60 ứng cử viên. Đứng ở cả 2 phía của quá trình phỏng vấn đã giúp cho mình có cái nhìn rõ ràng hơn về quy trình tuyển dụng của các công ty.
Bài viết này thể hiện quan điểm cá nhân của mình, có thể không đúng với quan điểm tuyển dụng của Google.
Nhận kết quả phỏng vấn: Nếu vượt qua vòng phỏng vấn, bạn sẽ nhận được thư chúc mừng từ recruiter. Các bạn đọc lưu ý bên dưới rằng ở bước này có thể các bạn sẽ chưa được nhận Offer Letter ngay, do vẫn còn bước 4 để các bạn có thể chắc chắn được đi thực tập tại Google.
Phỏng vấn Google chủ yếu hỏi về thuật toán. Bạn cũng có thể bị hỏi thêm 1 vài câu design (thiết kế hệ thống) hoặc những kiến thức khác. Do vậy, phần này mình sẽ chia làm 3 mục nhỏ: thuật toán, kĩ năng trình bày bằng tiếng Anh và các kiến thức khác.
Với dân ACM ICPC hoặc OI, các câu hỏi phỏng vấn sẽ không quá khó. Để thêm tự tin, các bạn có thể luyện tập cài đặt một số bài đơn giản, chú ý vào xét trường hợp đặc biệt và cài đặt dễ hiểu. Trong vòng 1 năm trước khi phỏng vấn Google, mình đang chuẩn bị cho ICPC World final 2016, hầu như ngày nào cũng làm contest 5h, nên lúc đi phỏng vấn mình không cần chuẩn bị gì cả. Tuy nhiên, các bạn vẫn cần chú ý một số điểm sau:
Với các bạn không thi ACM ICPC hoặc OI, hoặc bạn đã bỏ thi sau nhiều năm, các bạn có thể lên mạng làm thử 1 số bài gần với những bài được dùng trong phỏng vấn, ví dụ trang leetcode. Với mỗi bài, có thể luyện tập như sau:
Để kết thúc phần này, mình sẽ lấy ví dụ về một câu phỏng vấn:
Một xâu được gọi là xâu đối xứng nếu nó đọc từ trái qua phải cũng giống như từ phải qua trái. Ví dụ: "abcba", "a", "abba" là các xâu đối xứng. "abc" không phải là xâu đối xứng. Cho xâu S. Tìm xâu con gồm các ký tự liên tiếp của S, có độ dài lớn nhất và là xâu đối xứng.
Lời giải bài này các bạn có thể tìm thấy trên VNOI wiki. Với các bạn dân ACM khi gặp bài này, nên tránh những thuật toán như Hash, vì có thể người phỏng vấn sẽ thắc mắc những vấn đề như đánh giá độ chính xác. Bạn cũng nên tránh thuật toán không phổ biến như Manacher.
Quá trình phỏng vấn của Google rất coi trọng khả năng trình bày ý tưởng. Điều này đơn giản là vì nếu không có khả năng giao tiếp tốt, bạn không thể trở thành Software Engineer giỏi. Khi phỏng vấn, mình được phỏng vấn bởi các Software Engineer ở các khu vực khác nhau: Trung Quốc, Ấn độ, Singapore, châu Âu.. Tiếng Anh của bạn cần khá tốt để có thể nghe hiểu được các accent tiếng Anh khác nhau.
Việc trình bày thuật toán một cách dễ hiểu cũng rất quan trọng. Trước khi bắt đầu code, bạn cần giải thích thuật toán của mình rõ ràng mạch lạc, để người phỏng vấn có thể hiểu được. Sau đó, nếu cảm thấy thuật toán của bạn chưa đủ tốt, người phỏng vấn sẽ tiếp tục thảo luận thêm với bạn hoặc đưa ra gợi ý cho bạn làm tốt hơn.
Khi chuẩn bị phỏng vấn, hãy:
Bạn không cần giỏi tiếng Anh nhưng cần nắm rõ từ chuyên môn (ví dụ tên tiếng Anh tất cả các thuật toán), diễn đạt hợp lý và có sự tự tin.
Resume là một phần rất quan trọng trong quá trình phỏng vấn. Một resume không chỉ cần thể hiện rõ trình độ và kinh nghiệm của bạn mà còn cần được trình bày kĩ lưỡng và cẩn thận. Có rất nhiều lý do:
Dưới đây là một vài resume "chuẩn" của các bạn đã được nhận bởi Google:
Các đặt điểm cần chú ý của các resume này:
Ở vòng đầu tiên, resume của bạn sẽ được duyệt bởi recruiter. Những người này không phải là Software Engineer nên có lúc sẽ không đánh giá đúng được trình độ của bạn, do đó quá trình duyệt Resume sẽ có rủi ro nhất định. Trong những bạn mình refer, có hai bạn rất khá nhưng trượt vòng resume (đã nhận được email từ chối của Google). Tuy nhiên sau đó mình đã liên hệ trực tiếp với recruiter, viết 2 email rất dài để chứng minh 2 bạn đó rất giỏi. Kết quả cả 2 bạn đều được đi tiếp đến vòng phỏng vấn và 1 bạn sẽ đi thực tập ở Google vào hè tới. Ví dụ này cũng cho thấy quá trình duyệt resume cũng có rủi ro, và tài năng thật sự có thể bị bỏ qua.
Tuy nhiên bạn chỉ nên nhờ những người có quen biết trực tiếp với bạn refer. Bởi khi refer, sẽ cần phải trả lời những câu hỏi như:
Với một người chỉ biết bạn sơ sơ, tất nhiên họ sẽ không có cách nào trả lời những câu hỏi trên. Do đó sẽ không thể giúp bạn nhiều.
Vậy tìm người refer ở đâu? Cách tốt nhất là hãy tìm hiểu xem trường của bạn hoặc những trường xung quanh có ai đã đi thực tập ở Google. Nếu bạn là dân ACM thực thụ, cũng có thể liên hệ mình.
Với phỏng vấn intern, sẽ gồm khoảng 2 vòng phỏng vấn qua điện thoại. (sẽ có thể có thêm phụ thuộc vào kết quả của 2 vòng đó).
Với phỏng vấn full time, sẽ gồm 1 vòng phỏng vấn qua điện thoại + khoảng 5 vòng phỏng vấn trực tiếp. Mình có kết quả thi Google Code Jam khá tốt, nên được miễn 1 vòng phỏng vấn qua điện thoại và được recruiter liên hệ trực tiếp luôn. Đây cũng là 1 lý do các bạn nên cố gắng hết sức để thi những kỳ thi như Google Code Jam ;).
Mỗi vòng phỏng vấn thường kéo dài khoảng 45'. Bạn sẽ cần trả lời 2-3 câu đơn giản hoặc 1 câu khó.
Bạn sẽ phải code trên Google Docs, và theo mình biết kết quả phỏng vấn của bạn sẽ được quyết định bởi những người phỏng vấn và hiring committee (tạm dịch là hội đồng chấm thi). Hiring committee sẽ có bản Google Docs của các bạn, vì vậy các bạn cũng nên viết sơ qua thuật toán, độ phức tạp vào trong Google Docs trong lúc giải thích cho người phỏng vấn.
Một số chú ý trong quá trình phỏng vấn:
Mình sẽ lấy ví dụ về mặt cài đặt bằng bài toán tìm xâu con đối xứng dài nhất với độ phức tạp $\mathcal{O}(N^2)$ ở phần 1:
int expand(const string& s, int left, int right) {
// given a palindrome substring: s[left..right], we expand [left, right] to
// find the maximum palindrome substring with center [left..right].
// returns: length of maximum palindrome substring with center [left..right].
while (left > 0 && right + 1 < s.length() && s[left-1] == s[right+1]) {
left--;
right++;
}
return right - left + 1;
}
int max_palindrome_substring(string s) {
// Given string s, find its longest palindrome substring.
// Returns: length of longest palindrome substring.
int result = 0; // our result
for (int center = 0; center < s.length(); center++) {
// odd-length substrings
result = max(result, expand(s, center, center));
// even-length substrings
if (center + 1 < s.length() && s[center] == s[center+1]) {
result = max(result, expand(s, center, center+1));
}
}
return result;
}
Một vài chú ý trong code trên:
Như đã trình bày ở phần đầu bài viết, vòng cuối cùng bạn phải vượt qua là "Host matching". Mục đích của phần này là để các team tìm người phù hợp. Do đó bạn sẽ được phỏng vấn với người thuộc team đó, và bị hỏi gì cũng phụ thuộc chủ yếu vào team. Có team sẽ hỏi thuật toán, code, có team sẽ chỉ hỏi chung chung về sở thích của bạn hoặc có team sẽ chỉ giới thiệu về những cái họ làm rồi nhận luôn chứ không cần hỏi gì thêm.
Vòng này có tính rủi ro khá cao. Bạn có thể tăng khả năng đỗ của mình nếu có quen biết với nhân viên Google và xin trực tiếp vào những team đó. Ngoài ra nếu bạn nộp resume sớm sẽ có lợi thế hơn ở vòng này. Ví dụ các bạn muốn đi thực tập vào hè 2017, thì nên nộp resume từ tháng 9 năm 2016.