Chuyển đến nội dung
subtl

Cách Trình Bày Code trong Phỏng Vấn Kỹ Thuật bằng Tiếng Anh

Học cách trình bày mạch lạc dòng suy nghĩ của bạn bằng tiếng Anh trong buổi phỏng vấn kỹ thuật. Hướng dẫn này cung cấp các cụm từ, chiến lược và lỗi thường gặp.

· 9 phút đọc

A software developer explains their code during a technical interview conducted over a video call from their home office.

Phỏng vấn kỹ thuật bằng một ngôn ngữ không phải tiếng mẹ đẻ là một thử thách đặc biệt. Vấn đề không chỉ nằm ở việc giải quyết bài toán; mà còn là việc trình bày quá trình giải quyết vấn đề của bạn một cách rành mạch, ngay tại thời điểm đó. Người phỏng vấn muốn hiểu cách bạn tư duy, và điều đó đòi hỏi sự giao tiếp rõ ràng, tự tin.

Hướng dẫn này cung cấp một phương pháp có cấu trúc và các cụm từ tiếng Anh cụ thể để giúp bạn tường thuật quá trình viết code của mình. Chúng ta sẽ đi qua mọi thứ từ việc làm rõ vấn đề ban đầu cho đến khi trình bày giải pháp cuối cùng, giúp bạn thể hiện đồng thời cả kỹ năng kỹ thuật và kỹ năng giao tiếp.

Trước Khi Bắt Đầu Code: Làm Rõ Vấn Đề

Một trong những sai lầm phổ biến nhất mà các ứng viên mắc phải là lao vào viết code quá nhanh. Trước khi viết một dòng code nào, bạn phải hoàn toàn chắc chắn rằng mình hiểu rõ vấn đề, đầu vào, đầu ra và các ràng buộc của nó. Điều này cho người phỏng vấn thấy bạn là người cẩn thận và có phương pháp.

Bắt đầu bằng cách diễn đạt lại vấn đề theo cách hiểu của bạn để xác nhận lại.

Các cụm từ để làm rõ yêu cầu

  • "So, just to make sure I understand correctly, the goal is to write a function that takes [input] and returns [output]?" (Để chắc chắn rằng tôi đã hiểu đúng, mục tiêu là viết một hàm nhận [đầu vào] và trả về [đầu ra] phải không ạ?)
  • "To clarify, are we expecting the input array to contain only numbers, or can it have other data types?" (Để làm rõ hơn, mảng đầu vào có chỉ chứa số hay có thể chứa các kiểu dữ liệu khác ạ?)
  • "Could you give me an example of a valid input and the expected output?" (Anh/chị có thể cho tôi một ví dụ về đầu vào hợp lệ và đầu ra mong muốn được không?)
  • "When you say 'most frequent,' if there's a tie, which value should be returned?" (Khi nói 'phổ biến nhất', nếu có nhiều giá trị có cùng tần suất xuất hiện, thì nên trả về giá trị nào ạ?)

Các cụm từ để thảo luận về ràng buộc và trường hợp biên

  • "What are the constraints on the size of the input? For example, how large can the array be?" (Các ràng buộc về kích thước của đầu vào là gì? Ví dụ, mảng có thể lớn đến mức nào ạ?)
  • "How should the function handle invalid inputs, like a null or an empty list? Should it return an error, or a specific value?" (Hàm nên xử lý các đầu vào không hợp lệ như null hoặc danh sách rỗng như thế nào? Nên trả về lỗi hay một giá trị cụ thể ạ?)
  • "Are there any performance requirements I should be aware of, like time or space complexity?" (Có yêu cầu nào về hiệu năng mà tôi cần lưu ý không, chẳng hạn như độ phức tạp về thời gian hoặc không gian?)
  • "I'm thinking about edge cases. For instance, what if the input list contains duplicates? Or what if all elements are the same?" (Tôi đang nghĩ về các trường hợp biên. Ví dụ, nếu danh sách đầu vào chứa các phần tử trùng lặp thì sao? Hoặc nếu tất cả các phần tử đều giống nhau thì sao?)

Việc dành một vài phút để làm điều này không chỉ giúp bạn tránh giải quyết sai vấn đề mà còn cho bạn thời gian quý báu để suy nghĩ trong khi vẫn tương tác với người phỏng vấn.

Phương Pháp "Suy Nghĩ Thành Lời": Tường Thuật Quá Trình Tư Duy

Người phỏng vấn sử dụng các thử thách code để đánh giá tư duy của bạn. Một giải pháp hoàn hảo được đưa ra trong im lặng ít giá trị hơn một giải pháp tốt được giải thích rõ ràng. Bạn cần tường thuật lại hành trình của mình từ vấn đề đến giải pháp.

Giai đoạn 1: Hướng tiếp cận ban đầu

Bắt đầu bằng cách mô tả ý tưởng đầu tiên, đơn giản nhất của bạn. Đây thường là giải pháp "brute-force" (vét cạn). Điều này cho thấy bạn có thể tìm ra một giải pháp hoạt động được trước khi cố gắng tối ưu hóa nó.

  • "My first thought is to approach this with a nested loop. I can iterate through each element and then compare it with every other element." (Suy nghĩ đầu tiên của tôi là tiếp cận vấn đề này bằng vòng lặp lồng nhau. Tôi có thể duyệt qua từng phần tử và sau đó so sánh nó với mọi phần tử khác.)
  • "A straightforward way to solve this would be to sort the array first. That would simplify finding the duplicates." (Một cách đơn giản để giải quyết vấn đề này là sắp xếp mảng trước. Điều đó sẽ giúp việc tìm các phần tử trùng lặp đơn giản hơn.)
  • "Initially, I'm thinking of a brute-force approach. It might not be the most efficient, but it would work. From there, we can look for optimizations." (Ban đầu, tôi đang nghĩ đến một hướng tiếp cận brute-force. Nó có thể không hiệu quả nhất, nhưng sẽ hoạt động. Từ đó, chúng ta có thể tìm cách tối ưu hóa.)

Giai đoạn 2: Phân tích và Tinh chỉnh

Sau khi nêu ý tưởng ban đầu, hãy phân tích các ưu và nhược điểm của nó, đặc biệt là độ phức tạp về thời gian và không gian. Điều này thể hiện sự hiểu biết sâu sắc hơn về thuật toán và cấu trúc dữ liệu.

  • "The time complexity of this nested loop approach would be O(n²), which might be too slow if the input is very large." (Độ phức tạp về thời gian của phương pháp vòng lặp lồng nhau này sẽ là O(n²), có thể quá chậm nếu đầu vào rất lớn.)
  • "This solution has a space complexity of O(n) because I'm creating a new data structure to store the results." (Giải pháp này có độ phức tạp không gian là O(n) vì tôi đang tạo một cấu trúc dữ liệu mới để lưu trữ kết quả.)
  • "We could optimize this. If we use a hash map, we can reduce the time complexity to O(n) by trading off some space." (Chúng ta có thể tối ưu hóa điều này. Nếu sử dụng hash map, chúng ta có thể giảm độ phức tạp thời gian xuống O(n) bằng cách đánh đổi một chút không gian lưu trữ.)
  • "I think we can do better. Let me consider an alternative approach using a two-pointer technique." (Tôi nghĩ chúng ta có thể làm tốt hơn. Để tôi xem xét một phương pháp thay thế sử dụng kỹ thuật hai con trỏ.)

Giai đoạn 3: Cấu trúc Code của bạn

Trước khi bạn bắt đầu gõ phím điên cuồng, hãy phác thảo kế hoạch của mình. Giải thích các hàm, biến và logic bạn dự định sử dụng. Điều này hoạt động như một lộ trình cho cả bạn và người phỏng vấn.

  • "Okay, my plan is to first initialize an empty dictionary to store character counts." (Được rồi, kế hoạch của tôi là đầu tiên sẽ khởi tạo một dictionary rỗng để lưu số lần xuất hiện của các ký tự.)
  • "I'll write a main function that takes the array as an argument. Inside it, I'll have a loop to iterate through the elements." (Tôi sẽ viết một hàm chính nhận mảng làm đối số. Bên trong hàm, tôi sẽ có một vòng lặp để duyệt qua các phần tử.)
  • "I think I'll need a helper function to handle the logic for reversing this part of the string. It will make the main function cleaner." (Tôi nghĩ mình sẽ cần một hàm phụ trợ để xử lý logic đảo ngược phần này của chuỗi. Nó sẽ làm cho hàm chính gọn gàng hơn.)
  • "I'll start by handling the edge cases we discussed, like an empty input array." (Tôi sẽ bắt đầu bằng việc xử lý các trường hợp biên mà chúng ta đã thảo luận, như mảng đầu vào rỗng.)

Trong Khi Code: Duy Trì Cuộc Trò Chuyện

Khi bạn viết code, hãy tiếp tục giải thích những gì bạn đang làm và tại sao. Đừng chỉ đọc to code của bạn. Hãy giải thích mục đích của từng khối logic.

  • "Now, I'm creating a for loop that will go from the beginning of the array to the end." (Bây giờ, tôi đang tạo một vòng lặp for sẽ chạy từ đầu đến cuối mảng.)
  • "This variable, max_so_far, will keep track of the largest value we've seen." (Biến max_so_far này sẽ theo dõi giá trị lớn nhất mà chúng ta đã thấy.)
  • "Inside the loop, this if statement checks if we've encountered this element before. If we have, I'll increment its count in the map." (Bên trong vòng lặp, câu lệnh if này kiểm tra xem chúng ta đã gặp phần tử này trước đây chưa. Nếu rồi, tôi sẽ tăng số đếm của nó trong map.)
  • "I'm using a while loop here because the number of iterations isn't fixed; it depends on the values of these two pointers." (Tôi đang sử dụng vòng lặp while ở đây vì số lần lặp không cố định; nó phụ thuộc vào giá trị của hai con trỏ này.)

Nếu bạn bị mắc kẹt thì sao? Im lặng là kẻ thù của bạn. Việc cần một chút thời gian để suy nghĩ là hoàn toàn bình thường. Chỉ cần cho người phỏng vấn biết điều đó.

  • "Let me take a moment to think about the best way to structure this next part." (Để tôi suy nghĩ một chút về cách tốt nhất để cấu trúc phần tiếp theo này.)
  • "I'm just double-checking my logic for this condition. One second." (Tôi chỉ đang kiểm tra lại logic cho điều kiện này. Xin một giây ạ.)
  • "Hmm, I think there might be a small issue here. Let me trace the execution with an example input to find it." (Hmm, tôi nghĩ có thể có một vấn đề nhỏ ở đây. Để tôi dò lại quá trình thực thi với một đầu vào ví dụ để tìm ra nó.)

Nếu bạn đang tập trung vào logic và không thể nghĩ ra từ tiếng Anh phù hợp, điều đó có thể gây căng thẳng. Một trợ lý có thể gợi ý các cụm từ chuyên nghiệp sẽ rất hữu ích. Ví dụ, công cụ nhắc lệnh AI của Subtl có thể soạn thảo các cụm từ như "Let me think through the logic for this edge case" trong thời gian thực, giúp bạn duy trì cuộc trò chuyện trôi chảy mà không làm mất tập trung.

Xử Lý Gợi Ý và Phản Hồi

Nếu người phỏng vấn đưa ra gợi ý, đó không phải là dấu hiệu của sự thất bại. Đó là một lời mời hợp tác. Cách bạn tiếp nhận và kết hợp phản hồi là một kỹ năng quan trọng mà họ đang kiểm tra. Hãy lắng nghe cẩn thận, ghi nhận gợi ý và giải thích cách bạn sẽ sử dụng nó.

Các cụm từ để ghi nhận một gợi ý

  • "That's a great point. Using a set here would indeed make the lookup much faster. I'll change my approach." (Đó là một điểm rất hay. Sử dụng set ở đây thực sự sẽ làm cho việc tra cứu nhanh hơn nhiều. Tôi sẽ thay đổi cách tiếp cận của mình.)
  • "Thank you, that clarifies it. I see now that I was overcomplicating the base case for the recursion." (Cảm ơn anh/chị, điều đó đã làm rõ vấn đề. Bây giờ tôi thấy rằng mình đã làm phức tạp hóa trường hợp cơ sở cho đệ quy.)
  • "Ah, I didn't consider that edge case. You're right. I need to add a check for that before the loop starts." (À, tôi đã không xem xét trường hợp biên đó. Anh/chị nói đúng. Tôi cần thêm một bước kiểm tra cho trường hợp đó trước khi vòng lặp bắt đầu.)

Nếu bạn thực sự bị mắc kẹt, tốt hơn là nên hỏi xin một sự trợ giúp nhỏ thay vì im lặng. Điều đó cho thấy sự tự nhận thức và sẵn sàng yêu cầu giúp đỡ.

  • "I'm a bit stuck on optimizing the space complexity here. Could I perhaps get a small hint?" (Tôi hơi bí trong việc tối ưu hóa độ phức tạp không gian ở đây. Liệu tôi có thể xin một gợi ý nhỏ được không ạ?)
  • "I'm considering two data structures for this part, a dictionary or a simple list. I'm leaning towards the dictionary for performance, but I'm not sure. Do you have any thoughts on that?" (Tôi đang cân nhắc hai cấu trúc dữ liệu cho phần này, một dictionary hoặc một danh sách đơn giản. Tôi nghiêng về dictionary vì hiệu năng, nhưng không chắc chắn lắm. Anh/chị có ý kiến gì về việc này không?)

Sau Khi Viết Code: Kiểm Tra và Giải Thích

Khi bạn viết xong giải pháp của mình, đừng chỉ nói, "Tôi xong rồi." Cuộc phỏng vấn chưa kết thúc. Bạn cần xác minh code của mình và thảo luận về hiệu năng của nó.

  1. Kiểm tra với một ví dụ: Tự chạy code của bạn với một đầu vào mẫu. Điều này giúp phát hiện lỗi và chứng minh bạn hiểu những gì mình đã viết.

    • "Let's test this with the example input [3, 1, 4, 1, 5]." (Hãy thử nghiệm với đầu vào ví dụ là [3, 1, 4, 1, 5].)
    • "First, the map is empty. In the first iteration, we add 3 with a count of 1. In the second, we add 1 with a count of 1. In the fourth iteration, we see 1 again, so we increment its count to 2." (Đầu tiên, map rỗng. Trong lần lặp đầu tiên, chúng ta thêm 3 với số đếm là 1. Lần thứ hai, chúng ta thêm 1 với số đếm là 1. Đến lần lặp thứ tư, chúng ta lại thấy 1, vì vậy chúng ta tăng số đếm của nó lên 2.)
  2. Thảo luận lại về độ phức tạp: Nhắc lại độ phức tạp về thời gian và không gian của giải pháp cuối cùng của bạn.

    • "The final time complexity is O(n) because we iterate through the list once. The space complexity is O(k), where k is the number of unique elements, because of the hash map." (Độ phức tạp thời gian cuối cùng là O(n) vì chúng ta duyệt qua danh sách một lần. Độ phức tạp không gian là O(k), trong đó k là số lượng phần tử duy nhất, do sử dụng hash map.)
  3. Nói về các cải tiến: Đề cập ngắn gọn về cách code có thể được cải thiện nếu bạn có thêm thời gian.

    • "If this were production code, I would add more robust error handling for different input types." (Nếu đây là code cho môi trường production, tôi sẽ thêm xử lý lỗi mạnh mẽ hơn cho các loại đầu vào khác nhau.)
    • "Another possible optimization, if memory were a major concern, might be to modify the input array in-place, although that has its own trade-offs." (Một tối ưu hóa khả thi khác, nếu bộ nhớ là một vấn đề lớn, có thể là sửa đổi mảng đầu vào tại chỗ, mặc dù điều đó cũng có những đánh đổi riêng.)

Những Sai Lầm Phổ Biến Cần Tránh

  • Làm việc trong im lặng. Đây là sai lầm lớn nhất. Người phỏng vấn không thể đọc được suy nghĩ của bạn. Hãy trình bày quá trình suy nghĩ của mình một cách chi tiết.
  • Lao ngay vào viết code. Luôn làm rõ vấn đề và thảo luận về hướng tiếp cận của bạn trước tiên.
  • Phớt lờ hoặc tranh cãi về các gợi ý. Hãy xem người phỏng vấn như một người cộng tác. Tiếp thu phản hồi của họ một cách khéo léo.
  • Bỏ cuộc khi bị mắc kẹt. Bạn có thể dừng lại một chút, nhưng hãy cho biết rằng bạn đang suy nghĩ. Cố gắng tự gỡ lỗi code của mình bằng cách nói ra.
  • Quên các trường hợp biên. Luôn xem xét các đầu vào rỗng, null, các phần tử trùng lặp và các kịch bản không chuẩn khác.

Lưu ý về Sự Đồng Thuận và Công Cụ

Nếu bạn dự định sử dụng bất kỳ công cụ nào để ghi lại phiên âm hoặc hỗ trợ trong cuộc gọi, bạn phải minh bạch. Ở nhiều khu vực pháp lý, tất cả các bên phải đồng ý việc được ghi âm hoặc ghi lại phiên âm. Luôn thông báo cho người phỏng vấn vào đầu cuộc gọi nếu bạn đang sử dụng một công cụ như vậy. Để biết thêm chi tiết, bạn có thể xem xét hướng dẫn chung về luật ghi âm cuộc gọi. Xem hướng dẫn của chúng tôi tại /law/.

Giải thích code của bạn thành lời bằng tiếng Anh là một kỹ năng bạn có thể xây dựng thông qua luyện tập. Bằng cách cấu trúc giao tiếp, sử dụng các cụm từ rõ ràng và xem cuộc phỏng vấn như một buổi làm việc hợp tác, bạn có thể thể hiện hiệu quả khả năng kỹ thuật của mình, ngay cả khi tiếng Anh không phải là ngôn ngữ mẹ đẻ của bạn.

Để chuẩn bị cho các cuộc phỏng vấn quan trọng, việc luyện tập với một công cụ cung cấp phản hồi và dịch thuật thời gian thực có thể giúp bạn xây dựng sự tự tin. Subtl cho Mac cung cấp cho bạn bản ghi trực tiếp cuộc trò chuyện, để bạn có thể xem lại những gì đã nói và giúp bạn hình thành các câu trả lời rõ ràng, chuyên nghiệp. Tìm hiểu thêm về cách sử dụng nó cho /use-cases/interviews/.

phỏng vấn kỹ thuậtphỏng vấn xin việcgiao tiếp tiếng Anhphát triển phần mềm

Câu hỏi

Nếu giọng tiếng Anh của tôi khó nghe thì sao?

Hãy tập trung vào sự rõ ràng, không phải sự hoàn hảo. Nói chậm hơn bình thường và ngắt nghỉ giữa các câu. Người phỏng vấn quan tâm nhiều hơn đến logic và kỹ năng giải quyết vấn đề của bạn hơn là giọng của bạn.

Tôi nên nói bao nhiêu? Liệu có khi nào nói quá nhiều không?

Hãy nhắm đến việc tường thuật đều đặn những suy nghĩ kỹ thuật của bạn. Giải thích kế hoạch tổng thể, những đánh đổi bạn đang cân nhắc, và mục đích của các khối code chính. Bạn không cần phải tường thuật từng ký tự bạn gõ. Nếu người phỏng vấn bắt đầu nói, đó là dấu hiệu để bạn dừng lại và lắng nghe.

Nếu tôi không biết thuật ngữ tiếng Anh chính xác cho một cấu trúc dữ liệu thì sao?

Hãy mô tả nó bằng chức năng và thuộc tính. Ví dụ, nếu bạn không thể nhớ 'hash map', bạn có thể nói 'a data structure that stores key-value pairs and gives me very fast lookups' (một cấu trúc dữ liệu lưu trữ các cặp khóa-giá trị và cho phép tra cứu rất nhanh). Khái niệm mới là điều quan trọng nhất.

Viết bình luận (comment) trong code khi phỏng vấn có được không?

Được, điều đó có thể hữu ích, đặc biệt là để giữ chỗ. Bạn có thể nói, 'I'll add a quick comment here to remind myself to implement the sorting logic next' (Tôi sẽ thêm một bình luận nhanh ở đây để nhắc bản thân triển khai logic sắp xếp tiếp theo). Tuy nhiên, lời giải thích bằng lời của bạn luôn quan trọng hơn các bình luận trong code.

Tôi nên làm gì nếu người phỏng vấn hoàn toàn im lặng?

Đừng để sự im lặng của họ làm gián đoạn dòng suy nghĩ của bạn. Hãy tiếp tục quá trình 'suy nghĩ thành lời'. Bạn cũng có thể chủ động tương tác với họ bằng cách hỏi một câu đơn giản, chẳng hạn như 'Does this approach make sense so far?' (Hướng tiếp cận này đến đây có hợp lý không ạ?) để kiểm tra.

Subtl giúp gì cho việc này

Thử Subtl trong cuộc gọi tiếp theo

40 phút mỗi tháng miễn phí, không cần thẻ. macOS 13 trở lên.

Đọc tiếp