Czy źle jest przeprowadzać rozmowy kwalifikacyjne, aby kandydaci napisali implementację listy powiązanej? [Zamknięte]

43

Czytając tę ​​stronę i SO, widziałem wiele historii pytań i odpowiedzi na rozmowy kwalifikacyjne, które mówiły, że kandydat musiał zaimplementować listę od podstaw. Zwykle jest to ćwiczenie „gimme” do programowania kandydatów na role, takich jak pisanie FizzBuzz. Chodzi o to, że jeśli kandydat nie może tego zrobić, nie może zaprogramować i powinien zostać odrzucony niemal natychmiast.

Nie mogę jednak nie myśleć, że może to być kiepska praktyka z następujących powodów:

  • Nowoczesne języki wyższego poziomu, takie jak C # i Python, natywnie intensywnie używają list; napisanie własnego obiektu listy połączonej byłoby wymagane tylko w nietypowych okolicznościach, a nawet wtedy prawdopodobnie nie jest zalecane.
  • Języki niższego poziomu, takie jak C ++, mają standardowe biblioteki z iteratorami / kontenerami list i obiektami.
  • W świetle pierwszych dwóch punktów, koderzy mogą latami nawet nie myśleć o implementacji listy (połączonej, podwójnie powiązanej itp.). Niektórzy mogą nawet nie widzieć takich rzeczy od czasów studenckich.
  • Moc obliczeniowa również nie jest tak ważna jak przed laty, więc wydajność za pomocą wskaźników nie jest już takim problemem (jak zwykle).
  • Proste wyszukiwanie w Internecie czegoś w rodzaju „przykładowej listy łączonej” przyniosłoby wiele przykładów kodu, które można po prostu zapamiętać i wypluć z powrotem, nie tak naprawdę wskazując na prawdziwe kompetencje wnioskodawcy.

Powinienem powiedzieć, że korzystanie z połączonej listy do prowadzenia otwartych pytań / dyskusji na temat rozwiązywania problemów przez kandydatów / umiejętności krytycznego myślenia jest zazwyczaj bardzo dobrą praktyką podczas rozmowy kwalifikacyjnej. W jakikolwiek sposób ankieter może naprawdę zobaczyć, jaki jest wnioskodawca i jak jego zdaniem jest niezwykle korzystny.

Myślę, że to binarne podejście „brak połączonego kodu listy, brak pracy” dla programistów pracujących na komputerze lub aplikacji internetowej jest nieco przestarzałe. Może to być również bardzo szkodliwe; kandydat, który nie pamięta, jak prawidłowo pracować z szefem listy, może być doskonałym koderem i współpracownikiem i zagubić się w miksie. Myśli?

EDYCJA : Istnieje wiele (dobrych) komentarzy sugerujących, że pytanie, czy jest to dobre, czy złe pytanie, zależy od kontekstu pracy. Zdecydowanie się zgadzam, więc pozwól mi przeformułować to pytanie: Wdrażanie listy połączonej jest częstym pytaniem podczas wywiadu dla szerokiego zakresu zadań kodowania, podobnych do pytań takich jak FizzBuzz lub pisanie funkcji rekurencyjnej do obliczania silni. Czy to pytanie ma wystarczającą użyteczność, aby być powszechnie używanym do oceny kandydatów na programistów na całym forum? A może należy rozważyć złe pytanie, z wyjątkiem stanowisk „Starszy programista, Zespół list osadzonych”?

joshin4colours
źródło
11
Do czego to służy? Jaki to rodzaj pracy? W jakiej to jest domenie?
Thomas Owens
1
Widzę twoje zmiany, ale nadal - jaki to rodzaj pracy? Czy to staż? Praca na poziomie podstawowym? Praca pośrednia? Czy chcesz zatrudnić programistę, inżyniera lub naukowca? W której to jest domenie? Czy kiedykolwiek byliby w takiej pozycji, że z jakiegokolwiek powodu musieliby opracowywać własne algorytmy lub struktury danych?
Thomas Owens
3
„C # (...) natywnie intensywnie korzysta z list” i „wydajność za pomocą wskaźników nie jest już tym problemem”: czy wiesz, że te natywne listy nie są listami połączonymi, ale listami opartymi na tablicach? Tablice zwykle działają lepiej z powodu buforowania. W rzeczywistości IIRC .NET Framework nie miał nawet połączonych list do 2.0. Jestem prawie pewien, że większość programów w C # nie używa połączonych list.
Alex ten Brink
1
@AlextenBrink Co ciekawe, myślę, że to oznacza, że ​​znajomość listy połączonej jest jeszcze mniej ważna dla C #. Po co samodzielnie wdrażać strukturę danych (z możliwymi błędami), skoro mogę użyć lepszej struktury wbudowanej w język?
joshin4colours
Pytanie, które mam na myśli, brzmi: „dlaczego w ogóle rozważać użycie struktury danych, która jest prawie we wszystkich przypadkach gorsza od innej struktury danych”? Lista połączona jest wolniejsza dla większości operacji niż listy oparte na tablicach; jedyną rzeczą, z którą połączone listy są dobre, jest usuwanie w stałym czasie, ale jest bardzo niewiele sytuacji, w których jest to potrzebne. Zauważ, że nie mówię o tym, czy byłaby to dobra struktura danych na pytanie do wywiadu: związane z tym koncepcje mogą być dobrym testem, nie wiem.
Alex ten Brink

Odpowiedzi:

52

Jeśli odpowiedź na pytanie mówi ci, co chcesz wiedzieć o kandydacie, to jest to dobre pytanie do rozmowy kwalifikacyjnej. Jeśli to ci nie mówi, to złe pytanie.

Proste pytania, takie jak FizzBuzz, służą konkretnemu celowi. Jeśli kandydat nie potrafi kodować FizzBuzz, po prostu nie może kodować i możesz wcześniej zakończyć rozmowę kwalifikacyjną. Oceniam implementację połączonej listy tylko nieco trudniej, ale może ona rozpocząć rozmowę o strukturach danych w ogóle, która ujawni wiele.

Pamiętaj tylko, że żadne pytanie z wywiadu nie powie Ci wszystkiego, co chcesz wiedzieć. Naprawdę musisz mieć gotową grupę pytań. Powinieneś zadawać pytania w kolejności od najłatwiejszej do najtrudniejszej, aby znaleźć granicę tego, co wie kandydat. Jeśli zadajesz jedno pytanie, a oni go zadają, nadal nie wiesz, co jeszcze robią lub nie wiedzą.


Jeśli chodzi o twoją edycję:

Czy to pytanie ma wystarczającą użyteczność, aby być powszechnie używanym do oceny kandydatów na programistów na całym forum? A może należy rozważyć złe pytanie, z wyjątkiem stanowisk „Starszy programista, Zespół list osadzonych”?

Myślę, że jest to dobre pytanie ogólnego przeznaczenia, które można wykorzystać do oceny praktycznie każdego kandydata na programistę. Musi być tylko częścią większej grupy pytań. Byłby to dobry sposób na przełamanie lodów dla wielu rodzajów pozycji (nawet jeśli kandydat nie może zaimplementować od podstaw listy połączonej, być może może wyjaśnić, w jaki sposób używał jej wcześniej i jakie są kluczowe funkcje), lub na początku długa sekwencja bardziej zaawansowanych pytań na stanowisko „Senior Developer, Embedded Linked Lists Team”.

Bill jaszczurka
źródło
19
Twój pierwszy akapit to połowa historii. Druga połowa to: Jeśli pytanie zadaje kandydatowi chęć pracy dla ciebie, to jest to dobre pytanie na rozmowę kwalifikacyjną. Jeśli to sprawia, że ​​kandydat nie chce dla ciebie pracować, to złe pytanie.
ruakh
5
Nie możesz znaleźć limitu tego, co kandydat zna w ten sposób, ponieważ nie możesz w żaden sposób stwierdzić, że to, co uważasz za „skomplikowane” i „podstawowe”, ma zastosowanie w tej samej kolejności do twojego kandydata. LinkedList jest prawdopodobnie podstawowym narzędziem dla programisty uniwersyteckiego, ale programista samoukiem najprawdopodobniej nigdy nie musiał go pisać. W końcu prawdopodobnie napisał „LinkedList <ciąg> ...”, ilekroć go potrzebował. Czy to oznacza, że ​​jego wiedza jest powiązana z poziomem „linkedList”? Mógłby być ekspertem w bardziej złożonych tematach i być w stanie uczyć się LL w 5 minut w Google.
Sylverdrag
1
@Sylverdrag Dlatego powiedziałem, że potrzebujesz więcej niż jednego pytania. Gdy znajdziesz limit ich wiedzy o połączonych listach, przejdź do innego tematu.
Bill the Lizard
@ruakh To zdecydowanie odgrywa rolę. Jeśli każde pytanie, które zadaję podczas wywiadu, dotyczy przyziemnych aspektów aplikacji CRUD (tj. Nie sądzę, żebym mógł nauczyć się czegoś nowego w tej firmie), to nie podnieciłoby mnie to, że mogłem tam pracować.
Bill the Lizard
34

Tęskniłem za pracą wyłącznie dlatego, że mój umysł pogrążył się w takich prostych zagadkach. Świetnie poradziłem sobie również z takimi zagadkami w innych wywiadach - wiem, jak zaimplementować połączoną listę w środowisku bez presji. Nigdy nie skarżyłem się na moje umiejętności od kogoś, z kim pracowałem, więc może nie powinienem myśleć, że straciłem pracę, powinienem pomyśleć, że mnie przegapili.

Więc tak, myślę, że w najlepszym razie jest to wątpliwa praktyka, ale ja to rozumiem. Rozważyłem również możliwość, że nie jest to wina pytania, ale pytającego, który sprawił, że jest to sytuacja wysokiego ciśnienia.

Osobiście wolę zadawać otwarte pytania dotyczące problemu, który kandydat już rozwiązał - ostatnio, jeśli to możliwe, i dotyczy zarówno problemów z kodowaniem, jak i procesami. Jeśli potrafią przynieść próbki kodu, to fantastycznie.

pdr
źródło
Muszą o coś zapytać, czy to puzzle, czy cokolwiek innego. Każde pytanie może spowodować, że osoba będzie pusta.
Podpisz
2
@pdr - „Jeśli potrafią przynieść próbki kodu, to fantastycznie”. Gdyby napisali przyniesione przez siebie próbki kodu, bezcenne.
robrambusch
4
Jeśli czyjeś myśli są puste, jeśli chodzi o implementację listy połączonej, i nie mogą tego zrobić z niewielkim podpowiedziami lub łatwo się sfrustrować, myślę, że byłby to ktoś, kogo nie miałbym nic przeciwko temu.
Bill K
1
@pdr - „A jeśli nie możesz, jak myślisz, jak długo będziesz miał pracę?” - Tak długo, jak długo trzeba je zwolnić w ramach reżimu HR, przez który cierpisz. Istnieje dodatkowy koszt ponownego uruchomienia wyszukiwania kandydatów. Również koszt alternatywny związany z faktem, że następna osoba, z którą przeprowadziłbyś wywiad, mógł stać się technicznym filarem całego działu. Ale oczywiście teraz nie są dostępne, ponieważ jesteś zatrudniony niewłaściwą osobę i oni znaleźć inną pracę.
robrambusch
1
@robrambusch: Wykazywał doskonałe umiejętności rozwiązywania problemów i dobrze mówił o strukturze klas. Ale nie napisał kodu. Jeśli chodzi o pisanie kodu w wywiadzie, tak, to może być przydatne, ale utrzymuję, że mogę dowiedzieć się o tobie więcej w ciągu godziny rozmowy z tobą o rozwiązanych problemach, niż dać ci jeden wymyślony problem, który wymaga godzina do rozwiązania.
pdr
25

Należy zdefiniować typ zadania programowania. Jeśli zajmujesz się opracowywaniem kompilatorów i algorytmów, należy spodziewać się pytań o takie rzeczy. Jeśli pracujesz w aplikacjach biznesowych i spodziewasz się, że kandydat będzie robił aplikacje CRUD, być może znajomość koncepcji (bez pisania programu) jest wystarczająca. Dzisiaj znajomość różnych technologii potrzebnych do wykonania zadania specjalnie w aplikacjach typu LOB zastępuje potrzebę czystych algorytmów.

Bez szans
źródło
Dokładnie. W zeszłym roku napisałem komponent do sortowania genetycznego ogólnego zastosowania, który również wykorzystał trochę symulowanego wyżarzania (do tworzenia harmonogramów zajęć) i użył kilku „zaawansowanych” struktur danych, aby go wykonać. Nie musiałem kodować jednego. Jeśli .NET Framework nie miał tego, czego potrzebowałem, użyłem C5 lub Power Collections.
ElGringoGrande
4
Zgadzam się, piszę aplikacje LOB cały dzień, mam w przeszłości pisemne implementacje list powiązanych ... na studiach ... w języku COBOL. Mógłbym to zrobić jeszcze raz, ale dlaczego? Wielu kompetentnych programistów LOB prawdopodobnie nigdy tego nie napisało i nigdy nie będzie musiało.
CaffGeek
1
Uzgodnione ogólnie, ale połączona lista nie jest niczym egzotycznym. To podstawy, tylko jeden poziom od FizzBuzz.
Francesco De Vittori,
1
@FrancescoDeVittori: Czy to jednak czasem nie jest problem? Ktoś daje ci problem do rozwiązania. Wydaje się to dość proste, ale nigdy wcześniej tego nie robiłeś, więc twój mózg zaczyna się ścigać, szukając gotów, rzeczy, które będą cię kosztować rozmowę, jeśli o tym nie pomyślisz. I nie ma go, ale to odwraca uwagę od rozwiązania rzeczywistego problemu.
pdr
@FrancescoDeVittori: Czy możesz podać kilka przykładów pytań innych niż podstawowe? Potrzebuję tego do samodoskonalenia. Dzięki.
Den
9

Moja odpowiedź brzmi „to zależy”. Zadałbym to pytanie, jeśli kandydat umieścił C lub C ++ w swoim CV. Pytanie o implementację listy połączonej jest dobrym testem na zrozumienie wskaźników, co jest absolutnie niezbędne dla programisty C lub C ++.

Z drugiej strony, jeśli kandydat nie twierdzi, że zna C lub C ++, nie prosiłbym go o wdrożenie listy połączonej, ale rozważałbym zadawanie pytań na ten temat. Wyjaśnij na wysokim poziomie, jak działa połączona lista. Jaka jest złożoność dodawania elementu do nagłówka listy? Ogon listy? Wstawianie elementu na środku listy? Kiedy użyjesz listy zamiast tablicy? Są to podstawowe pojęcia dotyczące struktury danych, które IMHO powinien znać każdy programista.

Dima
źródło
7

Nie uważałbym tego za złe pytanie podczas rozmowy kwalifikacyjnej. Dużo zrozumienia i programowania struktury danych zaczyna się od naprawdę dobrego zrozumienia połączonych list. To powiedziawszy, istnieją pewne zastrzeżenia:

1) To pytanie typu bzyczenie. Sprawdzasz tylko coś bardzo podstawowego: czy dana osoba rozumie listę powiązaną. Zapytaj i przejdź dalej.

2) Wyzwanie związane z listami połączonymi stanowi wyzwanie, że języki, które są bardzo odpowiednie do wykazania zrozumienia pojęć związanych z listami powiązanymi (np. C), mogą nie być takie same, jak język, w którym będą pracować w pracy. Oczywiście możesz wykazać się podstawową znajomością dowolnego języka ze strukturami, ale poproszenie kandydata o ponowne zaimplementowanie połączonej listy w Erlangu bez użycia [] nie jest tym samym wyzwaniem i nie powie ci tego samego o zrozumieniu kandydata jak proszenie ich o zrobienie tego w C. Poproszenie ich o zrobienie tego w C, jeśli praca dotyczy Javy, również nieco to pomija.

3) Mając to na uwadze i ogólne wyzwania związane z „programowaniem tablicy”, zadając takie pytanie, przyjmę pseudokod lub diagramy, o ile wykażą one zrozumienie podstawowych zasad. Nie proszę, aby ludzie pisali na tablicy kod, który jest doskonały pod względem składniowym i logicznym, szczególnie jeśli mogą odwrócić się i zidentyfikować problemy logiczne, gdy zostaną poproszeni o ponowne spojrzenie na nie. YMMV.

dclements
źródło
6

Kiedy udzielałem wywiadów, często pytano mnie o implementacje list połączonych i niektóre algorytmy skupione wokół list łączonych. Rozwiązałem większość z nich, a niektóre wymagały ode mnie trochę ćwiczenia neuronów.

Gdybym kiedykolwiek przeprowadzał wywiad, wybrałbym coś w rodzaju implementacji listy połączonej, nie po to, by sprawdzać, jak dobra jest osoba w kodowaniu, ale by sprawdzić, ile uwagi przywiązuje do szczegółów. Każdy może napisać połączoną listę, ale są to graniczne przypadki, w których nawet niektórzy dobrzy programiści zawodzą. Nie pytaj go: Write a code for linked list in C/C++. Poproś go, aby napisał ogólną listę w C (nie C ++) itp.

Przekręć problem i stwórz kilka innych warunków na połączonej liście, a będziesz miał dobre pytanie, które należy zadać. Niektórzy ludzie popełniają wówczas błędy.

c0da
źródło
2
Nie ma czegoś takiego jak ogólna lista połączona w C.
DeadMG
1
Poważnie? Myślałem, że voidsą tam tylko wskaźniki ... :) Pierwszy link, który znalazłem w google dla „ogólnej listy linków w c” to: daniweb.com/software-development/c/threads/109260, a innym był wywiad techniczny .com /… Myślałem, że wszyscy to wiedzą!
c0da,
Nie testowałem tych kodów, ale mam tego typu listę połączoną wcześniej i na pewno działało dobrze ...
c0da
Nawet napisanie ogólnej listy połączonej w języku C # zawiera jeden lub dwa „gotchas” (np. Porównywanie elementów typu T nie jest oczywiste, tj. (T v1, T v2) => {return v1 == v2;} nie uda się skompilować chyba że masz ograniczenia klasowe lub nie używasz domyślnego operatora równości)
Steven Evers,
@ c0da Moim zdaniem lista, która korzysta ze voidwskaźników, nie jest ogólna, ale ma charakter ogólny na dowolny czas. Mogą przechowywać w nim wszelkiego rodzaju rzeczy, a nawet mieszać je, ile chcą - i to właśnie sprawia, że ​​dla mnie nie jest to rodzaj. To tak, jakby używać objectjęzyka podstawowego w językach obiektowych…
wcisnąć
5

W ciągu około 10 lat profesjonalnego programowania (i około dziesięciu lat jako hobby), nie sądzę, żebym kiedykolwiek potrzebował wdrożyć powiązaną listę. Jeśli ktoś poprosi mnie o zrobienie tego podczas rozmowy kwalifikacyjnej, mogę odpowiedzieć, pytając, czy będę to robić regularnie w pracy.

Z pewnością prawie na pewno istnieją zadania, w których trzeba będzie pisać mniej lub bardziej czyste implementacje powszechnie znanych algorytmów - na przykład zaimplementować listę od zera. Ale w przypadku większości zadań związanych z programowaniem, jaką konkretną wartość ma dla firmy, że kandydat może to zrobić podczas rozmowy kwalifikacyjnej? Czy to naprawdę tak ważne w takim otoczeniu, że kandydat zapewnia doskonałą implementację, która poprawnie obsługuje przypadki skrajne, zgłasza awarie zgodnie z powszechną praktyką w języku lub frameworku i tak dalej? Czy możesz przeoczyć to i zamiast tego skupić się na tym, jak faktycznie podchodzą do problemu, z którym być może nie mieli do czynienia od 10-20 lat?

Kiedy przeprowadziłem wywiad na temat mojej obecnej pracy, miałem bardzo małe doświadczenie ze stosem technologii stosowanym w firmie. Teraz, kilka lat później, regularnie przychodzą do mnie koledzy i zadają pytania nie tylko o produkty, ich wdrażanie i wdrażane przez nich standardy, ale także o znacznie bardziej ogólne problemy z programowaniem (wczoraj zapytano mnie, co implikacje wynikały z okrągłej zależności w domyślnym ograniczeniu w SQL Server w kontekście konkretnej tabeli i jej wykorzystania w naszym przypadku - rozumując to, okazało się, że nie było żadnych implikacji w tym konkretnym przypadku). Nie potrzebowałem też do tego całkiem nowej implementacji list połączonych.

Zadawaj pytania dotyczące pracy, do której kandydat prawdopodobnie zostanie przydzielonyi spróbuj dowiedzieć się, co sądzą o zdobywaniu nowej wiedzy. Jak mogliby dowiedzieć się o sensie niejasnej składni, której nigdy nie widzieli? (Na przykład, jeśli prowadzisz sklep w języku C, możesz spróbować odpowiedzieć na pytanie dotyczące trigrafów). Czy w przypadku pozycji programistycznej regularnie czytają lub uczestniczą w forach takich jak Stack Overflow? Gdyby zostali poproszeni o wykonanie jakiegoś zadania w języku programowania lub frameworku, z którym mają niewielkie lub żadne doświadczenie (powiedzmy, jeśli jesteś przede wszystkim sklepem Java, a co z Clojure lub .NET?), To jak zareagowaliby na ten problem? Może wyjmij prawdziwy błąd ze swojego narzędzia do śledzenia błędów (być może nawet ten, który już dawno został rozwiązany) i zapytaj go, jak ogólnie rzecz biorąc podejdą do jego rozwiązania, i przygotuj się na wyjaśnienie odpowiednich części danego produktu.

Jeśli kandydat potrafi poradzić sobie z typowymi problemami biznesowymi i ma dobre podejście do uczenia się nowych rzeczy, jest to prawdopodobnie o wiele lepszy wskaźnik dopasowania do tego konkretnego stanowiska niż umiejętność udzielania odpowiedzi na znane pytania, niezależnie od tego, czy te pytania dotyczą FizzBuzz, połączonych list lub czegoś innego. Rzuć okiem na to, jak dobrze kandydat pasuje do zespołu, a myślałbym, że jesteś na dość bezpiecznym gruncie.

CVn
źródło
4

Oczywiście większość ludzi nigdy nie musiałaby implementować połączonej listy, ale aby wdrożyć je od zera, prawdopodobnie trzeba będzie poprawnie obsługiwać wskaźniki. Myślą jest, że po utworzeniu spójnego modelu mentalnego dla wskaźników koreluje się z biegłą znajomością języka, rozumieniem tego, co dzieje się na pewnym (abstrakcyjnym) poziomie maszyny i ogólnie zdolnością do abstrakcji.

Nie twierdzę, że byłaby to z pewnością najlepsza miara, ale tylko, że istnieje pewna korelacja.

Benjamin Bannier
źródło
4

Zaczynasz od stwierdzenia, że ​​są to pytania „daj mi”, ale potem wskazujesz, że ludzie nie będą mogli ich zrozumieć. Jestem zmieszany.

Oto jak o tym myślę:

  • Jak mówisz, rzadko trzeba pisać, żeby ludzie łatwo zapomnieli.
  • Nie są niezwykle trudne do napisania.
  • Pojęcia użyte do ich napisania można uznać za podstawowe.
  • Są używane niezwykle często (nawet jeśli nie jesteś tego świadomy).

Myślę, że to czyni z nich dobre pytania. Jeśli martwisz się, że przygotowują się do rozmowy kwalifikacyjnej, dodaj listę. Poproś, aby napisali to okólnie i zapytali, jaki jest asymptotyczny czas ich wdrożenia. Czy też mogą napisać inną wspólną i / lub szybką strukturę danych ... Drzewo wyszukiwania binarnego? Kolejka (FIFO)? Stos (FILO)? Naiwna ( O(n)) kolejka priorytetowa? Wiele osób, które znam, uważa, że ​​BST jest O(log n) po prostu dlatego, że jest drzewem .

Jeśli szukasz kogoś, kto będzie pracował w metalu i potrzebuje bardzo solidne podstawy struktur danych ... To może być nawet o wiele zbyt trywialne dla kandydatów szukasz zatrudnić.

Zakłada się oczywiście, że chcesz programisty, który ma podstawy / podstawy struktur danych, a ich pozycja skorzystałaby na tych podstawach. Jeśli chcesz kogoś, kto może zrzucić stronę bolącą w kilka sekund, przesłuchaj za to. Nie chodzi o to, aby wybrać pytanie do rozmowy kwalifikacyjnej, ponieważ wszyscy je znają, ale o takie, które mierzy umiejętności, których szukasz. Osobiście uważam, że pytania dotyczące struktur danych są dobre, lista jest powiązana lub nie.

Steven Evers
źródło
W praktyce nie jest to mylące. FizzBuzz jest jeszcze łatwiejszym pytaniem, a jednak kandydaci rutynowo nie mogą nawet zacząć na nie odpowiadać. To samo dotyczy list połączonych. To tajemnica świata programowania.
joshin4colours
@ joshin4colours: Nie, jestem zdezorientowany co do pytania. Na początku OP mówi, że pytania LL są sprawami, ale potem podaje listę punktów, dlaczego wykwalifikowany programista nie zda pytania.
Steven Evers,
3

Czy to pytanie ma wystarczającą użyteczność, aby być powszechnie używanym do oceny kandydatów na programistów na całym forum?

Nie, absolutnie nie. W zależności od tego, w jaki sposób zostanie sformułowany, to, co powie, będzie się wahać od „ten kandydat wie, jak zaprojektować listę połączoną” do „ten kandydat może zaprogramować listę połączoną w języku X”. Jeśli poprosisz o pseudokod, będzie on miał tendencję bardziej do pierwszego. Jeśli poprosisz o implementację w określonym języku, uzyskasz więcej wiedzy na temat tego języka (szczególnie w C i C ++, gdzie możesz poradzić sobie ze wskaźnikami, referencjami i strukturami).

Posunąłbym się nawet do stwierdzenia, że ​​nie można ocenić wszystkich kandydatów przy użyciu tych samych pytań. Musisz dostosować pytania do rozmowy kwalifikacyjnej, aby ocenić umiejętności, których szukasz na danym stanowisku.

Jeśli dana osoba będzie w stanie napisać kod, pomyślałbym o dołączeniu pytania o algorytm i / lub strukturę danych, o ile było to odpowiednie dla tego stanowiska. Spróbowałbym wybrać coś, co mogło być wcześniej omówione lub wykorzystane. Skoncentrowałbym się również na rzeczach innych niż implementacja wspomnianych algorytmów i struktur danych, takich jak czas działania i zużycie pamięci (takie jak notacja wielkiej litery O). Pojęcia te dotyczą nie tylko tworzenia struktury danych, ale także wyboru, która implementacja jest najbardziej odpowiednia (na przykład ArrayListkontra a LinkedList).

Thomas Owens
źródło
3

Nie sądzę, aby regularna praca programistyczna była pytaniem eliminującym kandydata. Ale dobrze jest sprawdzić, czy masz do czynienia z naprawdę starszym programistą lub kimś, kto od wielu lat zajmuje się kodowaniem małp. Mimo to nie powinno to stanowić podstawowego kryterium wyboru programisty. Może jest świetnym programistą ze złą pamięcią i przez lata nie czytał słów „połączonej listy” (lub nie pamięta nazwy), ale nadal potrafi robić dobre aplikacje.

Tak więc, jak niektórzy powiedzieli, jeśli będzie to zadanie, które musi pracować z połączoną listą i wieloma fantazyjnymi algorytmami itp., To dobrze. Jest, jeśli dla zwykłych danych wejściowych w formularzu, sprawdzanie poprawności i wyświetlanie jest trochę bezużyteczne i niesprawiedliwe.

H27studio
źródło
2

Myślę, że to zły przykład pytania do rozmowy kwalifikacyjnej, ale z innego powodu. Lista połączona to tak prosta koncepcja, że ​​wiedzieć, co to znaczy, wiedzieć, jak ją wdrożyć. Jeśli dana osoba nie wie, co to jest lista połączona, musisz wyjaśnić, jak to działa, i robiąc to, dajesz odpowiedź bez odkrycia, czy wie, jak rozwiązać problemy . Zatem pytanie można sprowadzić do „czy już wiesz, czym jest lista połączona i jak działa?”, Co nie mówi nic przydatnego o ich przydatności jako programisty.

Mason Wheeler
źródło
2
Popularne pytania są również uzależnione od gier przez osoby, które są dobre w zapamiętywaniu.
Paul Nathan
1
Jeśli musisz wyjaśnić kandydatowi, jak działa lista połączona, prawdopodobnie nie powinieneś go zatrudniać do programowania ...
Dima,
2

Napisanie implementacji listy powiązanej jest dobrym pytaniem do rozmowy kwalifikacyjnej, ponieważ ujawni wiele na temat sposobu kodowania kandydata:

  • Czy on wie, co to jest interfejs API? Czy może używać kodu innych osób? Czy potrafi pisać kod, aby inni mogli go używać?

  • Czy on wie, co to jest lista połączona? Czy on zna kolekcje, struktury danych, algorytmy?

Jeśli nawet nie wie, jakie metody powinna oferować Lista połączona, wiesz, że prawdopodobnie nigdy jej nie użył lub wie, kiedy go użyć.

  • Jak sobie radzi z problemem? Czy zaczyna najpierw od analizy, małej specyfikacji, wcześniejszych testów? A może po prostu zaczyna się hackować z radością?

  • Czy on zajmuje się skrzynkami krawędziowymi? Co z usunięciem ostatniego węzła z listy połączonej? Co się stanie, jeśli ktoś spróbuje dodać odniesienie do samej listy połączonej do listy połączonej, a następnie usunie całość?

  • Czy radzi sobie z wyjątkami? Każdy język programowania ma swoje własne konwencje obsługi wyjątków: w Javie oczekuje się, że LinkedList zgłosi wyjątek NoSuchElementException po wykonaniu funkcji getFirst () na pustej liście. Inne języki mogą zwracać niezdefiniowane, -1 lub stałą.

Konerak
źródło
W ćwiczeniu polegającym na kodowaniu wywiadu, o ile nie jest to specjalnie wymagane, pomijałbym wszelkiego rodzaju obsługę spraw brzegowych, obsługę błędów itp., Wykraczając poza to, co jest konieczne do potwierdzenia koncepcji. ALE chciałbym również wyjaśnić, że dokonuję wyboru. Ograniczenia podczas jednogodzinnej lub nawet kilkugodzinnej rozmowy bardzo różnią się od sytuacji, w której faktycznie pracujesz nad czymś, co przyda się naprawdę.
CVn