Czy w wywiadzie lepiej jest zakodować brutalne rozwiązanie trudnego pytania, czy też spędzić rozmowę na dokładnym zbadaniu pytania? [Zamknięte]


14

Czasami pytania podczas rozmowy kwalifikacyjnej są trudne, niezależnie od tego, czy osoba przeprowadzająca wywiad zamierza je mieć, czy nie. Może sprowadzać się do wyboru, czy wykorzystać ograniczony czas wywiadu, aby napisać brzydkie, nieefektywne, brutalne rozwiązanie, lub poświęcić czas na zrozumienie każdego aspektu problemu z ankieterem.

Na przykład problem 91 w Project Euler można rozwiązać za pomocą niezbyt trudnego rozwiązania z użyciem siły brutalnej polegającego na obliczeniu każdego możliwego trójkąta, napisaniu testu isRightTriangle () i wstawieniu wszystkich trójkątów, które przejdą test do zestawu. Ale dwie pary współrzędnych X / Y sprawiają, że rozwiązanie O (x ^ 4) ma wysoką stałą wartość. Razem z przyjacielem opracowaliśmy rozwiązanie, które jest o wiele bardziej eleganckie i wydajne, ale spędziliśmy na nim 3 godziny i narysowaliśmy dziesiątki diagramów, przetestowaliśmy wiele formuł, zbadaliśmy wiele podejść itp.

Nie każde pytanie w rozmowie kwalifikacyjnej jest uczciwe. To, co jest łatwe dla jednej osoby, może być trudne dla innej. Jeśli ktoś zmaga się z pytaniem, czy byłbyś pod wrażeniem brzydkiego rozwiązania brutalnej siły, które działa? A może doskonałe rozumienie problemu i na drodze do eleganckiego rozwiązania, ale bez kodowanego rozwiązania? Czy istnieje zasada, że ​​po 20 minutach powinieneś zacząć kodować bez względu na wszystko?


10
Zapytaj ich, czy chcą rozwiązania brutalnej siły, czy z niuansów.
Robert Harvey

Gdyby chcieli rozwiązania nie brutalnego, zadaliby pytanie, którego brutalna siła nie może rozwiązać.
minusSeven

Odpowiedzi:


9

Po pierwsze, pytanie, które elegancko zoptymalizowało dwóch doświadczonych programistów przez trzy godziny, jest kiepskim wyborem na pytanie do rozmowy kwalifikacyjnej. Jeśli o to poprosisz, nie powinieneś oczekiwać idealnych odpowiedzi.

Z drugiej strony, czasami dowiadujesz się najwięcej o kimś, kiedy zmuszasz go do przekroczenia swoich granic. Dlatego wiele kursów uniwersyteckich zwiększa trudność, a następnie ocenia na krzywej. Jeśli wszyscy zdobędą 100% na każdym egzaminie, pozostawiasz wiele możliwości uczenia się.

Mój idealny kandydat prawdopodobnie najpierw wyliczy złożoność, powie „Och, to tylko 6 milionów iteracji, co nie potrwa długo”, a następnie szybko napisze rozwiązanie brutalnej siły. Następnie dyskutowali o podejściach, które mogliby zastosować, aby je zoptymalizować, niekoniecznie wdrażając je, chyba że poprosił o to ankieter.

Częściowo dzieje się tak, ponieważ wiele problemów typu euler projektu, które pojawiają się w prawdziwym świecie, to problemy jednorazowe, które należy rozwiązać raz, a potem o nich zapomnieć. Chcę wiedzieć, że osoba, którą zatrudnię, będzie w stanie rozpoznać algorytm brutalnej siły, który zajmuje 2 minuty, a napisanie 10 minut jest bardziej wydajne niż algorytm, który zajmuje 3 godziny i 10 sekund, jeśli potrzebujesz uruchomić to raz.


Świetna odpowiedź. Caleb przedstawił koncepcję brutalnej siły najpierw, a następnie optymalizację, ale Twoja jest jedyną odpowiedzią, która sugeruje podanie powodu, dla którego rozwiązanie brutalnej siły jest w tym przypadku możliwe do zaakceptowania: „To tylko 6 milionów iteracji, co nie zajmie bardzo długo." To tylko złoto. Dzięki wielkie!
GlenPeterson

14

Jako menedżer ds. Rekrutacji, jeśli proszę o rozwiązanie problemu z kodem tuż przede mną, nie robię tego tyle, aby zobaczyć sam kod (choć jest to ważne), ale raczej ustalić, jak i dlaczego zrobiłeś to, co zrobiłeś. Jedną z tych rzeczy, które możesz zrobić, nie jest kodowanie, a zamiast tego przesłuchuj mnie co do aspektów samego problemu, aby lepiej go rozwiązać. Jest to dla mnie znaczące i zwykle bardziej znaczące niż rozwiązanie przedstawione w kodzie. Jednak nie w ten sposób wszyscy to robią, nie wszyscy też chcą to zobaczyć (i w rzeczywistości rzadko pytam ludzi o kodowanie w rozmowie kwalifikacyjnej, ale kładę problemy na stole i rozmawiamy przez nie, a czasami pojawia się pseudokod , co jest dla mnie równie dobre ).

Masz rację, że nie każde pytanie na rozmowę kwalifikacyjną jest uczciwe, a to, co jest łatwe dla kogoś, jest trudne dla drugiego, w tym otoczeniu i przy tych ograniczeniach, i dlatego ci, którzy rozumieją, że zwykle nie szukają rozwiązania kodowego (chociaż znowu odgrywa to ważną rolę), ale raczej proces rozwiązania .

„Czy istnieje zasada, że ​​po 20 minutach powinieneś zacząć kodować bez względu na wszystko?” Odpowiedziałbym na to, mówiąc, że w bardzo krótkim czasie myśląc o problemie, powinieneś przynajmniej coś zrobić - zadawać więcej pytań, szkicować ramy rozwiązania lub mówić, że po prostu nie możesz tego zrobić / nie wiem od czego zacząć.

Gdybym postawił przed tobą trudny problem, a rozwiązanie, które dostarczyłeś - biorąc pod uwagę ograniczenia czasu i tego, co masz - było brutalne i brzydkie, zadałbym ci szereg pytań, dlaczego tak było, a co zmieniłoby to w coś bardziej eleganckiego: więcej informacji? więcej czasu? inne środowisko? Będąc świadomym i w kontakcie ze dlaczego to, co zrobiłeś, a co już nie zrobione, i jest w stanie racjonalnie wytłumaczyć, jest wielką gwiazdą złoto w mojej książce, ale są to rodzaje programistów I szukać. Tak więc „doskonałe zrozumienie problemu i in-road w kierunku eleganckiego rozwiązania” również działałoby dla mnie, ale nie dla wszystkich.


6
Plus milion za „Być samoświadomym i być w kontakcie z tym, dlaczego to, co zrobiłeś, a czego nie zrobiłeś, i móc to racjonalnie wyjaśnić, jest wielką złotą gwiazdą w mojej książce” . Liczba osób, które na pytanie „Dlaczego?”, Założyciel i nie mogąca odpowiedzieć, jest niewiarygodna. Podczas zatrudniania prawie zawsze wolę uczyć kogoś, kto potrafi myśleć samodzielnie, niż zatrudniać kogoś, kto potrafi pisać, ale nie umie myśleć.
Ben

Dzięki. To jest wnikliwe. W mojej pracy mam tendencję do analizowania przed dotknięciem klawiatury. Ale pod presją wywiadu chcę desperacko pokazać rozwiązanie programmers.stackexchange.com/questions/178075/... Twoja odpowiedź stanowi miły kontrprzykład.
GlenPeterson

4

Chciałbym mieć oba, ale mogą wyświetlać „kod, który po prostu działa” w jednym rozwiązaniu, a następnie ewentualnie omówić potencjalne rozwiązania dla poprawy tego lub innego problemu.

Jeśli poprosisz kogoś o napisanie kodu, a on po prostu chce porozmawiać o możliwych rozwiązaniach z zerowym kodem, byłoby to problemem.

Tak jak powiedziałeś, ktoś może z jakiegoś powodu mieć problem z konkretnym problemem, ale musisz nauczyć się, jak sobie z nim poradzić. Mogą mieć szczęście i już słyszeli o rozwiązaniu podobnego problemu. Zdarza się.

Obserwuj, jak ktoś pisze i dyskutuje o wystarczającej ilości kodu, i możesz dowiedzieć się, czy jest on odpowiedni do pracy.


1
Chyba też chciałbym usłyszeć, dlaczego rozwiązanie brutalnej siły może być problemem, jak w powyższym pytaniu.
Christopher Creutzig

@ChristopherCreutzig - Zakładałem, że trudno będzie zaoferować ulepszenia bez przynajmniej sugerowania problemów z obecnym rozwiązaniem.
JeffO

Prawdziwe. Chyba to podrapię.
Christopher Creutzig

3

Czy istnieje zasada, że ​​po 20 minutach powinieneś zacząć kodować bez względu na wszystko?

Nie, ale jeśli poświęcisz 20 minut na analizę problemu, zanim zabierzesz się do pracy, prawdopodobnie już masz kłopoty. Pracodawca, który zadaje ci pytanie takie jak to, które zacytowałeś, jest najbardziej zainteresowany sposobem, w jaki podchodzisz do problemu, ale jeśli poprosi go o problem z kodowaniem, również będzie chciał zobaczyć kod. Omów je przez proces myślowy ...

Cóż, oczywistym podejściem tutaj jest brutalna siła. Gdybym miał sposób rozpoznać prawy trójkąt, biorąc pod uwagę trzy wierzchołki, mógłbym przejść przez wszystkie kombinacje dwóch punktów i początku szukając odpowiednich trójkątów. To nie powinno być trudne - mogę napisać funkcję, która używa twierdzenia Pitagorasa do identyfikowania właściwych trójkątów. Aby to ułatwić, napiszę również funkcję określającą odległość między dwoma punktami za pomocą wzoru odległości ...

Pisanie tych funkcji powinno zająć około trzech minut. Teraz, zaledwie kilka minut od pytania, pokazałeś już, że pamiętasz podstawową geometrię i że naprawdę umiesz pisać kod. Daje ci również coś do rozmowy:

Tak więc moglibyśmy oczywiście umieścić isRightTriangle(p1, p2, p3)funkcję w środku czterech forpętli i iterować wszystkie możliwe opcje dla każdego z dwóch zmiennych punktów. Zobaczmy ... problem dotyczy liczby prostokątów w tym początku na siatce 50 x 50, więc użycie metody brutalnej siły pozwala sprawdzić 50 możliwości dla każdej współrzędnej każdego punktu. To 50 ^ 4 czeków ... Jestem pewien, że możemy zrobić lepiej, ale kod jest oczywisty, więc pozwól mi to zapisać ...

Więc teraz piszesz funkcję, która używa zagnieżdżonych forpętli i isRightTriangle()funkcję, którą właśnie napisałeś. Rozwiązałeś problem, ale pozwoliłeś ankieterowi zobaczyć, dokąd zmierzasz. Jeśli ich celem było po prostu sprawdzenie, czy umiesz pisać kod, mogą powiedzieć ci, żebyś przestał. Bardziej prawdopodobne jest, że z przyjemnością rozmawiają z kimś, kto wie, co robią, i będą chcieli zobaczyć, jak daleko się posuniesz. Więc kontynuuj ...

Kiedy pisałem, przyszło mi do głowy, że możemy skorzystać z symetrii. Możemy odzwierciedlić dowolny odpowiedni trójkąt wokół linii 45 °, więc jeśli zdecydujemy się sprawdzić jeden z punktów tylko po jednej stronie tej linii, możemy po prostu policzyć dowolne znalezione trójkąty dwa razy ... raz dla trójkąta i raz za swoje odbicie. To zmniejsza liczbę kontroli o połowę. Teraz, patrząc na to, bierzemy pierwiastek kwadratowy, aby znaleźć odległość między dwoma punktami, ale potem po prostu to kwadrat w isRightTriangle()...

I tak dalej. Ponownie, zazwyczaj nie chcą znaleźć idealnego rozwiązania, chcą zobaczyć, w jaki sposób można uzyskać rozwiązanie. Twój proces myślowy nie musi być podobny do powyższego - po prostu pewność, że będziesz głośno myśleć, będzie się bardzo liczył. Nie przejmuj się, jeśli popełnisz błąd - po prostu powiedz „hmmm, chyba zszedłem z torów - pozwól mi cofnąć się o krok ...”


1
Bardzo miła odpowiedź. Szczególnie podoba mi się: „Jestem pewien, że możemy sobie
poradzić

3

Jako menedżer, jeśli poproszę Cię o kodowanie jako test, najbardziej interesują mnie:

  • Czy umiesz pisać kod
  • Twój styl kodowania
  • Algorytm, który wybrałeś
  • Czy próba wskazuje, że zrozumiałeś problem?
  • Jeśli naprawdę lubię określoną technologię, to czy udowodniłeś, że mniej więcej ją znasz?

Pierwszy przedmiot może wydawać się szalony, ale byłbyś zaskoczony ...

Styl kodowania - mam na myśli nie tylko to, gdzie umieszczasz szelki, ale takie rzeczy jak:

  • Czy wybrałeś kompozycję lub dziedzictwo, aby rozwiązać ten problem? Dlaczego?
  • Dla tej wartości, dlaczego zdecydowałeś się użyć wyliczenia vs. ciąg znaków vs. int (lub cokolwiek permutacja ma zastosowanie)
  • Czy użyłeś właściwości, pól lub metod get / set dla tej wartości? Dlaczego?
  • Jak poradziłeś sobie ze stanem w swoich klasach?
  • Czy rozumiesz, jak działa dziedziczenie, interfejsy i lambdy?
  • Czy rozumiesz konwencje parametrów języka (co to jest wartość referencyjna vs. wartość?)
  • Czy wiesz jak pisać testy jednostkowe?

Oto, co naprawdę mnie nie obchodzi:

  • Że się kompiluje (zakładając, że właśnie dałem ci notatnik i brak kompilatora)
  • Że znasz z pamięci kolejność tych 2 parametrów w tej jednej funkcji
  • Że możesz recytować ciąg połączenia SQL Server lub Oracle na pamięć
  • Że potrafisz perfekcyjnie kodować, gdy stoję nad twoim ramieniem i obserwuję każdy błąd.

Szczerze mówiąc, nigdy nie byłem wielkim fanem testów kodowania - z wyjątkiem jako narzędzia do analizy stylu.


1
Nie jestem też fanem testów kodowania. Problemy z Project Euler to interesujące łamigłówki i świetny sposób na rozwijanie umiejętności rozwiązywania problemów. Ale jeśli piszesz głównie aplikacje CRUD, lepiej wiedzieć, czy kandydat wie, jak pisać dobre zapytania DB, a jeśli jesteś w świecie .NET, takim jak ja, jak prawidłowo używać rzeczy takich jak MVC, WCF, WPF i LINQ.
jfrankcarr 17.03.13

1
Dodałbym do tego komentarza, że ​​nawet semantyka nie ma znaczenia, a nie zrozumienie, jakie problemy rozwiązują te rzeczy oraz kiedy i gdzie mają znaczenie, i jakie mają wady.
Rig

@jfrankcarr - jak ustalić, czy ktoś może napisać sql bez jakiegoś testu?
JeffO

1
@JeffO - Ogólnie lubię to robić, rozmawiając o tym na podstawie ich CV lub na podstawie typowych scenariuszy. Na przykład „Czy używałeś zmiennych tabeli lub tabel tymczasowych w swoich zapytaniach?” lub „Jak zintegrowałeś starsze zapytania o dane w projekcie nowej aplikacji?” Mogę skorzystać z testów, jeśli zatrudniam młodszego programistę, który jest poza szkołą, ale wolę podejście oparte na otwartej rozmowie.
jfrankcarr

1

W takim przypadku dążenie do eleganckiego rozwiązania jest lepsze niż gorsze, ale kompletne rozwiązanie. Oba przypadki są dobre. Absolutnie dobrze jest zapisać pusdocode pokazujący, że rozumiesz problem i jak zamierzasz go rozwiązać, nawet jeśli nie miałeś czasu na napisanie kodu programu.


1

Myślę, że zadajesz pytanie, na które tak naprawdę nie ma odpowiedzi, a tym bardziej „właściwej” odpowiedzi. Mówię to dlatego, że zależy to całkowicie od tego, co osoba zadająca pytanie ceni.

Możliwe, że ankieter jest zapalonym pragmatykiem, który naprawdę chce zobaczyć, że coś szybko działa, a następnie zoptymalizować jako działanie o niższym priorytecie, jeśli masz czas. Równie możliwe jest, że osoba przeprowadzająca wywiad robi najlepsze wrażenie na temat praktyk rekrutacyjnych w Google i nie interesuje się niczym innym, niż najseksowniejszym, najbardziej eleganckim algorytmem i traktuje to jako oznakę słabości, jaką można by nazwać słowami „brutalny” i „ force ”w obrębie 5 słów od siebie. Jest również możliwe, że osoba przeprowadzająca wywiad przeszukała „pytania podczas rozmowy” i znalazła ten problem w Internecie na 5 minut przed twoim przybyciem i nie ma pojęcia, czego chce.

We wszystkich przypadkach najlepiej jest poprosić o wyjaśnienie, jeśli nie możesz wywnioskować na podstawie informacji kontekstowych, czego chce ankieter. Masz rację, że nie wszystkie pytania podczas rozmowy kwalifikacyjnej są uczciwe, a w rzeczywistości nie wszystkie z nich są dobrymi pytaniami lub nawet pytaniami, które mają sens. Wywiad jest z natury działaniem redukcjonistycznym, podobnie jak „szybkie randki”, w których spędzasz z kimś godzinę lub dwie, a twoja dwójka próbuje zgadnąć, na podstawie tej godziny, czy będzie dobrze współpracować przez następną godzinę 5 lat lub nie. Z tej perspektywy mam nadzieję, że wyjaśniono, dlaczego tak naprawdę nie ma odpowiedzi na pytanie dotyczące „reguły”.

Ktoś zadaje ci pytanie, które według nich da ci wgląd w twoje kompetencje i dopasowanie do ich zespołu. Musisz spojrzeć na ich zespół, to, co o nich wiesz, osobowość ankietera i dziesiątki innych czynników, i najlepiej zgadnąć, jakie odpowiedzi, podejście i proces będą prawdopodobnie cenić. Osobiście powiedziałbym, że powinieneś podejść do tego w sposób, który Twoim zdaniem jest najlepszym pomysłem. Jeśli nie zgadzają się z tobą, to i tak może nie być dobrym dopasowaniem - łatwiej to zrozumieć wcześniej niż później.


0

Ankieterzy i tak poprosą cię o ulepszenie twojego rozwiązania.

A podejście „najpierw brutalna siła” ma jedną niezaprzeczalną zaletę: jeśli nie uda ci się znaleźć idealnego rozwiązania, nadal masz coś ukończonego, aby je pokazać.


1
„Ankieterzy i tak poprosą cię o ulepszenie swojego rozwiązania.”. Wydaje mi się to hazardem.
Craige

1
@Craige: Nie bardzo. Ale jeśli tego nie poruszą. Powiedzmy, że jest to rozwiązanie brutalnej siły i dzięki analizie można je ulepszyć.
Martin York,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.