Czy pytania algorytmiczne są dobrymi pytaniami do rozmowy kwalifikacyjnej? [Zamknięte]

25

Kłóciłem się ostatnio z innym programistą. Rozmawiał o nowe stanowisko i zadano mu pytanie:

Podaj sekwencję liczb zaczynającą się od X i kończącą się na Y, ale bez jednego elementu, więc N to YX-1, znajdź brakujący element w O (N) lub lepszym.

Odpowiedź jest tutaj nieistotna (ale interesująca). To zapoczątkowało dyskusję, czy to było dobre pytanie, które należy zadać podczas wywiadu.

Jedna strona: Algorytmy są dziedziczną częścią programowania, a zdolność kandydata do odpowiedzi na to pytanie potwierdza, że ​​ten kandydat będzie dobrym programistą i będzie w stanie rozwiązać większe problemy i poradzi sobie z większością zadań programistycznych, które ostatecznie są łatwe do zrozumienia i odpowiedzi.

Druga strona: pisanie algorytmów od zera jest rzadko stosowane we współczesnym programowaniu i dlatego nie ma znaczenia w większym pytaniu, czy dana osoba będzie dobrym programistą. Osoba może z powodzeniem odpowiedzieć na to pytanie, ale nadal nie jest w stanie wykonywać bardziej typowych zadań programistycznych.

Twoje myśli? Dobre pytanie podczas rozmowy kwalifikacyjnej?

MBonig
źródło
Przykro mi, ale nie rozumiem find the missing element in O(N) or betterCo w tym kontekście oznacza „lub lepiej” ? To wydaje się być czymś, co można by rozwiązać za pomocą prostej pętli while, ale w każdym razie nie rozumiem - jest rozwiązane lub nierozwiązane , prawda?
Camilo Martin
„Lub lepiej” odnosi się do wydajności - rozwiązanie O (ln (n)) byłoby lepsze.
Ethel Evans
Pytania dotyczące algorytmu są w rzeczywistości jednym z oczekiwanych pytań w trakcie programowania lub technicznej rozmowy kwalifikacyjnej. Gayle Laakmaan McDowell napisał książkę zatytułowaną „Cracking the Coding Interview”, która zawiera dedykowaną sekcję dotyczącą algorytmów.
hagubear

Odpowiedzi:

20

Zgadzam się z pytaniem o algorytm, ale nie zgadzam się z naleganiem na określony poziom jakości big-O.

Zadanie tego rodzaju pytania jest interesujące, aby zobaczyć, jak dana osoba podchodzi do problemu i jakie pułapki biorą pod uwagę przy swojej próbie, ale chyba, że ​​piszą coś szalenie niepoprawnego lub nieefektywnego, faktyczny szczegół tego, co piszą, nie jest tak znaczący, jak fakt, że przejść przez etapy rozwiązywania problemów / projektowania w spójny sposób.

Zadaję podobne pytanie, ale ludzie, z którymi miałem najwięcej szczęścia po zatrudnieniu, to ludzie, którzy udzielili błędnych odpowiedzi, ale mieli właściwy pomysł.

Rachunek
źródło
9

Nie zgodziłbym się z pomysłem, że umiejętność pisania algorytmów nie ma znaczenia w większym pytaniu, czy dana osoba będzie dobrym programistą. Nawet jeśli nigdy nie musi go używać (co jest wątpliwe), wciąż pokazuje, czy ma elastyczność umysłową wymaganą do wypracowania logicznego rozwiązania problemu, który jest bardziej skomplikowany niż prosty zestaw wymagań, który został już napisany i określony szczegółowo przez klienta.

Na pewno nie chciałbym zatrudnić kogoś, kto nie wie, jak myśleć i analizować. To właśnie odróżnia małpę kodową od programisty komputerowego.

Mason Wheeler
źródło
6

Muszę przyznać, że jestem jednym z tych, którzy lubią zadawać pytania algorytmiczne w wywiadach, ale muszę podkreślić, że faktyczna odpowiedź na to pytanie jest absolutnie nieistotna. Nie dbam o to, czy osoba udzielająca wywiadu zna odpowiedź, czy nie. Dla mnie to pytanie dotyczy różnych aspektów, takich jak następujące - w kolejności ich ważności:

Wymagania

Takie pytania są celowo niedookreślone. W twoim przykładzie nie podano dalszych szczegółów na temat sekwencji. Jeśli masz rozmówcę, który pyta, czy te liczby są faktycznie posortowane, to dobry znak. Ma właściwy sposób myślenia, aby zapytać klientów o dalsze szczegóły, które pomogą znaleźć lepsze rozwiązanie w krótszym czasie. Kandydat może również zastanowić się nad wykorzystaniem przestrzeni O (n) do przechowywania tablicy N liczb, ale nie powinien tego robić bez pytania o więcej szczegółów na temat X i Y. Powiedzmy, że X i Y mają wartość od 1 do 1000 , a następnie, śmiało, uruchom rozwiązanie oparte na macierzy. Ale jeśli powiem wam, że interwał wynosi 1 i 1 miliard, problem staje się zupełnie inny. Jeszcze raz podkreślę, że nie dbam o rozwiązanie.

Standardowe techniki

Nie chcę zatrudniać programisty, który nawet nie wie, co oznacza O (n). To absolutna konieczność, jeśli masz przyzwoite wykształcenie w tej dziedzinie. Ale ważne jest też, aby nie tylko wiedzieć, co to znaczy, ale faktycznie zastosować tę wiedzę. W twoim przykładzie chcę, aby kandydat zdał sobie sprawę, że nie wolno mu sortować danych (bez zadawania dalszych pytań dotyczących opcji sortowania kubełkowego lub innych metod sortowania O (n)) z powodu wymaganego sortowania O (n log n) ogólnie.

Podobnie, inne pytania dotyczące algorytmu dotyczą standardowych technik, takich jak przechodzenie przez drzewa lub wykresy lub rekurencja. Kandydat może poślizgnąć się na jednej z tych technik, co nie robi dobrego wrażenia. Jednak w takich przypadkach lubię kopać głębiej, aby dowiedzieć się, czy kandydat w ogóle ma jakieś doświadczenie w CS. Oczywiście zależy to od docelowej pozycji, ale zwykle programista, który nie wie o złożoności środowiska uruchomieniowego, ani o typowych strukturach danych i ich przechodzeniu, nie będzie żadnej pomocy.

Sposób radzenia sobie z problemami

Po zadaniu pytania uważnie monitorujesz kandydata. Jak on / on reaguje? Uzyskać najlepsze wyniki tutaj od kandydatów, którzy nie mają żadnego pojęcia o tym, jak rozwiązać ten problem na początku . W tym względzie pytanie sprawdza, co może się stać, jeśli podobna sytuacja wystąpi później w miejscu pracy. Możesz spotkać się z takim problemem podczas rozwoju i dobrze jest wiedzieć, jak twój kandydat radzi sobie z tymi problemami, nawet jeśli nie jest w stanie rozwiązać go samodzielnie.

Przykład: Nie chcesz, aby Twój kandydat przeszedł w tryb cichy przez następne pół godziny! Sprawdź, czy może on wymyślić inteligentne pytania (patrz Wymagania), sprawdź, czy zaczyna myśleć nieszablonowo, gdy zda sobie sprawę, że nie może tego zrobić. Nawet „zabawne” kontr-pytanie, takie jak „Czy mogę skorzystać z opcji telefonu współpracownika?” to dobry znak.

Jak odpowiedzieć

Zasadniczo najlepszymi odpowiedziami na tego rodzaju pytania są kontr-pytania! Natychmiastowe udzielenie odpowiedzi w zasadzie zawodzi, i nie jest wcale dobrą odpowiedzią, ponieważ wszystkie te pytania wskazują na kompromisy, które sugeruje twoja odpowiedź, bez posiadania wymaganych informacji, aby inteligentnie to zrobić kompromis. Oczywiście jakość kontrpytań różni się w zależności od kandydata.

Jako ogólna uwaga na pytania podczas rozmowy kwalifikacyjnej: kontrpytania rzadko są złą rzeczą. W jednym z moich wywiadów zapytano mnie na przykład: „Gdybyś musiał wdrożyć X, czy wybrałbyś do tego C ++ lub Javę i dlaczego?” - Po prostu odpowiedziałem: „Czy jestem ograniczony do tych dwóch?”. Zgadnij, jaką reakcję otrzymujesz od ankietera na takie kontrpytanie - i jak łatwo jest ci pokazać ankieterowi, do czego jesteś zdolny.

Szczery
źródło
Dlaczego „Czy mogę skorzystać z opcji telefon-współpracownik?” dobry znak? Czy to nie pokazuje, że rozmówca nie wie, jak rozwiązać problemy i zawsze prosi o pomoc?
Uooo
Zawsze będzie pytanie, na które osoba udzielająca wywiadu po prostu nie może odpowiedzieć. W takim przypadku jest to dobry znak, ale oczywiście osoba udzielająca wywiadu nie powinna powtarzać tego zachowania w przypadku kilku pytań. Trudnym zadaniem jest ustalenie, czy trafiłeś właśnie w jedno słodkie miejsce, w którym kandydat nie ma wiedzy (co jest do zaakceptowania), czy też próbuje on wyjść z trudnych problemów w ogóle (co nie jest).
Frank
Ktoś kiedyś powiedział mi, że różnica między młodszym programistą a starszym programistą polega na tym, że starszy programista prosi o pomoc wcześniej. Ważną umiejętnością jest telefonowanie do współpracownika. W tej branży jest wiele ego, a powiedzenie „nie wiem” to dobry znak. Najlepszy kod, jaki kiedykolwiek zaprojektowałem / napisałem, pochodzi z pracy z ludźmi, a nie tylko z moich własnych pomysłów.
MBonig
5

O ile nie zadajesz pytań na temat algorytmów / formuł, które kandydat musi znać na potrzeby pracy (np. Dynamika płynów, jeśli wymaga tego pozycja), nie widzę ich wartości. Kandydat już prawdopodobnie martwi się tym, jak się ubiera, jak mówi, itp. ... czy może natychmiast odpowiedzieć na matematyczne pytanie, nie dowodzi nic innego, jak może poradzić sobie w teleturnieju.

Kiedy przeprowadzam wywiad, nie zadaję nawet pytań o „programowanie” per se. Poprosiłem kandydata, aby opisał swoje poprzednie projekty, w jaki sposób ich kod osiągnął cele, jakie są ich podejścia itp. Na tej podstawie mogę dość szybko powiedzieć, czy kandydat wie, co robi, czy też jest pozerem.

Grandmaster B.
źródło
4

Zgadzam się, że programiści muszą bardzo dobrze znać algorytmy, nawet przy użyciu nowych fantazyjnych ram, ale nie jestem całkowicie przekonany o łamigłówce w wywiadzie. Moją największą obawą jest to, że w prawdziwym środowisku piszesz algorytmy w bardzo różnych warunkach; alias, nie pod presją, gdy ktoś obserwuje cię każdym pociągnięciem pióra, co najmniej kilka minut, aby przemyśleć to w ciszy. W przypadku tych, którzy opowiadają się za tą metodą oceny, jak długo zazwyczaj dajesz osobie możliwość jej rozwiązania? Uważam, że w kodzie nie chodzi tylko o wypracowanie rozwiązania w gorączkowym 3-minutowym terrorze, więc przekonaj mnie, że to naprawdę dobry sposób, aby zobaczyć, jak ktoś poradzi sobie z codziennym zadaniem.

Morgan Herlocker
źródło
2

Problem z tym konkretnym pytaniem polega na tym, że jest to prawie podchwytliwe pytanie. Z jednym konkretnym wglądem z łatwością wymyślisz O (n), w przeciwnym razie będziesz miał trudności z osiągnięciem lepszych wyników niż O (n log n). To prawie sprowadza się do „Czy widziałeś to wcześniej?”

Nie jestem pewien, czy są jakieś dobre pytania algorytmiczne. Jeśli zapytasz kogoś opartego na teorii grafów, powiedzmy, że będzie to zależeć od tego, jak dobrze rozmówca był zaznajomiony z teorią grafów - a jeśli go zatrudnisz, może on dość szybko opanować teorię grafów. Znów wracamy do „Czy byłeś już wcześniej na to narażony?”

W regularnym wywiadzie nie ma czasu na poważne rozwiązywanie problemów, a ja podchodzę do sprawy inaczej, kiedy mogę usiąść, korzystać z Wikipedii i ogólnie zająć trochę czasu, aby coś wymyślić. Prawdopodobnie nie ma czasu, aby osoba przeprowadzająca wywiad dokładnie omówiła szczegółowo to, co rozmówca wie, i wybrała odpowiednie pytanie algorytmiczne.

David Thornley
źródło
1
Jaki jest szczególny wgląd w to, że jest to O (n)? Widzę „przeszukiwanie posortowanej listy N kolejnych wartości dla jednej, której brakuje” jako z natury problem O (n). Jak mogłeś to napisać, żeby było gorzej? (Szczerze mówiąc, jestem ciekawy i nie widzę, jak rozwiązanie O (n) jest nieoczywiste, a nawet O (log n) wydaje mi się oczywiste.)
dash-tom-bang
@ dash-tom-bang: Nie myślałem o liście jako posortowanej (czy coś źle zrozumiałem?), więc rozwiązaniem O (n log n) byłoby sortowanie i skanowanie, podczas gdy O (n) byłby sumą liczb w górę.
David Thornley,
Ach, okej, to może być przypadek. Nie pomyślałem, że lista będzie nieposortowana. :) („Lista zaczyna się o X, a kończy o Y.”)
dash-tom-bang
2
Działa tu również wariant szybkiego wyboru. Obróć na (góra + dół) / 2 i łatwo zobaczyć, która połowa brakującego wpisu jest, ponieważ wiesz, jak duża powinna być każda połowa. Powtarzaj, aż znajdziesz brakujący element.
Paul Hankin,
1
Myślę, że ponieważ pytanie odnosi się do sekwencji (a nie zestawu itp.) Rozpoczynającej się od X i kończącej się na Y, oznacza to, że elementy są sortowane. To wydaje się dość trywialne pytanie.
FinnNk,
1

Mam kilka pytań podobnych do algorytmów, z których regularnie korzystam, niektóre z nich są bardzo trudne. Używam ich, aby zobaczyć, w jaki sposób mentalnie atakują problem i sprawdzić, czy podsycają pewne pojęcia. (Widziałem zbyt wielu kandydatów na programistów, którzy po prostu nie rozumieją wskazówek).

John Franklin
źródło
Wskaźniki, jak pies, prawda? :)
JoshD
1

Chcesz pytania, które dadzą ci wgląd w kandydata. Pytanie algorytmu może dać dobrą odpowiedź lub nie. I nie mówię o tym, że są w stanie odpowiedzieć na to pytanie, czy nie. Jeśli to sprawdzą, a ty zrozumiesz ich tok rozumowania i podążasz za nimi, to dobry wskaźnik. Jeśli po prostu tam siedzą, nie ma prawdziwej odpowiedzi, wydaje się, że nawet nie wiem od czego zacząć, to zły wskaźnik (być może). Problem polegałby na tym, że niektórzy ludzie zamarzają, a odróżnienie zamrożenia od braku umiejętności rozwiązywania problemów może być trudne.

Ludzie narzekają na to, że pytają o wszystko w wywiadach z różnych powodów. Wnioskodawca może się zawiesić, wnioskodawca mógł po prostu przejrzeć to pytanie, wnioskodawca może nie znać tego konkretnego ciekawostki / techniki / czegokolwiek. Wszystko to prawda, ale wywiad musi się jeszcze odbyć, a wielu z nas w tym zawodzie tego nienawidzi. Nienawidzimy pomysłu, by ktoś nas osądzał. Natychmiast wyczuwamy powody, dla których możemy być niesprawiedliwie oceniani, lub w jaki sposób test może być fałszywy lub zagrany. Najważniejsze jest to, że to nie ma znaczenia.

To, czego naprawdę chcesz, to ankieter z umiejętnością określania umiejętności, które mogą zostać zaprezentowane podczas rozmowy. Pytania to tylko narzędzia. Dla mnie wszystkie młotki wyglądają tak samo. Ale dla kogoś, kto jest wystarczająco wykwalifikowany, jestem pewien, że jest różnica.

Jeremiasz Nunn
źródło
0

Lubię pytania dotyczące algorytmów, ponieważ robimy to. Lubię ograniczenia, ponieważ tego używamy. Big-O jest szczególnie istotny w mojej branży.

Nie lubię wymagać, aby odpowiedzi na tego rodzaju pytania brzmiały: „napisz kod na tablicy”. Rozmówca powinien być w stanie inteligentnie rozmawiać o podejściu do rozwiązania i brać udział w ciągłej dyskusji, gdy ankieterzy zmieniają wymagania w trakcie dyskusji.

Zadawane jest pierwotne pytanie, jak mówi rozmówca: „zacznij od początku i maszeruj w kierunku końca, szukając„ dziury ””. Ankieter mówi, że to jest zbyt wolne, ponieważ N jest olbrzymi. Rozmówca zaczyna omawiać wyszukiwanie binarne. Ankieter mówi, że nagle dane nie są już sortowane. Rozmówca mówi „sortuj, a następnie szukaj”. „Teraz jest zbyt wolny”. Itd itd.

dash-tom-bang
źródło