Dlaczego "juniorzy" nie mogą znaleźć pracy

Dlaczego "juniorzy" nie mogą znaleźć pracy
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 dni
  • Postów:3277
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.

Zobacz pozostałe 25 komentarzy
koszalek-opalek
@ToTomki: myślę, że niezły. :)
koszalek-opalek
@RequiredNickname: No żem napisał: "czy się delikwent spotkał z tym i czy czuje problem" -- dla mnie to dość konkretna wiedza. Może działam w domenie, w której mi się to wyczucie złożoności i jej problemów u pracowników baaardzo przydaje, ale tak jest.
piotrpo
@RequiredNickname: Pisałem gdzie indziej: umiejętność czytania kodu, umiejętność zrozumienia problemu z wydajnością, umiejętność napisania 5 linii kodu lepiej. Nikt nie pyta o definicję ciągu, ona jest podana a w trudniejszych przypadkach (kiedy ktoś nie potrafi czytać kodu) objaśniana.
Koziołek
@RequiredNickname: np. to czy rozumiesz czym jest divide and conquer, czym jest memoryzacja funkcji, jak działa rekurencja, czym jest przypadek bazowy. Sam problem jest na tyle prosty i nieskomplikowany, że jego „biznesowe” aspekty nie rozpraszają przy wymyślaniu części technicznej.
RequiredNickname
@Koziołek: i o taką odpowiedź mi chodziło, bo zwyczajnie nie wyłapałem kontekstu w którym przydatne są tego typu zadania ;) Dzięki, zwrócę większą uwagę na tego typu aspekty ;)
Pixello
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Podkarpacie
  • Postów:448
21

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

Otóż nie.

Są permutatorami.

jarekr000000
Fajne słówko. To mam dla javowców co dostawiają 12 tą losową adnotację przed klasą i jak w końcu coś zadziała to znaczy, że umiemy w magie.
TY
Permutation Driven Development ma nawet stronkę na wiki =P https://en.wikipedia.org/wiki/Programming_by_permutation
kevin_sam_w_domu
kevin_sam_w_domu
  • Rejestracja:prawie 4 lata
  • Ostatnio:prawie 3 lata
  • Postów:196
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...

edytowany 1x, ostatnio: kevin_sam_w_domu
p_agon
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:96-230
  • Postów:953
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?

Kopiuj
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 ;)


Reasumując wszystkie aspekty kwintesencji tematu, dochodzę do fundamentalnej konkluzji: To by nic nie dało, nie dałoby nic! Przez 10 minut można, przy 2h to już jakaś zemsta pagona.
Zobacz pozostałe 8 komentarzy
p_agon
Hmm. To moze czas na temat co wannabe junior powinien wiedziec, by dostac te prace. 🤔
3P
@p_agon: no ale jak? firma firme nierówna.
p_agon
Chodzi o taki zbiór ogólnych umiejętności. Taki must have może?
3P
@p_agon: nie ma najmniejszego sensu. sam kandydat musi na bieżąco modyfikować taki zbiór w zależności do jakiej firmy, na jakie stanowisko i w jakich technologiach chce pracować
p_agon
Nie do konca, ale niech Ci bedzie ;)
ToTomki
  • Rejestracja:około 7 lat
  • Ostatnio:około 3 godziny
  • Postów:1317
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

edytowany 1x, ostatnio: ToTomki
p_agon
:D :D :D
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 dni
  • Postów:3277
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ć.

ToTomki
  • Rejestracja:około 7 lat
  • Ostatnio:około 3 godziny
  • Postów:1317
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.

edytowany 2x, ostatnio: ToTomki
piotrpo
Dokładnie o to chodzi - nie da się poprawnie programować, jak nie rozumie się co robi napisany własnoręcznie kod. Cały sekret.
The Pontiff
  • Rejestracja:ponad 4 lata
  • Ostatnio:10 miesięcy
  • Postów:128
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.

SA
  • Rejestracja:około 12 lat
  • Ostatnio:37 minut
  • Postów:1427
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.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
5

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

Kopiuj
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.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 7x, ostatnio: jarekr000000
Zobacz pozostałe 6 komentarzy
AL
@Charles_Ray: tak, to znałem. Myślałem, że jeszcze jest coś innego ;)
Charles_Ray
Rainbow tables - czas stały :D
YourFrog2
Haha przypomniałeś mi że nie dostałem pracy bo nie znałem kiedyś wszystkich 3 sposobów policzenia fibonaciego :D Gość na macierzach wymagał bym go policzył
enedil
Heh po co komu macierze jak ma się liczby rzeczywiste nieograniczonej precyzji.
koszalek-opalek
@jarekr000000: W czasie logarytmicznym np. f(n) = (((1+sqrt(5))/2)**n - ((1-sqrt(5))/2)**n)/sqrt(5) -- tylko uwaga na błędy zaokrągleń [Czas logarytmiczny bo szybkie potęgowanie.]
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
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.


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
edytowany 1x, ostatnio: PerlMonk
Shalom
Ta wygenerowana niekoniecznie będzie poprawna ;)
Charles_Ray
Wystarczy poprosić kandydata, żeby opowiedział, jak realizowane jest dodawanie elementu do HashMapy i co się stanie, jak klucz już istnieje. O sam kontrakt osobiście nie pytam, bo ludzie potrafili cytować bez zrozumienia.
RequiredNickname
@Charles_Ray: tylko czemu/po co junior ma wiedzieć jak pod spodem realizowane jest dodawanie elementu do hashmapy?
Charles_Ray
Zrozumienie tego to absolutna podstawa podstaw :) junior nie musi dokładnie wiedzieć, ale musi umieć łączyć kropki i sam wykminić - w przypadku juniora większe znaczenie ma potencjał. Podałem ten przykład jak można nie pytać na sucho. Podobnie zamiast ArrayList vs LinkedList lepiej zapytać czego by użył i dlaczego w konkretnym kejsie. Sprawdzamy jak myśli, a nie co wykuł na pamięć.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 dni
  • Postów:3277
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.

szatkus
W życiu bym nie wpadł, żeby pisać testy przy zadaniu rekrutacyjnym.
YourFrog2
Goldenline mnie odrzucił kiedyś za zostawienie w akcji "die('dupa')". Nigdzie nie opisali jak endpoint ma się zachować, a mi się nie chciało tracić czasu na pisanie tego. Zero pytań itp. Po prostu w punktach dlaczego "NIE" został odpowiedni wpis uwzględniony. Wtedy zrozumiałem że nie chce tam pracować.
RequiredNickname
@piotrpo: a to w firmie zadania typu optymalizacja wydajności zlecacie juniorom? Ciekawe podejście ;)
piotrpo
@RequiredNickname: A czemu nie? Jak dostaną trochę dobrych sugestii na wejściu, to sobie poradzą.
RequiredNickname
@piotrpo: pewnie sobie poradzą, tylko zajmie im to tyle czasu, że finansowo się nie będzie biznesowi opłacać. Poziomy typu junior/mid/senior mimo wszystko po coś są by wymagać stosownej wiedzy i wiedzieć jakie zadania komu przydzielić a to jak dla mnie dobry przykład przydzielania zadania na poziomie mida juniorowi które mu zajmie tydzień i pewnie trzeba będzie poprawiać.
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
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?


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
piotrpo
Których "wszystkich" rozmów i gdzie "robię to samo"?
PerlMonk
"Tym czasem od jakiegoś czasu rozmawiam z ludźmi" - tych, które prowadzisz. Czasem aż się dziwię, że jest taki nacisk na hashcode.
szatkus
Ja lubię pytania o HashMapę. Gdyby nie to, że gdzieś na studiach mi się to wyryło to pewnie nie dałbym rady odpowiedzieć. W pracy jeśli komuś jest potrzeba wiedza jak działa HashMapa to może sobie przeczytać w dokumentacji.
piotrpo
Nie ma nacisku na hashcode. Jest to ważny temat w Javie, bo kolekcje bazują na tym kontrakcie i jak go złamiesz, to zaczynają się zachowywać albo losowo, albo bardzo powoli. Efektywne znalezienie unikalnych elementów kolekcji jest całkiem praktycznym zadaniem przecież, a ciężko to zrobić nie znając tej zależności. Ja chętnie pogadam na poważniejsze tematy np. jak działa DynamicProxy (podstawa działania Springa, więc też żadna "akademicka wiedza"), tylko jak ktoś ma problemy z dodawaniem, to nie zaczynasz rozmowy o całkach.
Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 11 godzin
  • Postów:1002
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.

piotrpo
Nie można tego wykluczyć.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
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.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
YourFrog2
Seniorzy którzy nie dotykali problemu wydajności również bardzo często nie zdają sobie z tego sprawy :( Ale popieram autora tematu że my jako community powinniśmy od juniorów tego wymagać... Nawet sami powinni potrafić zrobić implementacje prostej listy bez użycia array'ów.
Charles_Ray
CTO == najlepszy developer w firmie? :D
piotrpo
@Charles_Ray: Mój nie wiem jak programuje, ale jest to jedna z osób, które "wymyśliły chmurę", więc jakieś osiągnięcia ma ;)
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
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)


edytowany 1x, ostatnio: scibi_92
Zobacz pozostałe 12 komentarzy
Miang
jak nie tej ustrój? a podatek od napoi słodzonych to co?
baant
fibonaczi O(n) na kartce w stresie a nie jakies tam concurrentSraczMapy
S9
@baant: miałem na rekrutacji już i dobrze zrobiłem.
somekind
to znaczy że już na uber senior principle developera się nadaje - podobno po 5 kolekcjach się resetuje i zostaje się permanentnym stażystą.
S9
:(
YourFrog2
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 2 lata
  • Postów:100
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.

edytowany 1x, ostatnio: YourFrog2
Shalom
Ja też nie znam tego interfejsu UberInterfejs ;)
.andy
@Shalom: to coś pewnie z tego worka co UberManager. Pewnie @p_agon by coś więcej wiedział ;)
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 13 godzin
  • Postów:5107
10

w wojsku nie byli, życia nie znają

W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około godziny
  • Postów:3536
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)".

Zobacz pozostałe 3 komentarze
S9
@WeiXiao: po prostu zdziwiło mnie to że ludzie nie są wstanie tego wymyśleć :D
W0
Ogólnie to dużo zaczyna od metody "posortuj i wybierz dwie pierwsze/ostatnie" - co nie spełni złożoności O(n). Ale i tak to jest proste.
C4
Masz jeszcze jakieś inne ciekawe przykłady tego typu zadań, na których seniorzy się wykładają?
W0
Mamy repo z tak na oko 30 takimi zadaniami - wszystkie da się wyklepać w 2 minuty jeśli wie się jak (i tak zakładam 20-30 minut jeśli się nie wie jak) - ale raczej ich nie będę publikował. Z takich hardkorowych akcji to jeden człowiek +10 lat expa nie potrafił wypisać Stringa od tyłu bez StringBuilder.reverse(), mimo, że dostał podpowiedź, że istnieją String.toCharArray(), String.getCharAt(i) i String.length().
WeiXiao
@wartek01: odwrócenie stringa poprawnie to nie trywialne zadanie, nie napisałbym go z głowy
Marcin Marcin
  • Rejestracja:prawie 6 lat
  • Ostatnio:22 dni
  • Postów:610
2

Co sprawdza to zadanie z ciągiem fibonaciego?


Fan moderatora somekind
Zobacz pozostały 1 komentarz
Marcin Marcin
Uważam, że to nie weryfikuje czy ktoś jest w stanie policzyć złożoność obliczeniową. Masz trzy rodzaje złożoności - pesymistyczną, optymistyczną i typową.
W0
To co napisałeś nie ma nic wspólnego z tym co ja napisałem.
WeiXiao
@Marcin Marcin a później jest jeszcze rzeczywistość i faktyczna wydajność :)
Wawer0123
to czy wykułeś algorytm na pamięć
RequiredNickname
@Wawer0123: spoko tylko po co komu papiery na widlaka jak będzie pracował z łopatą?
The Pontiff
  • Rejestracja:ponad 4 lata
  • Ostatnio:10 miesięcy
  • Postów:128
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 :)

Zobacz pozostałe 4 komentarze
TC
Dla mnie to jest dziwne, że tyle ludzi myśli, że rekurencyjny fibonacci albo silnia są sporo prostsze od iteracyjnych. Dla mnie zawsze iteracyjne były prostsze.
Miang
@ToughCaptcha: +1, ja sie długo musiałam zastawiać jak to można by zrobić inaczej (skoro mówicie że można)
WeiXiao
ale wy kozacy jesteście, biorę was na topcoder open xd
RequiredNickname
fibonacci to nie świetne zadanie na początek tylko zadanie całkowicie oderwane od rzeczywistości w której przyszłemu kandydatowi przyjdzie pracować. Copy paste podejścia z uczelni takiego stricte akademickiego które potem jednak nie za specjalnie się przydaje.
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
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ć.


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
edytowany 2x, ostatnio: PerlMonk
rgawron
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Cannes
  • Postów:67
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.


edytowany 2x, ostatnio: rgawron
Zobacz pozostały 1 komentarz
Wawer0123
najwazniejsze w crudach jest umiejetnosc zrozumienia procesu biznesowego i implementowania tego w prosty sposób, ale zgodnie z architekturą
piotrpo
@Wawer0123: Jak masz proces biznesowy i zrozumienie to już nie masz CRUD. Chyba, że uznajesz za każda aplikacja zapisująca i odczytująca dane to CRUD. W takim wypadku, to nawet pisząc gry robiłem CRUD, bo gdzieś tam trzeba było zapisać stan i ponownie go wczytać.
Wawer0123
jako crud rozumiem proces typu: pobierz X, zmapuj do Y i wyslij/zapisz do Z Takie rzeczy bywają pokręcone, zwłaszcza jak masz mikroserwisy.
piotrpo
To bardziej pasuje do ETL akurat. CRUD to aplikacja, która implementuje Create, Read, Update, Delete na encjach.
Wawer0123
no to przeciez w tym nie ma zadnej roboty, zwlaszcza jak korzystasz z mongodb
Marcin Marcin
  • Rejestracja:prawie 6 lat
  • Ostatnio:22 dni
  • Postów:610
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ć.


Fan moderatora somekind
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:1493
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ść.

edytowany 3x, ostatnio: alagner
baant
  • Rejestracja:około 11 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
  • Postów:524
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

edytowany 2x, ostatnio: baant
piotrpo
Tylko wtedy odrzucę najbardziej ogarniętych (bo im się nie będzie chciało robić zadania), natomiast dostanę głównie miernych, ale z kolegą, co potrafi.
AL
@piotrpo: jak "kolega potrafi" to jedno. Ale z opowieści kolegów, którzy przeprowadzali rekrutacje, wiem jak pięknie np. interpolacja liniowa (do zrobienia w domu) potrafi ludzi z doktoratami z informatyki pokonać.
baant
Junior, ktoremu sie nie chce zrobic zadania? Panu dziekujemy i zyczymy powodzenia
piotrpo
@baant: Uważam, że nie ma sensu wymagać nadmiernego wysiłku od kandydata. Chcę potwierdzić, że kandydat wie co to Java, a nie czy mu się chce poświęcać 3 popołudnia na robienie jakiegoś zadania.
baant
dla wielu osob jednak wiekszym wysilkiem jest byc pod ostrzalem pytan pod stresem ;d
MA
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 2 lata
  • Postów:337
3

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

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 dni
  • Postów:3277
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.

AL
Pół-żartem nieco piszę, ale normalnie mam ochotę odświeżyć Javę (bo coś tam kiedyś pisałem/fixowałem, ale jednak w C++ siedzę na codzień) i się do Was przejść, bo fajnie to wygląda "na oko". A nuż (widelec) się uda ;) )
piotrpo
@alanger jak chcesz, to daj znać, podeślę link do ogłoszenia.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 13 godzin
  • Postów:5107
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.

edytowany 1x, ostatnio: WeiXiao
Zobacz pozostałe 9 komentarzy
piotrpo
@alanger: bo to zależy od kontekstu. Masz pamięci pod dostatkiem - rób jak chcesz, jak ci wygodniej. Tak długo jak zwalniasz zasoby, to nic złego się nie stanie. Jak twój kod ma działać na urządzeniach mobilnych, w chmurze, to nagle pamięć ma znaczenie. W pierwszym przypadku zakląłbym, gdyby ktoś w taki sposób przetwarzał XMLa na kilkadziesiąt megabajtów, w drugim już przy 1 megabajcie byłby problem. No i generalnie po co parsować całość do jakiejś tam struktury pamięciowej, jak można szybko przeskanować plik XML i wyciągnąć co tam potrzebujesz.
AL
Wiesz co, ja w innych technologiach pracuję i kilkadziesiąt/set mega - bezspornie. Ale nawet na moim "dużym embeded linuxie" kilkaset kilo parsowane w Pythonie to tyle co nic (biorąc pod uwagę, że kupa innych rzeczy jest ładowana do pamięci na zapas) ;)
AL
@piotrpo: także raz jeszcze: kontekst. ;)
piotrpo
Jasne, tylko my sobie tu dyskutujemy o kontekście (oczywiście, że jest to ważne), a jest część programistów, którzy nie wiedzą, że da się robić inaczej. W 90% przypadków nie ma to znaczenia, w pozostałych 10% ma. W ekstremalnym przypadku skutkuje to miesiącem grzebania w bajzlu, bo "pamięć jest tania", "złożoność obliczeniowa nie ma znaczenia", "taniej będzie wziąć większy serwer, niż napisać to optymalnie" itd.
WeiXiao
no w moim przypadku - xml 30 LoC, zatem to co pisze @alagner jest jak najbardziej zasadne. W ogóle jak już o pamięci, to bonusowe punkty bo tu użyłem File.ReadAllLines, więc i tak jest cały w pamięci xD
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
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ć.


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)