README-vn.md 21 KB

Google Interview University

Bản gốc:

Tác giả gốc: John Washam

Đóng góp cho bản dịch tiếng Việt:

Ghi chú riêng cho việc duy trì và cập nhật bản dịch tiếng Việt:

  • Bản dịch này nhằm mục đích khuyến khích các bạn trẻ yêu thích công nghệ nhưng chưa vững tiếng Anh dễ tiếp cận, và tìm được hướng nghiên cứu. Để đi xa hơn trong ngành công nghệ thông tin, sớm hay muộn, bạn cũng cần phải trau dồi vốn tiếng Anh của mình. Vì vậy, các thuật ngữ chuyên ngành, mình xin được giữ nguyên gốc. Ví dụ như: stack, heap, queue,...

  • Mình cố gắng dịch thoát nghĩa, sao cho các bạn với ít kiến thức công nghệ thông tin nhất cũng có thể hiểu được. Trong quá trình dịch khó có thể trách khỏi sai sót, xin được lượng thứ.

  • Mọi ý kiến, đóng góp về bản dịch, vui lòng tạo một issue mới hoặc bạn có thể chỉnh sửa và tạo Pull Request, đồng thời cc trực tiếp các dịch giả để kiểm tra.

Giới thiệu

Đây là kế hoạch học tập trong nhiều tháng của tôi, để từ một nhà phát triển web (tự học, không có bằng cấp về Khoa học máy tính) trở thành một kỹ sư phần mềm ở Google.

Viết code trên bảng - ánh trích từ bộ phim Silicon Valley của HBO

Danh sách dài này được trích và mở rộng từ Ghi chú huấn luyện của Google, vậy nên đây là những gì bạn cần biết. Một vài mục tôi thêm vào ở cuối danh sách có thể xuất hiện trong cuộc phỏng vấn hoặc hữu ích cho việc giải quyết các bài toán. Nhiều mục đến từ bài viết Lấy được việc ở Google (Get that job at Google)" của Steve Yegge.

Tôi lược bớt những gì bạn cần từ lời khuyên của yegge. Tôi cũng chỉnh sửa lại các yêu cầu dựa trên thông tin tôi có được từ bạn bè ở Google. Danh sách này được thiết kế cho Kỹ sư phần mềm hoặc những ai chuyển từ phát triển web hoặc phần mềm sang kỹ nghệ phần mềm (khi mà kiến thức về khoa học máy tính là bắt buộc). Nếu bạn có nhiều kinh nghiệm và muốn khẳng định nhiều năm trong đó bạn làm việc như một kỹ sư phần mềm, hãy sẳn sàng cho một buổi phòng vấn khó hơn. Xem thêm ở đây.

Nếu bạn có kinh nghiệm trong phát triển web hoặc ứng dụng, hãy chú ý rằng Google xem xây dựng phần mềm khác với web và ứng dụng thông thường. Họ yêu cầu kiến thức về khoa học máy tính.

Thêm vào đó, nếu bạn muốn trở thành một kỹ sư hệ thống (System engineer), hãy học thêm từ danh sách bổ sung (mạng máy tính, bảo mật,...)


Mục lục

---------------- Everything below this point is optional ----------------


Vì sao tôi cần tài liệu này?

Tôi đang chuẩn bị tham gia phỏng vấn ở Google. Tôi từng làm web, xây dựng các dịch vụ và lập các công ty khởi nghiệp từ năm 1997. Tôi có bằng Kinh tế, nhưng không có bằng Khoa học máy tính. Tôi thấy sự nghiệp của mình khá thành công, nhưng như thế chưa đủ. Tôi muốn làm việc ở Google, được tham gia xử lý một hệ thống lớn; thực sự hiểu rõ về máy tính, sự hiệu quả của các thuật toán và cấu trúc dự liệu, các ngôn ngữ lập trình cấp thấp, và chúng hoạt động cùng nhau như thế nào. Và nếu bạn không biết về cái nào trong số đó, Google sẽ không tuyển bạn.

Khi tôi bắt đầu dự án này, tôi không phân biệt được stack và heap, không biết về Big-O, không có khái niệm gì về cây (tree) hay việc duyệt đồ thị (graph). Và nếu buộc phải việt code cho một thuật toán sắp xếp, tôi đảm bảo rằng nó sẽ không chạy tốt.

Tất cả các cấu trúc dự liệu tôi từng sử dụng đề được dựng sẵn trong ngôn ngữ lập trình và tôi không nhất thiết phải biết chúng làm việc như thế nào. Tôi chưa từng phải tự quản lý vùng nhớ, trừ khi một tiến trình đang chạy ném lỗi "hết bộ nhớ" (out of memory), và sau đó tôi phải tìm một cách giải quyết khác. Tồi từng sử dụng mảng nhiều chiều vài lần trong dời, và hàng ngàn mảng liên kết (map hoặc dictionary cho dễ hiểu). Nhưng thực sự tôi chưa từng tự mình xây dựng một cấu trúc dữ liệu nào.

Nhưng, sau khi trải qua dự án này, tôi rất tự tin rằng mình sẽ được tuyển. Đây là một dự án dài hơi, sẽ tốn của tôi hàng tháng. Nếu bạn đã quen với nhiều nội dung trong này, bạn sẽ mất ít thời gian hơn.

Sử dụng như thế nào?

Phần này được viết lại khá nhiều để thuận tiện cho các bạn tiếp cận. Dựa theo bản gốc, tác giả có vẻ như cũng đang cố hướng dẫn cho người mới dùng git.

Bạn có thể bỏ qua mục này nếu đã có kiến thức về Git, Github và Github Flavored Markdown

Nếu bạn chưa biết về git thì vui lòng tham khảo các bài hướng dẫn sau để nắm cách sử dụng:

Tiếp theo, bạn cần biết cách fork một repo trên github (Mình không tìm được hướng dẫn tiếng Việt nào thích hợp.)

Ok, bây giờ bạn có thể bắt đầu:

  • Fork repo này.
  • Clone bản fork của bạn về máy tính cá nhân.

    git clone https://github.com/<your-username>/google-interview-university
    
  • Chạy các dòng lệnh sau

  • Tạo một branch mới để đánh dấu tiến độ của bạn:

    git checkout -b progress
    
  • Check các phần đã hoàn thành bằng cách thêm x vào giữa cặp ngoặc vuông ([ ]), như thế này: [x].

  • Chạy git add . để bắt đầu lưu lại các thay đổi.

  • Chạy git commit -m "commit message". Thay commit message với ghi chú của bạn cho sự thay đổi đó.

  • Đồng bộ thay đổi với bản fork trên Github của bạn bằng git push origin master.

Tự tạo cảm hứng Googley

In một (hay vài cái cũng được) đề can "future Googler" và để nó (chúng) ở đâu đó mà bạn luôn nhìn thấy và nghĩ đến được.

future Googler sign

Tôi đã được tuyển chưa?

Tôi đang ở trong hàng đợi. Hy vọng sẽ sớm đến lược phỏng vấn.

Cảm ơn vì đồng ý giới thiệu tôi, JP.

Theo dõi cuộc hành trình của tôi

Tôi cũng đang đi trên con đường này. Hãy cùng xem chúng ta đi được đến đâu:

John Washam - Google Interview University

Đừng nghĩ rằng bạn không đủ thông minh

Về Google

Về nguồn video

Một vài video chỉ xem được khi bạn tham gia vào các lớp học online trên Coursera, EdX, hay Lynda.com. Các lớp đó được gọi là MOOC. Đôi khi các lớp không có sẵn, và bạn phải đợi một vài tháng đến khi chúng được mở lại, do đó bạn không thể truy cập vào video được. Lynda.com thì không miễn phí.

Tôi sẽ rất cảm kích sự hỗ trợ của các bạn trong việc thêm các nguồn video miễn phí và luôn sẵn có, ví dụ như Youtube, để hỗ trợ nguồn video từ các khóa học online.
Tôi cũng rất thích xem các bài giảng của các trường đại học.

Quy trình phỏng vấn & các bước chuẩn bị tổng quát

Chọn ngôn ngữ lập trình cho cuộc phỏng vấn

Tôi viết bài báo ngắn về điêu này: Quan trọng: Chọn ngôn ngữ lập trình cho phỏng vấn ớ Google

Bạn có thể chọn ngôn ngữ mà bạn quen thuộc để thực hiện phần viết mã trong lúc phỏng vấn, nhưng với Google, những ngôn ngữ sau đây là thích hợp nhất:

  • C++
  • Java
  • Python

Bạn cũng có thể sử dụng các ngôn ngữ sau đây, nhưng hãy tìm hiểu thêm trước. Chúng có thể có bất lợi:

  • JavaScript
  • Ruby

Dù sao, bạn cũng cần phải rất quen thuộc với ngôn ngử lập trình của mình.

Xem thêm về các sự lựa chọn:

Xem tài liệu về các ngôn ngữ ở đây

Bạn sẽ thấy vài tài liệu về C, C++ và Python bên dưới, vì tôi đang học chúng. Ngoài ra còn có một vài đầu sách nữa, xem ở cuối.

In progress