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”?
źródło
Odpowiedzi:
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ę:
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”.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
void
są 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ą!void
wskaź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ćobject
języka podstawowego w językach obiektowych…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.
źródło
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.
źródło
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ę:
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 jestO(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.
źródło
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
ArrayList
kontra aLinkedList
).źródło
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.
źródło
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.
źródło
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łą.
źródło