Obecnie szukam nowej pozycji jako programista Front-End. Bardzo dobrze znam JavaScript i potrafię poetycko nawiązywać do zamknięć, curry, dziedziczenia prototypów, wzorców projektowych, wydajności aplikacji i ogólnej architektury front-end. Ale wciąż wciąż bombarduję rozmowy kwalifikacyjne. (Do Twojej wiadomości większość zadań, z którymi rozmawiam, to budowanie SPA z jakimś szkieletem MVC)
Zwykle testy kodowania to małe fragmenty kodu rzeczy, z którymi nigdy nie spotkałem się profesjonalnie. Jak napisać funkcję, aby rozwiązać jakiś problem matematyczny. Oprócz odziedziczonej niezręczności związanej z próbą kodowania, gdy trzymasz telefon w jednej ręce i gdy nieznajomy widzi Twój ekran i obserwuje każdą wpisaną przez ciebie postać, po prostu zwykle nie widzę tego rodzaju rzeczy w prawdziwym świecie.
Czy to poważny zestaw umiejętności, których mi brakuje, czy też ankieterzy zadają mi nieistotne pytania. Chyba powinienem popracować nad funkcjonalnym programowaniem i algorytmami, ale nie znalazłem wielu dobrych zasobów w Internecie (ani w wersji drukowanej), jakieś sugestie?
źródło
Odpowiedzi:
Pisanie kodu to tylko część procesu rozmowy kwalifikacyjnej.
Właściwie rozwiązanie logicznego problemu jest tylko częścią zadania pisania kodu.
Ankieterzy chcą mieć pewność, że:
Możesz pisać kod. Wielu kandydatów z dziesięcioletnim doświadczeniem zawodowym w języku nie może w ogóle napisać żadnego kodu, a ten test ma na celu ich odrzucenie.
Myślisz o problemie przed napisaniem kodu. Wielu skakało po klawiaturze, pisało dziesiątki linii kodu, a potem stwierdzało, że źle zrozumieli pierwotny problem, ponieważ nie zastanawiali się nad tym.
Możesz się dostosować podczas pisania kodu. Powiedzmy, że znalazłeś rozwiązanie, ale kiedy zacząłeś je wdrażać, okazało się, że twój pierwszy pomysł nie był najlepszy; czy możesz szybko przejść na lepszy, ostatecznie refaktoryzując napisany kod?
Oznacza to również, że takie wywiady powinny być bardziej interaktywne . Zamiast pisać jedną ręką, kup zestaw głośnomówiący lub zadzwoń przez Skype i użyj zestawu słuchawkowego. Pisz podczas pisania w pracy, jednocześnie komentując i wyjaśniając, co robisz: nagle stanie się o wiele mniej niezręczne.
Czy wykonałeś programowanie w parach? Jeśli tak, sytuacja podczas rozmowy kwalifikacyjnej jest bardzo podobna, z wyjątkiem tego, że osoba przeprowadzająca wywiad może nie wyrazić swojej opinii i nie poprosisz go, aby po zakończeniu zmienił klawiaturę.
Oto kilka przykładów czysto matematycznego problemu i sposobu, w jaki pokazuje on niematematyczne umiejętności programisty.
Przykład 1: proste ćwiczenie kodowania
Tutaj ankieter chce, abyś pomyślał tak szybko, jak to możliwe, znalazł rozwiązanie i szybko je wdrożył. Takie ćwiczenie nie ma związku z tym, co robią prawdziwi programiści, i jest znacznie bliższe temu, co można znaleźć, zdobywając dyplom CS, ale ankieterom podobają się tego rodzaju rzeczy, więc zróbmy to. Ponadto ograniczenie czasowe uniemożliwia przeprowadzenie zautomatyzowanych testów, więc osoba przeprowadzająca wywiad prawdopodobnie tego nie oczekuje od ciebie.
„Opis algorytmu każe mi myśleć o rekurencji. Druga zasada prowadzi do następującej funkcji rekurencyjnej. ”
„Aby zakończyć rekurencję, dodamy specjalne przypadki, zastępując zestaw
fibonacci
funkcji.”"Gotowy."
Wniosek
Jak powiedziałem, takie ćwiczenie jest całkowicie niezwiązane z faktyczną pracą programisty. Czy to czyni to bez znaczenia? Nie bardzo, bo przynajmniej pokazuje, że osoba:
Potrafi myśleć o problemie. Niektórzy kandydaci zostaną całkowicie zagubieni i pod wpływem stresu zajmą więcej czasu niż tylko przydzielony czas, aby pomyśleć o możliwym sposobie rozwiązania problemu.
Zna rekurencję lub potrafi obejść rekurencję przez zwykłą pętlę. Później osoba przeprowadzająca wywiad może zapytać, czy istnieją sposoby wykorzystania / nieużytkowania rekurencji oraz jakie są zalety / wady rekurencji.
Zna podstawy języka programowania. Nie ma znaczenia, czy użyta osoba
switch
, klauzula ochronna, warunkowa czy słownik : w zależności od tła, różni kandydaci wybiorą różne narzędzia, aby osiągnąć to samo.Koncentruje się na problemie, nie wnosząc rzeczy takich jak testy jednostkowe, skalowalność lub wydajność. Ankieter może następnie zapytać, dlaczego pod względem wydajności powyższa funkcja jest okropna, oczekując od kandydata wyjaśnienia, co należy zrobić, aby doprowadzić wydajność do rozsądnego poziomu.
Przykład 2: trudne pytania
Teraz mamy ciekawe ograniczenie, które pokazuje, że ankieterowi tak naprawdę nie zależy na zdolności kandydata do rozwiązywania problemów, ale raczej na jego zdolności do odgadnięcia, które sposoby są szybsze niż inne.
Te trudne pytania zazwyczaj zapraszają do trudnych odpowiedzi. Tutaj, biorąc pod uwagę ograniczenia czasowe, nie ma możliwości dokonywania wielu wdrożeń, porównywania ich, profilowania najszybszego i dostarczania optymalnego rozwiązania.
Zamiast tego:
„Pozwól mi Google” Pierwsze liczby Fibonacciego ... To wygląda obiecująco. Za pomocą
prostegowyrażenia regularnego (byłby to oksymoron) możemy stworzyć listę wartości oddzieloną przecinkami. ”„Wreszcie sam program”.
Wniosek
Podchwytliwe pytania zapraszają do trudnych odpowiedzi. Nie bądź bohaterski i nie rozpoczynaj testów i profilowania, gdy masz tylko trzy minuty. Pomyśl o sprytnych sposobach rozwiązania problemu podczas korzystania z doświadczenia. Moje doświadczenie daje mi podpowiedź, że korzystanie z mapy może być szybsze niż obliczenie liczby. Może być źle, ale należy się spodziewać tej próby, biorąc pod uwagę ograniczenie czasowe.
Znajomość narzędzi pomaga i jest niezbędną częścią umiejętności programistycznych: bez znajomości wyrażeń regularnych spędziłbym przydzielone trzy minuty na googlingu na liście oddzielonej przecinkami, lub zacząłem pisać parser, który zbuduje potrzebną tablicę.
Pamiętaj, że dobry programista nie jest tym, który zaczyna kodowanie od razu, ale wie, jak uniknąć kodowania, gdy jest lepsza okazja. Niektórzy ankieterzy nie zawahają się nadać ci zadań, które wyglądają jak kodowanie, ale które prawie nie wymagają kodu.
Przykład 3: pełne opracowanie aplikacji
Zaczynajmy.
„Przykładowa sekwencja jest bardzo pomocna, ponieważ pozwoli mi przeprowadzić kilka testów jednostkowych, aby upewnić się, że moja implementacja nie wygląda zupełnie źle. Ogólnie używam Mocha dla node.js lub QUnit dla JavaScript po stronie klienta, ale tutaj, dla uproszczenia, po prostu rzucę kilka funkcji testowych. ”
„Zaczynam od tworzenia
index.htm
ifib.js
plików. Następnie wypełniamindex.htm
bardzo minimalistycznym i niezgodnym z W3C kodem (możemy wrócić do tego później, jeśli interesują Cię również moje umiejętności HTML). ”„Napiszmy teraz kod, który wywoła funkcję generatora Fibonacciego i wyświetli wyniki”.
„Czas uruchomić kod po raz pierwszy i ... to nie działa. Nic się nie dzieje. Czemu?"
„OK, zapomniałem
fibonacci.init();
na końcu. Dodałem go i nadal nic się nie dzieje, podczas gdy powinien przynajmniej wyświetlać komunikat w konsoli. Czekaj, racja, nie jestonclick
, aleclick
; Używam JQuery tak często, że zaczynam zapominać nazwy zdarzeń w zwykłym JavaScript. ”„Dodajmy testy”.
„Porównywanie tablic może być trudne, więc po prostu kopiuję i wklejam
Array.prototype.equals
kod z tej odpowiedzi ”.„Po uruchomieniu aplikacji wyświetla się:”
„Test nie powiódł się, co było wysoce oczekiwane, biorąc pod uwagę naszą faktyczną implementację (
return [1, 2, 3];
) sekwencji Fibonacciego. Czas to zmienić. ”„Z pierwotnego stwierdzenia sekwencja Fibonacciego zaczyna się od
[0, 1]
, więccompute
staje się:”„Umożliwia to zdanie pierwszego testu, a teraz możemy napisać drugi.”
„Nie udaje się, więc wracamy do niego
compute
i modyfikujemy”.„Teraz oba testy przeszły pomyślnie i nadszedł czas, aby przejść do przypadków innych niż krawędzie”.
„Wszystkie trzy testy przeszły teraz pomyślnie, z wyjątkiem tego, że wynik nie wygląda dobrze dla większych długości, takich jak 100. Aby uzyskać prawidłowe wyniki, powinniśmy użyć biblioteki o dowolnej precyzji . Są też rzeczy do poprawy. Na przykład konwencje nazewnictwa są czasami zbyt złe (co jest
fib
?). Kod JavaScript związany z HTML powinien również przejść do innego obiektu, a także kodu testowego. Ponadto nie testowałemcompute(0)
i nie sprawdzałem danych wejściowych. ”Wniosek
Przechodząc przez przykład, możesz zobaczyć interakcję oczekiwaną podczas wywiadu. Nie wszystko poszło gładko (popełniłem kilka błędów na początku, co doprowadziło mnie do zawstydzającej sytuacji, w której nic się nie dzieje po uruchomieniu aplikacji), a oryginalne podejście było kiepskie, jeśli musieliśmy obsługiwać dużą długość sekwencji, ale udało mi się pokazać że:
compute(0)
które zawiodą, ale nie ma to znaczenia dla wersji demo).Właśnie tego powinien oczekiwać od ciebie ankieter.
źródło