Oryginalne pytanie
Przeprowadziłem już kilka wywiadów dla mojej firmy, głównie informatyków na stanowiska deweloperów, ale także niektórych testerów i kierowników projektów. Teraz muszę wypełnić wolne miejsce w naszej grupie badawczej w dziale badawczo-rozwojowym (uwaga: „badania” oznaczają, że staramy się rozwiązywać problemy w naszej dziedzinie zawodowej / niszy rynkowej za pomocą oprogramowania w projektach badawczych wraz z uniwersytetami, innymi firmami, ośrodkami badawczymi i organizacje użytkowników końcowych. To nie są badania informatyczne; nie rozwiążemy problemu P = NP).
Teraz zaprosiliśmy faceta posiadającego tytuł magistra chemii (z dużą ilością fizyki w swoim CV), który nigdy nie miał żadnej lekcji informatyki. Rozmawiałem już z nim przez około pół godziny w dniach kariery na lokalnym uniwersytecie i nie ma wątpliwości, że facet jest mądry. Również jego oceny są doskonałe i ukończył z wyróżnieniem. Aby uzyskać tytuł licencjata, musiał nauczyć się programowania w Mathematica i powiedział mi prawdopodobnie, że bardzo lubi programowanie. Rozwiązał także problem chemii fizycznej, którego prawdopodobnie nie rozumiem, używając własnego oprogramowania, zaimplementowanego w Mathematica, do pracy magisterskiej. Zawiera GUI i godną uwagi wielkość 8000 LoC. Wydaje się, że bardzo go pociąga to, co robimy w naszej grupie badawczej, i szczerze mówiąc, dla takiego MŚP jak my trudno jest znaleźć dobrych ludzi. Jestem również bardzo zainteresowany zatrudnieniem go, ponieważ może mi pomóc w pisaniu propozycji projektów, raportów, prezentacji i tak dalej. Prawdopodobnie pasowałby również do naszego zespołu.
Pozostaje tylko pytanie: jak mogę sprawdzić, czy zdobędzie umiejętności programistyczne potrzebne do wdrożenia oprogramowania w naszych projektach, ponieważ będzie to znacząca część pracy?
Oczywiście zapytam go, co to jest, fascynuje go w programowaniu. Zapytam także, jak napisał swoje oprogramowanie do nauk przyrodniczych i jak je zbudował. Zapytam o to, jak udało mu się zdobyć umiejętności i informacje na temat potrzebnego mu oprogramowania. Ale czy jest coś jeszcze, o co mogę zapytać? Może coś bardziej konkretnego? Czy powinienem poprosić go o wyjaśnienie rozwiązania Mathematica?
Żeby było jasne: nie szukam wiedzy w określonym języku lub stosie technologii. Jesteśmy sklepem .NET w zakresie opracowywania produktów, ale chcę mieć swobodny wybór dla naszych projektów badawczych. Interesuje mnie zatem to, że meta-kompetencja jest w stanie nauczyć się wszystkiego, co jest rzeczywiście potrzebne.
Mam nadzieję, że na to pytanie można odpowiedzieć i nie ma ono charakteru otwartego, ponieważ naprawdę lubię wiedzieć, czy istnieje domyślny sposób sprawdzenia możliwości zdobycia dalszych umiejętności programowania w pracy. Jeśli coś nie jest dla ciebie jasne, proszę o komentarze i pozwól, że poprawię moje pytanie.
Zaktualizuj, aby odzwierciedlić odpowiedzi udzielone do 01.12.2011
Jaką odpowiedź zaakceptowałem i dlaczego
Dziękuję wszystkim za odpowiedzi, większość z nich jest bardzo pomocna, więc bardzo głosowałem! Chociaż odpowiedź Toma Squiresa uzyskała najwięcej głosów, przyjmuję odpowiedź udzieloną przez księcia Goulasha . Oczywiście Tom jest obiektywnie prawdziwe, ale odpowiedź księcia jest po prostu bardziej pomocne dla mnie i dwukrotnie sprawdził nas, że to jest kryterium przyjąć odpowiedź.
O co go zapytam podczas wywiadu
Pozwolę mu wyjaśnić kilka prostych zadań, takich jak przykład w The Camel Has Two Humps wspomnianym przez Chrisa Burt-Browna
Poproszę go o wyjaśnienie bardziej zaawansowanych przepływów sterowania, może w formie zapisu graficznego.
Sprawdzę jego rozumienie rekurencji na przykładzie matematycznym.
Pozwolę mu wyjaśnić wybrany przez siebie algorytm w języku naturalnym.
Pozwolę mu wyjaśnić swoje rozwiązanie Mathematica, w szczególności zapytam o jego model procedury, użycie narzędzi, strukturę kodu i oprogramowania w ogóle, a także o różne warstwy abstrakcji.
Aby sprawdzić jego motywację, poproszę o fascynację tworzeniem oprogramowania.
Zapytam go, czy jest świadomy tego, czego będzie musiał się dowiedzieć o tworzeniu oprogramowania dla przedsiębiorstw. Szczególnie chcę zmienić dyskusję w kierunku pracy w zespołach, programowania pary, TDD, ponieważ spodziewam się, że nie będzie dużo o tym wiedział po pracy na swoim własnym mgr.
Wygląda na to, że to będzie długi wywiad;)
Aktualizacja po wywiadzie 2011-12-09
Jeszcze raz dziękuję wszystkim za dobre odpowiedzi. Przeszedł wywiad z latającymi kolorami. Nigdy nie byłem bardziej zadowolony z wnioskodawcy. Jego rozwiązanie Mathematica wydaje się być całkiem dobrze skonstruowane. Był w stanie wyjaśnić, gdzie używał funkcji wyższego rzędu, chociaż nie wiedział, że są one tak nazywane. Odpowiedział na moje matematyczne pytania rekurencyjne, a także na proste zadania i kontrolę przepływu rzeczy z The Camel Has Two Humps. Kiedy wyjaśniał niektóre algorytmy, wiele się nauczyłem o dopasowaniu nieliniowym;) Powiedział też szczerze, że oczywiście nie może zagwarantować, że będzie w stanie dowiedzieć się czegoś o profesjonalnym tworzeniu oprogramowania, którego do tej pory nie zna. Ale prawdopodobnie twierdzi, że zawsze był dobry w uczeniu się nowych koncepcji - nawet sam - i jest naprawdę zainteresowany tworzeniem oprogramowania. Poprosił również o stos technologii w projekcie, do którego zostałby najpierw zgłoszony, aby mógł obejrzeć go w domu. Był także ciekawy programowania w parach i pracy zespołowej. Teraz mam nadzieję, że umowa o pracę zostanie zawarta.
Odpowiedzi:
Jestem bardzo uprzedzony, ponieważ kilka lat temu zacząłem jako programista z doktoratem z fizyki, ale bardzo mało doświadczenia w kodowaniu (co stanowi kurs licencjacki na Fortran). Oczywiście zależy to od rodzaju tworzonego oprogramowania, ale moim zdaniem umiejętności kodowania są bardzo łatwe do zdobycia przez każdego, kto ma na wpół przyzwoite umiejętności naukowe / rozwiązywania problemów. Nie zamierzam tego obrażać przez całe życie programistów, którzy studiowali informatykę: oczywiście istnieją aspekty techniczne, które wymagają poważnego szkolenia w celu opanowania (np. Wielowątkowość i architektura bardzo niskiego poziomu), ale zakładam, że to nie stanowisko, które próbujesz obsadzić.
Podczas mojego wywiadu technicznego dotyczącego mojego obecnego stanowiska stanąłem wobec dość złożonego problemu matematycznego i poprosiłem o zaprojektowanie programu do jego rozwiązania. Nacisk położono na napisanie algorytmu, który po zaimplementowaniu rozwiąże problem. Mógłbym napisać odpowiedź, używając wyłącznie słów, aby opisać moje rozwiązanie, ale pozwolono mi napisać kod w wybranym przeze mnie języku. Test dotyczył bardziej umiejętności rozwiązywania problemów i tego, czy potrafiłem „myśleć jak programista”. Oczywiście, jeśli byliby kandydaci o równych umiejętnościach i ktoś miałby większe doświadczenie w kodowaniu bezpośrednim, wyszedłby na wierzch, ale to wydaje mi się dość uczciwe.
Najważniejsze jest: zbadaj kandydata pod kątem umiejętności, które go zatrudniasz, a nie pod kątem ideałów, które masz nadzieję osiągnąć.
źródło
Nie możesz . Niemożliwe jest dokładne przetestowanie umiejętności, której jeszcze nie ma. Musisz dokonać oceny sytuacji na podstawie jego inteligencji i postawy. Ostatecznie zawsze będzie to ryzyko.
Z własnego doświadczenia mogę powiedzieć, że przejście od nauki do programowania jest bardzo możliwe. Oba sprowadzają się do wykorzystania mózgu do rozwiązywania skomplikowanych zagadek.
źródło
Nie mam żadnych dodatkowych źródeł weryfikujących ten artykuł, więc nie mogę za niego ręczyć, ale:
Camel Has Two Humps
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
źródło
Jak mogę sprawdzić, czy zdobędzie umiejętności programowania, których potrzebuje?
To jest bardzo proste. Daj mu umiejętności.
To nie jest zbyt satysfakcjonująca odpowiedź, ale pozwólcie, że rozwinę się.
Do programowania przyjechałem po 3 latach pracy w inżynierii lądowej. To dość solidne tło w fizyce stosowanej i matematyce. To nie jest teoretyczna matematyka, którą dałby dyplom CS, ale jest coś warta. To, co czerpałem z doświadczenia inżynierskiego, było solidnym doświadczeniem w rozwiązywaniu problemów . Każdy, kto ma doświadczenie matematyczne, docenia już pojęcie elegancji, gdy mówi o rozwiązaniu problemu. Mają już wykształcenie w zakresie refaktoryzacji, ponieważ spędzili czas na pobraniu sześciu stron skrawków z kurczaka i przekształceniu ich w elegancki półfartowy dowód do złożenia.
Każdy, kto studiował fizykę, opracował intuicyjne podejście do łączenia razem rozwiązania z podstawowych ram.
A czym jest programowanie poza tymi umiejętnościami? - Język, idiom, wzory i ramy. Są łatwe do nauczenia. Rozwiązywanie problemów jest niemożliwe. Jeśli jesteś w stanie zapewnić instrukcje w tych obszarach, to skończysz z dobrym programistą.
Powstaje pytanie: „Jak długo możesz poczekać, aż osiągnie prędkość?”.
tl; dr; Możesz uczyć pisania. Nie możesz uczyć mądrze.
źródło
Mam licencjat z inżynierii materiałowej, ale całą swoją karierę pracowałem w tworzeniu oprogramowania.
Sugerowałbym, że twój kandydat prawdopodobnie nie będzie miał problemów z podstawowym programowaniem i algorytmami, ale jeśli chodzi o wymagania bardziej „inżynierskie”, może potrzebować wskazówek. Rozumiem przez to dobrą strukturę jego kodu, brak 500 funkcji liniowych, skuteczne testowanie, projektowanie pod kątem wydajności ...
Większość z tego można się nauczyć, ale możesz chcieć zaprojektować kilka pytań, aby to sprawdzić.
źródło
Wydaje mi się, że kandydat już wie, jak programować, pod warunkiem, że może nie mieć tyle doświadczenia, jak oddany programista, ale ma dający się wykazać projekt, który ukończył i wymagał wykonania niebanalnej ilości pracy. W związku z tym możesz być w stanie przeprowadzić wywiad z kandydatem w taki sam sposób, jak programista, który używa innego języka niż ten, którego używa sklep, a mianowicie:
Język, którego używa Mathematica, jest dość zaawansowany, a ktoś, kto jest dobry w pisaniu oprogramowania dla Mathematica, powinien być dość kompetentny w innych dziedzinach, więc skupienie się na tym doświadczeniu i wykorzystanie go jako podstawy do programowania może być dobrym sposobem na podejście do rozmowy kwalifikacyjnej.
źródło
Mówiąc jako absolwent inżynierii lotniczej, programista, z pewnością możliwe jest przejście od nauk przyrodniczych do programowania. Ostrzegamy jednak, że umiejętność rozwiązywania problemów nie zawsze wiąże się z umiejętnością pisania kodu. Wydaje się, że zdajesz sobie z tego sprawę i to jest dobra rzecz.
Dla mnie najważniejszymi pojęciami, aby upewnić się, że chwyta on kontrolę przepływu i rekurencję (i ogólnie zapętlenie jako podzbiór tego). Przed zatrudnieniem kandydata nawet ktoś bardzo inteligentny jest pewien, że potrafi napisać prosty algorytm rozwiązywania problemów. Upewnij się, że może wziąć ten algorytm prostych słów i przekształcić go przynajmniej w pseudo-kod. Możesz nawet zbadać, czy może on przynajmniej zrozumieć pojęcie polimorfizmu, chociaż nie jestem pewien, czy jest to niezbędna wiedza w takich okolicznościach.
Uważaj też na umiejętność rozwiązywania problemów naukowych w Mathematica / MatLab / Cokolwiek, co nie znaczy, że umie pisać dobry kod. Oznacza to jedynie, że jest on w stanie zastosować podstawowe (czasem bardzo podstawowe) zasady programowania, zwykle instrukcje if / else. Nauka bycia dobrym programistą na ogół wymaga od kogoś osobistego i pracodawcy zobowiązania na tym etapie. Ostrzeżenie: spotkałem bardzo inteligentnych ludzi, którzy byli / są dobrymi inżynierami, którzy nie potrafili zaprogramować wyjścia z papierowej torby i szczerze mówiąc, nie potrafili zrozumieć podstaw języka.
Osobiste doświadczenie
Ukończyłem szkołę ze stopniem inżyniera i odrobiną doświadczenia programistycznego. Pracowałem z bardzo małą ilością C, sporą ilością MatLab i trochę VB + Access. Zajęło mi około 3 miesięcy nauki, aby stać się naprawdę użytecznym jako programista w sklepie VB.NET. Pełne opanowanie zajęło mi kolejne 9 miesięcy. Jednak z pewnym stopniem pewności mogę powiedzieć, że moje umiejętności rozwiązywania problemów przewyższają 99% innych programistów, których spotkałem w pracy. Moi pracodawcy konsekwentnie uważali mnie za jeden z ich cenniejszych aktywów.
Wniosek
Jest to propozycja ryzyka / nagrody, ale często zdarza się, że walka z kimś, kto ma umiejętności rozwiązywania problemów, może się opłacić na dłuższą metę, o ile jest on w stanie nauczyć się koncepcji programowania i oboje jesteście gotowi zainwestować czas w rozszerzenie jego programowania wiedza, umiejętności. Jednak głęboko wierzę, że musi on posiadać przynajmniej podstawową wiedzę na temat podstaw programowania, zanim zaoferuje mu pracę. Z mojego doświadczenia wynika, że kiedy już jesteś w tym momencie, możesz pójść o krok dalej.
źródło
Zacznę od kilku podstawowych pytań dotyczących algorytmów i podstaw, aby sprawdzić, czy zajmuje się logiką algorytmów i programowania. Jeśli jest w stanie zrozumieć, czym jest algorytm, może w końcu rozwinąć umiejętności potrzebne do późniejszych konkretnych działań.
źródło
Szczerze mówiąc, jestem prawie pewien, że nie wyciągniesz tych informacji z trwającej jedną lub dwie godziny rozmowy. Daj mu zadanie programowania w C # (coś niezbyt technicznego) i jeden lub dwa tygodnie do rozwiązania. To powinien wystarczyć na naukę podstaw języka dla kogoś, kto nauczył się programowania w Mathematica. Następnie dokonaj z nim przeglądu kodu i wybierz tę bazę.
źródło
Możesz spojrzeć na praktyki programowania w środowisku naukowym? (na stosie przepełnienia), aby dowiedzieć się, jak wygląda kultura programowania w naukach przyrodniczych. W ten sposób możesz porównać jego przygotowanie z przygotowaniami jego rówieśników.
Jeśli o to chodzi, możesz poprosić go o opisanie praktyk programistycznych, do których był przyzwyczajony, aby dowiedzieć się, czy jest świadomy innych sposobów .
W mojej firmie jest wielu „dobrych programistów”, których kwalifikacje są w stanie utrzymać w głowie wystarczający stan, aby ułożyć jakiś działający kod, ale którego praca jest nieustrukturyzowana i trudna do utrzymania. Generalnie można ich uczyć, ale ... trzeba ich uczyć.
źródło
Inny dział, w którym pracuję, korzysta z odmiany naszego standardowego testu. Pierwszym zadaniem jest odwrócenie słów na miejscu. Następnie użyj tego kodu, aby odwrócić kolejność słów w ciągu, wciąż na miejscu. Zamiast używać języka programowania, kandydat zaprojektował algorytmy na papierze i uruchomił je za pomocą tablicy Scrabble.
źródło
Poprosiłbym o opisanie (przy użyciu języka naturalnego) algorytmu obliczania czegoś z fizyki. Coś nieco bardziej skomplikowanego niż prosta formuła, a potem zapytałbym, jak mógłby zobaczyć, jak jego obliczenia są zamknięte w obiektach (nie potrzeba wiedzy OOP, możesz wyjaśnić, czego oczekujesz od obiektu). W ten sposób możesz zobaczyć jego logiczne myślenie. Jest to ważniejsze niż jakakolwiek umiejętność programowania.
źródło
Po pierwsze, są prawdopodobnie całkiem sprytni, więc w najgorszym przypadku mogą nauczyć się być dobrym programistą z wytycznymi. Jeśli jednak potrzebujesz, aby wskoczyli i byli przyzwoitym programistą od samego początku, poproś, aby przesłali przykładowy kod, który napisali.
Czy jest to jedna czy dwie gigantyczne funkcje wielofunkcyjne, czy też zawierały one funkcjonalność na odpowiednich poziomach abstrakcji? Czy magiczne liczby są na stałe zakodowane? Czy kod jest SUCHY? Czy nadali zmiennym rozsądne nazwy, czy też wszystko jest nieczytelnym skrótem lub zmienną jednoliterową? Czy potrafisz przeważnie przestrzegać logiki ich kodu? Czy rozumieją podstawy OO?
Zapytaj, czego używają do kontroli wersji (git / hg / svn / cvs / bzr itp.). Czy kiedykolwiek profilowali kod lub używali debuggera, a jeśli tak, to które lub jaka jest ich ogólna strategia debugowania?
Jeśli nie przejdą tego testu i od samego początku potrzebujesz dobrego kodera, pomiń tę osobę. W przeciwnym razie, zatrudnij ich, zasugeruj, aby przeczytali książki inżynierii oprogramowania (np. Code Complete) oprócz ogólnych książek o programowaniu / CS.
(Dla przypomnienia jestem również fizykiem, który został programistą).
źródło
Ponieważ jest jeszcze na uniwersytecie lub dopiero niedawno skończył, jest przyzwyczajony do nauki. Poproś go, aby przeczytał i zrozumiał książkę Wzory projektowe, a po miesiącu (lub w ciągu miesiąca) przeprowadzi z nim szczegółowe dyskusje na te tematy. (Myślę, że) może to wiele powiedzieć o jego umiejętnościach (nie tylko tych trudnych (te też), ale także o tym, jak radzi sobie z chwytaniem nowych koncepcji, rozumieniem ich wykorzystania, widzeniem zalet i wad itp.). Ale będzie cię to kosztowało miesiąc.
źródło