Dlaczego "juniorzy" nie mogą znaleźć pracy

19

Mam aktualnie otwarty proces rekrutacyjny na programistę Java, doświadczenie w prowadzeniu takich rekrutacji na przestrzeni kilkunastu lat i trochę spostrzeżeń.
W ciągu ostatnich kilku tygodni, nieco się załamałem poziomem kandydatów na rynku. Nie szukam w tej chwili wymiataczy, chcę programistę z "jakimś" doświadczeniem, ale rozważę kogoś bez doświadczenia komercyjnego. Tylko na miłość boską, jak ktoś kandyduje na stanowisko Java Developer, to znajomość podstaw języka jest umiejętnością wymaganą.
Wystarczy sobie kupić książkę Java Core tom I przeczytać, zrozumieć. Nic więcej. Tym czasem od jakiegoś czasu rozmawiam z ludźmi na poziomie raczej dziwnym i pytania o:

  • modyfikatory dostępu
  • różnice pomiędzy Set a List
  • kontrakt hash equals
  • różnicę pomiędzy ArrayList i LinkedList
  • zwalnianie pamięci przez JVM
    i inne podobne tym pierdoły, sieją spustoszenie w szeregach kandydatów.

Proste zadanie na przekształcenie rekurencji (ciąg Fibonacciego) w kod o sensownej złożoności obliczeniowej, dla 90% było mission impossible.

Więc z mojego punktu widzenia rada jest prosta: chcecie dostać robotę, to opanujcie jej podstawy. Książkę podałem wyżej, ma 700 stron, można spokojnie dać sobie spokój z GUI i wątkami, bo na poziomie juniorskim nikt was o to nie będzie pytać, więc 200 stron odpada. Kurde, chcecie stawek wyższych niż w McDonalds, lżejszej roboty po której nie śmierdzą włosy, to niestety, ale trzeba mieć trochę więcej wiedzy i umiejętności. W pracy nie da się nauczyć programowania, co zresztą widać na rozmowach, bo u ludzi z doświadczeniem też nie koniecznie jest wiedza na temat "kiedy Java zwalnia pamięć". Więc serio - 70zł za książkę w promocji, 3 do 6 miesięcy czytania i ćwiczenia i możecie szukać roboty, albo stażu. Wiedzą przebijecie 90% kandydatów aktualnie błąkających się po rynku.

21

Ludzie mają wrażenie, że jak kod się kompiluje, po wielu permutacjach, to już są programistami.

Otóż nie.

Są permutatorami.

2

Mi się wydaje że ten temat jest założony aby wzbudzić kontrowersje, w pewnym sensie wymusić dyskusje, ale raczej juniorów do prac się już nie szuka. No chyba że duże korpo organizują staże dla studentów, ale to norma jak na każdym kierunku studiów...

2

modyfikatory dostępu:
public
private
protected
brak modyfikatora
różnice pomiędzy Set a List:
List: uporządkowana lista elementów.
Set nieuporadkowana?
hashCode- zwraca unikana wartosc int dla obiektu.
equals- porownuje np. Stringi.
ArrayList samo-rozszerzalna tablica?
LinkedList- powiazana lista.
Zwalnianie pamięci przez JVM, no normalnie GC?

class Piotrpro{

    public static void main(String[] args)  {
        System.out.print(fib(10));
    }
    public static int fib(int n) {
        if(n == 0) {
            return 0;
        }else if(n== 1){
            return 1;
        }else {
            return fib(n-1) + fib(n-2);
        }
    }
}

Dlaczego nie mogę dostać pracy?
Bo nie wysyłam cv? :D
ew. bledy na gorze ;)

2

Wg zasad przydzielania punktów w szkole oblałbyś za takie zdawkowe odpowiedzi. Jak miły nauczyciel to byś dostał 2.
A potem znalazłbyś pracę za stawkę lepszą od jego stawki.

Edit. Teraz zacząłem rozkminiać czy celowo udzieliłeś takich odpowiedzi, czy nie ;D

5

Temat nie został założony, żeby wzbudzić kontrowersje. Dyskusja jak najbardziej mile widziana. Widzę dużo postów typu:

  • zrobiłem staż, nie mogę znaleźć roboty
  • zrobiłem bootcamp, nie mogę znaleźć roboty
  • jak nikt nie chce zatrudniać juniora, to jak junior ma się stać midem
  • ....

Więc napisałem post, w jaki sposób rozwiązać podstawowy i wspólny moim zdaniem problem kandydatów, z którymi w ostatnim czasie miałem okazję rozmawiać.

3

Kiedy startowałem na juniora przeprowadzona była rekrutacja w formie testu na kilkanaście osób, a ja jako jedyny takie podstawy ślicznie umialem (teraz nie umiem). Jak rozmawiałem z ludźmi to mówili, że im trochę głupio, że na rekrutację przyszli tacy nieogarnięci, że przy mnie się czują głupio i wszyscy mówili, że praktycznie nic nie ogarniają z takich podstaw, nawet projektu żadnego nigdy nie zrobili. Wyszło na to, że na teście nie było nic z Javy ani programowania. dostałem jakiś śmieszny % punktów, a te łebki z kangurów matematycznych bez problemu krążyły koło maxa. I na co mi ta nauka wtedy była :(

A, jakby co to na kilka rekrutacji w Javie, nigdy roboty w Javie nie dostałem.

Edit. Chociaż ta wiedza procentuje teraz, bo jakbym kiedyś nie rył Javy to bym się chyba zapłakal przy obecnych projektach w Scali.

5
piotrpo napisał(a):

Proste zadanie na przekształcenie rekurencji (ciąg Fibonacciego) w kod o sensownej złożoności obliczeniowej, dla 90% było mission impossible.

Tak samo dla większości kandydatów na seniora. Po prostu ludzie nic nie potrafią a oczekują nie wiadomo czego.

7
The Pontiff napisał(a):
piotrpo napisał(a):

Proste zadanie na przekształcenie rekurencji (ciąg Fibonacciego) w kod o sensownej złożoności obliczeniowej, dla 90% było mission impossible.

Tak samo dla większości kandydatów na seniora. Po prostu ludzie nic nie potrafią a oczekują nie wiadomo czego.

Dla odmiany jeden z moich znajomych, zmuszony do nauki Pythona (studia techniczne) rozwiązał Fibonacciego od razu w złożoności O(n). Byłem zdziwiony dopóki nie okazało się, że nie miał świadomości, że funkcja może wywoływać samą siebie.
Gdybym miał znaleźć wniosek z tego płynący to chyba taki, że znajomość bądź nieznajomość poprawnego rozwiązania Fibonacciego sama w sobie nie oznacza właściwie niczego.

5

Poprawiam fibonacciego na złożoność liniową po @p_agon

public class Fib {

    public static void main(String[] args) {
        System.out.println(fib(10));
    }

    static int fib(int n) {
        Stream<Integer> infiniteStream = Stream.iterate(0, i -> 0);
        Acc res = infiniteStream.limit(n - 1).reduce(
                new Acc(0, 1),
                (a, ignored) -> new Acc(a.s2(), a.s2() + a.s1()),
                (r1, r2) -> {
                    throw new UnsupportedOperationException();
                });
        return res.s2();
    }
}

record Acc(int s1, int s2) {
}

smutna prawda jest taka, że bez pomocy internetu bym tego nie zrobił .... (nie w javie)

Ciekawostka - w sumie mało znana przez rekruterów - Fibonacciego da się policzyć też szybciej niż liniowo, ale to już trzeba być ultra juniorem.

6

A co jeśli ktoś ma gorszy dzień i akurat kontraktu nie może sobie przypomnieć? Z resztą po co ma pamiętać jeśli metodę hashCode można wygenerować sobie w IDE albo Lombokiem? Idąc tym tokiem myślenia można powiedzieć, że dzisiejszy seniorzy w Javie to leszcze, bo nie wiedzą co to są rejestry procesora albo jak napisać kompilator nie mając kompilatora.
Fajnie, że problem został zauważony, ale jeśli rozmowa trwa godzinę i mam na niej tylko tego typu pytania, to nie wiem czy chce w takiej firmie pracować. Nikt przez to nie sprawdza sposobu myślenia u kandydata.

0

@PerlMonk: Jak ktoś ma gorszy dzień, to ma gorszy dzień. Bywa, równie dobrze można mieć ten gorszy dzień podczas dowolnego innego egzaminu. Pytanie o kontrakt nie ma na celu sprawdzenia, czy ktoś potrafi nadpisać hash, tylko czy wie, że dwa tożsame wg. equals obiekty muszą zwracać identyczny hash a w przeciwnym wypadku powinny, w miarę możliwości zwracać różne hash'e. Rozmowa to nie trwający godzinę quiz. Kandydat był proszony o przygotowanie swojego ulubionego ide, dostawał link do repozytorium i miał "poprawić poprawny, ale wolny kod na szybszy tak jak by to zrobił w pracy". W zadaniu chodziło o to, żeby wpaść na pomysł dopisania zestawu testów, zanim zabierzesz się do roboty. Być może odegrał tu rolę stres, ale tego kroku nie zastosował nikt. Jednej osobie udało się ogarnąć zadanie (pozbyć się rekurencji) i w połączeniu z ogarnięciem w innych tematach, dostała ofertę, którą przyjęła.

7

@piotrpo: wiesz co jest wspólnym elementem wszystkich tych rozmów? Ty. Jeśli ciągle robisz to samo, to czemu oczekujesz innych rezultatów?

8

Może to nie problem kandydatów, a oferty, która z jakiegoś powodu odstrasza sensownych ludzi, pozostawiając amatorów, desperatów i ludzi, którzy nabrali się na oferty bootcampów.

3
piotrpo napisał(a):
  • różnicę pomiędzy ArrayList i LinkedList

Ale to juniora czy principala? Bo seniorzy tego raczej nie wiedzą, w ogóle mało kto wie, że są inne kolekcje niż ArrayList.

5

@somekind: jak znam Ja znam LinkedList, ArrayList, CopyOnWriteArrayList, HashSet, TreeSet, LinkedHashSet, ConcurrentSkipListSet, LinkedBlockingQueue, ArrayBlockingQueue, HashMap, LinkedHashMap i ConcurrentHashMap to znaczy że już na uber senior principle developera się nadaje?
Dodam nie skromnie że wiem co to tablica hashują i dlaczego ConcurrentHahMapa jest efektywna do pracy z wątkami (bo wiecie hehe, segmenty). I nawet wiem że ten HashSet to tak naprawde HashMapa.
Co wygrałem? :D
Edit: wiem jeszcze o kolekcjach z Guavy, Vavra i jakiś tam z apache commons collections (tych osatnich nie używałem)

2

W poprzedniej robocie pozwolili mi przez 2 tygodnie rekrutować na juniora (To było z 8 lat temu). Chciałem żeby napisali implementacje jakiegoś prostego kontraktu który miał metody dotyczące automatu z napojami (weź pieniążka, niech ktoś wybierze napój i dostanie produkt oraz resztę oraz metoda wsadowa w postaci listy produktów z cenami i ilościami).

Po 2 tygodniach zabronili mi dawać tego zadania bo nikt nie umiał napisać w pełni działającej implementacji. Byli tacy agenci co po 30 minutach nie napisali nawet "implements UberInterfejs" bo nie wiedzieli co to jest :|

Pamiętam jak rekrutowali mnie na juniora (stażyste?) z 13-14 lat temu. Miałem jakieś zadanie z przystankami autobusowymi i ze zmianą czasu to dyskusja z osobą rekrutującą dotarła po pewnym czasie do tego czym się różni "print" od "echo" w php pod maską... A robota była za ~600 zł netto. Wydaje mi się że my teraz jako community po prostu mniej wymagamy od ludzi zatrudnianych bo zdajemy sobie sprawę że ludzie nie żyją już programowaniem tylko chcą klepać kod by zarabiać pieniądze, a to dosyć znacząca różnica.

10

w wojsku nie byli, życia nie znają

3

Tak się zastanawiam ilu tutaj troluje, a ilu naprawdę nie rozumie, że taki ciąg Fibonacciego to całkiem dobra sprawa do odsiania nieogarniętych ludzi. Na wszelki wypadek przypomnę klasyczny artykuł z FizzBuzzem: https://blog.codinghorror.com/why-cant-programmers-program/

Ogólnie to może nie dla juniorów, ale już dla midów i seniorów lubię wrzucić takie w miarę proste zadanie algorytmiczne i zobaczyć jak ktoś je rozwiązuje. Sam się dziwiłem ile seniorów potrafi wylecieć na naprawdę prostych zadaniach w stylu "znajdź największą możliwą sumę dwóch liczb w tablicy tak, żeby złożoność była O(n)".

2

Co sprawdza to zadanie z ciągiem fibonaciego?

2
PerlMonk napisał(a):

A co jeśli ktoś ma gorszy dzień i akurat kontraktu nie może sobie przypomnieć? Z resztą po co ma pamiętać jeśli metodę hashCode można wygenerować sobie w IDE albo Lombokiem? Idąc tym tokiem myślenia można powiedzieć, że dzisiejszy seniorzy w Javie to leszcze, bo nie wiedzą co to są rejestry procesora albo jak napisać kompilator nie mając kompilatora.

Fajnie, że problem został zauważony, ale jeśli rozmowa trwa godzinę i mam na niej tylko tego typu pytania, to nie wiem czy chce w takiej firmie pracować. Nikt przez to nie sprawdza sposobu myślenia u kandydata.

Przecież to są pytania na pierwsze 5 minut. Pytanie - odpowiedź i tak x5
Fibonacci to zadanie na kolejne 5 minut. Fibonacci to jest zadanie które mogą robić uczniowie w liceum, świetne na początek nauki programowania.

wartek01 napisał(a):

Tak się zastanawiam ilu tutaj troluje, a ilu naprawdę nie rozumie, że taki ciąg Fibonacciego to całkiem dobra sprawa do odsiania nieogarniętych ludzi. Na wszelki wypadek przypomnę klasyczny artykuł z FizzBuzzem: https://blog.codinghorror.com/why-cant-programmers-program/

Ogólnie to może nie dla juniorów, ale już dla midów i seniorów lubię wrzucić takie w miarę proste zadanie algorytmiczne i zobaczyć jak ktoś je rozwiązuje. Sam się dziwiłem ile seniorów potrafi wylecieć na naprawdę prostych zadaniach w stylu "znajdź największą możliwą sumę dwóch liczb w tablicy tak, żeby złożoność była O(n)".

Oczywiście, bo my błędnie zakładamy że ludzie po prostu nie mogą być aż tak głupi i kłamać na rekrutacji nie potrafiąc w ogóle programować. A okazuje się że jakieś 4/5 to tacy kłamcy. Nie potrafią rozwiązać fizzubzza ani w ogóle napisać czegokolwiek co piszą uczniowie uczący się Pascala czy czego tam się teraz uczą. To jest tragedia i dlatego trzeba ich odsiewać. Jest dużo ludzi którzy przez całe lata w pracy dodają tylko frameworki do projektu i piszą kod który składa się w 99% z:

  • konfigurowania beanów w springu
  • tworzenia endpointów
  • delegowania do innego gotowego kodu
  • przeklejanek z drobnymi zmianami
  • wywoływania innych usług

Na rekrutacji nie potrafią napisać silni bez użycia reurencji. Zresztą zobacz ilu ludzi w tym wątku zapiekło :)

12

@The Pontiff: "Przecież to są pytania na pierwsze 5 minut. Pytanie - odpowiedź i tak x5" - powiedz to autorowi wątku. Ja spotkałem się z takimi, co dręczyli i cała rozmowa wyglądała jak recytowanie dokumentacji. Jestem przeciwny popadaniu w skrajność typu "nie umiesz hashcode - nie rozmawiam z tobą". Znajomość mechanizmu jest ważna, ale od tego mam dokumentację, żeby nie musieć zaśmiecać sobie głowy szczegółami. Przecież nawet pracując nad jednym projektem możemy zapomnieć jak działa moduł, którego nie ruszaliśmy trzy miesiące. Czy w tym czasie ma stać nade mną przełożony, który mnie zwolni jeśli nie wyrecytuje mu regułki o kontrakcie? Gdybym ja zadał takie pytanie, to oczekiwałbym, że ktoś wie dokładnie jak to działa albo wie gdzie szukać informacji na ten temat, żeby sprawdzić w parę minut. Jak ktoś wciśnie ctrl+q w Intellij, żeby zobaczyć dokumentację metody hashcode, to też uznam odpowiedź. Nie zawsze ważne skąd ktoś recytuje regułki - z dupy, z głowy czy z dokumentacji. Ważne, że umie sobie radzić.

20

Czy u Was w pracy taki junior będzie implementował algorytmy, gdzie złożoność obliczeniowa ma znaczenie i czy będzie analizował algorytmy rekurencyjne?

Pytam bez złośliwości, po prostu wydaje mi się, że to kolejny przykład, gdzie wymaga się algorytmiki i detali, a w pracy będą CRUDy, gdzie ważniejsza jest cierpliwość, a nie znajomość wyżej wymienionych rzeczy.

7

Moim zdaniem ułożyłeś pytania rekrutacyjne nie sprawdzające faktycznie umiejętności potrzebnych na dane stanowisko.

To nie będą typowe zadania, które junior będzie wykonywać.

2

Eh, smutne to. Ja reviewowałem w pracy ostatnimi czasy kod, który by na SO został wywalony za niską jakość (sic! tak źle było). Zgadzam się poniekąd z tym co @The Pontiff pisze, zastanawiam się tylko, na ile to jest wina tych ludzi ("że są głupi"), na ile rynek wymaga od nich bycia niskiej jakości wyrobnikami. Bo takimi ludźmi jednak się projekty dowozi, bo szybciej, szybciej, ficzer butem dopchnąć i niech leci. Projekt zrobiony, lata doświadczenia i cyk, leci.

@rgawron z jednej strony racja, z drugiej - trochę wstydzior jak "midosenior" odwala (w sensie: ocenia negatywnie) na review binary_search na rzecz fora po posortowanej kolekcji, bo nie wie czym jest to pierwsze twierdząc jednocześnie, że dba o czytelność.

6

Takie pytania na juniora to sprawdzą co najwyżej czy dzień przed rekrutacją ktoś se odpalił top 100 java interview questions. Tydzień po rekrutacji taki człowiek już i tak nie będzie nic z tego pamiętał xd
Wg mnie na juniora najlepiej sie sprawdza zadanie domowe, w którym ocenisz jak ktoś dzieli klasy, pakiety, czy pomyślał o testach itp itd.
Oczywiście to wszystko w kontekście 95% projektów aka smutnych crudów.
No i czasu oszczędzisz, bo szybciej sie to przegląda niż odbywa rozmowe

3

Zacznij robić interview przez telefon, 15 min i szereg pytań. Albo oddeleguj juniora albo babkę z hr do weryfikacji.

0

@PerlMonk: Kto ci powiedział, że takie męczenie trwało godzinę? Łamanie tego nieszczęsnego kontraktu jest nagminne w produkcyjnym kodzie, bo żeby "zajrzeć w dokumentację" musisz wiedzieć, że to tam jest. Podałem absolutnie wstępne, pytanka z Java, które zadawaliśmy pierwotnie "na rozgrzewkę", żeby kandydat trochę się uspokoił. Nie jestem w stanie wymyślić nic prostszego. Oczywiście może to być mój problem. Jak ktoś deklarował, że zna Springa, to dostawał np. pytanie o sposób wstrzykiwania zależności, czyli najbardziej podstawową i najbardziej powszechnie używana funkcję tego frameworku, efekt nie był lepszy. Wszystkie te pytania, to przeraźliwie nudne pytania quizowe, które dostają ludzie na połowie rozmów kwalifikacyjnych i są na każdej liście "jak przejść rozmowę na programistę".

Co do zadania - jest dużo narzekania, że na rozmowach każą komuś pisać kod na kartce, to zrobiliśmy "lepiej", poprosiliśmy o przygotowanie IDE, pełen komfort, podpowiadanie składni, makra, dokumentacja, co kto chce. I problem, bo poprosiliśmy osobę, której podstawowym zadaniem ma być pisanie kodu o napisanie kawałka kodu? Przecież przeczytanie banalnego kawałka programu, rozwiązanie problemu, który w nim jest to absolutna podstawa pracy programisty.

@rgawron: Projekt jest wieloczęściowym systemem, występują w nim aplikacje klienckie, chmurowy backend, w cholerę roboty z infrastrukturą, bezpieczeństwem. W jego fragmentach występują duże problemy z wydajnością i trzeba "coś" sprytnie zrobić, żeby zredukować koszty infrastruktury, albo poprawić wrażenia użytkownika. Zadanie takie, a nie inne, bo nie byliśmy w stanie wymyślić nic prostszego. Ot pobrać projekt z gita, dopisać test, poprawić, done.

4

Wszystkie metody rekrutowania są dobre, a zarazem złe - pytanie tylko kogo pytasz.

Bezdzietny lub desperat pewnie chętniej zrobi zadanko domowe czy pójdzie na 15 etapów rekrutacji

Ktoś, kto jedyny "algorytm" jaki przez ostatnie 2 lata napisał, to przejście po drzewku pewnie nie będzie zadowolony z Leetcoda

Ktoś, kto ćwiczył do interview teoryjkę OOP, SOLIDa i Leetcoda pewnie się zdziwi jak zapytasz go jakby coś zaprojektował lub jak działa DI w Springu

itd.

3

@piotrpo: ja do hashcode ostatnio zaglądałem może rok temu. Zgadzam się, że to są podstawy i można się bardzo boleśnie wyłożyć, jeśli się nie wie, że do czego jest hashcode. To jednak jest jedna z wielu rzeczy z jakimi programista ma do czynienia. Ja dziś spędziłem pół dnia na szukaniu przyczyny, dla której tabelka sortuje się na jednym widoku a na innym nie. Była mi przydatna cierpliwość i umiejętność debugowania w IDE. Tym razem bardziej przydała mi się wiedza czemu Intellij nie pokazuje zawartości zmiennej, jeśli używam Springa. Innym razem pewnie wyjdzie co innego i będę się uczyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1