You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 KiB

Tự ôn tập phỏng vấn về lập trình (Coding 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 (CNTT), 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.


Ban đầu, đây chỉ là một danh sách to-do (danh sách các việc cần làm) ngắn về các chủ đề phải ôn tập của tôi, để trở thành một kỹ sư phần mềm. Nhưng rôi nó lớn dần nên như ngày nay. Sau khi đi hết con đường này, tôi đã được tuyển vào vị trí Software Development Engineer ở Amazon! Bạn có lẽ không cần phải học nhiều như tôi đã học. Nhưng dù sao, mọi thứ bạn cần ở đây.

I studied about 8-12 hours a day, for several months. This is my story: Why I studied full-time for 8 months for a Google interview

Lưu ý: Bạn sẽ không cần phải học nhiều như tôi đã làm. Tôi đã lãng phí rất nhiều thời gian vào những thứ mà tôi không cần biết. Thêm thông tin về điều này ở phía dưới. Tôi sẽ giúp bạn đạt được mục tiêu mà không lãng phí thời gian quý giá của bạn.

Những chủ đề này sẽ chuẩn bị cho bạn nền tảng kiến thức vững vàng cho cuộc phỏng vấn kỹ thuật tại bất kỳ công ty phần mềm nào, bao gồm cả những gã khổng lồ như: Amazon, Facebook, Google hay Microsoft.

Chúc may mắn!

Giới thiệu

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

Đây là kế hoạch học tập kéo dài nhiều tháng của tôi để trở thành một software engineer cho một công ty lớn.

Yêu cầu:

  • Một chút kinh nghiệm về mã hóa (biến, vòng lặp, phương thức/hàm, v.v.)
  • Tính kiên nhẫn
  • Thời gian

Lưu ý rằng đây là một kế hoạch dành cho software engineering, không phải frontend engineering hay full-stack. Thực sự có một siêu lộ trình và khóa học cho những career path đó ngoài kia (xem https://roadmap.sh/ để biết thêm chi tiết).

Có rất nhiều điều để học trong một chương trình Khoa học Máy tính tại trường đại học, nhưng chỉ cần biết khoảng 75% là đủ tốt cho một cuộc phỏng vấn, vì vậy đó là những gì tôi đề cập ở đây. Để có một chương trình tự học Khoa học Máy tính hoàn chỉnh, các tài nguyên cho kế hoạch học tập của tôi đã được đưa vào Lộ trình Khoa học Máy tính của Kamran Ahmed: https://roadmap.sh/computer-science


Mục lục

Kế hoạch học tập

Nội dung học tập

Tìm việc

---------------- Những mục dưới đây là tuỳ chọn ----------------

Optional Extra Topics & Resources


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

Nếu bạn muốn làm kỹ sư phần mềm cho một công ty lớn, đây là những điều bạn phải biết.

Nếu bạn đã bỏ lỡ cơ hội để có được bằng cử nhân khoa học máy tính, giống như tôi, điều này sẽ giúp bạn bắt kịp và tiết kiệm bốn năm cuộc đời của 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 traversal). 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 đều được cài đặt 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 Process đ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 đời, và hàng ngàn mảng kết hợp (associate arrays). 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.

Đây là một kế hoạch dài hơi, sẽ tốn của bạn vài 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 tài liệu này như thế nào?

Tất cả những gì dưới đây là một bản phác thảo, và bạn nên tiếp cận các mục theo thứ tự từ trên xuống dưới.

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:

Nếu bạn không muốn sử dụng git

Trên trang này, nhấp vào nút Code gần phía trên, sau đó nhấp vào "Download ZIP". Giải nén file và bạn có thể làm việc với các file văn bản.

Nếu bạn mở trong một trình soạn thảo code hiểu markdown, bạn sẽ thấy mọi thứ được định dạng đẹp mắt.

Cách tải repo dưới dạng tệp zip

Nếu bạn muốn làm quen với git

Tiếp theo, bạn cần biết cách gắp (fork) một repo trên github:

  1. Fork GitHub repo: https://github.com/jwasham/coding-interview-university bằng cách clicking vào nút Fork.

    Fork the GitHub repo

  1. Clone bản fork của bạn về máy tính cá nhân.

    git clone https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.git
    cd coding-interview-university
    git remote add upstream https://github.com/jwasham/coding-interview-university.git
    git remote set-url --push upstream DISABLE  # để bạn không đẩy Process cá nhân của mình trở lại repo gốc
    
  • 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
    
  1. 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 main.

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

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 chưa mở, 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.

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

Bạn sẽ cần phải chọn một ngôn ngữ lập trình cho các cuộc phỏng vấn lập trình mà bạn tham gia, nhưng bạn cũng cần tìm một ngôn ngữ mà bạn có thể sử dụng để nghiên cứu các khái niệm khoa học máy tính.

Ưu tiên là ngôn ngữ đó sẽ giống nhau, để bạn chỉ cần thành thạo một ngôn ngữ.

Đối với Kế Hoạch Học Tập này

Khi tôi thực hiện kế hoạch học tập, tôi đã sử dụng 2 ngôn ngữ cho hầu hết phần này: C và Python

  • C: Ngôn ngữ bậc thấp. Cho phép bạn làm việc với con trỏ và cấp phát/giải phóng bộ nhớ, vì vậy bạn cảm nhận được cấu trúc dữ liệu và thuật toán trong tâm can của mình. Trong các ngôn ngữ cấp cao hơn như Python hoặc Java, những điều này được ẩn đi. Trong công việc hàng ngày, điều đó thật khủng khiếp, nhưng khi bạn đang học cách xây dựng những cấu trúc dữ liệu cấp thấp này, thật tuyệt vời khi cảm thấy gần với phần cứng.
    • C có mặt ở khắp mọi nơi. Bạn sẽ thấy các ví dụ trong sách, bài giảng, video, ở khắp mọi nơi trong khi bạn đang học.
    • Ngôn ngữ lập trình C, Ấn bản thứ 2
      • Đây là một cuốn sách ngắn, nhưng nó sẽ giúp bạn hiểu rõ về ngôn ngữ C và nếu bạn thực hành một chút bạn sẽ nhanh chóng trở nên thành thạo. Hiểu C giúp bạn hiểu cách hoạt động của chương trình và bộ nhớ.
      • Bạn không cần phải đi sâu quá vào cuốn sách (hoặc thậm chí hoàn thành nó). Chỉ cần học cho đến khi bạn cảm thấy thoải mái khi đọc và viết bằng C.
  • Python: Hiện đại và rất biểu cảm, tôi học nó vì nó chỉ đơn giản là rất hữu ích và cũng cho phép tôi viết ít code hơn trong một cuộc phỏng vấn.

Đây là các khuyến nghị của tôi. Tất nhiên bạn có thể làm những gì bạn thích.

Có thể bạn không cần, nhưng dưới đây là một số trang web để học một ngôn ngữ mới:

Cho Cuộc Phỏng Vấn Lập Trình của bạn

Bạn có thể sử dụng một ngôn ngữ mà bạn quen thuộc để làm phần lập trình trong cuộc phỏng vấn, nhưng đối với các công ty lớn, 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ưới đây là một bài viết mà tôi đã viết về việc chọn ngôn ngữ cho cuộc phỏng vấn: Chọn Một Ngôn Ngữ cho Cuộc Phỏng Vấn Lập Trình. Đây là bài viết gốc mà bài đăng của tôi dựa trên: Chọn Một Ngôn Ngữ Lập Trình cho Cuộc Phỏng Vấn

Bạn cần phải quen thuộc với ngôn ngữ và có kiến thức về nó.

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

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

Sách về Cấu Trúc Dữ Liệu và Thuật Toán

Cuốn sách này sẽ tạo nền tảng cho khoa học máy tính của bạn.

Chỉ cần chọn một cuốn, bằng một ngôn ngữ mà bạn quen thuộc. Bạn sẽ đọc và code rất nhiều.

C

Python

Java

Lựa chọn ở bạn:

C++

Lựa chọn ở bạn:

Sách chuẩn bị phỏng vấn

Bạn không cần phải mua nhiều sách như thế này. Thực sự "Cracking the Coding Interview" có lẽ đã đủ, nhưng tôi đã mua thêm để tạo thêm cơ hội thực hành cho bản thân. Nhưng tôi luôn luôn làm quá mức.

Tôi đã mua cả hai. Chúng đã cho tôi rất nhiều bài tập thực hành.

  • Programming Interviews Exposed: Coding Your Way Through the Interview, 4nd Edition
    • Có câu trả lời bằng C++ và Java
    • Được khuyến khích bởi các khóa hướng dẫn của Google.
    • Đây là một phần luyện tập tốt trước khi bắt đầu với quyển Cracking the Coding Interview
    • Không quá khó, phần lớn các bài toán có lẽ dễ hơn nhiều so với những gì bạn thường thấy trong một buổi phỏng vấn (dựa theo những gì tôi đọc được)
  • Cracking the Coding Interview, 6th Edition
    • Trả lời bằng Java
    • Được khuyến nghị trên Google Careers site
    • Nếu bạn thấy mọi người trích dẫn "The Google Resume", đó là một cuốn sách được thay thế bởi "Cracking the Coding Interview".

Nếu bạn có nhiều thời gian hơn nữa:

Chọn 1:

Đừng phạm sai lầm của tôi

Danh sách này ngày càng dài theo năm tháng và tôi phải thừa nhận là nó ngoài tầm kiểm soát.

Sau đây là 1 vài lỗi tôi đã mắc phải, hy vọng rằng có thể mang lại cho bạn một chút kinh nghiệm.

1. Bạn sẽ không nhớ được tất cả

Tôi đã xem hàng giờ video và viết rất nhiều ghi chú, và chỉ sau vài tháng không còn nhớ chút gì. Tôi đã bỏ ra 3 ngày đọc lại các ghi chú và làm thẻ ghi nhớ để có thể đọc dễ dàng hơn.

Hãy đọc để tránh phạm phải sai lầm tương tự:

Retaining Computer Science Knowledge

2. Sử dụng flash card

Để giải quyết vấn đề, tôi đã viết 1 trang web nhỏ về flash card để thêm các thẻ mới với 2 dạng chính: kiến thức chung và code. Mỗi loại có định dạng riêng.

Tôi đã làm một trang mobile-first (lấy mobile là trọng tâm phát triển trang web) để có thể xem trên điện thoại và máy tính bảng, ở bất cứ đâu.

Tự tạo cho mình hoàn toàn miễn phí:

TÔI KHÔNG KHUYẾN NGHỊ sử dụng bộ flash card của tôi. Có quá nhiều và hầu hết chúng là những thông tin vặt không cần thiết.

Nhưng nếu bạn không muốn nghe lời tôi, đây là những gì bạn cần:

Hãy nhớ rằng tôi đã làm quá mức và các flash card có thể bao gồm cả assembly (ngôn ngữ máy) và Python cho đến cả máy học (machine learning) và thống kê. Như thế là quá nhiều so với những gì cần thiết.

Ghi chú dành cho các flash card: Lần đầu tiên bạn nhận ra bạn biết câu trả lời, đừng đánh dấu là đã biết.Bạn phải xem thẻ tương tự và đưa ra câu trả lời chính xác vài lần trước khi bạn thực sự khẳng định đã nắm được vấn đề. Lặp đi lặp lại việc này sẽ giúp kiến thức được khắc sâu vào não bạn.

Có thể thay thế thẻ ghi nhớ với Anki, đây là ứng dụng mà bạn sẽ thấy tôi khuyến khích sử dụng rất nhiều lần. Nó sử dụng một hệ thống lặp để giúp bạn có thể ghi nhớ được kiến thức.

Đây là ứng dụng cực kì thân thiện với người dùng, có mặt trên tất cả các hệ điều hành, và có hệ thống lưu trữ đồng bộ đám mây. Tốn khoản 25$ cho iOS nhưng miễn phí trên các hệ điều hành khác.

Cơ sở dữ liệu thẻ ghi nhớ của tôi tuân theo chuẩn định dạng của Anki: https://ankiweb.net/shared/info/25173560 (cảm ơn @xiewenya)

Một số sinh viên đã đề cập đến vấn đề định dạng với khoảng trắng có thể được sửa bằng cách thực hiện như sau: mở bộ thẻ, chỉnh sửa thẻ, nhấp vào thẻ, chọn nút "styling", và thêm "white-space: pre;" vào class thẻ.

Tôi giữ một danh sách xem nhanh các mã của ASCII, OSI stack, định nghĩa về Big-O, và nhiều hơn nữa. Tôi đọc bất cứ khi nào rảnh rỗi.

Khi gặp vấn đề trong lúc code, nghỉ ngơi chừng nửa giờ và đọc lại các thẻ ghi nhớ.

3. Làm Câu Hỏi Phỏng Vấn Lập Trình Trong Khi Bạn Đang Học

ĐIỀU NÀY RẤT QUAN TRỌNG.

Bắt đầu làm câu hỏi phỏng vấn lập trình trong khi bạn đang học cấu trúc dữ liệu và thuật toán.

Bạn cần áp dụng những gì bạn đang học để giải quyết vấn đề, nếu không bạn sẽ quên. Tôi đã mắc phải lỗi này.

Một khi bạn đã học một chủ đề, và cảm thấy khá quen thuộc với nó, ví dụ, danh sách liên kết:

  1. Mở một trong những Sách chuẩn bị phỏng vấn (hoặc trang web về vấn đề lập trình, được liệt kê dưới đây)
  2. Làm 2 hoặc 3 câu hỏi liên quan đến danh sách liên kết.
  3. Chuyển sang chủ đề học tiếp theo.
  4. Sau đó, quay lại và làm thêm 2 hoặc 3 vấn đề về danh sách liên kết.
  5. Làm như vậy với mỗi chủ đề mới bạn học.

Tiếp tục làm các vấn đề trong khi bạn đang học tất cả những điều này, không phải sau này.

Bạn không được tuyển dụng vì kiến thức, mà là cách bạn áp dụng kiến thức.

Có rất nhiều nguồn lực cho điều này, được liệt kê dưới đây. Hãy tiếp tục.

4. Tập trung

Có rất nhiều thứ lấy đi sự tập trung của ta, việc này tốn rất nhiều thời gian. Tập trung và toàn tâm toàn ý rất khó. Bật vài bản nhạc không lời và bạn có thể tập trung hơn.

Những phần không được đề cập

Có vài công nghệ đang thịnh hành nhưng không được đề cập đến, ví dụ:

  • Javascript
  • HTML, CSS, và các công nghệ thiết kế giao diện người dùng ("front-end").
  • SQL

Kế hoạch hàng ngày

Khóa học này bao gồm rất nhiều chủ đề. Mỗi chủ đề có thể mất của bạn vài ngày, hoặc thậm chí hơn một tuần. Điều này phụ thuộc vào lịch trình của bạn.

Mỗi ngày, hãy chọn chủ đề tiếp theo trong danh sách, xem một số video về chủ đề đó, sau đó viết code về cấu trúc dữ liệu hoặc thuật toán đó bằng ngôn ngữ bạn đã chọn cho khóa học này.

Bạn có thể xem code của tôi tại đây:

Bạn không cần phải ghi nhớ mọi thuật toán. Bạn chỉ cần hiểu đủ để có thể viết cài đặt của riêng bạn.

Luyện tập các câu hỏi coding

Tại sao cái này lại ở đây? Tôi chưa sẵn sàng để phỏng vấn.

Then go back and read this.

Lý do bạn cần thực hành giải các bài toán lập trình:

  • Nhận diện vấn đề, lựa chọn cấu trúc dữ liệu và thuật toán phù hợp
  • Xác định các yêu cầu của vấn đề
  • Trình bày cách suy nghĩ của bạn như thể bạn đang trong buổi phỏng vấn
  • Lập trình trên bảng trắng hoặc trên giấy, không phải với máy tính
  • Đưa ra được tính toán độ phức tạp về thời gian và không gian thực thi của giải pháp của bạn (xem Big-O phía dưới)
  • Kiểm tra giải pháp của bạn

Có một lời giới thiệu tuyệt vời về việc giải quyết vấn đề một cách có phương pháp và giao tiếp trong một cuộc phỏng vấn. Bạn cũng sẽ nhận được điều này từ các sách phỏng vấn lập trình, nhưng tôi thấy điều này xuất sắc:: Thuật toán thiết kế canvas

Viết code trên bảng trắng hoặc giấy, không phải máy tính. Kiểm tra với một số đầu vào mẫu. Sau đó gõ nó và kiểm tra nó trên máy tính.

Nếu bạn không có bảng trắng ở nhà, hãy mua một tờ giấy vẽ lớn từ cửa hàng mỹ thuật. Bạn có thể ngồi trên ghế sofa và thực hành. Đây là "bảng trắng sofa" của tôi. Tôi đã thêm bút vào ảnh chỉ để đo lường. Nếu bạn sử dụng bút, bạn sẽ ước gì mình có thể tẩy. Nhanh chóng trở nên lộn xộn. Tôi sử dụng 1 chiếc bút chì và 1 cục gôm.

bảng trắng sofa của tôi

Việc luyện tập giải các bài toán lập trình không phải là việc học thuộc lòng các câu trả lời cho các vấn đề lập trình.

Giải bài toán lập trình

Đừng quên các sách phỏng vấn lập trình quan trọng của bạn ở đây.

Giải quyết vấn đề:

Video Câu Hỏi Phỏng Vấn Lập Trình:

Trang web Thử thách/Thực hành:

  • LeetCode
    • Trang web bài toán lập trình yêu thích của tôi. Đáng giá số tiền đăng ký cho 1-2 tháng bạn có thể chuẩn bị.
    • Xem video của Nick White và FisherCoder ở trên để xem hướng dẫn code.
  • HackerRank
  • TopCoder
  • Codeforces
  • Codility
  • Geeks for Geeks
  • AlgoExpert
    • Được tạo bởi các kỹ sư của Google, đây cũng là một nguồn tài nguyên tuyệt vời để trau dồi kỹ năng của bạn.
  • Project Euler
    • Rất tập trung vào toán học và không thực sự phù hợp với các cuộc phỏng vấn viết code

Bắt Đầu Nào

Được rồi, nói đủ nhiều rồi, hãy cùng học nào!

Nhưng đừng quên làm các bài toán lập trình ở phía trên trong khi bạn đang học!

Độ phức tạp của thuật toán / Big-O / Phân tích tiệm cận

Ồ, chắc cũng đủ rồi.

Khi bạn đọc "Cracking the Coding Interview", có một chương về điều này, và cuối chương có một bài kiểm tra để xem nếu bạn có thể xác định độ phức tạp thời gian chạy của các thuật toán khác nhau. Đó là một bài ôn tập và kiểm tra tuyệt vời.

Cấu trúc dữ liệu

Kiến thức ngoài

Cây

Sắp xếp

Tóm lại, dưới đây là biểu đồ trực quan của 15 thuật toán sắp xếp. Nếu bạn cần thêm chi tiết về chủ đề này, xem qua phần "Sắp xếp" trong Đọc thêm về một số đề tài

Đồ thị

Đồ thị có thể được sử dụng để miêu tả nhiều bài toán trong khoa học máy tính, vậy nên phần này cũng khá dài, tương đương với CâySắp xếp.

Bạn sẽ biết thêm nhiều ứng dụng của đồ thị trong sách của Skiena (xem danh mục sách bên dưới) và các sách về phỏng vấn.

Kiến thức bổ sung


Tổng kết

Phần này sẽ là các video ngắn đề bạn ôn tập lại hầu hết các khái niệm quan trọng.
Cũng tốt nếu như bạn muốn bồi dưỡng thường xuyên.

Lý lịch (Resume) của bạn

Khi bạn tiến gần đến kỳ phỏng vấn

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

Phỏng vấn mô phỏng:

Hãy nghĩ đến những thứ bạn sẽ được hỏi

Nghĩ sẵn 20 câu hỏi kỹ thuật bạn có thể gặp phải, cùng với danh sách bên dưới. Chuẩn bị 2 đến 3 câu trả lời cho mỗi câu hỏi. Hãy chuẩn bị cả câu chuyện (từ chính kinh nghiệm của bạn), chứ không chỉ một câu trả lời suông.

  • Tại sao bạn lại muốn ứng tuyển vị trí này?
  • Vấn đề khó chịu nhất bạn từng giải quyết là gì?
  • Thử thách lớn nhất bạn từng đối mặt?
  • Thiết kế (hệ thống) tốt nhất/tồi nhất bạn từng gặp?
  • Những ý tưởng để cải thiện các sản phẩm hiện có.
  • Bạn sẽ làm việc như thế nào để đạt hiệu quả tốt nhất, trong trường hợp làm việc một mình và làm theo team?
  • Kỹ năng hay kinh nghiệm nào của bạn thích hợp cho công việc này, và tại sao?
  • Bạn thích điều gì nhất ở [công việc X/ dự án Y]?
  • Thách thức lớn nhất bạn từng gặp phải ở [công việc X/ dự án Y]?
  • Lỗi lớn nhất bạn từng gặp phải ở [công việc X/ dự án Y]?
  • Bạn học được những gì ở [công việc X/ dự án Y]?
  • Những gì bạn cho rằng mình đã có thể làm tốt hơn ở [công việc X/ dự án Y]?

Chuẩn bị câu hỏi dành cho phỏng vấn viên

Một vài câu hỏi của tôi (Tôi có thể đã tìm hiểu trước rồi, nhưng vẫn muốn được nghe ý kiến từ góc nhìn của người phỏng vấn):

  • Quy mô của team thế nào?
  • Quy trình phát triển của bạn? Waterfall/sprints/agile?
  • Áp lực deadline có phổ biến không? Liệu có sự linh hoạt nào không?
  • Các quyết định của team được xây dựng như thế nào?
  • Khoảng bao nhiêu cuộc họp hàng tuần?
  • Bạn có cảm thấy môi trường làm việc của bạn giúp bạn tập trung không?
  • Hiện tại bạn đang làm gì?
  • Bạn thích gì ở công việc này?
  • Cuộc sống làm việc như thế nào?
  • Sự cân bằng giữa công việc và cuộc sống của bạn ra sao?

Khi bạn được nhận việc

Chúc mừng!

Hãy tiếp tục rèn luyện.

Bạn không bao giờ thực sự học xong!


*****************************************************************************************************
*****************************************************************************************************

Mọi thứ dưới đây là tùy chọn. Nó không cần thiết cho một cuộc phỏng vấn ở cấp độ mới vào nghề.
Tuy nhiên, bằng cách nghiên cứu những điều này, bạn sẽ tiếp xúc nhiều hơn với các khái niệm CS và sẽ được chuẩn bị tốt hơn
cho bất kỳ công việc kỹ sư phần mềm nào. Bạn sẽ trở thành một kỹ sư phần mềm toàn diện hơn.

*****************************************************************************************************
*****************************************************************************************************

Sách bổ sung

Đây là nơi bạn có thể đào sâu vào các chủ đề bạn thấy hứng thú
  • The Unix Programming Environment

    • cũ nhưng mà tốt
  • The Linux Command Line: A Complete Introduction

    • một sự lựa chọn hiện đại hơn
  • TCP/IP Illustrated Series

  • Head First Design Patterns

    • dẫn nhập nhẹ nhàng về các mẫu thiết kế.
  • Design Patterns: Elements of Reusable Object-Oriented Software

    • còn được gọi là "Sách của bộ tứ" (Gang Of Four, hoặc GOF)
    • quyển sách cổ diển về mẫu thiết kế.
  • Algorithm Design Manual (Skiena)

    • Như một tài liệu ôn tập và hỗ trợ nhận dạng vấn đề.
    • Danh mục thuật toán thật sự vượt xa độ khó của một cuộc phỏng vấn.
    • Cuốn sách có 2 phần:
      • Giáo trình về cấu trúc dữ liệu và giải thuật:
        • Ưu:
          • Là một bài tổng quát tốt tương đương với các giáo trình khác.
          • Nhiều câu chuyện thú vị từ kinh nghiệm của tác giả trong việc giải quyết các vấn đề thực tế và trong giới học thuật.
          • Code mẫu bằng C.
        • Nhược:
          • Cô đặc và có thể khó hiểu ngang với CLRS, và trong một số chủ đề, CLRS có thể là một tài liệu tốt hơn để tham khảo.
          • Các chương 7, 8, 9 có thể rất vất vả để theo được, vì một vài phần không được giải thích rõ, hoặc là yêu cầu nhiều não hơn những gì tôi có.
          • Đừng hiểu lầm: Tôi thích Skiena, cách dạy học và phong các của ông ấy, nhưng tôi có lẽ không đủ khả năng để tốt nghiệp ở Stony Brook (nơi Skiena giảng dạy).
      • Danh mục thuật toán:
        • Đây là lý do thực sự bạn mua cuốn sách này.
        • Cuốn sách này tốt hơn khi được sử dụng như một tài liệu tham khảo về thuật toán, chứ không phải là một thứ bạn đọc từ đầu đến cuối.
    • Trích dẫn từ Yegge: "Hơn hẳn những quyến sách khác, cuốn này giúp tôi hiểu rõ các bài toán về Graph phổ biến một cách đáng kinh ngạc và quan trọng như thế nào - chúng nên là một phần trong các công cụ của bất kỳ lập trình viên nào. Quyển sách đồng thời cũng bao phủ các cấu trúc dữ liệu cơ bản, các thuật toán sắp xếp. Đó là một điểm cộng. Nhưng phần quý giá thật sự nằm ở nửa sau, chính là bách khoa toàn thư ngắn gọn về hàng triệu bài toán hữu dụng và vô số cách để giải quyết chúng, trình bày sơ lược. Mỗi trang đều có một hình minh họa, giúp người đọc dễ ghi nhớ hơn. Đó là một cách tốt đề định dạng và phân loại các bài toán".
    • Có thể thuê quyển sách này trên Kindle
    • Câu trả lời cho các bài tập trong sách:
    • Errata
  • Algorithm (Jeff Erickson)

  • Write Great Code: Volume 1: Understanding the Machine

    • Quyển này được xuất bản năm 2004, phần nào đã lỗi thời, nhưng nó vẫn là một tài liệu tuyệt vời để tìm hiểu về máy tính một cách ngắn gọn.   - Tác giả phát minh ra HLA (High Level Assembly), vậy nên hãy hãy chú ý một chút về các ví dụ và định nghĩa trong sách. Tuy không được sử dụng rộng rãi, nhưng đó là một ví dụ hiện đại về hợp ngữ (assembly).
    • Những chương này rất đáng đọc để xây dựng cho bạn một nền tảng tốt (giữ nguyên gốc tiếng Anh):
      • Chapter 2 - Numeric Representation
      • Chapter 3 - Binary Arithmetic and Bit Operations
      • Chapter 4 - Floating-Point Representation
      • Chapter 5 - Character Representation
      • Chapter 6 - Memory Organization and Access
      • Chapter 7 - Composite Data Types and Memory Objects
      • Chapter 9 - CPU Architecture
      • Chapter 10 - Instruction Set Architecture
      • Chapter 11 - Memory Architecture and Organization
  • Introduction to Algorithms   - Chú ý: Đọc cuốn này chỉ có một ít giá trị. Đây là một tổng hợp xuất sắc về giải thuật và cấu trúc dữ liệu, nhưng nó không dạy cho bạn cách viết code xuất sắc. Để làm một lập trình viên giỏi, bạn đồng thời phải có khả năng phát triển một giải pháp một cách hiệu quả nữa.

    • Trích lời Yegge: "Nhưng nếu bạn muốn đến với buổi phỏng vấn một cách có chuẩn bị, vậy hãy hoãn đơn xin ứng tuyển lại cho đến khi bạn hoàn tất quyển sách này"
    • Half.com là một trang hữu dụng để tìm sách với giá tốt.
    • Đôi được gọi là CLR, hoặc là CLRS (trích chữ cái đầu trong tên của các tác giả), vì Stein (một trong 4 tác giả, S trong CLRS) nhập cuộc trễ
  • Kiến trúc Máy tính, Ấn bản thứ Sáu: Một cách tiếp cận định lượng

    • Đối với một cách tiếp cận phong phú hơn, cập nhật hơn (2017), nhưng dài hơn

Thiết kế hệ thống, Khả năng mở rộng, Xử lý dữ liệu

Học thêm

Tiêu đề của các video, các thuật ngữ cao cấp xin được giữ nguyên. Một số thuật ngữ có thể dịch được, nhưng người dịch không đủ vốn từ đề diễn đạt chúng một cách ngắn gọn như trong tiếng Anh, nên cũng xin phép cho qua.

Tôi đã thêm chúng để giúp bạn trở thành một kỹ sư phần mềm toàn diện và để bạn biết về một số
công nghệ và thuật toán, vì vậy bạn sẽ có một bộ công cụ lớn hơn.

--

Đọc thêm về một số đề tài

   Tôi thêm những phần này để củng cố các kiến thức đã được trình bày ở trên, nhưng không muốn đưa chúng vào danh sách trên, vì đã quá nhiều rồi. Cũng có hơi vượt mức cần thiết. Nhưng dù sao, bạn muốn trúng tuyển mà phải không?

Các chuỗi Video

Hãy ngồi xuống và thưởng thức.

Các khóa học khoa học máy tính

Algorithms implementation