20 mẫu thiết kế và câu hỏi phỏng vấn thiết kế phần mềm dành cho lập trình viên

Các mẫu thiết kế và câu hỏi thiết kế phần mềm là một phần thiết yếu của bất kỳ cuộc phỏng vấn lập trình nào, bất kể bạn sắp phỏng vấn Java hay phỏng vấn C#. Trên thực tế, kỹ năng lập trình và thiết kế bổ sung cho nhau khá tốt, những người lập trình giỏi thường là những nhà thiết kế giỏi cũng như họ biết cách chia vấn đề thành các đoạn mã hoặc thiết kế phần mềm nhưng những kỹ năng này lại không có. Bạn cần tiếp tục thiết kế, lập trình cả hệ thống quy mô nhỏ và quy mô lớn, đồng thời không ngừng học hỏi từ những sai lầm.

20 mẫu thiết kế và câu hỏi phỏng vấn thiết kế phần mềm dành cho lập trình viên

Tìm hiểu về các nguyên tắc thiết kế hướng đối tượng là một điểm khởi đầu tốt. Dù sao, bài viết này là về một số câu hỏi thiết kế đã được hỏi nhiều lần trong các cuộc phỏng vấn khác nhau.

Tôi đã chia chúng thành hai loại cho người mới bắt đầu và trung cấp để làm rõ và mức độ khó. Nó chứa các câu hỏi dựa trên các mẫu thiết kế hướng đối tượng cũng như về thiết kế phần mềm, ví dụ: cách viết mã máy bán hàng tự động bằng Java. Để làm tốt, bạn cần có kiến thức tốt về phân tích và thiết kế hướng đối tượng.

Nhân tiện, để hiểu rõ nhất về các mẫu thiết kế, bạn cần tìm ra một số tình huống, ví dụ, v.v. Tốt nhất là lấy loại kiến thức này như một phần công việc của bạn nhưng ngay cả khi bạn không đạt được những điều đó, bạn có thể bổ sung chúng bằng cách tham gia các khóa học mẫu thiết kế Java toàn diện này và thực hiện một số bài tập thiết kế phần mềm hướng đối tượng.

Thiết kế mẫu câu hỏi phỏng vấn cho cấp Senior và có kinh nghiệm


mẫu thiết kế và các câu hỏi thiết kế phần mềm được hỏi trong cuộc phỏng vấn Đây là những câu hỏi không chỉ liên quan đến mẫu thiết kế mà còn liên quan đến thiết kế phần mềm. Những câu hỏi này đòi hỏi một số lượng suy nghĩ và kinh nghiệm để trả lời. Trong hầu hết các trường hợp, người phỏng vấn không tìm kiếm câu trả lời tuyệt đối mà tìm kiếm cách tiếp cận của bạn, cách bạn nghĩ về một vấn đề, bạn có thể suy nghĩ thấu đáo không, bạn có thể đưa ra những điều chưa được nói với bạn không?

Đây là nơi kinh nghiệm xuất hiện trong bức tranh, Bạn cân nhắc điều gì trong khi giải quyết vấn đề, v.v. Nhìn chung, những câu hỏi thiết kế này sẽ khởi động quá trình suy nghĩ của bạn. Đôi khi những người phỏng vấn cũng yêu cầu bạn viết mã, vì vậy hãy chuẩn bị cho điều đó.

bạn có thể xuất sắc trong những câu hỏi này nếu bạn biết khái niệm, ví dụ và ứng dụng của các kỹ năng thiết kế và lập trình của mình. Bạn có thể nhận trợ giúp từ mẫu thiết kế Head First để tìm hiểu thêm về các mẫu thiết kế cũng như phân tích và thiết kế hướng đối tượng.

1. Cho ví dụ bạn thích lớp trừu tượng hơn giao diện? (trả lời)
Đây là một câu hỏi phỏng vấn thiết kế phổ biến nhưng phức tạp. cả lớp giao diện và lớp trừu tượng đều tuân theo nguyên tắc thiết kế "viết mã cho giao diện hơn là triển khai", điều này bổ sung tính linh hoạt cho mã, điều khá quan trọng để giải quyết các yêu cầu thay đổi. đây là một số gợi ý giúp bạn trả lời câu hỏi này:

1. Trong Java, bạn chỉ có thể mở rộng một lớp nhưng triển khai nhiều giao diện. Vì vậy, nếu bạn mở rộng một lớp, bạn sẽ mất cơ hội mở rộng một lớp khác.

2. Giao diện được sử dụng để đại diện cho tính từ hoặc hành vi, ví dụ:. Runnable, Clonable, Serializable, v.v., vì vậy nếu bạn sử dụng một lớp trừu tượng để thể hiện hành vi thì lớp của bạn không thể Runnable và Clonable cùng một lúc vì bạn không thể mở rộng hai lớp trong Java nhưng nếu bạn sử dụng giao diện thì lớp của bạn có thể có nhiều hành vi đồng thời.

3. Các ứng dụng quan trọng đúng giờ thích lớp trừu tượng nhanh hơn một chút so với giao diện.

4. Nếu có một hành vi chung thực sự trong hệ thống phân cấp thừa kế có thể được mã hóa tốt hơn ở một nơi thì lớp trừu tượng là lựa chọn ưu tiên. Đôi khi giao diện và lớp trừu tượng cũng có thể hoạt động cùng nhau khi xác định chức năng trong giao diện và chức năng mặc định trên lớp trừu tượng.

Để tìm hiểu thêm về các giao diện trong Java, hãy xem bài đăng của tôi 10 điều cần biết về giao diện Java


2. Thiết kế một Máy bán hàng tự động có thể chấp nhận các loại tiền khác nhau và giao các sản phẩm khác nhau?
Đây là một câu hỏi thiết kế mở mà bạn có thể sử dụng làm bài tập, hãy thử tạo tài liệu thiết kế, mã và kiểm tra Junit thay vì chỉ giải quyết vấn đề và kiểm tra xem bạn mất bao nhiêu thời gian để tìm ra giải pháp và tạo ra các tạo tác yêu cầu, Lý tưởng nhất là , câu hỏi này sẽ được giải quyết trong 3 giờ, ít nhất là một phiên bản hoạt động.


3. Bạn có một lớp Smartphone và sẽ có các lớp dẫn xuất như iPhone, AndroidPhone,WindowsMobilePhone
thậm chí có thể là tên điện thoại có thương hiệu, bạn sẽ thiết kế hệ thống Lớp học này như thế nào.
Đây là một bài tập mẫu thiết kế khác mà bạn cần áp dụng kỹ năng thiết kế hướng đối tượng của mình để đưa ra một thiết kế đủ linh hoạt để hỗ trợ các sản phẩm trong tương lai và đủ ổn định để hỗ trợ những thay đổi trong mô hình hiện có.


4. Khi nào bạn nạp chồng một phương thức trong Java và khi nào thì bạn ghi đè lên nó? (trả lời)
Thay vào đó, một câu hỏi đơn giản dành cho các nhà thiết kế có kinh nghiệm về Java. nếu bạn thấy các cách triển khai khác nhau của một lớp có cách thực hiện một số việc nhất định thì ghi đè là cách thực hiện trong khi quá tải đang thực hiện cùng một việc nhưng với đầu vào khác. chữ ký phương thức thay đổi trong trường hợp quá tải nhưng không thay đổi trong trường hợp ghi đè trong Java.

5. Thiết kế máy ATM?
Tất cả chúng ta đều sử dụng máy ATM (Máy rút tiền tự động), Hãy nghĩ xem bạn sẽ thiết kế máy ATM như thế nào? để thiết kế một hệ thống tài chính, người ta phải đặt ra yêu cầu là chúng phải hoạt động như mong đợi trong mọi tình huống. vì vậy, bất kể máy ATM bị mất điện có nên duy trì đúng trạng thái (giao dịch), hãy nghĩ đến việc khóa, giao dịch, điều kiện lỗi, điều kiện biên, v.v. ngay cả khi bạn không thể đưa ra thiết kế chính xác nhưng nếu bạn có thể chỉ ra đưa ra yêu cầu phi chức năng, đặt ra một số câu hỏi, nghĩ về điều kiện biên sẽ tiến triển tốt.


6. Bạn đang viết các lớp học để cung cấp Dữ liệu thị trường và bạn biết rằng bạn có thể chuyển sang các nhà cung cấp khác nhau theo thời gian như Reuters, Wombat và thậm chí có thể chuyển sang nguồn cấp dữ liệu trao đổi trực tiếp, bạn thiết kế hệ thống Dữ liệu thị trường của mình như thế nào?
Đây là một câu hỏi phỏng vấn thiết kế rất thú vị thực sự được hỏi tại một trong những ngân hàng đầu tư lớn và khá phổ biến nếu bạn đang viết mã bằng Java. Điểm mấu chốt là bạn sẽ có giao diện MarketData sẽ có các phương thức theo yêu cầu của khách hàng, ví dụ:. getBid(), getPrice(), getLevel(), v.v. và MarketData phải được tạo với MarketDataProvider bằng cách sử dụng phép nội xạ phụ thuộc. Vì vậy, khi bạn thay đổi nhà cung cấp MarketData, Khách hàng sẽ không bị ảnh hưởng vì họ truy cập phương thức từ lớp hoặc giao diện MarketData.


7. Tại sao không được phép truy cập vào các biến không tĩnh từ các phương thức tĩnh trong Java
Bạn không thể truy cập dữ liệu không tĩnh từ ngữ cảnh tĩnh trong Java đơn giản vì các biến không tĩnh được liên kết với một thể hiện cụ thể của đối tượng trong khi Tĩnh không được liên kết với bất kỳ thể hiện nào. Bạn cũng có thể xem bài đăng của tôi về lý do tại sao các biến không tĩnh không thể truy cập được trong ngữ cảnh tĩnh để thảo luận chi tiết hơn.

8. Thiết kế một Concurrent Rule pipeline trong Java?
Lập trình đồng thời hoặc thiết kế đồng thời đang rất nóng hiện nay để tận dụng sức mạnh của các lõi ngày càng tăng trong
bộ xử lý tiên tiến và Java là ngôn ngữ đa luồng có lợi ích hơn các ngôn ngữ khác. Khi thiết kế một hệ thống đồng thời, điểm quan trọng cần lưu ý là tính an toàn của luồng, tính không thay đổi và các biến cục bộ, đồng thời tránh sử dụng các biến tĩnh hoặc biến thể hiện. bạn chỉ nghĩ rằng một lớp có thể được thực thi bởi nhiều luồng cùng một lúc, Vì vậy, cách tiếp cận tốt nhất là mọi luồng hoạt động trên dữ liệu của chính nó, không can thiệp vào dữ liệu khác và ưu tiên đồng bộ hóa tối thiểu khi bắt đầu quy trình.

Câu hỏi này có thể dẫn từ cuộc thảo luận ban đầu đến mã hóa đầy đủ các lớp và giao diện nhưng nếu bạn nhớ các điểm chính và vấn đề xung quanh đồng thời, ví dụ: điều kiện chủng tộc, bế tắc, nhiễu bộ nhớ, tính nguyên tử, biến ThreadLocal, v.v. bạn có thể khắc phục.

Thiết kế mẫu câu hỏi phỏng vấn cho người mới bắt đầu
Các câu hỏi về mẫu thiết kế và thiết kế phần mềm này hầu hết được hỏi ở cấp độ mới bắt đầu và chỉ nhằm mục đích cung cấp thông tin rằng ứng viên đã quen thuộc với các mẫu thiết kế đến mức nào, chẳng hạn như anh ta có biết mẫu thiết kế là gì hay một mẫu thiết kế cụ thể làm gì không? Những câu hỏi này có thể dễ dàng được trả lời bằng cách ghi nhớ khái niệm nhưng vẫn có giá trị về mặt thông tin và kiến thức.


1. Mẫu thiết kế là gì? Bạn đã sử dụng bất kỳ mẫu thiết kế nào trong mã của mình chưa?
Các mẫu thiết kế là những cách đã được thử và kiểm tra để giải quyết các vấn đề thiết kế cụ thể bởi các lập trình viên khác nhau trên thế giới. Các mẫu thiết kế là một phần mở rộng của việc sử dụng lại mã.


2. Bạn có thể kể tên một số mẫu thiết kế được sử dụng trong thư viện JDK tiêu chuẩn không?
Mẫu thiết kế trang trí được sử dụng trong các lớp Java IO khác nhau, mẫu Singleton được sử dụng trong Thời gian chạy, Lịch và nhiều lớp khác, mẫu Factory được sử dụng cùng với các lớp Bất biến khác nhau như Boolean, ví dụ: Boolean.valueOf và mẫu Người quan sát được sử dụng trong Swing và nhiều khung công tác xử lý sự kiện.


3. Mẫu thiết kế Singleton trong Java là gì? viết mã cho một singleton an toàn cho luồng trong Java
Mẫu singleton tập trung vào việc chia sẻ đối tượng đắt tiền trong toàn bộ hệ thống. Chỉ một phiên bản của một lớp cụ thể được duy trì trong toàn bộ ứng dụng được chia sẻ bởi tất cả các mô-đun. Java.lang.Runtime là một ví dụ cổ điển về mẫu thiết kế của Singleton. Bạn cũng có thể xem bài đăng 10 câu hỏi của tôi về mẫu Singleton trong Java để biết thêm câu hỏi và thảo luận. Từ Java 5 trở đi, bạn có thể sử dụng enum cho một singleton an toàn cho luồng.


4. Lợi ích chính của việc sử dụng các mẫu nhà máy là gì? Bạn sử dụng nó ở đâu?
Lợi ích chính của mẫu nhà máy là tăng mức đóng gói trong khi tạo đối tượng. Nếu bạn sử dụng Factory để tạo các đối tượng thì sau này bạn có thể thay thế cách triển khai ban đầu của Sản phẩm hoặc lớp bằng cách triển khai hiệu suất cao và nâng cao hơn mà không có bất kỳ thay đổi nào trên lớp máy khách. Xem bài đăng của tôi về các mẫu Nhà máy để được giải thích chi tiết hơn và các lợi ích.


5. Mẫu thiết kế quan sát viên trong Java là gì
Mẫu thiết kế người quan sát dựa trên việc truyền đạt các thay đổi về trạng thái của một đối tượng cho người quan sát để họ có thể thực hiện hành động. Một ví dụ đơn giản là một hệ thống thời tiết trong đó những thay đổi về thời tiết phải được phản ánh trong Chế độ xem để hiển thị cho công chúng. Ở đây đối tượng thời tiết là Chủ thể trong khi các chế độ xem khác nhau là Người quan sát. Hãy xem bài viết này để biết ví dụ đầy đủ về mẫu Người quan sát trong Java.


6. Cho ví dụ về mẫu thiết kế trang trí trong Java? Nó hoạt động ở cấp độ đối tượng hay cấp độ lớp?
Mẫu trang trí nâng cao khả năng của từng đối tượng. Java IO sử dụng rộng rãi các mẫu trang trí và một ví dụ cổ điển là các lớp Buffered như BufferedReader và BufferedWriter giúp tăng cường các đối tượng Reader và Writer để thực hiện đọc và ghi ở mức Buffer để cải thiện hiệu suất. Đọc thêm về các mẫu thiết kế Decorator và Java


7. Mẫu thiết kế MVC là gì? Cho một ví dụ về mẫu thiết kế MVC?

8. Mẫu thiết kế FrontController trong Java là gì? Cho một ví dụ về mẫu điều khiển phía trước?

9. Mẫu thiết kế Chuỗi trách nhiệm là gì?

10. Mẫu thiết kế Adapter là gì? Cho ví dụ về các mẫu thiết kế bộ điều hợp trong Java?

Đây cũng là một bảng cheat mẫu thiết kế đẹp mà bạn có thể kiểm tra để trả lời hầu hết các câu hỏi về mẫu thiết kế này.

Những điều này còn lại cho bài tập của bạn, hãy thử tìm câu trả lời cho những câu hỏi về mẫu thiết kế này như một phần trong quá trình chuẩn bị của bạn.

Đây là một số câu hỏi về mẫu thiết kế mà tôi đã gặp trong hầu hết các cuộc phỏng vấn, còn nhiều câu hỏi khác nữa, đặc biệt là về thiết kế phần mềm, điều quan trọng trong các cuộc phỏng vấn của google và nhiều công ty khác như Amazon, Microsoft, v.v. Vui lòng chia sẻ nếu bạn gặp phải bất kỳ câu hỏi nào. câu hỏi thiết kế thú vị đáng để chia sẻ.