Có phải thực tế phỏng vấn xấu để các ứng cử viên viết một thực hiện danh sách liên kết? [đóng cửa]


43

Đọc trang web này và SO tôi đã thấy nhiều câu chuyện về câu hỏi và câu trả lời phỏng vấn nói rằng một ứng viên phải thực hiện một danh sách liên kết từ đầu. Thông thường đây là một bài tập "gimme" cho các ứng cử viên vai trò lập trình như viết FizzBuzz. Ý tưởng là nếu ứng viên không thể làm điều này, họ không thể lập trình và nên bị từ chối gần như ngay lập tức.

Tuy nhiên, tôi không thể không nghĩ rằng đây có thể là một thực tiễn kém vì những lý do sau:

  • Các ngôn ngữ cấp cao hiện đại hơn như C # và Python thường sử dụng danh sách rộng rãi; viết đối tượng danh sách liên kết của riêng bạn sẽ chỉ được yêu cầu trong các trường hợp bất thường và thậm chí sau đó có thể không được khuyến khích.
  • Các ngôn ngữ cấp thấp hơn như C ++ có các thư viện chuẩn với các trình lặp và danh sách các đối tượng.
  • Theo hai điểm đầu tiên, các lập trình viên có thể mất nhiều năm mà không cần suy nghĩ về việc thực hiện một danh sách (liên kết, liên kết đôi, v.v.). Một số thậm chí có thể không thực sự nhìn thấy những điều như vậy kể từ ngày học đại học.
  • Sức mạnh tính toán cũng không phải là yếu tố của nó cách đây nhiều năm, vì vậy hiệu quả thông qua con trỏ không phải là vấn đề trước đây (nói chung).
  • Một tìm kiếm trên web đơn giản về một cái gì đó như "ví dụ danh sách được liên kết" sẽ đưa ra rất nhiều ví dụ mã có thể được ghi nhớ và nhổ ra, không thực sự cho thấy năng lực thực sự của người nộp đơn.

Tôi nên nói rằng việc sử dụng một danh sách được liên kết để dẫn đến các câu hỏi / thảo luận mở về khả năng giải quyết vấn đề / tư duy phê phán của ứng viên hầu như có khả năng là một thực hành phỏng vấn thực sự tốt. Bất kỳ cách nào một người phỏng vấn thực sự có thể thấy người nộp đơn là như thế nào và họ nghĩ như thế nào là có lợi lớn.

Tôi nghĩ cách tiếp cận nhị phân này của "không có mã danh sách liên kết, không có công việc" đối với các lập trình viên làm việc trên máy tính để bàn hoặc ứng dụng web là một chút lỗi thời. Nó cũng có thể khá có hại; một ứng cử viên không thể nhớ làm thế nào để làm việc đúng với người đứng đầu danh sách có thể là một lập trình viên và đồng nghiệp xuất sắc và bị lạc trong hỗn hợp. Suy nghĩ?

EDIT : Có nhiều ý kiến ​​(tốt) cho thấy rằng đây là một câu hỏi tốt hay xấu để hỏi tùy thuộc vào bối cảnh của công việc. Tôi hoàn toàn đồng ý, vì vậy hãy để tôi viết lại câu hỏi này: Thực hiện danh sách liên kết là một câu hỏi phỏng vấn phổ biến cho một loạt các công việc mã hóa, tương tự như các câu hỏi như FizzBuzz hoặc viết hàm đệ quy để tính các yếu tố. Câu hỏi này có đủ tiện ích được sử dụng phổ biến để đánh giá các ứng cử viên lập trình trên bảng không? Hoặc nên xem xét một câu hỏi tồi để hỏi ngoại trừ vị trí "Nhóm nhà phát triển cao cấp, danh sách liên kết nhúng"?


11
Vị trí này là gì? Đây là loại công việc gì? Nó thuộc miền nào?
Thomas Owens

1
Tôi thấy các chỉnh sửa của bạn, nhưng vẫn còn - loại công việc này là gì? Đây có phải là một thực tập? Một công việc cấp nhập cảnh? Một công việc trung gian? Bạn đang muốn thuê một lập trình viên hoặc một kỹ sư hoặc một nhà khoa học? Tên miền này là gì? Họ có bao giờ ở trong một vị trí mà họ sẽ cần phải cuộn các thuật toán hoặc cấu trúc dữ liệu của riêng mình vì bất kỳ lý do gì không?
Thomas Owens

3
'C # (...) thực sự sử dụng danh sách rộng rãi' và 'hiệu quả thông qua con trỏ không phải là vấn đề mà nó từng là': bạn có biết rằng những danh sách gốc này không phải là danh sách được liên kết mà là danh sách dựa trên mảng? Mảng có xu hướng hoạt động tốt hơn vì bộ nhớ đệm. Trên thực tế, IIRC, .NET framework thậm chí không có danh sách liên kết cho đến 2.0. Tôi khá chắc chắn rằng phần lớn các chương trình C # ngoài kia không sử dụng danh sách được liên kết.
Alex ten Brink

1
@AlextenBrink Thật thú vị, tôi nghĩ điều đó có nghĩa là kiến ​​thức danh sách được liên kết thậm chí còn ít quan trọng hơn đối với C #. Tại sao phải tự thực hiện cấu trúc dữ liệu (với các lỗi có thể xảy ra) khi tôi có thể sử dụng cấu trúc tốt hơn được tích hợp ngay vào ngôn ngữ?
joshin4colours

Câu hỏi tôi có trong đầu là 'tại sao thậm chí cân nhắc sử dụng cấu trúc dữ liệu trong tất cả các trường hợp kém hơn cấu trúc dữ liệu khác'? Danh sách liên kết chậm hơn đối với hầu hết các hoạt động so với danh sách dựa trên mảng; điều duy nhất các danh sách được liên kết là tốt để xóa trong thời gian liên tục, nhưng có rất ít tình huống cần thiết. Lưu ý rằng tôi không nói về việc liệu đây có phải là cấu trúc dữ liệu tốt cho câu hỏi phỏng vấn hay không: các khái niệm liên quan có thể là một bài kiểm tra tốt, tôi không biết.
Alex ten Brink

Câu trả lời:


52

Nếu trả lời câu hỏi cho bạn biết những gì bạn muốn biết về một ứng viên, thì đó là một câu hỏi phỏng vấn tốt. Nếu nó không nói với bạn điều đó, thì đó là một câu hỏi tồi.

Các câu hỏi dễ như FizzBuzz phục vụ một mục đích cụ thể. Nếu một ứng viên không thể mã hóa FizzBuzz, họ chỉ đơn giản là không thể mã hóa và bạn có thể kết thúc cuộc phỏng vấn sớm. Tôi đánh giá việc thực hiện một danh sách được liên kết chỉ khó hơn một chút, nhưng nó có thể bắt đầu một cuộc trò chuyện về cấu trúc dữ liệu nói chung sẽ tiết lộ rất nhiều.

Chỉ cần nhớ rằng không có câu hỏi phỏng vấn duy nhất sẽ cho bạn biết tất cả mọi thứ bạn muốn biết. Bạn thực sự cần phải có một nhóm các câu hỏi sẵn sàng. Bạn nên đặt câu hỏi theo trình tự từ dễ nhất đến khó nhất để bạn có thể tìm thấy giới hạn của những gì ứng viên biết. Nếu bạn hỏi một câu hỏi và họ đóng đinh nó, bạn vẫn không biết những gì họ làm hoặc không biết.


Về chỉnh sửa của bạn:

Câu hỏi này có đủ tiện ích được sử dụng phổ biến để đánh giá các ứng cử viên lập trình trên bảng không? Hoặc nên xem xét một câu hỏi tồi để hỏi ngoại trừ vị trí "Nhóm nhà phát triển cao cấp, danh sách liên kết nhúng"?

Tôi nghĩ rằng đây là một câu hỏi mục đích chung tốt có thể được sử dụng để đánh giá thực tế bất kỳ ứng cử viên lập trình nào. Nó chỉ cần là một phần của một nhóm câu hỏi lớn hơn. Nó sẽ là một công cụ phá băng tốt cho nhiều loại vị trí (ngay cả khi ứng viên không thể thực hiện danh sách được liên kết từ đầu, có thể họ có thể giải thích cách họ đã sử dụng một vị trí trước đó và chức năng chính là gì) hoặc bắt đầu một chuỗi dài các câu hỏi nâng cao hơn cho vị trí "Nhóm nhà phát triển cao cấp, danh sách liên kết nhúng".


19
Đoạn đầu tiên của bạn là một nửa câu chuyện. Nửa còn lại là: Nếu được hỏi câu hỏi khiến ứng viên muốn làm việc cho bạn, thì đó là một câu hỏi phỏng vấn tốt. Nếu nó làm cho ứng viên không muốn làm việc cho bạn, đó là một câu hỏi tồi.
ruakh

5
Bạn không thể tìm thấy giới hạn của những gì ứng viên biết theo cách đó, bởi vì bạn không có cách nào để khẳng định rằng những gì bạn cho là "phức tạp" và "cơ bản" áp dụng theo cùng một thứ tự cho ứng viên của bạn. LinkedList có lẽ là một cơ bản cho một lập trình viên giảng dạy đại học, nhưng một lập trình viên tự học rất có thể không bao giờ phải viết một. Sau tất cả, anh ta có lẽ đã viết "LinkedList <string> ..." bất cứ khi nào anh ta cần. Điều đó có nghĩa là kiến ​​thức của anh ấy được chốt dưới mức "LinkedList"? Anh ta có thể là một chuyên gia trong các môn học phức tạp hơn và có thể học LL trong 5 phút tại Google.
Sylverdrag

1
@Sylverdrag Đó là lý do tại sao tôi nói bạn cần nhiều hơn một câu hỏi. Khi bạn tìm thấy giới hạn kiến ​​thức của họ về danh sách được liên kết, hãy chuyển sang chủ đề khác.
Bill Lizard

@ruakh Điều đó chắc chắn đóng một phần. Nếu mỗi câu hỏi tôi được hỏi trong một cuộc phỏng vấn là về các khía cạnh trần tục của các ứng dụng CRUD (nghĩa là tôi không nghĩ rằng tôi có thể học được bất cứ điều gì mới ở công ty đó), thì nó sẽ không kích thích tôi làm việc ở đó.
Bill Lizard

34

Tôi đã bỏ lỡ các công việc hoàn toàn vì tâm trí tôi trống rỗng về những câu đố đơn giản như thế này. Tôi cũng đã hoàn thành xuất sắc các câu đố như vậy trong các cuộc phỏng vấn khác - Tôi biết cách thực hiện một danh sách được liên kết trong một môi trường không áp lực. Tôi chưa bao giờ phàn nàn về khả năng của mình từ người mà tôi đã làm việc cùng, vì vậy có lẽ tôi không nên nghĩ rằng tôi đã bỏ lỡ công việc, tôi nên nghĩ rằng họ đã bỏ lỡ tôi.

Vì vậy, vâng, tôi nghĩ rằng đó là một thực tiễn đáng nghi ngờ nhất, nhưng tôi hiểu nó. Tôi cũng đã xem xét khả năng đó không phải là lỗi của câu hỏi mà là người hỏi, vì đã biến nó thành một tình huống áp lực cao.

Cá nhân, tôi thích hỏi những câu hỏi mở về một vấn đề mà ứng viên đã giải quyết - gần đây, nếu có thể, và bao gồm cả các vấn đề về mã hóa và quy trình. Nếu họ có thể mang mẫu mã, tuyệt vời.


Họ cần phải hỏi một cái gì đó, có thể là câu đố hoặc bất cứ điều gì khác. Bất kỳ câu hỏi có thể làm cho người để trống.

2
@pdr - "Nếu họ có thể mang mẫu mã, thật tuyệt vời." Nếu họ viết các mẫu mã họ mang theo, vô giá.
robrambusch

4
Nếu tâm trí của ai đó trống rỗng trong việc thực hiện danh sách được liên kết và họ không thể giải quyết nó với một chút gợi ý hoặc dễ dàng nản lòng, tôi nghĩ đó sẽ là người mà tôi sẽ không bỏ lỡ.
Bill K

1
@pdr - "Và nếu bạn không thể, bạn nghĩ bạn sẽ có công việc trong bao lâu?" - Miễn là phải sa thải họ dưới bất kỳ chế độ nhân sự nào mà bạn phải chịu đựng. Sau đó, có thêm chi phí để khởi động lại tìm kiếm ứng cử viên của bạn. Ngoài ra, chi phí cơ hội vốn có trong thực tế là người tiếp theo bạn đã phỏng vấn có thể đã trở thành nhân viên kỹ thuật của toàn bộ bộ phận của bạn. Nhưng tất nhiên bây giờ họ không có mặt vì bạn đã thuê nhầm người và họ đã tìm được một công việc khác.
robrambusch

1
@robrambusch: Anh ấy thể hiện kỹ năng giải quyết vấn đề tuyệt vời và nói tốt về cấu trúc lớp học. Nhưng anh không viết mã. Về vấn đề viết mã trong một cuộc phỏng vấn, vâng, điều đó có thể hữu ích, nhưng tôi duy trì rằng tôi có thể tìm hiểu thêm về bạn trong một giờ nói chuyện với bạn về các vấn đề bạn đã giải quyết hơn là đưa ra một vấn đề khó khăn duy nhất gây ra Giờ để giải quyết.
pdr

25

Người ta phải xác định loại công việc lập trình. Nếu bạn đang kinh doanh trong việc phát triển các trình biên dịch và thuật toán, các câu hỏi về những điều đó nên được mong đợi. Nếu bạn đang ở trong các ứng dụng loại kinh doanh và bạn mong muốn ứng viên thực hiện các ứng dụng CRUD, thì, có thể kiến ​​thức về khái niệm này (không cần viết chương trình) là đủ. Ngày nay, kiến ​​thức về các công nghệ khác nhau cần có để hoàn thành công việc đặc biệt trong loại ứng dụng LOB thay thế cho nhu cầu về các thuật toán gọn gàng.


Chính xác. Năm ngoái tôi đã viết một thành phần sắp xếp di truyền có mục đích chung, cũng sử dụng một chút ủ mô phỏng (để tạo lịch trình lớp học) và sử dụng một số cấu trúc dữ liệu "nâng cao" để thực hiện. Tôi không cần mã một. Nếu khung .Net không có những gì tôi cần, tôi đã sử dụng Bộ sưu tập Power hoặc C5.
ElGringoGrande

4
Đồng ý, tôi viết các ứng dụng LOB cả ngày, trước đây tôi có các triển khai danh sách liên kết bằng văn bản ... ở trường đại học ... trong COBOL. Tôi có thể làm lại, nhưng tại sao? Rất nhiều nhà phát triển LOB có năng lực có lẽ chưa bao giờ viết, và sẽ không bao giờ cần.
CaffGeek

1
Đồng ý nói chung, nhưng một danh sách liên kết là không có gì kỳ lạ, thực sự. Đó là những điều cơ bản, chỉ một cấp độ qua FizzBuzz.
Francesco De Vittori

1
@FrancescoDeVittori: Đôi khi đó không phải là vấn đề? Ai đó cho bạn một vấn đề để giải quyết. Điều đó có vẻ đơn giản, nhưng bạn chưa bao giờ thực hiện nó trước đây, vì vậy bộ não của bạn bắt đầu chạy đua, cố gắng tìm kiếm các vấn đề, điều sẽ khiến bạn phải trả giá cho cuộc phỏng vấn nếu bạn không nghĩ về nó. Và nó không có ở đó, nhưng điều đó làm bạn mất tập trung vào việc giải quyết vấn đề thực tế.
pdr

@FrancescoDeVittori: Bạn có thể đưa ra một vài ví dụ về các câu hỏi phỏng vấn không cơ bản không? Tôi cần điều này để tự cải thiện. Cảm ơn.
Den

9

Câu trả lời của tôi là "Nó phụ thuộc". Tôi sẽ hỏi câu hỏi này nếu một ứng viên đã liệt kê C hoặc C ++ trong hồ sơ của mình. Yêu cầu thực hiện một danh sách được liên kết là một thử nghiệm tốt cho sự hiểu biết về con trỏ, điều này hoàn toàn cần thiết cho một lập trình viên C hoặc C ++.

Mặt khác, nếu một ứng viên không yêu cầu biết C hoặc C ++, tôi sẽ không yêu cầu anh ta thực hiện một danh sách liên kết, nhưng tôi sẽ xem xét đặt câu hỏi về nó. Giải thích ở mức cao làm thế nào một danh sách liên kết hoạt động. Sự phức tạp của việc thêm một yếu tố vào đầu danh sách là gì? Đuôi của danh sách? Chèn một phần tử vào giữa danh sách? Khi nào bạn sẽ sử dụng một danh sách trái ngược với một mảng? Đây là những khái niệm cấu trúc dữ liệu cơ bản mà IMHO, mọi lập trình viên nên biết.


7

Tôi sẽ không coi đó là một câu hỏi phỏng vấn xấu. Rất nhiều sự hiểu biết về cấu trúc dữ liệu và lập trình bắt đầu với sự hiểu biết thực sự tốt về Danh sách liên kết. Điều đó nói rằng, có một số hãy cẩn thận:

1) Đây là một câu hỏi loại fizz-buzz. Bạn chỉ đang xác nhận một cái gì đó rất cơ bản: Người đó có hiểu danh sách liên kết không. Hỏi nó và đi tiếp.

2) Có một thách thức với các danh sách được liên kết là các ngôn ngữ rất phù hợp để thể hiện sự hiểu biết của bạn về các khái niệm danh sách liên kết (ví dụ: C) có thể không giống với ngôn ngữ mà chúng sẽ làm việc trong công việc. Dĩ nhiên, bạn có thể thể hiện sự hiểu biết cơ bản bằng bất kỳ ngôn ngữ nào với các cấu trúc, nhưng yêu cầu ứng viên thực hiện lại danh sách được liên kết trong Erlang mà không sử dụng [] không phải là một thách thức tương tự và sẽ không cho bạn biết điều tương tự về cách hiểu của ứng viên như yêu cầu họ làm điều đó trong C. Yêu cầu họ làm điều đó trong C nếu công việc xung quanh Java cũng thiếu điểm nào đó.

3) Với suy nghĩ đó và những thách thức chung của "lập trình bảng trắng", khi hỏi loại câu hỏi này, tôi chấp nhận mã giả hoặc sơ đồ miễn là chúng thể hiện sự hiểu biết về các nguyên tắc cốt lõi. Tôi không yêu cầu mọi người viết mã trên bảng trắng hoàn hảo về mặt cú pháp và logic, đặc biệt là nếu sau đó họ có thể quay lại và xác định bất kỳ vấn đề logic nào khi được yêu cầu xem lại. YMMV.


6

Khi tôi trả lời phỏng vấn, tôi thường được yêu cầu triển khai danh sách liên kết và một số thuật toán tập trung vào danh sách liên kết. Tôi đã giải quyết hầu hết trong số họ, và một số trong số họ yêu cầu tôi tập thể dục thần kinh một chút.

Nếu tôi đã từng tham gia một cuộc phỏng vấn, tôi sẽ thực hiện một số cách thực hiện danh sách liên kết, không phải để kiểm tra mức độ tốt của một người trong việc mã hóa, mà là kiểm tra xem một người chú ý đến chi tiết như thế nào. Bất cứ ai cũng có thể viết một danh sách liên kết, nhưng đó là trường hợp ranh giới mà ngay cả một số lập trình viên giỏi cũng thất bại. Đừng hỏi anh ấy : Write a code for linked list in C/C++. Yêu cầu anh ta viết một danh sách liên kết chung trong C (không phải C ++), v.v.

Xoay vấn đề và đưa một số điều kiện khác vào danh sách được liên kết và bạn sẽ có một câu hỏi hay để hỏi. Một số người bị ràng buộc để phạm sai lầm sau đó.


2
Không có thứ gọi là danh sách liên kết chung trong C.
DeadMG

1
Nghiêm túc? Tôi nghĩ rằng voidcon trỏ chỉ dành cho điều đó ... :) Liên kết đầu tiên tôi tìm thấy trên google cho "danh sách liên kết chung trong c" là: daniweb.com/software-development/c/threads/109260 và một liên kết khác là phỏng vấn kỹ thuật .com / ... tôi nghĩ tất cả mọi người biết điều này!
c0da

Tôi chưa kiểm tra các mã này, nhưng tôi có loại danh sách được liên kết này trước đó và chắc chắn nó hoạt động tốt ...
c0da

Ngay cả việc viết một danh sách được liên kết chung trong C # cũng có một hoặc hai "gotchas" (ví dụ: so sánh các phần tử của loại T là không rõ ràng; tức là (T v1, T v2) => {return v1 == v2;} sẽ không biên dịch trừ khi bạn có các ràng buộc lớp hoặc sử dụng toán tử đẳng thức mặc định)
Steven Evers

@ c0da Theo tôi, một danh sách sử dụng voidcon trỏ không chung chung, mà chỉ chung chung cho bất kỳ lúc nào. Họ có thể giữ bất kỳ loại thứ nào trong đó, và thậm chí trộn lẫn tất cả những gì họ muốn - và chính xác điều đó làm cho nó không chung chung đối với tôi. Nó giống như sử dụng loại cơ sở objecttrong các ngôn ngữ hướng đối tượng,
chọc

5

Trong khoảng 10 năm cho đến nay lập trình chuyên nghiệp (và khoảng mười năm nữa như một sở thích), tôi không nghĩ rằng mình đã bao giờ cần phải thực hiện một danh sách liên kết. Nếu ai đó yêu cầu tôi làm điều đó trong một cuộc phỏng vấn, tôi có thể phản bác bằng cách hỏi liệu đó có phải là điều tôi sẽ làm thường xuyên trong công việc không.

Chắc chắn, gần như chắc chắn có những công việc ngoài kia, nơi bạn sẽ cần phải viết các triển khai phòng sạch hơn hoặc ít hơn của các thuật toán thường được biết đến - như thực hiện một danh sách được liên kết từ đầu. Nhưng đối với hầu hết các công việc lập trình, nó có giá trị cụ thể nào đối với công ty mà ứng viên có thể làm trong một cuộc phỏng vấn? Có thực sự quan trọng đến mức trong một cài đặt như vậy mà ứng viên cung cấp một triển khai hoàn hảo xử lý các trường hợp cạnh chính xác, báo cáo các lỗi theo thông lệ chung trong ngôn ngữ hoặc khung, v.v. Hoặc bạn có thể bỏ qua điều đó và thay vào đó tập trung vào cách họ thực sự tiếp cận một vấn đề mà có lẽ họ đã không phải đối mặt trong 10-20 năm?

Khi tôi phỏng vấn cho công việc hiện tại của mình, tôi có rất ít kinh nghiệm với công nghệ được sử dụng tại công ty. Bây giờ, vài năm sau, tôi thường xuyên có các đồng nghiệp đến gặp tôi và đặt câu hỏi không chỉ về sản phẩm, việc thực hiện chúng và các tiêu chuẩn do họ thực hiện mà còn về các vấn đề lập trình chung hơn nhiều (chỉ mới hôm qua tôi đã được hỏi các hàm ý của một phụ thuộc vòng tròn trong một ràng buộc mặc định trong SQL Server trong ngữ cảnh của một bảng cụ thể và cách sử dụng nó trong trường hợp của chúng tôi - lý do thông qua nó, hóa ra là không có hàm ý nào trong trường hợp cụ thể đó). Tôi cũng không cần một triển khai danh sách liên kết hoàn toàn mới cho việc đó.

Đặt câu hỏi phù hợp với công việc mà ứng viên có khả năng được chỉ địnhvà cố gắng có được một ý tưởng về cách họ cảm nhận về việc tiếp thu kiến ​​thức mới. Làm thế nào họ đi về việc tìm ra ý nghĩa của một số cú pháp tối nghĩa mà họ chưa từng thấy? (Ví dụ: nếu bạn là một cửa hàng C, thì bạn có thể thử một câu hỏi liên quan đến các bài viết.) Đối với vị trí lập trình, họ có thường xuyên đọc hoặc đóng góp cho các diễn đàn như Stack Overflow không? Nếu họ được yêu cầu thực hiện một số tác vụ bằng ngôn ngữ lập trình hoặc khung mà họ có ít hoặc không có kinh nghiệm với (giả sử, nếu bạn chủ yếu là một cửa hàng Java, thì còn Clojure hoặc .NET thì sao?), Vậy họ sẽ tiếp cận vấn đề như thế nào? Có thể lấy một lỗi thực sự ra khỏi trình theo dõi lỗi của bạn (thậm chí có thể là một lỗi đã được giải quyết từ lâu) và hỏi họ về cách nói chung họ sẽ tiếp cận giải quyết nó như thế nào và sẵn sàng giải thích các phần có liên quan của sản phẩm.

Nếu ứng viên có thể xử lý các loại vấn đề liên quan đến tình huống kinh doanh và có thái độ tốt đối với việc học những điều mới, thì đó có lẽ là một chỉ số phù hợp hơn cho vị trí cụ thể đó hơn là có thể đưa ra câu trả lời đóng hộp cho các câu hỏi nổi tiếng, cho dù đó là câu hỏi là về FizzBuzz, danh sách được liên kết hoặc một cái gì đó khác. Ném vào việc ứng viên phù hợp với đội như thế nào và tôi sẽ nghĩ rằng bạn đang ở trên mặt đất khá an toàn.


4

Tất nhiên hầu hết mọi người sẽ không bao giờ cần phải thực hiện một danh sách được liên kết, nhưng để thực hiện chúng từ đầu, có lẽ họ sẽ cần phải xử lý con trỏ một cách chính xác. Sau đó, họ nghĩ rằng việc hình thành một mô hình tinh thần nhất quán cho con trỏ tương quan với trình độ ngôn ngữ, hiểu những gì xảy ra ở cấp độ máy (trừu tượng) và khả năng trừu tượng nói chung.

Tôi không nói rằng đây nhất thiết phải là biện pháp tốt nhất, nhưng chỉ có điều có một số mối tương quan.


4

Bạn bắt đầu nói rằng họ là những câu hỏi 'gimme', nhưng sau đó bạn chỉ ra rằng mọi người sẽ không thể làm được chúng một cách dễ hiểu. Tôi bối rối.

Đây là cách tôi nghĩ về nó:

  • Như bạn nói, hiếm khi cần phải viết một cái, vì vậy mọi người sẽ dễ dàng quên đi.
  • Chúng không khó viết lắm.
  • Các khái niệm được sử dụng để viết chúng có thể được coi là cơ bản.
  • Chúng được sử dụng cực kỳ thường xuyên (ngay cả khi bạn không biết về nó).

Tôi nghĩ rằng điều đó làm cho họ những câu hỏi hay để hỏi. Nếu bạn lo lắng về việc họ học trước cuộc phỏng vấn, hãy đưa vào danh sách. Yêu cầu họ viết thông tư và hỏi thời gian chạy tiệm cận của việc thực hiện là gì. Hoặc có họ viết một cấu trúc dữ liệu phổ biến và / hoặc nhanh chóng khác ... Một cây tìm kiếm nhị phân? Một hàng đợi (FIFO)? Một ngăn xếp (FILO)? Một O(n)hàng đợi ưu tiên ngây thơ ( )? Nhiều người tôi biết nghĩ rằng BST O(log n) chỉ vì nó là một cái cây .

Nếu bạn đang tìm kiếm một ai đó sẽ được làm việc tại các kim loại, và cần có một rất nền tảng vững chắc trong cấu trúc dữ liệu ... những thậm chí có thể xa quá tầm thường đối với các ứng viên bạn đang tìm kiếm để thuê.

Tất nhiên, điều này giả định rằng bạn muốn một nhà phát triển có những điều cơ bản / cơ bản về cấu trúc dữ liệu và vị trí của họ sẽ được hưởng lợi từ những nguyên tắc cơ bản đó. Nếu bạn muốn ai đó có thể kết hợp một trang asp trong vài giây, hãy phỏng vấn cho điều đó. Vấn đề không phải là chọn một câu hỏi phỏng vấn bởi vì những người khác làm, mà là chọn một câu hỏi đo lường các kỹ năng bạn đang tìm kiếm. Cá nhân, tôi nghĩ rằng các câu hỏi về cấu trúc dữ liệu là tốt, danh sách liên kết hoặc không.


Nó không khó hiểu trong thực tế. FizzBuzz là một câu hỏi thậm chí còn dễ dàng hơn và những người đăng ký thường không thể bắt đầu trả lời nó. Tương tự với danh sách liên kết. Đó là một bí ẩn của thế giới lập trình.
joshin4colours

@ joshin4colours: Không, tôi bối rối về câu hỏi. Lúc đầu, OP nói rằng các câu hỏi LL là của gimme, nhưng sau đó tiếp tục liệt kê các điểm về lý do tại sao một nhà phát triển đủ điều kiện sẽ không trả lời câu hỏi.
Steven Evers

3

Câu hỏi này có đủ tiện ích được sử dụng phổ biến để đánh giá các ứng cử viên lập trình trên bảng không?

Không, hoàn toàn không. Tùy thuộc vào cách nó diễn đạt, những gì nó sẽ cho bạn biết từ "ứng cử viên này biết cách thiết kế danh sách được liên kết" đến "ứng viên này có thể lập trình danh sách được liên kết theo ngôn ngữ X". Nếu bạn yêu cầu mã giả, nó sẽ có xu hướng nhiều hơn về đầu tiên. Nếu bạn yêu cầu triển khai bằng một ngôn ngữ cụ thể, bạn sẽ hiểu rõ hơn về ngôn ngữ của họ (đặc biệt là với C và C ++, nơi bạn có thể xử lý các con trỏ và các tham chiếu và cấu trúc).

Tôi thậm chí còn đi xa hơn để nói rằng không thể đánh giá tất cả các ứng viên sử dụng cùng một câu hỏi. Bạn cần điều chỉnh các câu hỏi phỏng vấn của bạn để đánh giá các kỹ năng mà bạn đang tìm kiếm ở vị trí này.

Nếu người đó sẽ ở trong một vị trí để viết mã, tôi sẽ nghĩ đến việc bao gồm một câu hỏi về thuật toán và / hoặc cấu trúc dữ liệu, miễn là nó có liên quan đến vị trí đó. Tôi sẽ cố gắng chọn một cái gì đó có thể đã được thảo luận hoặc sử dụng trước đây. Tôi cũng tập trung vào những thứ khác ngoài việc triển khai các thuật toán và cấu trúc dữ liệu đã nói, như thời gian chạy và mức tiêu thụ bộ nhớ (những thứ như ký hiệu big-O). Các khái niệm này có liên quan đến việc không chỉ tạo ra cấu trúc dữ liệu mà còn chọn cách triển khai nào phù hợp nhất (chẳng hạn như ArrayListso với LinkedListví dụ).


3

Tôi không nghĩ rằng đối với một công việc lập trình thông thường nên là một câu hỏi loại bỏ một ứng cử viên. Nhưng đó là một điều tốt để xem nếu bạn đang làm việc với một lập trình viên thực sự cao cấp hoặc một người nào đó chỉ là hình thức mã hóa khỉ trong nhiều năm. Và ngay cả như vậy, nó không nên là một tiêu chí cơ bản để chọn một lập trình viên. Có thể là một lập trình viên tuyệt vời với bộ nhớ kém và đã không đọc các từ "danh sách được liên kết" trong nhiều năm (hoặc không nhớ tên) nhưng vẫn có thể làm các ứng dụng tốt.

Vì vậy, như một số người đã nói, nếu sẽ là một công việc cần phải làm việc với danh sách được liên kết và rất nhiều thuật toán ưa thích, vv .. thì ok. Là nếu đối với dữ liệu đầu vào thông thường trên một biểu mẫu, xác thực và hiển thị là vô ích và không công bằng.


2

Tôi nghĩ rằng đây là một ví dụ tồi cho một câu hỏi phỏng vấn, nhưng vì một lý do khác. Một danh sách liên kết là một khái niệm đơn giản đến mức phải biết nó là gì để biết cách thực hiện nó. Nếu người đó không biết danh sách được liên kết là gì, thì bạn phải giải thích cách thức hoạt động của nó và khi làm như vậy bạn sẽ đưa ra câu trả lời mà không khám phá bất cứ điều gì về việc họ có biết cách giải quyết vấn đề hay không . Vì vậy, câu hỏi có thể rút gọn thành "bạn đã biết danh sách được liên kết là gì và nó hoạt động như thế nào chưa?", Điều này cho bạn biết không có gì hữu ích về sự phù hợp của họ với tư cách là một lập trình viên.


2
Những câu hỏi phổ biến cũng là đối tượng để chơi game bởi những người giỏi ghi nhớ.
Paul Nathan

1
Nếu bạn phải giải thích làm thế nào một danh sách được liên kết hoạt động với một ứng cử viên, thì có lẽ bạn không nên thuê anh ta làm lập trình ...
Dima

2

Viết một triển khai danh sách liên kết là một câu hỏi phỏng vấn tốt, bởi vì nó sẽ tiết lộ rất nhiều về cách mã hóa của ứng viên:

  • Anh ta có biết API là gì không? Anh ta có thể sử dụng mã của người khác không? Anh ta có thể viết mã để người khác có thể sử dụng nó không?

  • Anh ấy có biết Danh sách liên kết là gì không? Anh ấy có biết Bộ sưu tập, Cấu trúc dữ liệu, Thuật toán không?

Nếu anh ta thậm chí không biết Danh sách liên kết nên cung cấp phương pháp nào, bạn có thể biết anh ta có thể không bao giờ sử dụng phương pháp nào hoặc biết khi nào nên sử dụng phương pháp đó.

  • Làm thế nào để anh ấy xử lý vấn đề? Có phải anh ấy bắt đầu với một phân tích đầu tiên, một đặc điểm kỹ thuật nhỏ, một số thử nghiệm trước? Hay anh ta chỉ bắt đầu hack đi một cách hạnh phúc?

  • Liệu anh ta xử lý các trường hợp cạnh? Điều gì về việc loại bỏ nút cuối cùng khỏi Danh sách liên kết? Điều gì xảy ra nếu ai đó cố gắng thêm một tham chiếu đến chính danh sách được liên kết vào danh sách được liên kết, và sau đó xóa toàn bộ?

  • Anh ấy có xử lý ngoại lệ không? Mỗi ngôn ngữ lập trình có các quy ước riêng để xử lý các trường hợp ngoại lệ: trong Java, bạn sẽ mong đợi LinkedList sẽ ném NoSuchEuityException khi bạn thực hiện getFirst () vào danh sách trống. Các ngôn ngữ khác có thể trả về không xác định, -1 hoặc hằng số.


Trong một bài tập mã hóa phỏng vấn, trừ khi nó được yêu cầu cụ thể, tôi sẽ bỏ qua tất cả các loại xử lý trường hợp cạnh, xử lý lỗi, v.v., ngoài những gì cần thiết cho một bằng chứng về khái niệm. NHƯNG tôi cũng sẽ nói rõ rằng đó là một lựa chọn mà tôi đang thực hiện. Các ràng buộc trong một cuộc phỏng vấn một giờ hoặc thậm chí vài giờ rất khác với tình huống khi bạn đang thực sự làm việc gì đó sẽ thấy sử dụng thực sự.
một CVn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.