Wydaje się, że istnieje OGROMNA rozbieżność między tym, czego oczekuję od kogoś, kto studiował programowanie przez kilka lat na uniwersytecie, a tym, co się właściwie zna.
Nie mam ochoty zadawać zbyt skomplikowanych pytań w wywiadach. Niektóre z moich zwykłych pytań to:
Jaka jest różnica między typem odniesienia a typem wartości?
Jeśli wydaje się, że rozmówca tak naprawdę nie rozumie własnej odpowiedzi lub jeśli nie zna terminologii, której używam, wchodzę w więcej szczegółów, prosząc go o wyjaśnienie, co się dzieje, gdy piszę int i = 0; w metodzie, co z obiektem o = 0, obiektem o = nowa MyClass () itp.
Zasadniczo robię wszystko, co w mojej mocy, aby oszukać rozmówcę, aby powiedział mi o stosie wywołań, stosie itp., I staram się pozostać przy koncepcjach agnostycznych z językiem. Jeśli rozmówca powie mi, że zrobił dużo C, C ++ lub c #, nurkuję głębiej w konkretnym języku i prawdopodobnie w szczegółach implementacji.
W razie potrzeby pytam rozmówcę, co to jest stos wywołań lub gdzie przechowywane są argumenty przekazywane do funkcji w wybranym przez niego języku rozkazującym.
większość rozmówców nie ma pojęcia o tym, czym jest callstack, nie mówiąc już o boksie itp.
Jaka jest różnica między klasą abstrakcyjną a interfejsem. W jakich przypadkach należy stosować jeden na drugim?
Zwykle proszę również, aby wyobrazili sobie projekt małej biblioteki z przypadkiem użycia mającym na celu wykorzystanie pewnego dziedzictwa i niektórych abstrakcyjnych fabryk
Większość rozmówców nie ma pojęcia, jaki może być prawdziwy cel dziedziczenia. Zazwyczaj znają niektóre słowa kluczowe (wirtualne, zastępowanie itp.), Ale tak naprawdę nie wiedzą, kiedy ich użyć, nie mówiąc już o wyjaśnieniu, czym jest wirtualna tabela.
Mimo że wcześniej sprawdzam CV, nawet w przypadku osób z 5-letnim doświadczeniem w projektach z udziałem złożonych architektur, powiedziałbym, że mniej niż 25% wszystkich moich rozmówców może poprawnie odpowiedzieć na te dwa pytania. A kiedy mówię poprawnie, nie mam na myśli „dogłębnie” ... tylko po to, aby mieć przybliżone wyobrażenie o tym, czym jest ta koncepcja.
Jeśli chodzi o juniorów, nie mam nic przeciwko zatrudnieniu kogoś, kto nie wie, jak dobrze zorganizować swój czas, lub kogoś, kto nie jest przyzwyczajony do procesów budowy przemysłowej, ale mam wrażenie, że jeśli ktoś nie słyszał słowa „ callstack ”po kilku latach studiowania informatyki jest albo głupi, albo niemotywowany, albo wybrał swój uniwersytet bardzo niemądrze.
Myślisz, że jestem tu zbyt ekstremistką? Czy często uczyć się tych podstawowych po ukończeniu uniwersytetu? Czy znasz osoby, które nie były z nimi zaznajomione i po kilku latach stały się bardzo dobrymi inżynierami oprogramowania? I czy uważasz, że moja firma może mieć problem z przyciąganiem utalentowanych ludzi, czy może doświadczasz tego samego rodzaju problemów w procesie rekrutacji?
Edytować. jeśli chodzi o „typ natychmiastowy”, było to dosłowne tłumaczenie z francuskiego na angielski, jak zwykle przeprowadzamy nasze wywiady w języku francuskim. Naprawiłem to w swoim pytaniu. Ale nadal myślę, że wszyscy doskonale rozumiecie, co miałem na myśli, co to za punkt widzenia, prawda?
Odpowiedzi:
Terminologia jest częstym błędem w sytuacji wywiadu.
Zadajesz rozmówcy pytanie przy użyciu terminologii, która coś dla ciebie znaczy, ale rozmówca może znać to pod innym pojęciem lub po prostu znać ogólną teorię bez zastosowania w określonych językach lub środowiskach. Powstają nieporozumienia. Żadna ze stron nie jest szczęśliwa.
W rzeczywistości okazuje się, że rozmówca doskonale rozumie, że niektóre wartości mogą być przechowywane bezpośrednio w rejestrze, a inne odnoszą się do fragmentu pamięci w innym miejscu, ale ponieważ zadajesz pytanie w sposób określony przez domenę, chodzi o to, o co pytasz, i to, o czym chciałbyś, żeby rozmówca ci powiedział, tak naprawdę nie daje rady.
Może masz wiele sytuacji, w których osoba udzielająca wywiadu nagle klika i mówi „Och - o tym mówisz” - a następnie dość dokładnie wyjaśnia.
Jest to trudna równowaga, ponieważ programiści świeżo po studiach nie będą mieli zróżnicowanego doświadczenia, jakie zapewnia im rzeczywisty rozwój w środowisku zespołowym. Tymczasem doświadczeni programiści często nie pamiętają (ani nawet nie interesują się) wszystkimi rzeczami, których nauczyli się na uniwersytecie, ponieważ jest to po prostu nieistotne dla ich codziennego użytku.
Te dwa typy ludzi (tak - to osoba przeprowadzająca wywiad i osoba przeprowadzająca wywiad) muszą nauczyć się, jak się ze sobą komunikować, zanim będzie można się dowiedzieć o sobie nawzajem. Ciężar spoczywa na osobie z większym doświadczeniem (ankieterze), aby upewnić się, że tak się stanie.
Nie wspominając już o tym, że niektórzy ludzie doświadczają całkowitej awarii pamięci w wywiadach. Ja wliczony w cenę. Pamiętam, że zostałem poproszony o napisanie programu w C i przez całe życie nie mogłem sobie przypomnieć symbolu używanego do uzyskiwania dostępu do członka za pomocą wskaźnika (->) i musiałem kogoś zapytać. To nie było nawet dla mojej pierwszej pracy. Chłopak nękał mnie ten moment przez ostatnie 15 lat :-)
Moim zdaniem, o wiele bardziej przydatna jest umiejętność komunikowania się, umiejętność skutecznego i pełnego rozwiązywania problemów; podnosić rzeczy szybko; okazywać pozytywne nastawienie; dobrze współdziałać z innymi ludźmi i innymi podstawowymi wartościami.
Nie poddawaj się rozmówcom, ponieważ nie wiedzą, jaki jest typ bezpośredni. Pójść dalej.
źródło
Pytasz o znajomość języka, a używane terminy nie są w 100% takie same we wszystkich językach. Ja - na przykład - nie mam pojęcia, co to jest „typ natychmiastowy”.
Weź również pod uwagę, że nauczanie na uniwersytecie nie polega na tym, jak wykopać standardowy kod w X, ale nauczyłem się wielu podstawowych pojęć i widziałem różne paradygmaty programowania. Innymi słowy, jest bardzo podobny do prawa jazdy - mimo że znasz podstawową teorię, wciąż potrzebujesz dużo praktyki.
źródło
„Słyszę i zapominam. Widzę i pamiętam. Rozumiem i rozumiem”. (I moim zdaniem zrozumienie prowadzi do lepszego przechowywania pamięci).
Mówiąc najprościej, niedawny absolwent nie ma dużego doświadczenia, więc jak zauważył ktoś inny, nie będzie miał o wiele więcej niż minimum wiedzy, bez względu na to, jaki jest ich „wybrany” język.
Poszedłem do college'u, który został zaprojektowany specjalnie w celu usprawnienia nauki o wybranej przez siebie specjalności (więc na przykład nie miałbyś literatury historycznej, gdybyś był studentem CS; najbliższą dostępną literaturą historyczną jest Science Fiction), i zaraz po studiach nie byłbym w stanie powiedzieć wam, czym był interfejs, nie mówiąc już o jego różnicy w porównaniu z klasą abstrakcyjną, chociaż nauczyliśmy się o abstrakcji (i interfejsach jest pełno w .Net, technologii, której się nauczyłem). Mogliśmy dotknąć interfejsów, ale zagubiliśmy się we wszystkich innych rzeczach, które musieliśmy wiedzieć, aby zaliczyć klasę. Dopiero po mojej pierwszej pracy po studiach dowiedziałem się o interfejsach, szczególnie w jakikolwiek znaczący sposób.
Wspomniałeś o przeprowadzaniu wywiadów w języku francuskim, co pokazuje, że jesteśmy w różnych krajach, więc twój przebieg może być różny, ale tutaj, w Stanach Zjednoczonych, uczelnie notorycznie opóźniają się, jeśli chodzi o technologię. Dlatego, chyba że masz do czynienia z dojrzałymi językami (C / C ++, COBOL itp.), Jest również całkiem prawdopodobne, że to, czego używasz nawet przez lata, może nie być dostępne w wersji, której nauczyli się studenci. Na przykład .Net 3.0 wprowadził Entity Framework, WPF, WCF i wiele innych fajnych rzeczy, ale nawet moja szkoła wciąż utknęła w .Net 1.1 i 2.0 (co oznaczało, że utknąłem w ADO.NET i nawet nie uczyłem się o Object -Relational Relation). Szkoła korzystająca z PHP może utknąć na (innym niż OOP) PHP 4.
Pamiętaj też, że uczeń musi zebrać mnóstwo informacji, które są często używane tylko przez krótki czas. Koncepcje „zaawansowane”, takie jak abstrakcja, są często nauczane pod koniec klasy, gdzie uczeń może mieć tylko tydzień na zabawę, walcząc z innymi klasami, które musi wziąć i być może szczyt pracy w niepełnym lub pełnym wymiarze godzin. Połącz je wszystkie i to cud, że osoba może wszystko zapamiętać , a tym bardziej utrzymać wszystko w porządku.
Przynajmniej w Stanach Zjednoczonych zakłada się, że niedawna ocena nie wie nic poza podstawowymi podstawami (być może różnica między przekazywaniem wartości a przekazywaniem referencji), ponieważ rozumie się, że teoria ogólna i rozwiązywanie problemów jest główną częścią szkoła, nie uczy się tajników danego języka.
Zalecam używanie pytań, które miałeś więcej, jako miernika tego, czego będziesz musiał uczyć / ponownie uczyć (pamiętaj, jest całkiem możliwe, że po prostu nie nauczyli się terminu , którego próbujesz użyć, nawet jeśli uważasz, że jest to wszechobecne), w przeciwieństwie do tego, czy rozmówca jest „bezwartościowy”. Połącz to ze sprawdzeniem, jak chętni są się uczyć i jakie są ich ogólne umiejętności rozwiązywania problemów (poważnie, daj im zagadkę do rozwiązania i zobacz, jak sobie radzą), a możesz bardzo dobrze mieć przyszłą gwiazdę rocka, którą ty mogło minąć, ponieważ nie wiedzieli, co masz na myśli przez „callstack”.
źródło
Masz dość wąskie poglądy i zakładasz je domyślnie.
Według mojej wiedzy nie ma uniwersytetu, w którym ludzie studiują programowanie przez kilka lat. Uniwersytety oferują kursy informatyki, których jednym z aspektów jest programowanie.
Ogólna zasada: jeśli Lisp poradzi sobie bez rozróżnienia, to tylko bałagan;)
Mówienie o pojęciach niezależnych od języka jest dobrym pomysłem. Ani stos, ani stos nie są jednak zależne od języka.
Wszystkie te języki mają specyfikacje. Implementacja jest niezdefiniowana przez język. C i C ++ mogą być kompilowane krzyżowo przy użyciu LLVM do uruchamiania w programie Flash Player lub dowolnym środowisku wykonawczym JavaScript. To powoduje, że twoje założenia dotyczące alokacji stosów i stosów stają się nieważne.
Z C # jest prawie tak samo. C # jest JITowany przed wykonaniem z dużą optymalizacją, którą można wykonać. Zmienne lokalne, które są przechwytywane przez zamknięcia, ostatecznie staną na stosie, zamiast na stosie, podczas gdy analiza ucieczki pozwala na przechowywanie obiektów lokalnych o zasięgu (które zwykle powinny przechodzić na stos) do przechowywania na stosie. Właściwa alokacja rejestru znacznie zmniejszy również potrzebę alokacji stosu.
O co zapytałbyś kogoś, kto ma tylko bogate doświadczenie programistyczne w Haskell? : P
Podstawową ideą stojącą za autoboxingiem jest to, że prymitywy można również traktować jako obiekty (lub przynajmniej wartości, których typ można wykryć w czasie wykonywania). W odniesieniu do tej abstrakcji istnieją trzy rodzaje języków:
Nie rozumiem, dlaczego ludzie nie powinni używać języków kategorii 1 (tak naprawdę to dobry pomysł). Nie rozumiem, dlaczego ludzie, którzy używają języków kategorii 2, powinni się tym przejmować. I myślę, że każdy, kto używa języka kategorii 3, tj. Takiego, w którym podstawowa funkcja semantyczna jest po prostu zepsuta, używa niewłaściwego języka.
To jest bardzo subiektywne i naprawdę zależy od języka. C ++ nie ma interfejsów. Cel C nie ma klas abstrakcyjnych. Twierdziłbym, że każdy język, który ma oba, wymaga poważnego przeprojektowania. Wiele współczesnych języków używa cech, miksów, kategorii, ról i podobnych konstrukcji w celu zapewnienia znacznie czystszych rozwiązań w zakresie ponownego wykorzystania kodu niż dziedziczenia częściowych implementacji. Języki oparte na prototypach i tak nie mają klas.
Ostatecznie jest to trudny i kwestionowany temat. Rozmowa kwalifikacyjna nie jest właściwym miejscem do rozwiązania tego pytania i tak naprawdę nie dałbym rady nikomu ubiegając się o stanowisko młodsze, ponieważ nie dał mi dobrej odpowiedzi.
Istnieje wiele języków obiektowych, które nie używają dziedziczenia ani klasycznych vtables.
Moja rada:
Ważne jest zrozumienie, w jaki sposób te proste i izolowane fakty można zastosować do projektowania elastycznych i łatwych do utrzymania rozwiązań złożonych problemów.
Aby przejść do prawdziwego pytania:
Wszystkie firmy mają problemy z przyciąganiem zręcznych ludzi, z wyjątkiem być może dużych graczy. To dlatego, że jest ich niewiele. I z powodu założenia uniwersytet czyni ludzi umiejętnościami. Tak nie jest. Dzięki temu są kompetentni (zakładając, że zarówno student, jak i uniwersytet wytrzymają swoją część umowy). Doświadczenie czyni ludzi umiejętnymi.
Jest kilka osób, które zebrały doświadczenie przed podjęciem studiów i kontynuują je podczas studiów. Ponieważ lubią programować i ponieważ, gdy na kursie wpadną na jakiś nowy pomysł, postarają się przekonać, w jaki sposób mogą go wykorzystać, a przede wszystkim wrócą do domu. To ludzie, których chciałbyś zatrudnić. Ale jest ich niewiele.
To pasja programowania i samodoskonalenia oraz jego dążenie sprawiają, że programiści są dobrzy. W samą porę.
Myślę, że musisz zdać sobie sprawę, że niestety większość ludzi wejdzie na uniwersytet i opuści go bez wystarczającego doświadczenia w programowaniu.
Jednocześnie nasza branża bardzo potrzebuje doświadczonych programistów. Dlatego uważam, że misją naszej branży jest próba wkroczenia. A przeprowadzając wywiady z kandydatami na stanowiska młodsze, realistycznie szukasz osób chętnych do nauki i doskonalenia się. I powinieneś wybrać ostrożnie, ponieważ będziesz musiał zainwestować dużo energii i nie chcesz, aby to się marnowało.
Pomyśl o tym jak o wynajęciu świeżej krwi, aby zostać kierowcą dla swojego zespołu wyścigowego: Dobry kierowca ma wystarczającą wiedzę na temat mechaniki, aby jak najlepiej wykorzystać swój samochód, ale sama ta wiedza nie ma sensu (nie jest to nawet głowa początek). To, czego szukasz, to ktoś chętny do ciężkiej pracy nad własnym ulepszeniem i dobrze ze swoim zespołem.
źródło
Niezależnie od terminu „typu bezpośredniego”, o którym nie mam pojęcia (typ wartości? OK, nie byłem pewien, dziękuję za aktualizację), myślę, że masz rację co do swoich pytań i całkowicie nie jesteś ekstremistą. To są pytania, na które można odpowiedzieć, jeśli ktoś zaraz wychodzi ze szkoły. Mimo to nie od razu zwolnię kandydatów, wciąż są tacy, którzy mogą mieć potencjał, ponieważ chcą się uczyć.
Kontynuacja analogii prawa jazdy: niektórym ludziom nie zależy na tym, co się stanie po włożeniu klucza (lub naciśnięciu przycisku „Start”). Po prostu to robią i jeżdżą. To nie znaczy, że oni też są bezwartościowi, po prostu, że zajmie im trochę czasu;
Tylko osobista uwaga na temat stopnia / dyplomu: Obecnie pracuję z osobami z biochemią i doświadczeniem przemysłowym, które mają kilkuletnie doświadczenie w branży IT, a także z niektórymi „doświadczonymi” facetami z wykształceniem CS, i zgadnij, kto jest najbardziej kompetentny jak działa silnik pojazdu? Tak, to nie ludzie, którzy studiowali CS! Po prostu doświadczam faktu, że dyplom nie zawsze ma znaczenie!
źródło
Zasadniczo nie zadaję szczegółowych pytań na temat terminologii lub definicji podczas wywiadów. Jak zauważyły inne odpowiedzi, ludzie mają różne terminy dla różnych pojęć i chociaż mogą koncepcyjnie zrozumieć ten temat, mogą nie być w stanie ci tego przekazać.
W Juniors intensywnie koncentruję się na stażach i projektach szkolnych. Zadaję pytania na ich temat, pozwól im sformułować odpowiedzi, a następnie zacznę głębiej zanurzyć się w faktyczne zaangażowanie w projekt, czego się nauczyli, co poczuli.
Zasadniczo, jeśli dana osoba była w projekcie martwa, to nie może ogólnie dać mi satysfakcjonujących odpowiedzi, więc zazwyczaj jest dość łatwo powiedzieć. Uważaj tylko, aby nie pomylić nerwowego i zamkniętego w sobie intencji z bezinteresownością i zaangażowaniem.
Określenie dobrego kandydata, który jest nieśmiały i zamknięty w sobie, jest trochę trudne, ale kultura, w której pracuję, nie byłaby dobra dla introwertycznego i nieśmiałego programisty, więc jeśli nie będą w stanie przeprowadzić szczegółowej szczegółowej rozmowy ze mną, nie są dobrze dopasowane.
źródło
To bardzo niesprawiedliwe. Gdy jesteś studentem, możesz wybrać najwyżej oceniany uniwersytet, do którego dostaniesz swoje stopnie, a może ten, który reklamuje się, pozwalając ci grać z robotami w piłce nożnej. Nic więcej. Kurs uniwersytecki można ocenić dopiero po jego ukończeniu, po czym odszedł i pracował przez kilka lat w przemyśle i zbudował kilka niebanalnych projektów.
Nawet jeśli na każdym takim kursie pojawił się wielki neon, który brzmiał: „NIE UCZYMY STAŁU WEZWANIA”, to czego oczekujesz od uczniów? Spędzasz miesiące badając go, aby naprawdę mogli zrozumieć, co to znaczy i ile potrzebowaliby takiego, który go uczy? Dla każdego kursu z każdą kombinacją znaków?
Realistycznie ludzie nie wybierają swojej edukacji.
źródło
Podczas wywiadów z nowymi absolwentami trzymam się tematów wymienionych w ich CV. Jeśli użyli Java, zapytam ich o Javę. Jeśli użyli Bluba, spędzam pół godziny, czytając o Blubie i pytając ich o to. Ale zawsze pytam za pomocą słów kluczowych języka. Jeśli jest to Java, zapytam o „rozszerzenia” i „implementuje”, ale nie „podklasę” i „dziedziczenie”. Oczekuję, że nowi absolwenci będą w stanie porozmawiać o napisanym przez siebie kodzie, rozwiązać prosty problem programistyczny i mieć podstawową strukturę danych (tabele skrótów i drzewa).
źródło
Jako dyrektor, który zaprojektował proces rozmowy kwalifikacyjnej, mogę podać ci, czego nasza firma oczekuje od nowych stopni: oczekuję ludzi, którzy potrafią czytać dokumentację i stosować wiedzę. Tak więc mamy kilka bardzo praktycznych zadań, które prosimy o wykonanie. Są to proste zadania kodowania, niewiele trudniejsze niż przeciętne ćwiczenia na studiach (doświadczeni „dobrzy” programiści mogą to znokautować w około 15 minut). Kandydat otrzymuje stację roboczą z dostępem do Internetu, kompilatorem (w naszym przypadku studio wizualne) i plikami pomocy.
Jeśli nie mogą napisać kodu w tych warunkach, nie otrzymują wynagrodzenia za wynajem. Proste. Cała wymówka „no cóż, nie znam języka” tak naprawdę nigdy mi nie przeszkadzała, ponieważ każdy kandydat, który przychodzi na rozmowę, wie, że będzie test, zna języki i narzędzia, których używamy z góry. Możesz pobrać Visual Studio Express w domu i zrobić kilka podstawowych rzeczy przed wejściem i zdać test poziomu podstawowego, tych, którzy nie zawracają sobie głowy ... Cóż, to nazywam czerwoną flagą.
źródło