07/11/2018, 23:31

Tại sao phải ôn luyện full-time 8 tháng cho 1 buổi phỏng vấn với Google?

Đúng vậy, tôi đã dành hàng ngàn giờ để đọc sách, viết code, xem các bài giảng về khoa học máy tính… làm tất cả mọi thứ để chuẩn bị cho buổi phỏng vấn kĩ sư phần mềm của Google. Tham khảo kế hoạch ôn luyện của tôi tại đây: https://github.com/jwasham/google-interview-university ...

Đúng vậy, tôi đã dành hàng ngàn giờ để đọc sách, viết code, xem các bài giảng về khoa học máy tính… làm tất cả mọi thứ để chuẩn bị cho buổi phỏng vấn kĩ sư phần mềm của Google.

Tham khảo kế hoạch ôn luyện của tôi tại đây: https://github.com/jwasham/google-interview-university

Từng bước đến thành công

Tôi bắt đầu lập trình từ những năm cấp 2 nhưng khi lên đến ĐH, tôi lại theo đuổi Kinh tế. Lý do chính là vì tôi nghĩ sẽ có rất nhiều programmers tìm việc khi tôi tốt nghiệp. Nhưng, tôi đã sai.

Sau đó, tôi gia nhập quân đội để trở thành 1 programmer, nhưng nhà tuyển dụng bảo tôi hãy làm ở vị trí tình báo quân đội và tôi đã dành 2 năm tiếp theo để nghiên cứu tiếng Hàn. Tôi phục vụ tại Hàn Quốc 2 năm sau đó.

Trước khi rời quân đội, tôi đã nỗ lực để trở lại với lập trình và rất ngạc nhiên trước những khó khăn đang đợi mình. Tôi học những kiến thức CƠ BẢN tại trường cấp 2 và tiếp tục lập trình lúc học cấp 3. Nhưng tôi đã bắt đầu trở lại với việc nghiên cứu lập trình với C++, và khoảng cách quá lớn khiến tôi không thể bắt kịp.

Tuy rất thích lập trình web nhưng tôi đã sử dụng phần mềm với giao diện tương tự như Word để ra mắt những website của mình. Tôi đã không biết cách tạo websites ngay từ đầu.

Sau thời gian ở quân đội, tôi quyết định ở lại Hàn Quốc 1 năm và dạy tiếng Anh. Mỗi đêm, mỗi cuối tuần tôi đều học lập trình web, sử dụng các ngôn ngữ như Perl, HTML, CSS (còn khá mới thời điểm đó), JavaScript và SQL.

Sau 1 năm mài dũi cật lực, tôi có được 1 công việc tại khu Seattle.

Tính đến nay, tôi đã là web dev được 15 năm. Tôi bắt đầu ở 3 công ty, 2 trong số đó vẫn đang chạy và đang có lợi nhuận. Tôi đã làm việc tại những công ty lớn và những công ty nhỏ, hỗ trợ các startup ra mắt và phát triển, thực hiện tuyển dụng và quản lý các teams. Tôi từng là product manager, CEO, designer và marketer.

Tôi đã có nghề nghiệp thành công và đã học được rất nhiều thứ trong suốt hành trình đó. Nhưng vẫn chưa đủ.

Tìm kiếm sự thay đổi về nghề nghiệp

Còn nhớ lúc tôi nói mình không có tấm bằng về khoa học máy tính không? Đó chính là điểm khác biệt.

Cách đây vài năm, tôi đã nghĩ mình có thể làm việc ở bất kì đâu. Tôi nghĩ mình là 1 nhân tố hot, khó tìm: web developer full-stack. Nhưng bước vào giai đoạn tìm việc năm 2013, tôi nhận ra mình còn thiếu nhiều kĩ năng. Tôi đã dành nhiều thời gian để kiếm tiền bằng cách mở startups khi rảnh rỗi và dần khiến các kĩ năng của bản thân hao mòn. Tôi đã không theo kịp công nghệ.

Trong nhiều năm, tôi học chỉ đủ để tồn tại. Tôi có kĩ năng rộng nhưng lại không chuyên sâu vào thứ gì. Đừng hiểu lầm, tôi có thể vẫn được tuyển dụng nhưng không phải trong những ngành công nghệ hoặc lĩnh vực mà tôi muốn làm việc. Tôi có thể làm cho những công ty mà tech stack có thể hơi lỗi thời 1 chút, giống như chính tôi vậy. Những nơi đó có nhiều tiền thật nhưng viễn cảnh tương lai thì chẳng có gì thú vị.

Nhận thức của tôi nâng lên 1 tầm cao mới vào năm ngoái tại 1 hội chợ việc làm. Tôi đã rất muốn làm việc cho 1 công ty nội địa, là các startup labs được vận hành bởi các công ty đầu tư mạo hiểm. Tuy nhiên, trước thực tế là tôi thiếu tấm bằng khoa học máy tính và các kĩ năng, kiến thức đi kèm với 1 tấm bằng như thế, tôi đã không có cơ hội.

Thời điểm đó tôi vẫn đang làm full-time trong các hoạt động kinh doanh của mình và bây giờ vẫn vậy.

Đầu năm 2016, tôi quyết định nên có 1 sự thay đổi về nghề nghiệp, chuyển từ web dev sang software engineer. Tôi cần phải học thật chăm và luyên tập liên tục để ngốn hết tấm bằng khoa học máy tính trong vài tháng nhưng tôi biết một khi hoàn thành, mình có thể bắt đầu 1 công việc mới.

Bạn có thể không thấy được sự khác biệt giữa các vị trí lập trình web và software engineering vì cả 2 đều liên quan đến lập trình và sự lành nghề. Nhưng software engineering đòi hỏi kiến thức về cấu trúc dữ liệu và thuật toán, các compiled languages, memory considerations và khả năng thấu hiểu sức ảnh hưởng trong các quyết định về code, architecture của các machines có liên quan.

170102-post-fb05Công thức tối ưu PHP & PHP7 hàng đầu. Đăng kí ngay!

Đây cũng chính là kiến thức mà các công ty lớn mong đợi ở các ứng viên khi tuyển dụng các vị trí về software engineering.

Tôi đã tiếp cận với 1 người quen làm việc tại Google và hỏi anh ấy về kinh nghiệm tại dây. Tôi từng đọc quyển How Google Works và khá thân thuộc với Google.

Qua 1 mối quen biết khác, tôi đã nhận được bản sao chép các bài notes tập huấn của Google dùng để phỏng vấn các ứng viên. Đây chính là nền tảng cơ bản cho kế hoạch ôn luyện của tôi.

Google là 1 nơi làm việc khá tốt, nhưng thậm chí trước khi tôi biết đến điều đó, Google đã là mục tiêu của tôi.

Tại sao lại là Google?

Google đã đặt ra chuẩn mực tuyển dụng rất cao vì họ chỉ muốn tuyển những người tốt nhất. Vì vậy, nếu tôi đặt tầm nhìn của mình thật cao (được làm việc tại Google), tôi vẫn có thể được tuyển dụng ở bất kì đâu dù tôi vẫn chưa được Google chọn.

Càng biết nhiều về Google, tôi lại càng muốn làm việc ở đó. 

Tóm lại, Google là 1 công ty tuyển những người sáng tạo, thông minh và đối xử với họ tốt. Google tưởng thưởng cho những người xứng đáng, ủng hộ các ý tưởng lớn và đem đến cho nhân viên sự tự do để đưa ra những ý tưởng tốt cho người dùng.

Quy trình tuyển dụng được điều chỉnh để mang về những con người thông minh, nhiệt huyết. Google đã mài giũa chương trình tuyển dụng và phỏng vấn qua nhiều năm. Các câu hỏi quá phức tạp tràn ngập. Ngày nay, các ứng viên được chọn dựa trên khả năng coding, kiến thức kĩ thuật và tính “Googleyness” – có rất nhiều thứ để chỉ trong 1 từ đó thôi.

Cách thức quản lý của Google cũng khác biệt. Những người điều hành không tập trung vào quản lý vi mô. Họ tin tưởng các kĩ sư sẽ đưa ra những quyết định đúng đắn. Tin tưởng nhân viên giúp thay đổi vai trò của các managers tại Google theo những gì mà mọi người hình dùng về công việc quản lý. Thêm nữa, các nhà quản lý không thể đơn phương tuyển dụng, sa thải hay thăng chức. Khi ban điều hành giải quyết các chính sách, rất nhiều quyết định quản lý quan trọng được nhân viên lĩnh hội, góp phần ngăn ngừa mối nguy hiểm đó.

Những người thuộc các bộ phận vân hành của Google (HR) đã học cách làm việc thêm giờ, sử dụng dữ liệu và góp ý nhân viên để cải thiện các hệ thống đánh giá, quy trình tuyển dụng, thăng chắc, chính sách bồi thường, quyền lợi… Tham khảo Work Rules! của tác giả Laszlo Bock để hiểu hơn.

Đúng vậy, quyền lợi của nhân viên Google rất đáng kinh ngạc. Tôi đã từng dạo 1 vòng tour tại trụ sở Google ở Kirkland (Washington) và mọi thứ thực vượt quá mong đợi.

Có thể nói, mong đợi của tôi đã được đặt ở chuẩn mực cao.

Google Interview University

Bạn còn nhớ các bài notes tập huấn mà tôi nhận được khi đề cập đến những gì tôi sẽ học không? Tôi thấy danh sách các topics cũng dễ nghiên cứu dù tôi chưa biết bất cứ thứ gì trong danh sách đó.

Tôi chuyển các topics trong notes thành dàn bài và bắt đầu nghiên cứu các topics với các videos bài giảng trên Youtube từ MIT và UC Berkeley. Danh sách cứ thế tăng lên.

Tôi đã công bố danh sách đó trên Github vì tài khoản Github của tôi khá trống trải. Vì tất cả code tôi viết cho các doanh nghiệp và công việc riêng có tính bảo mật nên nhiêu người sẽ nghĩ tôi không code gì cả khi nhìn vào tài khoản Github. Tôi cần phải xây dựng portfolio nên đã đặt trên cho dự án này là “Project 9894” vì Google ra mắt vào ngày 4/9/1998. Sau đó, tôi đã tên lại thành “Google Interview University”.

Theo thời gian, tôi cũng thêm vài topics tự chọn mà mình khám phá được trên suốt hành trình vừa qua.

Danh sách đọc mùa hè năm nay của tôi

Tôi đã khá ngạc nhiên khi nhận ra mình đã tiến xa như thế nào trong sự nghiệp dù chẳng biết gì về cách CPU thực thi 1 chương trình, làm thế nào mà bộ nhớ bị rò rỉ… Tôi chỉ biết “vừa đủ” để thành công mà thôi.

170102-post-fb05Công thức tối ưu PHP & PHP7 hàng đầu. Đăng kí ngay!

Dự án Github nhỏ của tôi bắt đầu với vài stars, và tôi đã ra mắt 1 bài post trên blog để kỉ niệm 20 stars đạt được.

Một sáng tỉnh dậy, tôi nhận ra nó đã lên đến 120 stars. Một ai đó đã tweet về Github của tôi vào buổi đêm, giúp nó xuất hiện trên báo cáo các Github xu hướng trong ngày và Github của tôi giữ #1 được vài ngày.

Rất nhiều người tử tế đã tiếp cận, cảm ơn và cổ vũ tôi. Hóa ra có hàng ngàn người không chỉ muốn làm việc tại Google mà còn muốn trở thành software engineer và danh sách này chính là to-do list mà họ cần.

Giờ nó đã vượt trên 21,000 stars.

Tôi vẫn không thể tin được.

Điều gì sẽ xảy ra nếu tôi không kiếm được việc tại Google?

Chắc chắn sẽ không có tận thế nào xảy đến.

Tôi đã dành thời gian, tâm huyết để nghiên cứu, ôn luyện với mục tiêu được tuyển dụng vào vị trí software engineer tại Google nhưng dù tôi có thất bại đi nữa, tôi vẫn được trang bị các kĩ năng, kiến thức cần có để làm việc như 1 software engineer ở bất kì công ty nào.

Dù tôi dừng lại ở bất kì cột mốc nào thì tôi vẫn đang tiệm cận với vị trí software engineer cấp độ mới vào nghề. Tôi chỉ có khả năng tương đương với 1 người mới tốt nghiệp với tấm bằng CS (Computer Science – Khoa học máy tính) nhưng tôi lại thừa hưởng được nhiệt huyết của 1 người fresher. Đây chính là thế giới mới đối với tôi. Tôi chỉ mới bắt đầu. Tôi không sợ sẽ mắc lỗi vì tôi biết mình sẽ mắc lỗi. Tôi cũng muốn học hỏi mọi thứ mình có thể và trở thành 1 sự bổ sung xuất sắc dành cho bất kì 1 team nào.

Đừng học quá nhiều như những gì tôi đã làm

Đúng vậy, tôi đã mất 8 tháng. Nhưng đáng lẽ, tôi đã có thể rút ngắn được quy trình đó. Như bất cứ kì startup nào đang nuôi dưỡng mục tiêu lớn, bạn mắc sai lầm và làm những thứ tốn thời gian. Có rất nhiều thứ tôi ước mình có thể quay lại và làm khác đi. 

Tôi nghiên cứu những topics không cần thiết, 1 vài topics là bởi tôi nghĩ mình sẽ cần chúng khi phỏng vấn và 1 số khác là vì tôi muốn có sẵn kiến thức để sử dụng khi bắt đầu làm việc. Tôi không muốn mình là gánh nặng cho team mà mình hỗ trợ. Hóa ra tôi đã chuẩn bị quá mức cần thiết.

Tôi dành 3 tuần để đọc quyển sách 1000 trang về C++. Tôi không nhớ hết 1000 pages đó nhưng hiện giờ thì tôi đã biết 1 chút về C++. Tuy nhiên, tôi lại đang sử dụng ngôn ngữ Python khi phỏng vấn. Tôi đã tưởng mình cần C++, C hoặc Java nhưng tôi đã sai. Tốt nhất là bạn nên hỏi chứ không nên giả dụ. 

Tôi đã đọc nhiều sách hơn tôi cần. Chỉ có 3 hoặc 4 quyển sách  mà đáng lẽ tôi nên đọc.

Tôi có 1 quyển code catalog với hàng tá thuật ngữ, mà hầu hết trong số chúng khó lòng xuất hiện trong 1 bài phỏng vấn. Bạn không cần phải làm như thế.

Đống các thuật toán mà tôi in ra để review

Tôi đã dành hàng giờ để xem các videos trên Youtube nhưng đáng lẽ ra tôi nên xem ít hơn và trải đều các topics.

Tôi đáng lẽ nên dừng việc đọc sách và xem videos sớm và bắt tay xử lý các vấn đề coding sớm hơn. Tôi đã có thể dành nhiều thời gian hơn để áp dụng các topics mà mình đã học.

Spaced repetition – “Lặp lại cách quãng” là chìa khóa để luyện tập khả năng ghi nhớ. Khi bạn học thứ gì đó, hãy review nó lần nữa và lần nữa. Với mức độ lặp lại này, bạn sẽ củng cố khả năng học của mình. Dành nhiều giờ và nhiều giờ tại 1 thời điểm cho priority queues (hàng ưu tiên) không giúp bạn trở thành chuyên gia. Bạn chỉ trở thành chuyên gia khi xem lại và review nhiều lần theo thời gian, từ đó bạn sẽ không thể quên được nội dung chi tiết.

Để hỗ trợ việc review, tôi đã tạo 1792 flashcards (digital flashcards). Thật là quá nhiều. Tôi review chúng trên điện thoại hoặc tablet bất cứ khi nào có thời gian rảnh (như trong thời gian shopping Christmas). Flash cards và spaced repetition đi cùng với nhau. Dù tôi có đưa ra được câu trả lời đúng trên flashcard thì tôi cũng không cho là mình đã biết rõ vấn đề đó. Tôi giữ flashcard lại và khi nào thấy nó, trả lời vấn đề chính xác nhiều lần thì tôi mới đánh dấu là mình đã biết.

170102-post-fb05Công thức tối ưu PHP & PHP7 hàng đầu. Đăng kí ngay!

Nỗi sợ (“Chuyện gì sẽ xảy ra nếu họ hỏi tôi về red-black trees – là một dạng cây tìm kiếm nhị phân tự cân bằng, một cấu trúc dữ liệu được sử dụng trong khoa học máy tính) khiến tôi nghiên cứu nhiều topics hơn những gì mà bản thân thực sự cần.

Nhưng tôi không muốn chỉ chuẩn bị cho phỏng vấn, tôi muốn chuẩn bị cho 1 công việc tại Google, giải quyết được các vấn đề lớn lao hơn. Điều đó đồng nghĩa với việc khi biết được các thuật toán, tôi sẽ tiết kiệm được computing resources về thời gian, không gian và I/O.

Tôi có thể không cần biết thuật toán Ford-Fulkerson nhưng thật tốt khi biết có 1 công cụ có sẵn như thế để giải quyết các tình huống phát sinh (mà không cần nhớ implementation) và phát hiện khả năng ứng dụng nó vào xử lý vấn đề.

Kết

Lúc đầu, tôi đã ước giá như mình có thể bỏ qua hết tất cả quá trình ôn luyện này, chỉ cần tăng tốc và cứ thế được tuyển dụng, để tôi có thể dành thời gian học những ngôn ngữ và công cụ hỗ trợ cho team của mình. Nhưng trong suốt thời gian ấy, tôi nhận ra tầm quan trọng của những kiến thức mình có được, và mặc dù hầu hết chúng không thể áp dụng trong cuộc sống hằng ngày, tôi vẫn rất mừng vì mình đã dồn nhiều công sức. Tôi thực sự rất ngưỡng mộ lịch sử của điện toán, cấu trúc dữ liệu, học thuật và cách các hệ thống máy tính vận hành ở cấp độ thấp.

Bạn có thể tìm tôi ở đâu?

Googley as Heck: https://googleyasheck.com

Google Interview University trên Github: https://github.com/jwasham/google-interview-university

Nguồn: Techtalk via Medium

Bài liên quan

Tại sao phải ôn luyện full-time 8 tháng cho 1 buổi phỏng vấn với Google?

Đúng vậy, tôi đã dành hàng ngàn giờ để đọc sách, viết code, xem các bài giảng về khoa học máy tính… làm tất cả mọi thứ để chuẩn bị cho buổi phỏng vấn kĩ sư phần mềm của Google. Tham khảo kế hoạch ôn luyện của tôi tại đây: https://github.com/jwasham/google-interview-university ...

Trịnh Tiến Mạnh viết 1 tuần trước

Tại sao không được dùng trùng tên file css cho theme và module trong Drupal 7

Hôm nay mình tạo một module trong Drupal. Trong module của mình có một file css tên là style.css. Và mình dùng drupal_add_css() để load file css này. Tuy nhiên, mình làm mãi mà file này vẫn không được load. Đoạn mã của mình như sau: drupal_add_js(drupal_get_path('module', 'shoppingcart') . ...

Bùi Văn Nam viết 17:29 ngày 01/10/2018

Tại sao phải dùng BigDecimal khi tính toán về tiền tệ trong Java?

Nếu bạn là 1 Java dev, ắt hẳn bạn đã từng làm 1 task về những tính toán liên quan đến tiền bạc, lương thưởng, các loại tài chính... Nếu bạn dùng float/double cho việc này thì pull request của bạn sẽ ăn max comment thôi, và tất nhiên là bạn sẽ được force về dùng BigDecimal. Nhưng bạn đã tự hỏi tại ...

Trịnh Tiến Mạnh viết 22:38 ngày 08/09/2018

Nén JavaScript và CSS, khi nào và tại sao phải làm như vậy?

Hẳn khi các bạn tham khảo các dự án hay source code của một ai đó có kinh nghiệm, có thể các bạn sẽ thấy trong source code của họ thường có các tệp tin dưới dạng như là style.min.css hay script.min.js . Vậy chữ min ở đây có nghĩa là gì? Nó chính là từ viết tắt của minify trong tiếng anh nghĩa ...

Tạ Quốc Bảo viết 14:10 ngày 07/09/2018

Vai trò của BA trong dự án SCRUM và lý do tại sao QA lại là ứng viên tốt nhất cho vị trí này.

Vai trò nổi bật của các nhân viên phân tích nghiệp vụ (BA) trong SCRUM: Một nhà phân tích nghiệp vụ, người được gọi tắt là BA, đóng một vai trò quan trọng và có tác động mạnh mẽ trong SCRUM. BA là người liên kết giữa PO/ khách hàng và nhóm CNTT kỹ thuật. Mặc dù mọi người đã tìm hiểu và biết qua ...

Hoàng Hải Đăng viết 18:20 ngày 12/08/2018
0