Công nghệ thông tin

100 câu hỏi phỏng vấn software engineer của các công ty công nghệ Việt Nam

Bài viết này tổng hợp hơn 100 câu hỏi phỏng vấn cho vị trí software engineer tại các công ty công nghệ tại Việt Nam như Gotit, FPT, KMS, Line, Fsoft, Cốc Cốc… Các câu hỏi được sắp xếp theo các chủ đề: Cấu trúc và giải thuật, Lập trình hướng đối tượng, design Patterns, Cơ sở dữ liệu, Mạng máy tính, hệ điều hành, hệ điều hành, kỹ năng xử lý vấn đề, kiến thức CS nâng cao, Language Proficiency, Unit testing, design reasoning… cùng một số chủ đề khác. Một số câu hỏi có các gợi ý trả lời và những tài liệu tham khảo.

Nội dung

1. Cấu trúc và giải thuật2. Lâp trình hướng đối tượng – Object Oriented Programming3. Design Patterns4. Cơ sở dữ liệu5. Mạng máy tính6. Hệ điều hành7. Kỹ năng giải quyết vấn đề8. Kiến thức CS nâng cao9. Mức độ thành thạo ngôn ngữ lập trình10. Tool Proficiency11. Unit Testing12. Coding Style & Convention13. Design Reasoning14. Các câu hỏi kỹ thuật khác15. Các câu hỏi non-tech trong phỏng vấn software engineerKết luận
1. Cấu trúc và giải thuật
Q 1: Hãy cho biết sự khác nhau giữa mảng (array) và danh sách liên kết (linked list) về storage allocation, thứ tự của các phần tử, truy cập phần tử, chèn và xóa, tìm kiếm, sử dụng bộ nhớ, yêu cầu bộ nhớ cần thiết… (Goit)

Gợi ý trả lời:

Có những điểm khác nhau cơ bản giữa mảng và danh sách liên kết

Mảng là cấu trúc dữ liệu chứa tập hợp các phần tử dữ liệu kiểu tương tự trong khi danh sách liên kết được coi là cấu trúc dữ liệu không nguyên thủy ( non-primitive data structure) chứa tập hợp các phần tử được liên kết không có thứ tự được gọi là các node.
Trong mảng, các phần tử thuộc về các chỉ mục (index), tức là, nếu bạn muốn vào phần tử thứ tư, bạn phải viết tên biến với chỉ số hoặc vị trí của nó trong dấu ngoặc vuông.
Tuy nhiên, trong một danh sách liên kết, bạn phải bắt đầu từ phần đầu và làm việc theo cách của bạn cho đến khi bạn đến phần tử thứ tư.
Truy cập một mảng phần tử nhanh trong khi danh sách liên kết mất thời gian tuyến tính, do đó, nó chậm hơn một chút.
Các thao tác như chèn và xóa trong mảng tiêu tốn rất nhiều thời gian. Trong khi đó, hiệu suất của các hoạt động này trong danh sách liên kết rất nhanh.
Mảng có kích thước cố định. Ngược lại, danh sách liên kết rất linh hoạt, có thể mở rộng và thu nhỏ quy mô của nó.
Trong một mảng, bộ nhớ được gán trong thời gian biên dịch trong khi trong danh sách Liên kết, bộ nhớ được cấp phát trong thời gian thực thi hoặc thời gian chạy.
Các phần tử được lưu trữ liên tiếp trong các mảng trong khi nó được lưu trữ ngẫu nhiên trong danh sách Liên kết.
Mảng cần bộ nhớ ít hơn do dữ liệu thực tế được lưu trữ trong chỉ mục. Ngược lại, cần có nhiều bộ nhớ hơn cho danh sách được liên kết do lưu trữ các phần tử tham chiếu tiếp theo và trước đó.
Việc sử dụng bộ nhớ không hiệu quả trong mảng. Ngược lại, việc sử dụng bộ nhớ hiệu quả trong danh sách liên kết.

Xem thêm sự khác nhau giữa mảng và danh sách liên kết tại đây

Hoặc tìm hiểu thêm các câu hỏi về mảng và danh sách liên kết trong bài 50 câu hỏi phỏng vấn về giải thuật và cấu trúc dữ liệu dành cho lập trình viên

Q2: Hãy cho biết sụ khác nhau giữa Stack (ngăn xếp) và Queue (hàng đợi)? (Nhiều công ty)

Gợi ý trả lời:

Stack và Queue đều là các cấu trúc dữ liệu không nguyên thủy (non-primitive). Sự khác biệt lớn nhất giữa Stack và Queue là Stack sử dụng phương thức LIFO (last in first out) để truy cập và thêm các phần tử dữ liệu trong khi Queue sử dụng phương thức FIFO (First in first out) để truy cập và thêm các phần tử dữ liệu.

Các sự khác nhau cơ bản khác:

Trong một ngăn xếp, cùng một đầu được sử dụng để chèn và xóa các phần tử. Ngược lại, hai đầu khác nhau được sử dụng trong hàng đợi để chèn và xóa các phần tử.
Vì ngăn xếp chỉ có một đầu mở, đó là lý do chỉ sử dụng một con trỏ để tham chiếu đến đầu ngăn xếp. Nhưng hàng đợi sử dụng hai con trỏ để tham chiếu phía trước và phía sau của hàng đợi.
Stack thực hiện hai hoạt động được gọi là push và pop trong khi trong Queue, nó được gọi là enqueue và dequeue.
Triển khai ngăn xếp dễ dàng hơn trong khi triển khai hàng đợi thì phức tạp.
Hàng đợi có các biến thể như hàng đợi tròn, hàng đợi ưu tiên, hàng đợi kết thúc kép, v.v. Ngược lại, ngăn xếp không có các biến thể.

Để chuẩn bị tốt hơn cho câu hỏi phỏng  vấn software engineer liên quan đến Stack và Queue bạn nên xem thêm tại đây

Queue. Ảnh: techdifferences.com
Q3: Hãy cho biết sự khác nhau giữa: std::map và std::unordered_map trong C++ (Goit)

Gợi ý trả lời:

Cả std :: map & std :: unardered_map đều lưu trữ các phần tử trong cặp giá trị khóa (key value pair ) & cung cấp các hàm thành viên để chèn, tìm kiếm và xóa các cặp giá trị khóa một cách hiệu quả.

Nhưng chúng khác nhau ở các điểm sau:

 
map
unorder_map

search time
log(n)
O(1) -> Average
 

O(n) -> Worst Case

Ordering
increasing order (by default)
no ordering

Insertion time
log(n) + Rebalance
Same as search

Deletion time
log(n) + Rebalance
Same as search

Implementation
Self balancing BST like Red-Black Tree
Hash Table

Nguồn: geeksforgeeks.org

Xem thêm sự khác nhau giữa container std::map và std::unordered_map trong C++

Q4: Cho biết sự khác nhau giữa cây (tree) và đồ thị (graph)? (Nhiếu công ty)

Gợi ý trả lời:

Tree và Graph thuộc loại cấu trúc dữ liệu phi tuyến tính, trong đó tree cung cấp một cách rất hữu ích để biểu diễn mối quan hệ giữa các node trong một cấu trúc phân cấp và Graph tuân theo một mô hình mạng. Tree và Graph được phân biệt bởi thực tế là cấu trúc cây phải được kết nối và không có vòng lặp (non-circular) trong khi trong biểu đồ không có những hạn chế như vậy.

Những kiến thức khác có thể sẽ được hỏi:

Sự khác nhau giữa các loại dữ liệu cây
Sự khác nhau trong cách duyệt cây
Làm thế nào để thực hiện BFS (Breadth First Search) và DFS (Depth First Search) trong cây

Tham khảo thêm cho câu hỏi phỏng vấn software engineer này: Tree vs Graph data structure, Difference Between Tree and Graph,

Q5: Hãy cho biết về giải thuật sắp xếp (Sort)? So sánh các giải thuật sort (Goit)

Gợi ý trả lời:

Thuật toán sắp xếp là phương pháp sắp xếp lại một số lượng lớn các mục thành một số thứ tự cụ thể như cao nhất đến thấp nhất, hoặc ngược lại, hoặc thậm chí theo một số thứ tự bảng chữ cái.

Các thuật toán này lấy một danh sách đầu vào, xử lý nó (tức là thực hiện một số thao tác trên đó) và tạo ra danh sách đã được sắp xếp.

Tham khảo về giải thuật sort tại đây

Q6: Breadth first search và depth first search là gì? Hãy cho một cây ví dụ và thực hiện việc tìm kiếm đó (Goit)

Giải thuật tìm kiếm luôn là câu hỏi thường gặp trong các buổi phỏng vấn software engineer tại nhiều công ty, trong đó có Gotit

Gợi ý trả lời:

Tìm kiếm theo chiều rộng (Breadth first search) BFS là viết tắt của Breadth First Search là một kỹ thuật dựa trên đỉnh để tìm đường đi ngắn nhất trong đồ thị. Nó sử dụng cấu trúc dữ liệu Hàng đợi first in first out. Trong BFS, một đỉnh được chọn tại một thời điểm khi nó được truy cập và đánh dấu sau đó các đỉnh lân cận của nó được truy cập và lưu trữ trong hàng đợi.
Tm kiếm theo chiều sâu (depth first search) DFS là một thuật toán để tìm hoặc duyệt qua đồ thị hoặc cây theo chiều sâu. Việc thực thi thuật toán bắt đầu ở nút gốc và khám phá từng nhánh trước khi quay ngược. Nó sử dụng cấu trúc dữ liệu ngăn xếp (Stack) để ghi nhớ, để lấy đỉnh tiếp theo và bắt đầu tìm kiếm, bất cứ khi nào một điểm cuối xuất hiện trong bất kỳ lần lặp nào.

Xem thêm về Breadth first search và depth first search cùng ví dụ tại đây

Q7: Cho một danh sách số nguyên (integers), làm sao để kiểm tra xem một số bất kỳ có tồn tại trong danh sách đó? (Goit)

Gợi ý trả lời

Sử dụng Linear search (tìm kiếm tuyến tính)
Binary search (tìm kiếm nhị phân).

Q8: Tìm một số đảo ngược của một số, ví dụ: 1234 -> 4321. (Goit)

Gợi ý trả lời:

1234 có thể viết dưới dạng 1234 = 1*103 + 2*102 + 3*101 + 4
Số đảo ngược 4321 có thể viết lại dưới dạng 4321 = 4*103 + 3*102 + 2*101 + 1

Q9: Hash map (bảng băm) là gì? Làm thế nào để xử lý xung độ?  How to handle collision? (Goit)

Gợi ý trả lời:

Bảng băm là một cấu trúc dữ liệu lưu trữ một tập hợp cho phép ta có thể nhanh chóng xác định xem một phần tử nào đó có nằm trong tập hợp hay không.

Xem thêm: Bảng băm và các cơ chế giải quyết xung đột cơ bản

Q10: So sánh quick sort và merge sort? (Nhiều công ty)

Gợi ý trả lời:

Trong merge sort, mảng phải được chia chỉ thành hai nửa (tức là n / 2). Ngược lại, trong quick sort, không có sự bắt buộc phải chia danh sách thành các phần tử bằng nhau.
Độ phức tạp trong trường hợp xấu nhất của quick sort là O (n2) vì nó cần nhiều phép so sánh hơn trong điều kiện xấu nhất. Ngược lại, merge sort có cùng độ phức tạp trường hợp xấu nhất và trường hợp trung bình là O (n log n).
Merge sort có thể hoạt động tốt trên bất kỳ loại tập dữ liệu nào cho dù nó lớn hay nhỏ. Ngược lại, quick sort không thể hoạt động tốt với các bộ dữ liệu lớn.
Quick sort nhanh hơn merge sort trong một số trường hợp chẳng hạn như đối với các tập dữ liệu nhỏ.
Merge sort yêu cầu không gian bộ nhớ bổ sung để lưu trữ các mảng phụ. Quick sort không yêu cầu nhiều dung lượng để có thêm bộ nhớ.
Quick sort hiệu quả hơn Quick sort.
Quick sort là phương pháp sắp xếp nội bộ trong đó dữ liệu sắp xếp được điều chỉnh tại một thời điểm trong bộ nhớ chính. Ngược lại, mersort là phương pháp sắp xếp bên ngoài, trong đó dữ liệu được sắp xếp không thể được chứa trong bộ nhớ cùng một lúc và một số phải được lưu trong bộ nhớ phụ.

(Nguồn: techdifferences.com)

Quick Sort vs Merge Sort. Nguồn GeeksforGeeks.com

Xem thêm: Quick Sort vs Merge Sort

Q11: Hãy cho biết về cách duyệt cây: Inorder vs Preorder vs Postorder (Goit)

Gợi ý trả lời:

Không giống như cấu trúc dữ liệu tuyến tính (Mảng, Danh sách liên kết, Hàng đợi, Ngăn xếp, v.v.) chỉ có một cách logic để duyệt chúng, cây (tree) có thể được duyệt theo nhiều cách khác nhau. Sau đây là những cách thường được sử dụng để đi ngang qua cây:

Depth First Traversals:
(a) Inorder (Left, Root, Right) : 4 2 5 1 3
(b) Preorder (Root, Left, Right) : 1 2 4 5 3
(c) Postorder (Left, Right, Root) : 4 5 2 3 1
Breadth First or Level Order Traversal : 1 2 3 4 5

Xem chi tiết tại đây

Q12: Độ phức tạp thời gian (time complexity) và độ phức tạp bộ nhớ (undone và redone
– Hệ thống có thể dễ dàng mở rộng với các loại hành động mới
– Chất lượng code có thể sử dụng trong thực tế
– Chức năng platform-specific code

Q80: Thiết kế một dịch vụ rút gọn URL tương tự như bit.ly (Gotit)

Gợi ý trả lời:

Tham khảo:

System Design – URL Shortening Service
Designing a URL Shortening service like TinyURL

8. Kiến thức CS nâng cao
Q81: Giải thích cách hoạt động của web session. Làm thế nào để mở rộng quy mô hệ thống web (Gotit)

Q82: Single page application (SPA) là gì? Hãy cho biết ưu và nhược điểm của SPA? (Nhiều công ty)

Gợi ý trả lời:

Tham khảo: Single Page Application là gì? Lợi ích khi sử dụng Single Page Application

Q83: So sánh sessions và cookies (nhiều công ty)

Gợi ý trả lời: Xem câu 99 trong bài 100+ câu hỏi phỏng vấn Java cùng hướng dẫn trả lời

Q84: So sánh mã hóa đối xứng (Symmetric) và bất đối xứng (Asymmetric) (Gotit)

Gợi ý trả lởi:

Tham khảo: Symmetric vs. Asymmetric Encryption – What are differences?

Nguồn: ssl2buy.com
9. Mức độ thành thạo ngôn ngữ lập trình
Q85: Giải thích về decorators trong Python (Gotit)

Gợi ý trả lời:

Tham khảo: Decorators in Python

Q86: Giả thích cách sử dụng “this” trong Javascript (Gotit)

Q87: Hãy cho biết mục đích sử dụng Virtual DOM (câu hỏi này dành cho frontend engineers có đề cập ReactJS trong CV) (Gotit)

Gợi ý trả lời:

DOM ảo (VDOM) là một khái niệm lập trình trong đó một biểu diễn lý tưởng hay còn gọi là “ảo” của giao diện người dùng được lưu trong bộ nhớ và được đồng bộ hóa với DOM “thực” bởi một thư viện như ReactDOM. Quá trình này được gọi là reconciliation.

Cách tiếp cận này cho phép API khai báo của React: Bạn cho React biết bạn muốn giao diện người dùng ở trạng thái nào và nó đảm bảo DOM khớp với trạng thái đó. Điều này tóm tắt thao tác thuộc tính, xử lý sự kiện và cập nhật DOM thủ công mà bạn sẽ phải sử dụng để xây dựng ứng dụng của mình.

Vì “DOM ảo” mang tính chất mẫu (pattern) hơn là một công nghệ cụ thể, nên đôi khi người ta nói nó có nghĩa là những thứ khác nhau. Trong thế giới React, thuật ngữ “DOM ảo” thường được kết hợp với các phần tử React vì chúng là các đối tượng đại diện cho giao diện người dùng. Tuy nhiên, React cũng sử dụng các đối tượng bên trong được gọi là “fibers” để chứa thông tin bổ sung về cây thành phần. Chúng cũng có thể được coi là một phần của việc triển khai “DOM ảo” trong React

Tham khảo: React: The Virtual DOM

Q88: Mô tả ý tưởng chính của Flux / Redux (Gotit)

Gợi ý trả lời:

Tham khảo

https://facebook.github.io/flux/
https://redux.js.org/basics/data-flow

Ứng viên có thể được yêu cầu vẽ một sơ đồ đơn giản để trình bày ý tưởng.

Q89: Hãy cho biết nguyên tắc SOLID trong lập trình (nhiều công ty)

Gợi ý trả lời:

SOLID là viết tắt của 5 chữ cái đầu trong 5 nguyên tắc thiết kế hướng đối tượng. Giúp cho lập trình viên viết ra những đoạn code dễ đọc, dễ hiểu, dễ bảo trì. Năm nguyên tắc đó bao gồm:

Single responsibility priciple (SRP)
Open/Closed principle (OCP)
Liskov substitution principe (LSP)
Interface segregation principle (ISP)
Dependency inversion principle (DIP)

10. Tool Proficiency
Q90: Hãy cho biết các phương pháp hay nhất để thiết kế các RESTful APIs (Gotit)

11. Unit Testing
Các câu hỏi về kiểm thử không chỉ xuất hiện trong các cuộc phỏng vấn về testing mà cả về software engineer

Q91: Hãy cho biết sự khác nhau giữa Unit testing và integration testing? (nhiều công ty)

Q82: Làm thế nào để thực hiện unit test cho một component mà component đó phụ thuộc vào các components khác hoặc một dịch vụ của bên thứ ba? (Gotit)

12. Coding Style & Convention
Q93: Làm thế nào để bạn giữ cho code của bạn nhất quán (code style consistent)? (Gotit)

13. Design Reasoning
Q94: Tại sao chúng ta cần random salts khi hashing (băm) passwords? (Gotit)

Gợi ý trả lời:

Tham khảo: Băm và lưu password đúng cách

Q95: Làm thế nào để lưu password một cách an toàn? (Gotit)

14. Các câu hỏi kỹ thuật khác
Q96: Hiện thực một cấu trúc dữ liệu (CTDL) chứa số nguyên (int) có method insert và method trả về TẤT CẢ các CẶP số nguyên hiện có trong CTDL sao cho tổng của chúng bằng 1 số n cho trước. (KMS)

Chú ý: Câu hỏi phỏng vấn software engineer này không rõ ràng ở chỗ các số nguyên hiện có trong CTDL có bị duplicate hay không? Nên trước khi trình bày với người phỏng vấn, bạn nên nêu rõ là mình đã xét trường hợp ấy. Người phỏng vấn cũng chỉ mong là bạn đưa ra được solution sử dụng 2 vòng lặp để hiện thực method count. Solution tối ưu hơn chúng ta sẽ dùng HashTable

 
Q97:  Cho trước 1 List viết 1 hàm dạng:

int dist (String a, String b) trả về khoảng cách a,b trong list. Nếu a,b bị duplicate trong list thì trả về khoảng cách bé nhất. Nếu a hoặc b không tồn tại thì trả về -1 (KMS)

Ví dụ: input là List list = Array.asList(“cat”, “dog”, “bird”, “fish”, “cat”,”duck”,”chicken”,”dog”)

15. Các câu hỏi non-tech trong phỏng vấn software engineer
Dưới đây là các câu hỏi không liên quan đến kỹ thuật trong các buổi phỏng vấn software engineer:

Q98: Tại sao lại muốn chuyển công ty ? Sao lại chọn công ty chúng tôi? (nhiều công ty)

Q99: Hãy cho biết về chi tiết một số dự án đã từng làm? (nhiều công ty)

Q100: Điểm yếu nhất của sếp cũ của bạn là gì? (nhiều công ty)

Q101: Mục tiêu ngắn hạn và dài bạn trong nghề nghiệp (nhiều công ty)

Kết luận
Hơn 100 câu hỏi phỏng vấn dành cho software engineer của các công ty công nghệ tại Việt Nam này sẽ giúp bạn chuẩn bị tốt hơn cho quá trình tìm kiếm một công việc mới. Hoặc đơn giản là củng cố các kiến thức của bạn qua các câu hỏi này. Nếu bạn có câu hỏi phỏng vấn software engineer nào khác có thể chia sẻ, hãy để lại bên dưới phần bình luận nhé

 

 

 

Back to top button