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.
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
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)
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ớ (space complexity) là gì? Hãy cho ví dụ (Goit)
Gợi ý trả lời:
Time complexity
- Độ phức tạp về thời gian của một thuật toán là sự thể hiện lượng thời gian mà thuật toán cần để thực thi đến khi hoàn thành. Yêu cầu về thời gian có thể được biểu thị hoặc định nghĩa dưới dạng một hàm số t (N), trong đó t (N) có thể được đo bằng số bước, miễn là mỗi bước có thời gian không đổi.
- Ví dụ, trong trường hợp cộng hai số nguyên n bit, N bước được thực hiện. Do đó, tổng thời gian tính toán là t (N) = c * n, trong đó c là thời gian dùng để cộng hai bit. Ở đây, chúng tôi quan sát thấy rằng t (N) tăng tuyến tính khi kích thước đầu vào tăng lên.
Space Complexity
-
Space Complexity của một thuật toán thể hiện lượng không gian bộ nhớ cần thiết của thuật toán trong vòng đời của nó. Không gian cần thiết của một thuật toán bằng tổng của hai thành phần sau
-
Một phần cố định là không gian cần thiết để lưu trữ dữ liệu và biến nhất định (tức là biến và hằng số đơn giản, kích thước chương trình, v.v.), không phụ thuộc vào quy mô của vấn đề.
-
Một phần biến là một không gian được yêu cầu bởi các biến, kích thước của nó hoàn toàn phụ thuộc vào kích thước của bài toán. Ví dụ, không gian ngăn xếp đệ quy, cấp phát bộ nhớ động, v.v.
-
- Space Complexity S (p) của bất kỳ thuật toán p nào là S (p) = A + Sp (I) Trong đó A được coi là phần cố định và S (I) được coi là phần biến của thuật toán phụ thuộc vào đặc tính cá thể I .
- Sau đây là một ví dụ đơn giản cố gắng giải thích khái niệm
Ví dụ:
SUM (P, Q)
Bước 1 - BẮT ĐẦU
Bước 2 - R ← P + Q + 10
Bước 3 - Dừng lại
Ở đây chúng ta có ba biến P, Q và R và một hằng số. Do đó S (p) = 1 + 3. Bây giờ không gian phụ thuộc vào kiểu dữ liệu của các kiểu và biến hằng số đã cho và nó sẽ được nhân lên tương ứng.
Nguồn: Time and Space Complexity in Data Structure
Q13: Binary search là gì? (Goit)
Gợi ý trả lời:
Binary search: Tìm kiếm một mảng đã sắp xếp bằng cách chia đôi khoảng thời gian tìm kiếm nhiều lần. Bắt đầu bằng một khoảng bao gồm toàn bộ mảng. Nếu giá trị của khóa tìm kiếm nhỏ hơn mục ở giữa khoảng, hãy thu hẹp khoảng đó xuống nửa dưới. Nếu không, hãy thu hẹp nó xuống nửa trên. Lặp lại kiểm tra cho đến khi giá trị được tìm thấy hoặc khoảng thời gian trống.
Tham khảo: binary search
Q14: Hãy giải thích về kỹ thuật hai con trỏ (two pointers) (Goit)
Gợi ý trả lời
Kỹ thuật hai con trỏ là một kỹ thuật dễ dàng và hiệu quả thường được sử dụng để tìm kiếm các cặp trong một mảng được sắp xếp.
Tìm hiểu thêm: Two Pointers Technique
Q15: Prefix sum, prefix product là gì? (Goit)
Gợi ý trả lời
Tham khảo: Prefix Product Array, Prefix Sum Array
Q16: Cho một chuỗi chứa các ký tự trong bảng ASCII. Hãy viết một hàm kiểm tra nếu mỗi ký tự chỉ xuất hiện một lần trong chuỗi. (Goit)
Gợi ý trả lời:
- Cách 1: Sử dụng kỹ thuật Brute Force chạy 2 vòng với biến i và j. So sánh str [i] và str [j]. Nếu chúng trở nên bằng nhau tại bất kỳ điểm nào, hãy trả về false.
- Cách 2: Sử dụng giải thuật sắp xếp dựa trên giá trị ASCII của các ký tự
Tham khảo thêm: Determine if a string has all Unique Characters
Q17: Find the most occurring character in an input string (Goit)
Gợi ý trả lời:
Sắp xếp chuỗi đầu vào và sau đó duyệt qua chuỗi đã sắp xếp để tìm ký tự xuất hiện với số lần tối đa.
Tham khảo thêm: Return maximum occurring character in an input string
Q18: Phân biệt cây nhị phân(binary tree) và cây nhị phân tìm kiếm (binary search tree)? (Nhiều công ty)
Gợi ý trả lời:
Cây nhị phân |
Cây nhị phân tìm kiếm |
BINARY TREE là một cấu trúc dữ liệu phi tuyến tính trong đó mỗi node hầu như có hai node con |
BINARY SEARCH TREE là một cây nhị phân dựa trên node có thêm cây con bên phải và bên trái cũng là cây tìm kiếm nhị phân. |
BINARY TREE không có thứ tự do đó chậm hơn trong quá trình chèn, xóa và tìm kiếm. |
Việc chèn, xóa, tìm kiếm một phần tử trong CÂY NHỊ PHÂN nhanh hơn so với CÂY NHỊ PHÂN TÌM KIẾM do các đặc điểm được sắp xếp theo thứ tự |
Trong BINARY TREE không có thứ tự về cách các node được sắp xếp |
TRONG CÂY TÌM KIẾM BINARY cây con bên trái có phần tử nhỏ hơn phần tử node và cây con bên phải có phần tử lớn hơn phần tử node |
Bạn có thể tham khảo thêm:
-
Các câu hỏi phỏng vấn dành cho software engineer về cây nhị phân (Binary Tree) trên ITguru Blog
-
Binary tree vs Binary Search tree trên javatpoint.com
- Difference between Binary Tree and Binary Search Tree trên GFG
Q19: Viết một hàm để kiểm tra các dấu ngoặc có khớp (cân bằng) nhau không (balanced parentheses) trong một biểu thức (Nhiều công ty)
Gợi ý trả lời
Cho một biểu thức có chứa các dấu ngoặc mở và đóng khác nhau. Biểu thức có thể chứa các dấu ngoặc đơn sau → ’(’, ‘)’, ‘{‘, ‘}’, ‘[‘, ‘]’. Biểu thức được cho là cân bằng nếu:
- Thứ tự của dấu ngoặc mở và đóng ngoặc là như nhau.
- Khung mở phải được đóng bằng cùng một loại khung đóng.
Có khá nhiều giải pháp để giải quyết vấn đề này. Để trả lời tốt câu hỏi này trong phỏng vấn software engineer bạn thể dùng các giải pháp sau:
- Brute Force Solution → Đây là một giải pháp mà chúng ta sẽ duy trì một bộ đếm. Giá trị của bộ đếm này không được nhỏ hơn 0 tại bất kỳ thời điểm nào đối với các biểu thức cân bằng.
- Giải pháp Brute Force được tối ưu hóa theo thời gian → Ở đây trong giải pháp này, chúng ta cũng sẽ sử dụng bộ đếm nhưng sẽ tiếp tục thay thế các cặp phù hợp bằng *.
- Giải pháp Sử dụng Ngăn xếp (Stack) → Trong giải pháp này, chúng ta sẽ sử dụng các khái niệm về ngăn xếp để tìm xem biểu thức có cân bằng hay không.
Tham khảo thêm về giải pháp tại đây
Q20: Tìm bảng trong một excel file để tự động áp dụng một số định dạng cho bảng đó nhằm tạo hình ảnh tốt hơn: Một excel file bao gồm các ô được tạo thành bởi các hàng và cột. Có các ô có giá trị và các ô trống trong file này. Tất cả các ô có giá trị liền kề (trái, phải, lên, xuống, chéo) tạo thành một bảng.
– Đầu vào: mảng 2 chiều đại diện cho các ô của tập tin excel
– Dữ liệu ra: đếm số lượng bảng trong một tệp excel. (Goit)
Gợi ý trả lời:
Sử dụng BFS (Breadth First Search), component-connected trong graph
Q21: Cho một trang web HTML chứa nhiều thẻ <a>, mỗi thẻ có một thuộc tính`href`chứa liên kết URL điều hướng đến trang web đích. Trình thu thập dữ liệu web sẽ tìm nạp nội dung HTML từ trang web và phân tích nội dung của nó để phát hiện liên kết URL nào sẽ được thu thập thông tin tiếp theo. Quá trình này sẽ lặp lại cho đến khi không có liên kết mới để thu thập thông tin.
Thiết kế thuật toán để xây dựng trình thu thập dữ liệu web.
+ Đầu vào: URL của một trang web
+ Đầu ra: Một danh sách tất cả các liên kết cần được thu thập thông tin. (Goit)
Gợi ý trả lời:
Sử dụng giải thuật BFS (Breadth First Search)
Q22: Kiểm tra nếu một chuỗi cho trước là palindrome. Ví dụ: abccba (Nhiều công ty)
Gợi ý trả lời:
Có thể đưa ra cả hai giải pháp: cách lặp và cách đệ quy
Bạn có thể xem thêm các câu hỏi phỏng vấn dành cho software engineer liên quan đến palindrome tại đây (Python) và tại đây (chung)
Q23: Triển khai một hàm để tính số Fibonacci thứ n.
Phân tích độ phức tạp của thời gian và bộ nhớ (nhiều công ty)
Gợi ý trả lời
Các số Fibonacci là các số trong dãy số nguyên sau:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …… ..
Theo thuật ngữ toán học, dãy Fn của các số Fibonacci được xác định bằng quan hệ lặp lại:
Fn = Fn-1 + Fn-2
Với giá trị hạt giống (seed)
F0 = 0 và F1 = 1.
Để tìm số Fibonacci thứ n bạn có thể dùng phương pháp đệ quy, sử dụng lập trình động, sử dụng ma trận…
Tham khảo các phương pháp và độ phức tạp của thuật toán tại đây hoặc tại đây
Q24: Viết hàm tìm ra mảng con liên tiếp có tổng lớn nhất trong một mảng với tham số k là số phần tử của mảng con đó. (Employment Hero)
Ví dụ: [1, -5, 4, 3, 6, 8, 2, 4], k = 3 => output: [3, 6, 8]
Q25: Viết hàm trả về số nhỏ thứ k trong mảng số nguyên. Ví dụ cho một mảng các số nguyên chưa được sắp xếp thứ tự (Employment Hero)
2. Lâp trình hướng đối tượng – Object Oriented Programming
Q29: Câu hỏi cho các ứng viên có background về C++/Java: những từ này nghĩa là gì và sự khác nhau là gì: private, protected, public? (Gotit)
Gợi ý trả lời:
Bạn hẳn đã thấy các từ khóa public, private và protected trong các chương trình java/C++, chúng được gọi là các từ khóa truy cập (access modifiers). Một access modifiers hạn chế quyền truy cập của một class, constructor, data member, method trong một class khác.
Xem thêm:
- Các loại access modifier trong Java
- Access Modifiers in Java
- C++ Access Specifiers
- Access Modifiers in C++
Q30: Sự khác nhau giữa Interface vs abstract class là gì? (Nhiều công ty)
Gợi ý trả lời:
- Interface: bao gồm các abstract methods chỉ có tên hàm mô tả hành vi của hàm mà không có thân hàm thực hiện hành vi đó. Ngoài ra có thể có các biến const.
- Abstract Class (lớp trừu tượng): Bản chất abstract class là một class vì vậy có tất cả tính chất của một class (có thể có biến, có hàm,..). Chỉ có điểm khác duy nhất là abstract class có abstract methods (các phương thức trừu tượng) trong khi class bình thường không có.
Tham khảo so sánh Interface vs Abstract Class: Interface vs Abstract Class in Java: What’s the Difference?
Q31: 4 nguyên tắc ( principles) của lập trình hướng đối tượng OOP là gì? Bạn có thể giải thích? (Nhiều công ty)
Gợi ý trả lời:
Có 4 nguyên tắc chính tạo nên một ngôn ngữ Hướng đối tượng là Encapsulation, Data Abstraction, Polymorphism và Inheritance. Đây cũng được gọi là bốn trụ cột (pillars) của Lập trình hướng đối tượng.
Xem chi tiết: What are four principles of OOP, How aggregation is different than Composition?
Q32: OOP là gì? Tại sao chúng ta nên sử dụng OOP? (Nhiều công ty)
Gợi ý trả lời:
Đây là cũng là một câu hỏi thường xuyên gặp trong các buổi phỏng vấn dành cho software engineer. OOP viết tắt của Object-Oriented Programming.
Lập trình hướng đối tượng (OOP) là một mô hình lập trình dựa trên khái niệm về lớp (classes) và đối tượng (objects). Nó được sử dụng để cấu trúc một chương trình phần mềm thành các phần đơn giản, có thể tái sử dụng của các bản thiết kế mã (thường được gọi là các lớp), được sử dụng để tạo các thể hiện riêng lẻ của các đối tượng. Có nhiều ngôn ngữ lập trình hướng đối tượng như JavaScript, C ++, Java và Python.
Lập trình hướng đối tượng (OOP) có một số ưu điểm:
- OOP nhanh hơn và dễ thực thi hơn
- OOP cung cấp một cấu trúc rõ ràng cho các chương trình
- OOP giúp giữ cho code không bị lặp lại giúp dễ bảo trì, sửa đổi và gỡ lỗi hơn
- OOP giúp bạn có thể tạo các ứng dụng có thể tái sử dụng với ít code hơn và thời gian phát triển ngắn hơn
Tham khảo: What is Object Oriented Programming? OOP Explained in Depth
Q33: Có một trò chơi trong đó chúng ta có tập hợp các động vật thuộc các chủng tộc khác nhau (Ví dụ: Chó, Chim, Mèo, Sư tử). Làm thế nào để làm cho tất cả các động vật trong tập hợp hiển thị một phương pháp có tên là “bay” để chúng ta có thể yêu cầu chúng bay ngay cả khi chúng không phải là chim? (Gotit)
Gợi ý trả lời:
Ứng viên có thể sử dụng tính năng thừa kế. Nhưng đây là một tình huống phi thực tế. Chúng ta không thể bắt một con chó kế thừa các thuộc tính và phương pháp của bất kỳ loại nào khác có thể bay. Giải pháp chính xác là cung cấp giao diện “Flyable”.
Q34: Giải thích về overwrite và overload trong C++ (Gotit)
Gợi ý trả lời
Tham khảo: Difference between Function Overloading and Function overriding in C++
Q35: Tại sao constructor không trả vê giá trị nào? (Gotit)
Gợi ý trả lời:
Các constructors được sử dụng để khởi tạo trạng thái của object. Giống như các method, một constructor cũng chứa tập hợp các câu lệnh (tức là các lệnh) được thực thi tại thời điểm tạo object.
Xem thêm: Constructors in Java
Q36: Hãy giải thích về multiple inheritance? Method sẽ được gọi khi thực thi dòng lệnh sau: a.run() (a là một instance của lớp A. A thừa kế từ B, C. B và C có các method của chúng) (Gotit)
Gợi ý trả lời:
Multiple Inheritance là một đặc điểm của khái niệm hướng đối tượng, trong đó một lớp có thể kế thừa các thuộc tính của nhiều hơn một lớp cha.
Tham khảo:
Q37: Composition là gì? So sánh composition và inheritance. (Nhiều công ty)
Gợi ý trả lời:
Composition là một trong những khái niệm cơ bản trong lập trình hướng đối tượng. Nó mô tả một class tham chiếu đến một hoặc nhiều object của các lớp khác trong các instance variables.. Điều này cho phép bạn lập mô hình liên kết có-một giữa các đối tượng.
Inheritance vs. Composition:
Sự khác biệt chính giữa Inheritance và Composition là ở mối quan hệ giữa các đối tượng.
Inheritance được biết đến như một dạng kết hợp chặt chẽ nhất trong lập trình hướng đối tượng. Thay đổi một lớp cơ sở có thể gây ra các tác dụng phụ không mong muốn trên các lớp con của nó hoặc thậm chí trên toàn bộ cơ sở mã.
Composition là một kết nối lỏng lẻo hơn. Tuy nhiên, việc kết hợp với Dependency Injection, nó mang lại sự linh hoạt hơn và cũng cho phép chúng ta thay đổi hành vi thời gian chạy.
Q38: Hãy giải thích về class constructor (Gotit)
Gợi ý trả lời:
Phương thức class constructor là một hàm thành viên đặc biệt của một lớp được thực thi bất cứ khi nào chúng ta tạo các đối tượng mới của lớp đó.
Q39: Hãy giải thích khái niệm Polymorphism (Gotit)
Gợi ý trả lời:
Polymorphism (đa hình) là một khái niệm lập trình hướng đối tượng đề cập đến khả năng của một biến, hàm hoặc đối tượng có nhiều dạng. Trong một ngôn ngữ lập trình thể hiện tính đa hình, các đối tượng lớp thuộc cùng một cây phân cấp (kế thừa từ một lớp cha chung) có thể có các hàm có cùng tên, nhưng với các hành vi khác nhau.
Xem thêm về Polymorphism
3. Design Patterns
Q40: Design patterns là gì? Tại sao chúng ta cần dùng design patterns? (Nhiêu công ty)
Gợi ý trả lời:
Design pattern (mẫu thiết kế) cung cấp một giải pháp chung có thể tái sử dụng cho các vấn đề chung xảy ra trong thiết kế phần mềm. Mẫu thường hiển thị các mối quan hệ và tương tác giữa các lớp (class) hoặc đối tượng (object). Ý tưởng là để tăng tốc quá trình phát triển bằng cách cung cấp các mô hình thiết kế / phát triển đã được kiểm nghiệm, chứng minh. Các mẫu thiết kế là độc lập với ngôn ngữ lập trình để giải quyết một vấn đề chung. Điều đó có nghĩa là một mẫu thiết kế đại diện cho một ý tưởng, không phải là một triển khai cụ thể. Bằng cách sử dụng các mẫu thiết kế, bạn có thể làm cho mã của mình linh hoạt hơn, có thể tái sử dụng và có thể bảo trì.
Các design patterns có hai lợi ích chính:
- Cung cấp cho bạn cách giải quyết các vấn đề liên quan đến phát triển phần mềm bằng cách sử dụng một giải pháp đã được chứng minh. Giải pháp tạo điều kiện thuận lợi cho việc phát triển các mô-đun có tính gắn kết cao với khớp nối tối thiểu. Chúng cô lập sự thay đổi có thể tồn tại trong các yêu cầu hệ thống, làm cho hệ thống tổng thể dễ hiểu và dễ bảo trì hơn.
- giúp giao tiếp giữa các nhà thiết kế hiệu quả hơn. Các chuyên gia phần mềm có thể hình dung ngay thiết kế cấp cao trong đầu khi họ đề cập đến tên của pattern được sử dụng để giải quyết một vấn đề cụ thể khi thảo luận về thiết kế hệ thống.
Xem thêm về Software Design Patterns
Q41: Câu hỏi về Observer pattern: Một Controller có một thuộc tính có tên là “view” thể hiện một view mà nó điều khiển. Làm thế nào để view thông báo cho controller biết khi một sự kiện nhất định xảy ra? (Gotit)
Gợi ý trả lời:
Tìm hiểu về Observer pattern:
Q42: Câu hỏi về Architectural pattern: Hãy giải thích khái niệm về Microservices và monolithic (Gotit)
Gợi ý trả lời:
- Monolith trong tiếng Anh có nghĩa là nguyên khối. Ứng dụng Monolithic mô tả một ứng dụng phần mềm trong đó các thành phần khác nhau kết hợp thành một chương trình từ một nền tảng duy nhất.
-
Microservices là một cách tiếp cận để phát triển ứng dụng trong đó một ứng dụng lớn được xây dựng dưới dạng một bộ các dịch vụ mô-đun (tức là các mô-đun / thành phần được ghép nối lỏng lẻo). Mỗi mô-đun hỗ trợ một mục tiêu kinh doanh cụ thể và sử dụng một giao diện đơn giản, được xác định rõ ràng để giao tiếp với các nhóm dịch vụ khác.
Thay vì chia sẻ một cơ sở dữ liệu duy nhất như trong ứng dụng Monolithic, mỗi microservice có cơ sở dữ liệu riêng. Hơn nữa, một dịch vụ có thể sử dụng một loại cơ sở dữ liệu phù hợp nhất với nhu cầu của nó.
Tham khảo thêm:
- Monolithic vs Microservices architecture
-
Introduction to Monolithic Architecture and MicroServices Architecture
Q43: Câu hỏi về Dependency injection: Biết rằng lớp A cần sử dụng một instance của lớp B. Làm thế nào để thực hiện ý tưởng này mà không tạo ra sự phụ thuộc trực tiếp (direct dependency) giữa 2 lớp? (Gotit)
Gợi ý trả lời:
Tham khảo:
Q44: Câu hỏi về Architectural pattern: Hãy mô tả mô hình MVC. Đưa ra cách giải quyết vấn đề “Massive controller” (Gotit)
Gợi ý trả lời:
- Model-View-Controller (MVC) là một architectural pattern phân tách một ứng dụng thành ba thành phần logic chính: model, view, và controller. Mỗi thành phần này được xây dựng để xử lý các khía cạnh phát triển cụ thể của một ứng dụng. MVC là một trong những khung phát triển web tiêu chuẩn ngành được sử dụng thường xuyên nhất để tạo ra các dự án có thể mở rộng.
-
Tránh Massive View Controller bằng cách sử dụng Container View và Child View Controller
Tham khảo thêm:
Q45: Hãy mô tả the singleton pattern (Nhiều công ty)
Gợi ý trả lời
Tham khảo:
4. Cơ sở dữ liệu
Q46: Có những kiểu join khác nhau nào trong SQL? (Nhiều công ty)
Gợi ý trả lời:
Dưới đây là các kiểu khác nhau của các JOIN trong SQL:
- (INNER) JOIN: Trả về các bản ghi có giá trị phù hợp trong cả hai bảng
- LEFT (OUTER) JOIN: Trả về tất cả các bản ghi từ bảng bên trái và các bản ghi đã so khớp từ bảng bên phải
- RIGHT (OUTER) JOIN: Trả về tất cả các bản ghi từ bảng bên phải và các bản ghi phù hợp từ bảng bên trái
- FULL (OUTER) JOIN: Trả về tất cả các bản ghi khi có một kết quả phù hợp trong bảng bên trái hoặc bên phải
Q47: Hãy cho biết sự khác nhau giữa WHERE và HAVING clause trong SQL? (Nhiều công ty)
Gợi ý trả lời:
Sự khác biệt chính giữa WHERE và HAVING clause xuất hiện khi được sử dụng cùng với mệnh đề GROUP BY. Trong trường hợp đó, WHERE được sử dụng để lọc các hàng trước khi nhóm và HAVING được sử dụng để loại trừ các records sau khi nhóm. Đây là sự khác biệt quan trọng nhất và nếu bạn nhớ điều này, nó sẽ giúp bạn viết các truy vấn SQL tốt hơn.
Mặt khác, HAVING chỉ có thể được sử dụng nếu việc nhóm đã được thực hiện bằng mệnh đề GROUP BY trong truy vấn SQL. Một điều đáng chú ý khác về mệnh đề WHERE và HAVING là mệnh đề WHERE không thể chứa hàm tổng hợp như COUNT (), SUM (), MAX (), MIN (), v.v. nhưng mệnh đề HAVING có thể chứa các hàm tổng hợp.
Một điểm đáng chú ý khác giữa mệnh đề WHERE và HAVING là WHERE được sử dụng để áp đặt tiêu chí lọc cho câu lệnh SELECT, UPDATE, DELETE cũng như hàm hàng đơn và được sử dụng trước mệnh đề group by nhưng HAVING luôn được sử dụng sau mệnh đề GROUP BY.
Tham khảo: Difference between WHERE and HAVING clause in SQL
Q48: Tấn công SQL injection là gì và làm thế nào để ngăn chặn việc này? (Gotit)
Gợi ý trả lời:
SQL Injection (SQLi) là một kiểu tấn công bằng cách thực thi các câu lệnh SQL độc hại. Các câu lệnh này kiểm soát một máy chủ cơ sở dữ liệu của ứng dụng web. Những kẻ tấn công có thể sử dụng lỗ hổng SQL Injection để vượt qua các biện pháp bảo mật của ứng dụng. Họ có thể vượt qua xác thực và ủy quyền của một trang web hoặc ứng dụng web và truy xuất nội dung của toàn bộ cơ sở dữ liệu SQL. Họ cũng có thể sử dụng SQL Injection để thêm, sửa đổi và xóa các bản ghi trong cơ sở dữ liệu.
Xem thêm về tấn công SQL Injection và cách phòng chống tại đây
Q49: So sánh MySQL vs Redis. Hãy cho biết một vài trường hợp dùng redis. (Gotit)
Gợi ý trả lời:
Mô tả redis dưới dạng bộ nhớ cache và hàng đợi tin nhắn
Tham khảo thêm: Difference between Redis and MySQL
Q50: Cho một bảng có 5 cột trong CSDL: id, full_name, age, created_date, updated_date
1) Hãy viết câu lệnh select tất cả các sinh viên tuổi lớn hơn 20
2) Cột nào cần index để cải thiện câu query trên?
3) Hãy select tất cả các sinh viên có ký tự ‘a’ trong full name.
4) Nếu chúng ta index cột ‘full_name’ thì hiệu suất (performance) có được cải thiện? Tại sao?(Gotit)
Q51: Cấu trúc dữ liệu của các chỉ mục trong InnoDB của MySQL là gì? Đâu là sự khác nhau giữa MyISAM và InnoDB (Gotit)
Gợi ý trả lời:
Tham khảo: What is the difference between MyISAM and InnoDB
Q52: B-Tree là gì? Làm thế nào để triển khai B-Tree? (Gotit)
Gợi ý trả lời:
- Bên cạnh Hash và R-Tree index, mySQL còn có một kiểu index khác là B-Tree
- B-tree là một kiến trúc dữ liệu, để lưu trữ dữ liệu dưới dạng các node được sắp xếp theo thứ tự nhất định.
Tham khảo:
Q53: Mô tả quan hệ nhiều – nhiều (n-n) trong trong cơ sở dữ liệu quan hệ (Gotit)
Gợi ý trả lời:
Use an association table with foreign keys pointing to the two tables
Q54: Chỉ mục (index) được dùng để làm gì? (Nhiều công ty)
Gợi ý trả lời:
Indexes là các bảng tra cứu đặc biệt mà công cụ tìm kiếm cơ sở dữ liệu có thể sử dụng để tăng tốc độ truy xuất dữ liệu. Nói một cách đơn giản, index là một con trỏ đến dữ liệu trong một bảng. Một index trong cơ sở dữ liệu rất giống với một index ở phía sau của một cuốn sách.
Q55: Hãy so sánh khóa chính (primary key) và khóa ngoại (foreign key). Một bảng có nhất định phải có khóa chính không? (Gotit)
Gợi ý trả lời:
- Primary key constrain là cột xác định duy nhất mọi hàng trong bảng của hệ thống quản lý cơ sở dữ liệu quan hệ, trong khi foreign key là cột tạo mối quan hệ giữa hai bảng.
- Primary key không chấp nhận giá trị null trong khi foreign key có thể chấp nhận nhiều giá trị null.
- Chỉ có thể có một khóa chính duy nhất trong bảng trong khi có thể có nhiều khóa ngoại trong bảng.
- Không thể xóa giá trị của khóa chính khỏi bảng mẹ trong khi giá trị của khóa ngoại có thể bị xóa khỏi bảng con.
- Không có hai hàng nào có thể có bất kỳ giá trị nào giống nhau cho một khóa chính, mặt khác một khóa ngoại có thể chứa các giá trị trùng lặp.
Tham khảo thêm: Difference between Primary Key and Foreign Key
Q56: Hãy so sánh hai cơ sở dữ liệu SQL và noSQL (nhiều công ty)
Gợi ý trả lời:
Xem phần Khác nhau giữa Cơ sở dữ liệu SQL và NoSQL trong bài Cơ sở dữ liệu NoSQL là gì và tất cả những gì cần biết về NoSQL Database trên ITguru Blog để có thể trả lời tốt câu hỏi phỏng vấn software engineer này
Q57: Mô tả key-value structure trong cơ sở dữ liệu quan hệ
Q58: Chuẩn hóa cơ sở dữ liệu (database normalization) là gì? Vì sao chúng ta cần chuẩn hóa khi thiết kế một cơ sở dữ liệu mới? (Gotit)
Gợi ý trả lời:
Chuẩn hóa (normalization) là một kỹ thuật thiết kế cơ sở dữ liệu để giảm dư thừa dữ liệu và loại bỏ các đặc điểm không mong muốn. Các quy tắc chuẩn hóa chia các bảng lớn hơn thành các bảng nhỏ hơn và liên kết chúng bằng cách sử dụng các mối quan hệ. Mục đích của Chuẩn hóa trong SQL là loại bỏ dữ liệu dư thừa (lặp đi lặp lại) và đảm bảo dữ liệu được lưu trữ một cách hợp lý.
Tham khảo: What is Normalization? 1NF, 2NF, 3NF, BCNF Database Example
Q59: ACID là gì trong CSDL ? (Nhiều công ty)
Gợi ý trả lời:
- Trong các hệ thống cơ sở dữ liệu, ACID (Atomicity, Consistency, Isolation, Durability – Tính nguyên tử, Tính nhất quán, Tính cách ly, Độ bền) đề cập đến một tập hợp các thuộc tính tiêu chuẩn đảm bảo các giao dịch cơ sở dữ liệu được xử lý một cách đáng tin cậy.
- ACID đặc biệt quan tâm đến cách cơ sở dữ liệu phục hồi từ bất kỳ lỗi nào có thể xảy ra trong khi xử lý giao dịch.
- DBMS tuân thủ ACID đảm bảo rằng dữ liệu trong cơ sở dữ liệu vẫn chính xác và nhất quán cho dù có bất kỳ lỗi nào.
Tham khảo: What does ACID mean in Database Systems?
Q60: Có những kiểu quan hệ nào trong CSDL? Làm thế nào để xác định chúng bằng cách sử dụng khóa ngoại và bảng ?(Gotit)
Gợi ý trả lời:
Các loại kiểu quan hệ trong CSDL:
- One-to-One Relationship
- One-to-Many or Many-to-One Relationship
- Many-to-Many Relationship
Tham khảo: What are the different types of relationships in DBMS?
Q61: Hãy cho biết sự khác nhau giữa kiểu dữ liệu Varchar và Char trong MySQL (Gotit)
Gợi ý trả lời:
CHAR có độ dài cố định trong khi VARCHAR là độ dài thay đổi. Điều đó có nghĩa là, một chuỗi CHAR (x) có độ dài chính xác x ký tự, bao gồm cả dấu cách. Một chuỗi VARCHAR (x) có thể có tối đa x ký tự và nó cắt bỏ khoảng trắng ở cuối, do đó có thể ngắn hơn độ dài đã khai báo.
Về mặt hiệu quả, nếu bạn đang lưu trữ các chuỗi có độ dài thay đổi nhiều thì hãy sử dụng VARCHAR, nếu độ dài luôn bằng nhau thì hãy sử dụng CHAR vì nó nhanh hơn một chút.
Chúng cũng khác nhau về độ dài tối đa trong đó độ dài của giá trị CHAR có thể là bất kỳ giá trị nào từ 0 đến 255 và độ dài tối đa của giá trị VARCHAR là 65,535.
Q62: Hãy cho biết tác dụng của store procedure (Fsoft)
5. Mạng máy tính
Các câu hỏi về mạng máy tính và hệ điều hành (phần 6) cũng thường xuyên xuất hiện trong các buổi phỏng vấn software engineer
Q63: Mô tả định dạng request và response của HTTP? (Gotit)
Q64: Hãy so sánh UDP và TCP? (Gotit)
Q65: Kể tên các tầng (layer) của Mô hình OSI (OSI Model) (Gotit)
Q66: Domain là gì, port là gì? (Gotit)
Q67: Kể tên một số giao thức thuộc tầng ứng dụng (OSI) mà bạn biết. (Gotit)
Q68: Điều gì sẽ xảy ra từ khi nhập một tên miền (ví dụ: “google.com”) vào trình duyệt đến khi trang được hiển thị? (Gotit)
Q69: Hãy so sánh GET và POST, POST và PUT (nhiều công ty)
6. Hệ điều hành
Q70: Giải thích thuật ngữ deadlock, race condition (Gotit)
Q71: Mô tả stack và heap memory (Gotit)
Q72: So sánh thread và process (Gotit)
Q73: Hãy định nghĩa “bộ nhớ đệm”? Vì sao ta cần sử dụng bộ nhớ đệm? (Gotit)
Q74: Những tiêu chí nào có thể được sử dụng để phân loại Hệ điều hành (Gotit)
Q75: 32-bit có nghĩa là gì trong Hệ điều hành Windows 32-bit (Gotit)
Q76: Round-robin scheduling là gì What is round robin scheduling ? (Gotit)
Q77: Giải thích thuật ngữ “race condition” ? Làm thế nào để xử lý race condition? (Gotit)
Q78: Process starvation là gì? (Gotit)
7. Kỹ năng giải quyết vấn đề
Những câu hỏi phỏng vấn software engineer dạng này nhằm kiểm tra kỹ năng giải quyết một vấn đề cụ thể.
Q79: Xây dựng một hệ thống undo/redo đơn giản bằng bất kỳ ngôn ngữ lập trình nào (Gotit)
Yêu cầu:
– Không giới hạn số lượng hoạt động có thể được thực hiện, 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 undo/redo được thể hiện trong một bảng điều khiển / ứng dụng web / di động đơn giản
– Nó không sử dụng nhiều 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:
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?
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
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<String> 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é