[Review Sách] Cracking the Coding Interview - 189 Programming Questions & Solutions
Bài đăng này đã không được cập nhật trong 2 năm
Mở đầu
Dạo gần đây Viblo có khá nhiều event lớn nhỏ thú vị, mình cũng tính đủ đường tham gia mà không tìm được chủ đề nào phù hợp để viết bài . Tháng 3 này với campaign Raise women’s voice up thì một lần nữa cũng thử ngồi nghĩ đề tài xem sao. Thực ra với nội dung mang tính "tôn vinh phụ nữ, khích lệ, động viên, truyền cảm hứng cho phụ nữ trong ngành CNTT" cũng khá là khó nhằn (ít nhất là đối với mình ), và trong lúc khá bế tắc sau hàng giờ suy nghĩ, thì mình chợt nhận ra là: À cuốn sách ở trên giá sách ngay trước mặt mình đây, là của một tác giả nữ!. Đây là điều đã để lại cho mình một ấn tượng đặc biệt, từ rất lâu về trước, khi lần đầu cầm trên tay cuốn sách đó. Sau đó, mình cũng từng nhiều lần thấy tác giả trên các video trên Youtube nữa (mình sẽ giới thiệu luôn ở phần phía dưới bài viết).
Và giờ những hồi ức đó tràn về để trở thành ý tưởng giúp mình ngồi đây viết nên những chia sẻ này. Những chia sẻ về một cuốn sách khá nổi tiếng, đã ra mắt đến bản in thứ 6, mang tên Cracking the Coding Interview - 6th Edition - 189 Programming Questions & Solutions của tác giả Gayle Laakmann McDowell. Hy vọng những chia sẻ này có thể giúp ích cho các bạn cũng có hứng thú, hay cũng đang tìm kiếm một cuốn sách, hay tài liệu học tập nào đó tương tự.
Về tác giả Gayle Laakmann McDowell
Trên trang cá nhân của mình, Gayle được giới thiệu là founder và CEO của CareerCup, một công ty thực hiện nhiều business xoay quanh các cuộc phỏng vấn về Technical.
Cô tốt nghiệp cử nhân (Bachelor) và thạc sỹ (Master) ngành khoa học máy tính, đồng thời có nhiều năm kinh nghiệm làm việc với vị trí software engineer tại Google, Microsoft và Apple. Tại Google, cô có kinh nghiệm phỏng vấn hàng trăm ứng viên, và tham gia vào việc đánh giá hàng nghìn ứng viên khác nhau.
Với những kinh nghiệm của mình trong lĩnh vực phát triển phần mềm, cũng như tuyển dụng, hiện cô cùng công ty đang thực hiện nhiều những công việc liên quan đến tư vấn (consulting) cho vấn đề tuyển dụng các vị trí liên quan đến Software Engineer, với những vai trò như coaching cho đội ngũ HR, hướng dẫn xây dựng và hoàn thiện interview progress, xây dựng interviewer training programs... Bên cạnh đó, cô đã viết và xuất bản 4 cuốn sách nổi tiếng là Cracking the Coding Interview, Cracking the PM Interview, Cracking the Tech Career, và Cracking the PM Career. Các cuốn sách của cô thường xuyên xuất hiện ở vị trí #1 Best Seller trên Amazon ở nhiều categories khác nhau. (Ví dụ như ở thời điểm đang viết bài, mình có lên Amazon check thì có thấy cuốn Cracking the PM Interview là #1 Best Seller ở chuyên mục Technical Project Management, hay Cracking the Coding Interview là #1 Best Seller ở chuyên mục Data Structure and Algorithms, Software Development)
Gayle Laakmann McDowell trên một podcast của HackerRank với chủ đề: Deconstructs the Engineering Interview ProcessVề cuốn sách Cracking the Coding Interview
Tổng quan
Với hơn 6K ratings trên Amazon, số điểm trung bình là 4.7/5, hay với hơn 6K đánh giá với số điểm trung bình là 4.35 trên Goodreads, có thể nói Cracking the Coding Interview là một trong số những cuốn sách nổi tiếng nhất, và thành công nhất nói về chủ đề Coding Interview. Trên trang bìa cuốn sách, thì nó được giới thiệu là Amazon.com's #1st Best-Selling Interview Book. Có lẽ đây chính là thứ bạn nên "gối đầu giường" khi chuẩn bị cho một kỳ phỏng vấn vào các công ty công nghệ lớn
Hiện tại cuốn sách cũng được xuất bản đến lần thứ 6, với nhiều update được bổ sung. Ở 5th Edition, chúng ta chỉ có một cuốn sách với 150 câu hỏi và dày hơn 500 trang, thì sang 6th Edition, với 189 câu hỏi, chúng ta đã có một cuốn sách dày đến ... gần 700 trang giấy Đúng vậy, bạn không đọc nhầm đâu, gần 700 trang giấy! Thế nên, đây đúng là cuốn sách mà bạn có thể "gối đầu giường", theo cả nghĩa bóng, lẫn nghĩa đen luôn
Chắc hẳn bạn sẽ có phần thắc mắc, chỉ là giới thiệu về có 189 câu hỏi phỏng vấn về Coding thôi thì có gì mà bôi ra đến 700 trang vậy? Mình cũng từng thắc mắc như vậy. Hãy cùng tìm hiểu sâu hơn về các nội dung chính được đề cập trong cuốn sách nhé.
Nội dung chính
Bỏ qua phần Introduction giống như bao cuốn sách khác giới thiệu về tác giả, động lực viết ra cuốn sách ... chúng ta sẽ bước vào các mục giới thiệu về process phỏng vấn technical, những điểm đặc trưng trong việc phỏng vấn tại các công ty công nghệ lớn như Microsoft, Amazon, Google, Apple, Facebook... cũng như là những điểm chú ý, những thứ nên chuẩn bị cho buổi phỏng vấn của các công ty này. Bên cạnh đó cũng sẽ là những phân tích của tác giả về những skills được chờ đợi ở những vị trí đặc biệt như Leader, Manager, hay môi trường đặc biệt như Startups.
Tiếp theo chúng ta sẽ đến phần Before the Interview và Behavioral Questions, là những chia sẻ, những lời khuyên về việc viết Resume như thế nào, có lộ trình chuẩn bị ra sao, hay trả lời những câu hỏi về tính cách, đặc điểm cá nhân như thế nào để có thể tạo được ấn tượng tốt cho nhà tuyển dụng. Nhìn chung cho đến phần này, thì nội dung chủ yếu xoay quanh process phỏng vấn và sự chuẩn bị cho việc phỏng vấn là chính.
Phần tiếp theo là Big O, thì như tên gọi, nó là một mục để giúp người đọc ôn lại một kiến thức cơ bản về cấu trúc dữ liệu và giải thuật, khái niệm mà sẽ còn được sử dụng nhiều ở những phần về sau: độ phức tạp thuật toán (bao gồm cả Time Complexity và Space Complexity).
Đến đây chúng ta đã duyệt qua một đoạn dạo đầu khá chi tiết, nhưng cũng rất hấp dẫn. Và tiếp theo sẽ là phần chính rất được mong đợi: Interview Questions. Ở phần này, tổng cộng 189 câu hỏi phỏng vấn sẽ được giới thiệu lần lượt theo các chủ đề, cụ thể là:
- Mảng (Arrays) và Chuỗi (Strings)
- Danh sách liên kết (Linked Lists)
- Ngăn Xếp (Stacks) và Hàng Đợi (Queues)
- Cây (Trees) và Đồ Thị (Graphs)
- Các thao tác với Bit (Bit Manipulation)
- Toán và Logic Puzzles
- Lập trình hướng đối tượng (Object-Oriented Design)
- Đệ quy (Recursion) và Quy hoạch động (Dynamic Programming)
- Sắp Xếp (Sorting) và Tìm Kiếm (Searching)
- Scalability và Memory Limits
- Testing
- Ngỗ ngữ C và C++
- Ngôn ngữ Java
- Databases
- Threads và Locks
- Các câu hỏi với độ khó ở mức Trung Bình
- Các câu hỏi Khó
Các câu hỏi được liệt kê ở phần này sẽ được giải đáp ở phần sau đó, Solutions. Và phần Solutions này chính là lý do làm cho cuốn sách lại ... dày đến vậy Ở nhiều câu hỏi đòi hỏi phải coding, thì phần Solution này cũng cung cấp sẵn Source Code để mọi người có thể tham khảo luôn. Ngôn ngữ lập trình chủ yếu được sử dụng trong cuốn sách là Java (bên cạnh đó còn có C và C++). Nhìn chung thì việc đọc một một ngữ lập trình hướng đối tượng mạnh như Java thì chắc cũng dễ dàng cho phần lớn độc giả rồi, còn nếu bạn muốn tham khảo cả solution được code bằng một ngôn ngữ khác, mà mình đang sử dụng hàng ngày chẳng hạn, thì bạn có thể tham khảo thêm tại Github Repo của tác giả tại đây. Trên đó cũng có rất nhiều solution được cộng đồng đóng góp bằng nhiều ngôn ngữ lập trình khác nhau như PHP, Ruby, Python, Javascript ...
Ngoài phần Solutions ra, tác giả còn rất tinh tế trong việc tạo thêm một mục là Hints, đây là nơi bạn có thể lấy gợi ý cho các câu hỏi Interview. Nếu bạn muốn đào sâu suy nghĩ, để tìm ra cách giải quyết thay vì nhảy ngay đến phần solution chi tiết, thì mục Hints này chính là nơi dành cho bạn, khi bạn gặp phải khó khăn và muốn có sự trợ giúp.
Nhận xét
Về tổng thể chung, đây là một cuốn sách rất thú vị, khi ta vừa đọc nó, và vừa đặt bản thân mình đang ở trong buổi phỏng vấn thì sẽ phải trả lời ra sao Với nội dung khá chi tiết, sáng tạo, cũng không khó hiểu khi mà Cracking the Coding Interview trở thành một trong những cuốn sách thành công nhất ở thể loại Coding Interview.
Tuy nhiên, hãy cân nhắc kỹ khi bạn chỉ chăm chăm tập trung vào cuốn sách này khi chuẩn bị cho buổi phỏng vấn sắp tới. Mình thấy ở Việt Nam thì chắc cũng khá ít các công ty đặt các câu hỏi phỏng vấn kiểu dạng như trong sách viết, có chăng thì chỉ một vài nội dung cơ bản về Cấu trúc dữ liệu & Giải thuật, hay OOP, Database. Ngược lại, có lẽ dù có đặt một số câu hỏi chuyên sâu về giải thuật, về các vấn đề Time/Memory Optimization ... thì cũng không có nhiều ứng viên có thể trả lời được (^^;) Có thể chỉ những công ty lớn, hoặc khi bạn ứng tuyển vào những vị trí cao cấp về kỹ thuật, thì mới thấy được sự quen thuộc từ nội dung của cuốn sách Hoặc nếu bạn đang đặt mục tiêu apply vào những công ty IT lớn ở nước ngoài, thì biết đâu những nội dung trong Cracking the Coding Interview sẽ rất giúp ích cho bạn đấy.
Ngoài ra, cũng nên nhớ rằng thể hiện trong Coding Interview cũng chỉ là một phần để nhà tuyển dụng đánh giá bạn. Vẫn còn rất nhiều yếu tố khác có thể ảnh hưởng đến kết quả cuối cùng nữa, như tính cách con người, sự phù hợp với môi trường, văn hóa, mục tiêu, tầm nhìn của công ty, mức lương kỳ vọng ... Dẫu vậy, trang bị thật tốt hành trang về kỹ thuật thì không bao giờ là thừa cả. Nó cũng sẽ giúp bạn có thêm rất nhiều tự tin trong những buổi phỏng vấn. Mà kể cả không hề có định phỏng vấn gì đi chăng nữa, thì một cuốn sách như Cracking the Coding Interview cũng sẽ giúp bạn rất nhiều trong việc ôn luyện lại kiến thức cũ, hay học tập thêm rất nhiều kiến thức mới mẻ nữa đấy
P/S: Một số câu hỏi từ Cracking the Coding Interview
Kết lại bài viết, mình thử pick ra vài câu hỏi trong sách để các bạn tham khảo nhé, hãy thử đặt mình vào vị trí ứng viên và nghĩ câu trả lời xem nào Mình pick cũng khá random thôi, chủ yếu là chọn vài câu ngắn gọn gõ lại cho nhanh ấy mà
- Cho một bàn cờ có kích cỡ 8x8, bị cắt bỏ 2 ô chéo góc (còn lại 62 ô). Bạn có 31 thanh domino, mỗi thanh có kích cỡ bằng 2 ô bàn cờ (tổng cộng 31 thanh có kích cỡ tương đương 62 ô bàn cờ). Bạn có thể dùng 31 thanh đó để lấp đầy ô bàn cờ ở trên được không? Hãy chứng minh câu trả lời của mình (nếu câu trả lời là "có" hãy đưa ra đáp án, nếu là "không" hãy chứng minh tại sao lại không thể?)
- Hãy giải thích ý nghĩa của đoạn code sau
((n & (n-1) == 0)
- Implement một function để check xem một binary tree có phải là binary search tree hay không?
- Viết một chương trình in-place swap (swap 2 số
a
vàb
mà không dùng đến biến trung gian) => không chơi dùng Python nhé =)) - Bạn có một file có dụng lượng 20GB, với dữ liệu được tổ chức dưới dạng một đoạn string ở trên 1 dòng. Hãy tìm cách sắp xếp file này.
- Bạn có 10 tỉ URLs. Hãy tìm những URL bị duplicate trong số đó (2 URL được coi là duplicate nếu nó giống hệt nhau)
- Nếu phải thiết kế 1 web crawler, bạn sẽ thiết kế thế nào để không gặp phải tình trạng lặp vô hạn?
- ...
Và vẫn còn nhiều, nhiều những câu hỏi thú vị khác ở Cracking the Coding Interview, bạn hãy tự mình khám phá nhé
Ngoài ra, nếu bạn cũng muốn ôn tập lại các kiến thức cơ bản về Data Structures & Algorithms, thì bạn cũng có thể tìm xem một số video cũng của được publish trên HackerRank nhé
All rights reserved