Rozmowa kwalifikacyjna na stanowisko programisty będzie tematem dzisiejszego wpisu, który powstał przy współpracy z jedną z uczestniczek konkursu Daj się poznać. Zaproponowałem vevurce współpracę przy tworzeniu tego materiału, ponieważ na co dzień zajmuję się programowaniem. Wraz z doświadczeniem, przychodzi moment, kiedy to Ty zadajesz pytania podczas rozmowy kwalifikacyjnej, osobie ubiegającej się o pracę w zespole do którego należysz.
Zadaniem jej będzie postawienie mi pytań jakie mogą przytrafić się każdemu, kto idzie na rozmowę w sprawie pracy na stanowisku programisty oraz ocenienie odpowiedzi jakie jej udzielę. Moją rolą będzie odpowiedzenie na zadane przez rekrutera pytania w jak najlepszy sposób, od razu zaznaczam, że moje odpowiedzi są z perspektywy studenta, programisty starającego się o pierwszą pracę w zawodzie.
Pytania jakie mi zadała zostały podzielone na siedem kategorii. Z wszystkich pytań postanowiłem wybrać po jednym z każdego działu. Zatem przystąpmy do odpowiedzi na zadane mi pytania.
Post podzielony jest na dwie części. W pierwszej odpowiedziałem – czasem niepoprawnie -zgodnie z moją wiedzą i umiejętnościami. vevurka je zweryfikowała w drugiej części, umieszczonej niżej.
Rozmowa kwalifikacyjna – odpowiedzi na pytana
Algorytmy
Co to jest stos? Czym różni się od sterty?
Stos to obszar pamięci, w którym mamy dostęp do ostatnio dodanego elementu. Do operacji na stosie wykorzystywany jest algorytm LIFO, czyli ostatni przychodzi pierwszy wychodzi. Sterta natomiast jest obszarem pamięci, dynamicznie przydzielanym.
Kontrola wersji
Czym się różni git pull od git fetch?
Komenda git pull pobiera z serwera wszystkie dane, zaś git fetch pobiera dane, których jeszcze nie mamy w lokalnym repozytorium.
Bazy danych
Co to jest ORM? Znasz jakieś przykłady?
ORM to Object-Relational Mapping, czyli mapowanie obiektowo-relacyjne. ORM jest odpowiedzialny za tworzenie bazy z klas. Przykładem może być JPA, które jest wykorzystywane do mapowania obiektowo-relacyjnego w języku Java.
Programowanie
Czym się różni statyczne typowanie od dynamicznego? Podaj też przykłady języków programowania.
Typowanie statyczne dokonywane jest w momencie kompilacji, a dynamiczne w czasie wykonywania programu na podstawie przechowywanych danych w zmiennej. Przykładem języka w którym wykorzystuje się statyczne typowanie to np. Java, zaś dynamiczne to php.
OOP
Do czego służy polimorfizm? Podaj jakiś przykład użycia?
To możliwość stosowania tych samych metod dla różnych obiektów dziedziczących po jednej klasie.
Przykład
Mamy klasę Planeta z metodą getName() oraz dwie inne klasy Ziemia i Mars. Możemy utworzyć kolekcję obiektów klasy Planeta, która będzie zawierać w sobie obiekty klasy Ziemia i Mars. Iterując po kolejce mamy możliwość wywołania metody getName().
Java
Krótko scharakteryzuj jakim językiem programowania jest Java (np. jaki ma system typów, jak jest ewaluowana).
Java jest językiem obiektowym, która umożliwia tworzenie aplikacji desktopowych oraz webowych. Typowanie jakie jest wykorzystywane w tym języku to statyczne. Jest przenośnia, ponieważ aplikacja napisana w tym języku może być odpalona na każdym urządzeniu z zainstalowaną maszyną wirtualną – jre.
Testowanie
Czym się różni testowanie jednostkowe od funkcjonalnego? A testy integracyjne?
Testowanie jednostkowe to sprawdzenie poprawności działa metod, obiektów w programowaniu obiektowym lub funkcji w programowaniu proceduralnym. Testy funkcjonalne to testy przeprowadzone przez osobę, nietworzącą aplikacji, bez dostępu do kodu, jedynie posiadającej dokumentację projektu. Test integracyjne służą do wykrywania błędów w interfejsach.
Ocena odpowiedzi na zadane pytania
Rozmowa kwalifikacyjna opiera się na interakcji. Wobec czego skupię się na następstwach tych odpowiedzi i opiszę bardziej „co myślę” gdy słyszę taką odpowiedź.
Algorytmy
Co to jest stos? Czym różni się od sterty?
Twoja odpowiedź jest ok, ale to pytanie bardziej dotyczyło struktur danych. Po tego typu odpowiedzi z reguły zadaję pytanie – a czy możesz opisać stos jako strukturę danych? Jakie operacje można wykonywać na stosie? I to samo dla sterty, tutaj dużo ludzi ma nagle problem.
Kontrola wersji
Czym się różni git pull od git fetch?
Pudło :P. git pull to git fetch po którym jest jeszcze wykonane git merge (czyli zmiany są nakładane), obie komendy pobierają wszystkie dane. W każdym razie od juniora lub stażysty nie oczekuję poprawnej odpowiedzi na to pytanie – raczej ma to być start do kolejnych pytań w zależności od odpowiedzi. Jeśli słyszę odpowiedź „nie wiem” to pytam jaka mogłaby być różnica lub jaki mógłby być sens rozdzielenia tych dwóch komand, czy w ogóle wie co to git pull, git merge, jak rozwiązywać konflikty.
Bazy danych
Co to jest ORM? Znasz jakieś przykłady?
Ok. Potem przechodzę do tego by kandydat pokazał mi jak mogłby wyglądać klasy dla jakiś dwóch tabel, gdzie jedna ma klucz obcy do drugiej.
Programowanie
Czym się różni statyczne typowanie od dynamicznego? Podaj też przykłady języków programowania.
Ok. Pytam czy jest możliwe posiadanie zarówno dynamicznego jak i statycznego typowania. Jak można by było takie coś osiągnąć? Tutaj nie oczekuję „poprawnych” odpowiedzi i znajomości jak to jest faktycznie robione tylko patrzę, co kandydat potrafi wymyślić i drążymy wspólnie jego pomysły.
OOP
Do czego służy polimorfizm? Podaj jakiś przykład użycia?
Ok. Takie przykłady najlepiej pisać pseudokodem na tablicy.
Java
Krótko scharakteryzuj jakim językiem programowania jest Java (np. jaki ma system typów, jak jest ewaluowana).
Cisnęłabym kwestię ewaluacji, bo pominąłeś tę kwestię. Zaczęłabym od tego czym się różni leniwa od gorliwej. Pytałabym jak jest z ewaluacją wyrażeń logicznych (czy na przykład kandydat wie gdzie są nawiasy jak nie ma ich explicite w kodzie). Jeśli kandydat używał hibernate to pytałabym czy da się mieć leniwą ewaluację itp, jeśli nie zna, to byśmy rozmawiali o hipotetycznym ORM i zapytaniu które wyciąga dużo danych.
Testowanie
Czym się różni testowanie jednostkowe od funkcjonalnego? A testy integracyjne?
Testy jednostkowe są też w programowaniu funkcyjnym, nieładnie to pomijać, pewnie bym zapytała o to jakie znasz paradygmaty. Zapytałabym też co rozumiesz przez interfejsy w odpowiedzi a propos testów integracyjnych i pewnie byśmy przeszli do tego, jak można takie interfejsy robić.
Podsumowanie
Na początku chciałbym podziękować vevurce za współpracę oraz zachęcić każdego czytelnika do odwiedzenia jej blogu https://vevurka.github.io/. Jak widzimy, pytania jakie dostałem są z różnych dziedzin informatyki. Jednak wszystko to daje obraz tego jaką wiedzą dysponuje kandydat do pracy w zespole. Jak można wyczytać z opinii zawodowego programisty, nie zawsze moje odpowiedzi były idealne, natomiast zawsze generowałby dodatkowe pytania, ponieważ jak to już wcześniej zaznaczyła vevurka, rozmowa kwalifikacyjna to interakcja, dialog. Zachęcam również do wyrażania opinii w komentarzach na temat poruszony we wpisie.
Git pull różni się od git fetch tym, że na git pull składa się zarówno git fetch jak i git merge. Ilość pobieranych danych nie ma tu nic do rzeczy.