1. Trong lập trình, `concurrency` và `parallelism` khác nhau như thế nào?
A. Concurrency là việc thực hiện nhiều tác vụ đồng thời, trong khi parallelism là việc thực hiện nhiều tác vụ cùng một lúc.
B. Parallelism là việc thực hiện nhiều tác vụ đồng thời, trong khi concurrency là việc thực hiện nhiều tác vụ cùng một lúc.
C. Concurrency là một loại parallelism.
D. Parallelism là một loại concurrency.
2. Trong lập trình, `memory leak` (rò rỉ bộ nhớ) là gì?
A. Một lỗi cú pháp trong mã nguồn.
B. Một tình huống trong đó chương trình không giải phóng bộ nhớ đã cấp phát, dẫn đến việc bộ nhớ bị sử dụng hết theo thời gian.
C. Một tình huống trong đó chương trình sử dụng quá nhiều bộ nhớ.
D. Một lỗi logic trong chương trình.
3. Trong ngữ cảnh của cơ sở dữ liệu, ACID là viết tắt của những thuộc tính nào?
A. Atomicity, Consistency, Isolation, Durability
B. Accuracy, Consistency, Integrity, Durability
C. Atomicity, Concurrency, Integrity, Distribution
D. Availability, Consistency, Isolation, Distribution
4. Sự khác biệt chính giữa `biên dịch` (compilation) và `thông dịch` (interpretation) là gì?
A. Biên dịch tạo ra mã máy trực tiếp, trong khi thông dịch thực thi mã nguồn từng dòng một.
B. Biên dịch nhanh hơn thông dịch.
C. Thông dịch tạo ra mã máy trực tiếp, trong khi biên dịch thực thi mã nguồn từng dòng một.
D. Không có sự khác biệt giữa biên dịch và thông dịch.
5. Trong lập trình, `refactoring` (tái cấu trúc) có nghĩa là gì?
A. Viết lại toàn bộ mã nguồn từ đầu.
B. Thay đổi cấu trúc bên trong của mã nguồn mà không thay đổi hành vi bên ngoài của nó.
C. Thêm các tính năng mới vào chương trình.
D. Sửa lỗi trong mã nguồn.
6. Trong lập trình, `mutable` và `immutable` có nghĩa là gì?
A. Mutable có nghĩa là có thể thay đổi sau khi tạo, còn immutable có nghĩa là không thể thay đổi sau khi tạo.
B. Immutable có nghĩa là có thể thay đổi sau khi tạo, còn mutable có nghĩa là không thể thay đổi sau khi tạo.
C. Mutable có nghĩa là dữ liệu được lưu trữ trong bộ nhớ, còn immutable có nghĩa là dữ liệu được lưu trữ trên đĩa.
D. Immutable có nghĩa là dữ liệu được mã hóa, còn mutable có nghĩa là dữ liệu không được mã hóa.
7. Trong lập trình, `code smell` là gì?
A. Một đoạn mã có hiệu suất kém.
B. Một dấu hiệu trong mã nguồn cho thấy có thể có vấn đề sâu hơn về thiết kế hoặc triển khai.
C. Một lỗi cú pháp trong mã nguồn.
D. Một đoạn mã không tuân thủ các quy ước mã hóa.
8. Trong lập trình, `deadlock` (bế tắc) là gì?
A. Một lỗi cú pháp trong mã nguồn.
B. Một tình huống trong đó hai hoặc nhiều tiến trình (hoặc luồng) bị chặn vĩnh viễn, chờ đợi lẫn nhau để giải phóng tài nguyên.
C. Một lỗi logic trong chương trình.
D. Một tình huống trong đó chương trình chạy quá chậm.
9. Trong các cấu trúc dữ liệu sau, cấu trúc nào hoạt động theo nguyên tắc LIFO (Last In, First Out)?
A. Hàng đợi (Queue)
B. Ngăn xếp (Stack)
C. Danh sách liên kết (Linked List)
D. Cây (Tree)
10. Phương pháp lập trình nào tập trung vào việc chia nhỏ bài toán thành các hàm nhỏ, độc lập?
A. Lập trình hướng đối tượng (Object-Oriented Programming)
B. Lập trình cấu trúc (Structured Programming)
C. Lập trình hàm (Functional Programming)
D. Lập trình logic (Logic Programming)
11. Trong lập trình, `dependency injection` (tiêm phụ thuộc) là gì?
A. Một kỹ thuật để giảm độ phức tạp của mã nguồn.
B. Một mẫu thiết kế trong đó các phụ thuộc của một đối tượng được cung cấp cho đối tượng đó thay vì đối tượng tự tạo ra chúng.
C. Một phương pháp để kiểm tra lỗi trong mã nguồn.
D. Một kỹ thuật để tối ưu hóa hiệu suất của chương trình.
12. Kiểu dữ liệu trừu tượng (Abstract Data Type - ADT) là gì?
A. Một kiểu dữ liệu được định nghĩa bằng cách sử dụng các kiểu dữ liệu cơ bản.
B. Một kiểu dữ liệu được định nghĩa bằng cách chỉ định tập hợp các thao tác có thể được thực hiện trên nó, mà không cần quan tâm đến việc các thao tác đó được thực hiện như thế nào.
C. Một kiểu dữ liệu được sử dụng để lưu trữ các số nguyên.
D. Một kiểu dữ liệu được sử dụng để lưu trữ các số thực.
13. Mục đích chính của việc sử dụng hệ thống kiểm soát phiên bản (version control system) như Git là gì?
A. Để tự động hóa việc triển khai ứng dụng.
B. Để theo dõi và quản lý các thay đổi của mã nguồn.
C. Để tối ưu hóa hiệu suất của ứng dụng.
D. Để tạo tài liệu tự động cho mã nguồn.
14. Trong lập trình, `callback function` (hàm gọi lại) là gì?
A. Một hàm được gọi trước khi chương trình bắt đầu.
B. Một hàm được truyền như một đối số cho một hàm khác và được gọi sau khi hàm đó hoàn thành.
C. Một hàm được sử dụng để xử lý lỗi.
D. Một hàm được sử dụng để tối ưu hóa hiệu suất.
15. Trong lập trình, `race condition` là gì?
A. Một lỗi cú pháp trong mã nguồn.
B. Một tình huống trong đó kết quả của một chương trình phụ thuộc vào thứ tự thực hiện của các luồng (hoặc tiến trình) không thể đoán trước.
C. Một tình huống trong đó chương trình chạy quá chậm.
D. Một lỗi logic trong chương trình.
16. Trong lập trình web, CORS (Cross-Origin Resource Sharing) là gì?
A. Một kỹ thuật để tối ưu hóa hiệu suất của trang web.
B. Một cơ chế bảo mật trình duyệt cho phép các trang web từ một nguồn gốc (origin) khác nhau truy cập tài nguyên của một trang web khác.
C. Một ngôn ngữ lập trình để tạo giao diện người dùng.
D. Một framework để phát triển ứng dụng web.
17. Trong lập trình, thuật ngữ `đệ quy` (recursion) đề cập đến điều gì?
A. Một vòng lặp vô hạn.
B. Một hàm tự gọi chính nó.
C. Một biến toàn cục.
D. Một cấu trúc dữ liệu phức tạp.
18. Trong lập trình, `memoization` là gì?
A. Một kỹ thuật tối ưu hóa bằng cách lưu trữ kết quả của các lệnh gọi hàm tốn kém và trả về kết quả đã lưu trong bộ nhớ cache khi đầu vào tương tự xảy ra trở lại.
B. Một phương pháp để mã hóa dữ liệu.
C. Một kỹ thuật để giảm kích thước mã nguồn.
D. Một phương pháp để kiểm tra lỗi trong mã nguồn.
19. Độ phức tạp thời gian của thuật toán sắp xếp `merge sort` (sắp xếp trộn) là gì?
A. O(n^2)
B. O(n log n)
C. O(log n)
D. O(n)
20. Sự khác biệt chính giữa `process` (tiến trình) và `thread` (luồng) là gì?
A. Một process có thể chứa nhiều thread, trong khi một thread không thể chứa nhiều process.
B. Một thread có thể chứa nhiều process, trong khi một process không thể chứa nhiều thread.
C. Process chia sẻ bộ nhớ, trong khi thread không chia sẻ bộ nhớ.
D. Thread là độc lập, trong khi process phụ thuộc vào nhau.
21. Trong lập trình hướng đối tượng, tính chất nào cho phép một đối tượng thuộc lớp con có thể thay thế một đối tượng thuộc lớp cha mà không làm thay đổi tính đúng đắn của chương trình?
A. Tính đóng gói (Encapsulation)
B. Tính đa hình (Polymorphism)
C. Tính kế thừa (Inheritance)
D. Tính trừu tượng (Abstraction)
22. Trong lập trình hướng đối tượng, nguyên tắc `SOLID` là gì?
A. Một tập hợp các quy tắc để viết mã nguồn dễ đọc.
B. Một tập hợp các nguyên tắc thiết kế để tạo ra phần mềm dễ bảo trì, mở rộng và kiểm thử.
C. Một tập hợp các quy ước mã hóa.
D. Một tập hợp các kỹ thuật tối ưu hóa hiệu suất.
23. Trong kiểm thử phần mềm, sự khác biệt giữa `unit testing` (kiểm thử đơn vị) và `integration testing` (kiểm thử tích hợp) là gì?
A. Unit testing kiểm tra các thành phần riêng lẻ của chương trình, trong khi integration testing kiểm tra sự tương tác giữa các thành phần đó.
B. Integration testing kiểm tra các thành phần riêng lẻ của chương trình, trong khi unit testing kiểm tra sự tương tác giữa các thành phần đó.
C. Unit testing được thực hiện bởi nhà phát triển, trong khi integration testing được thực hiện bởi người kiểm thử.
D. Integration testing nhanh hơn unit testing.
24. Sự khác biệt chính giữa `authentication` (xác thực) và `authorization` (ủy quyền) là gì?
A. Authentication xác định người dùng là ai, trong khi authorization xác định người dùng được phép làm gì.
B. Authorization xác định người dùng là ai, trong khi authentication xác định người dùng được phép làm gì.
C. Authentication là quá trình mã hóa dữ liệu, trong khi authorization là quá trình giải mã dữ liệu.
D. Authentication và authorization là hai thuật ngữ đồng nghĩa.
25. Trong lập trình, `caching` (bộ nhớ đệm) được sử dụng để làm gì?
A. Để lưu trữ dữ liệu vĩnh viễn.
B. Để lưu trữ tạm thời dữ liệu thường xuyên được truy cập, giúp tăng tốc độ truy cập.
C. Để mã hóa dữ liệu.
D. Để nén dữ liệu.
26. Độ phức tạp thời gian của thuật toán tìm kiếm nhị phân (binary search) trong trường hợp tốt nhất là gì?
A. O(n)
B. O(log n)
C. O(1)
D. O(n^2)
27. Trong lập trình, thuật ngữ `Big O notation` (ký hiệu Big O) được sử dụng để mô tả điều gì?
A. Độ phức tạp của mã nguồn.
B. Hiệu suất của thuật toán khi kích thước đầu vào tăng lên.
C. Kích thước của mã nguồn.
D. Số lượng biến trong chương trình.
28. Sự khác biệt chính giữa `stack` và `heap` trong quản lý bộ nhớ là gì?
A. Stack được sử dụng cho các biến cục bộ và lời gọi hàm, trong khi heap được sử dụng cho bộ nhớ được cấp phát động.
B. Heap được sử dụng cho các biến cục bộ và lời gọi hàm, trong khi stack được sử dụng cho bộ nhớ được cấp phát động.
C. Stack nhanh hơn heap.
D. Heap nhanh hơn stack.
29. Trong lập trình, `garbage collection` (thu gom rác) là gì?
A. Một quá trình tự động giải phóng bộ nhớ không còn được sử dụng bởi chương trình.
B. Một quá trình nén dữ liệu để tiết kiệm bộ nhớ.
C. Một quá trình mã hóa dữ liệu để bảo mật.
D. Một quá trình kiểm tra lỗi trong mã nguồn.
30. Trong lập trình hướng đối tượng, `design pattern` (mẫu thiết kế) là gì?
A. Một đoạn mã có thể được sao chép và dán vào nhiều chương trình.
B. Một giải pháp đã được chứng minh cho một vấn đề thiết kế phần mềm thường gặp.
C. Một công cụ để tự động tạo mã nguồn.
D. Một tiêu chuẩn mã hóa bắt buộc phải tuân theo.