Jeśli twój algorytm jest poprawny, czy ma to znaczenie, ile czasu zajęło mu napisanie go? [Zamknięte]


11

Niedawno dowiedziałem się, że Facebook miał wyzwanie programistyczne, które po prawidłowym ukończeniu automatycznie powoduje rozmowę telefoniczną.

Istnieje przykładowe wyzwanie, w którym należy napisać algorytm, który może rozwiązać problem typu Wieża Hanoi . Biorąc pod uwagę liczbę kołków i dysków, początkową i końcową konfigurację; Twój algorytm musi określić jak najmniej kroków, aby dojść do ostatecznej konfiguracji i wygenerować kroki.

To przykładowe wyzwanie daje ci 45-minutowy limit czasu, ale pozwala ci nadal przetestować kod, aby sprawdzić, czy upłynie on po wygaśnięciu limitu czasu.

Nie wiedziałem o żadnym uroczym rozwiązaniu matematycznym, które mogłoby go rozwiązać, i nie chciałem szukać takiego, ponieważ uważam, że byłoby to oszustwo. Starałem się więc rozwiązać to wyzwanie najlepiej, jak mogłem.

Byłem w stanie stworzyć algorytm, który zadziałał i przeszedł. Jednak zajęło mi to ponad 4 godziny, znacznie dłużej niż 45 minut. Ponieważ zajęło mi to znacznie więcej czasu niż mi przydzielono, nie podjąłem rzeczywistego wyzwania.

Zastanawiam się jednak, czy w rzeczywistości to naprawdę ważne, że zajęło mi to tak długo? Mam na myśli to, że jest to znak, że nie będę w stanie znaleźć pracy w takim miejscu (nie tylko Facebook, ale Google, Fog Creek itp.) I muszę obniżyć swoje aspiracje, czy też fakt, że faktycznie zdałem przy mojej pierwszej próbie, mimo że zajęło to zbyt długo, aby być uznanym za dobry?


12
To miało znaczenie - czy to dla ciebie wystarczające?

2
Dlaczego uważasz, że brak pracy dla dużej nazwy .com oznacza, że ​​obniżasz swoje aspiracje?
mouviciel,

@mouviciel Nie chodziło mi o obniżenie moich aspiracji do pracy z dużą nazwą .com, ale bardziej o pracę w firmie, w której programowanie jest podstawową rolą, a nie o pracę w firmie, która robi coś innego, jak sprzedaż detaliczna, w której nikt nie rozumie, co robisz.
JD Isaacks,

5
Oprogramowanie LOL at Fog Creek jest dołączone do Facebooka i Google.
georgiecasey

Odpowiedzi:


42

W praktyce nie ma znaczenia, jak długo to zajmie. Problem, który może rozwiązać problem w 45 minut, jest - wszystko inne równy - pięć razy bardziej produktywny niż taki, który zajmuje 4 godziny, a zatem jest bardziej atrakcyjny dla pracodawcy.

To powiedziawszy, nie mówisz, dlaczego zajęłeś cztery godziny, aby rozwiązać ten problem.

  • Czy byłeś w najlepszym wydaniu (dobrze odżywiony, nie zmęczony, w pełni skoncentrowany)?
  • Czy problem został dobrze określony, czy sam musiałeś przeprowadzić dodatkowe badania?
  • Czy musiałeś nauczyć się nowych rzeczy, aby to zrobić?
  • Czy narzędzia były znane, czy nie?
  • itp.

Każda z tych rzeczy może mieć wpływ na czas, który ci zajmuje, a właściwie ważniejsze jest, aby móc rozwiązać problem pod presją, bez mówienia wszystkiego i przy pomocy dostępnych narzędzi, ponieważ BĘDZIE to miało miejsce podczas twojej kariery i zwykle jest to moment, w którym bardzo ważne jest dla kogoś, czy odniesiesz sukces, czy nie.


Dziękuję za odpowiedź. Aby odpowiedzieć na pytanie, dlaczego zajęło mi to długo, po części dlatego, że miałem trochę problemów ze zrozumieniem, co tak naprawdę powinienem zrobić, kiedy zrozumiałem tę część, wciąż musiałem pomyśleć, aby wymyślić jakiś plan. Na przykład, jeśli dysk blokuje dysk, chcę go przenieść i najpierw muszę go przenieść, gdzie mam go przenieść. Właściwie część programistyczna była najkrótsza, ale wszystko to wydłużyło czas.
JD Isaacks,

@JohnIsaacks Problem polegał na tym, że nie znasz Towers of Hanoi. Większość programistów, których znam, została wprowadzona, gdy uczy się ich o rekurencji (każdy ruch dysku jest w zasadzie „przenieś dysk nade mną do wolnego kołka”, który ładnie odwzorowuje rekursję). Czy otrzymałeś formalne wykształcenie, a jeśli tak, to na jakim poziomie?

@ ThorbjørnRavnAndersen, nie nauczyłem się żadnego programowania w szkole. Jestem samoukiem, uczyłem się w pracy, przez książki, eksperymenty itp. Nie byłem zaznajomiony z grą (oprócz pamiętania podobnej gry granej na planecie małp), musiałem Google, aby wiedzieć, że to była o nazwie „Wieże Hanoi”. Rozumiem rekurencję (przynajmniej tak mi się wydaje) i wykorzystałem ją tutaj. Ale samo rozwiązanie zagadki byłoby dla mnie znacznie łatwiejsze, trudniejsze było: „Jaki wzór da za każdym razem najmniejszą możliwą liczbę ruchów”.
JD Isaacks,

Programowanie @JohnIsaacks jest bardzo podobne do gry na pianinie - możesz samemu dobrze sobie radzić, ale aby być naprawdę dobrym, musisz nauczyć się, jak robić to dobrze przez doświadczonego nauczyciela. Czy możesz opracować sposób rozwiązania zagadki, ale trudno ci znaleźć „optymalną” część?

Mógłbym wykonać funkcję rekurencyjną, która przesuwa element na miejsce, przesuwa dowolny blokujący element na bok, a następnie zaczyna od następnego elementu. Zaczynając od największego kawałka i kończąc na ostatnim najmniejszym kawałku. Część „czy to optymalna” pochodzi z ruchu elementu blokującego. W zależności od tego, gdzie go przenosisz, może tworzyć dodatkowe niepotrzebne kroki. Na przykład przeniesienie 1 na 3 spowoduje zablokowanie 3 i będzie trzeba go ponownie odsunąć, gdy nadejdzie czas na przesunięcie 3, ale w zależności od bieżącej konfiguracji może nie być to niemożliwe.
JD Isaacks,

13

Ma to znaczenie dla firmy, która szuka ogólnych programistów z dobrym przepływem środków pieniężnych , ponieważ szybsze oznacza więcej pracy. Jednak w wielu innych przypadkach (w rzeczywistości twierdziłbym w większości przypadków), nie ma to znaczenia tak bardzo, jak twoja umiejętność rozwiązywania problemów i umiejętność ich rozwiązywania .

Mogę wymyślić pięć różnych rodzajów rozwiązań problemów:

Ci, którzy...

  1. ... może szybko rozwiązać problemy dzięki czystemu i wydajnemu rozwiązaniu.
  2. ... potrafi szybko rozwiązać problemy , ale z brudnym i nieefektywnym rozwiązaniem.
  3. ... może rozwiązywać problemy powoli , ale w końcu daje czyste i wydajne rozwiązanie.
  4. ... może rozwiązywać problemy powoli , ale kończy się brudnym i nieefektywnym rozwiązaniem.
  5. ... nie może rozwiązać problemów ani szybko, ani powoli.

Test w stylu Facebooka wyraźnie eliminuje kandydatów nr 3, 4 i 5, ponieważ wiąże się to z ograniczeniem czasowym, dlatego wiemy, że ten test jest przeznaczony dla pracodawców, którzy ustalili, że powinni zatrudnić tylko kandydatów nr 1 lub ewentualnie 2 ( w zależności od dalszego badania).

Kilka przykładów:

  • Pracodawca taki jak Facebook może szukać tylko programistów nr 1 , ponieważ mogą sobie pozwolić na ogromne wynagrodzenie dla programistów z gwiazdami.
  • Pracodawca, który ma dużą sprzedaż jednorazową (jak niektóre sklepy z projektowaniem stron internetowych), może chcieć tylko dewelopera nr 2 , który jest tańszy niż równie skuteczny deweloper nr 1.
  • Pracodawca, który ma wyspecjalizowaną domenę problemową (taką jak pisanie oprogramowania do zaciągania pożyczek), może zaakceptować programistę nr 3 w stosunku do programisty nr 1 , ponieważ genialny programista podwójnego stopnia może być bardzo drogi lub może być trudny do znalezienia.
  • Pracodawca, który z różnych powodów nie dba o to lub ma ograniczony budżet, może być w porządku z deweloperem nr 4 .
  • 5 deweloperów zostaje zatrudnionych przez firmy, które nie wiedzą, czego szukają i nie sprawdzają kandydatów.

5

Wieża Hanoi? To było jedno z pierwszych zadań programistycznych, jakie miałem na studiach pierwszego roku na uniwersytecie (zaraz po Fibonacci - tak, miałem zajęcia z jednym z tych funkcjonalnych maniaków programowania :). I nawet nie jestem informatyką, jestem inżynierem informatyki.

Mimo to większość tak zwanych „programistów” nie potrafi poprawnie napisać tego rodzaju algorytmu, ponieważ większość programistów jest okropna. (wyszukaj Fizzbuzz dla dodatkowej zabawy)

W każdym razie, kiedy przekroczysz pewien próg, myślę, że twoje umiejętności programistyczne nie mają tak dużego znaczenia, jak twoja zdolność do kończenia projektów, twoja odporność na trudności itp. I wydaje się, że na pewno przekroczyłeś ten próg.

Facebook chce zatrudnić najlepszych deweloperów, jasne, ale nie wiem, ile z nich ma nadzieję uzyskać przy tego rodzaju grach. Myślę, że po prostu nie chcą tracić czasu z okropnie złymi programistami.

Wskazówka, którą zawsze słyszę, to to, że jeśli chcesz zostać zatrudniony przez fajną firmę technologiczną, spróbuj zaangażować się w projekty open source. Spróbuj także zdobyć staż.


3

Przy dużej podaży (wielu potencjalnych programistów) i niewielkim popycie (kilka zadań programistycznych) pracodawcy mogą być tak wymagający, jak tylko chcą. W rzeczywistości muszą być wymagający, inaczej spędziliby nadmierną ilość czasu na przeprowadzaniu wywiadów z ludźmi zamiast wykonywania jakiejkolwiek pracy. Dają więc kandydatom wyjątkowo ciężkie testy, aby jak najszybciej uzyskać krótką listę i upewnić się, że będą przeprowadzać wywiady z ludźmi, którzy są nie tylko dobrzy, nie bardzo dobrzy, ale w rzeczywistości charyzmatyczni .

Zatem fakt, że nie ukończyłeś testu w wyznaczonym czasie, nie oznacza, że ​​jesteś złym programistą; po prostu nie pasujesz do definicji tego, co Facebook uważa za charyzmatyczny. Moim zdaniem jest w porządku.


0

Czas ma znaczenie, ale nie rozumiem, że jesteś głupi, jeśli zajmuje ci to więcej czasu. Wiele osób ma rzeczy „zapamiętane”. Ćwiczą stosowanie technik takich jak rekurencja tak bardzo, że staje się to naturą 2CD. Nie chodzi o to, że są mądrzejsi, po prostu ćwiczyli do rzeczy 2cd i ty też możesz!

Rozważ następujący problem matematyczny: 2 + 2 =?

Jeśli od razu wiedziałeś, że odpowiedź brzmi 4, to nie dlatego, że jesteś sprytny, ale dlatego, że to natura 2cd. Dziecko uczące się dodawać może zostać zmuszone do wykonania najbardziej podstawowych operacji liczenia, aby uzyskać odpowiedź. Ale to dziecko może potencjalnie przewyższyć dorosłego.


-1

Ludzie tak naprawdę nie dbają o to, ile czasu spędzasz na robieniu czegoś; po prostu dotrzymuj swoich terminów i wszystko jest w porządku.


7
Kiedy więc upłynie „45 minut od teraz” i skończysz cztery godziny później, ludzie się tym przejmują.

1
Mehrdad oznacza, że ​​możesz pracować w nadgodzinach, aby dotrzymać terminów: D
quant_dev,

1
Jeśli musisz pracować w nadgodzinach, aby robić rzeczy, na które inni deweloperzy nie potrzebowaliby nadgodzin - nie masz żadnych przystanków, aby się wycofać, gdy
kupa

-1

Jest dość napięty, wymagałoby to przeczytania o tym, czym jest wieża Hanoi -15min, uruchomienia IDE, stworzenia pustego rozwiązania -5min, więc to tylko 25 minut na rozwiązanie problemu. Po prostu napisanie kodu z wszystkimi instalacjami wodnymi, takimi jak bezpieczne klasy z dobrym projektem interfejsu, również wymagałoby czasu - 10 minut, więc na sam pomysł pozostało 15 minut. W zależności od wieży na Hanoi może to wystarczyć, ale może nie być. Czasami muszę po prostu pozwolić, aby problem sam się rozwiązał, gdy pracuję nad innymi problemami, ponieważ nie widzę rozwiązania na miejscu. Więc rozwiązuje się za darmo w równoległym wątku, ale nie dzieje się to natychmiast.

W każdym razie jest to jedna z największych firm, więc mogą robić, co chcą. Ale limit czasu jest jednym z najgorszych czynników w wywiadach IMHO, zawsze czuję się naciskany, popędzony, nie mogę zrobić wszystkiego czystego i nie mogę skoncentrować się na wszystkich szczegółach, które są bardzo ważne podczas faktycznej pracy. :) Pewnie, że możesz szybko rozwiązywać rozwiązania, na przykład ustawić dostęp do administratora, aby wszystko działało + 'SELECT * FROM pass WHERE usr == ' + user_input, ale dla każdego bezpiecznego i dobrze napisanego zadania, z którego byłbym dumny, potrzebowałbym trochę czasu, a 45 minut jest naprawdę dość intensywne.


1
Myślę, że chcą ludzi, którzy po prostu pamiętają, co to jest problem z Wieżą Hanoi (to klasyk).
quant_dev,

Uruchomienie IDE i utworzenie pustego projektu zajmuje pięć minut? Jeśli jeszcze nie znasz Towers Of Hanoi, przynajmniej zrób je w odwrotnej kolejności, aby IDE ładowało się (z maszyny wirtualnej najwyraźniej przez Internet) podczas badań!
Bryan Boettcher

W takim teście niekoniecznie szukają „dobrego projektu interfejsu” i „hydrauliki” - oczekiwałbym, że chcą zobaczyć twoje zrozumienie problemu i umiejętność stworzenia algorytmu do jego rozwiązania. Jeśli język nie byłby ograniczeniem, używanie czegoś takiego jak Java i Eclipse jest ostatnią rzeczą, którą bym zrobił. Używałbym Pythona i minimalnego edytora tekstu / kompaktowego IDE. (Nie mówię, że sam korzystasz z Javy; po prostu mówisz ...)
Occulus,
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.