Java - pytania rekrutacyjne mid/senior

Java - pytania rekrutacyjne mid/senior

Wątek przeniesiony 2022-01-19 11:11 z Kariera przez cerrato.

LU
  • Rejestracja:ponad 11 lat
  • Ostatnio:6 dni
  • Lokalizacja:Gdańsk
23

Przez ostatnie 3 miesiące byłem na wielu rozmowach rekrutacyjnych na Java Dev.
Poniżej przesyłam zestaw pytań, które zapamiętałem i spisałem może komuś się przyda ;)

  1. Standardowe pyanie: Opowiedz w jakich projektach uczesniczyłeś, jakich technologii używałeś itp.
  2. Jak działa JIT? Czy ma jakieś wady?
  3. Do czego służy adnotacja @PostConstruct
  4. Wymień sposoby wstrzykiwania zależności. Jakiego sposobu używasz i dlaczego?
  5. Co to jest hermetyzacja?
  6. Jakie rzeczy weszły z Java11. Jakich używałeś?
  7. Kryptografia z kluczem publicznym vs prywatnym. Czym się różni i, która metoda jest używana w TLS?
  8. Jak byś napisał metodę kontrolera do usunięcia wielu użytkowników?
  9. Rest vs Soap
  10. Mikroserwisy vs Monolity
  11. Do czego służą indeksy i jakie znasz?
  12. Zasady SOLID, IoC, Dependency Injection
  13. Mamy 2 serwisy każdy z nich ma swoją bazę. Jak uzyskać spójność / transakcyjność
    gdy jeden wywołuje drugi jakie znasz patterny?
  14. Dlaczego BigDecimal jest lepszy od double to przechowywania wartości pieniężnych?
    Dlaczego double nie jest precyzyjny?
  15. Do czego służy BindingResult w Springu?
  16. Wymień poziomy izolacji transakcji i wyjaśnij jak działa jeden z nich?
  17. Adnotacja @Transactional jakie ma właściwości / co można ustawić?
  18. Jak walidować przychodzące requesty w REST w Springu? Jaki błąd wystąpi
    gdy podamy stringa zamiast inta?
  19. Jak zabezpieczyłbyś api restowe?
  20. Jak przechowywać hasła w bazie danych? Jak działa bcrypt?
  21. Jakie znasz zalety/wady stream api w Java?
  22. Jak działa protokół HTTP? Jakie są metody?
  23. Kiedy wybrałbyś rozwiązanie przechowywania danych
    w oparciu o relacyjną bazę danych a kiedy NoSQL? Jakie
    brałbyś kryteria pod uwagę?
  24. Model pamięci w Java. Jakie znasz Garbage Collectory? Po co one są?
  25. Jak działa HashMap/ConcurrentHashMap w środku?
  26. Komunikacja z zewnętrznymi usługami. Podejście do obsługi błędów
  27. Typy ataków webowych np. xxs,csrf wymień i objaśnij jeden z nich

xxxmateusz00xxx
Bardzo fajne pytania, nie na wszystkie znam odpowiedzi
LukeJL
Co do 11. czy tu chodzi o indeksach w bazach danych czy Java ma jakieś swoje indeksy?
LU
@LukeJL: Chodziło o indeksy na bazie danych
Damian Pawelec
  • Rejestracja:prawie 4 lata
  • Ostatnio:ponad rok
  • Postów:22
0

Wszystkie tematy (poza Java 11 i rozproszoną baza danych w jednej aplikacji) mialem poruszone na studiach inżynierskich, i uważam że pytania naleza do puli juniora, który już samodzielnie potrafi robić taski.

Zobacz pozostały 1 komentarz
M0
Uważam, że stażysta który musi jeszcze dopłacać za to że może pracować musi mieć to w jednym palcu
JM
jackson-mike
+1
wiciu
Uważam, że asystent stażysty, który powinien dopłacać za to że może pracować, jeździć 50 km codziennie do biura firmy na własny koszt, przygotowywać obiady dla wszystkich pracowników i szorować kible służbowe po pracy, musi mieć to w jednym palcu
PanamaJoe
nie znacie się, to są pytania na maturę z informatyki, bez tego nie ma co iść na infę, zostaje tylko socjologia i PHP hobbystycznie w weekendy
P1
  • Rejestracja:ponad 3 lata
  • Ostatnio:20 dni
  • Postów:55
5
Damian Pawelec napisał(a):

Wszystkie tematy (poza Java 11 i rozproszoną baza danych w jednej aplikacji) mialem poruszone na studiach inżynierskich, i uważam że pytania naleza do puli juniora, który już samodzielnie potrafi robić taski.

Na juniora zdecydowanie nie, na regulara są ok, na seniora te pytania to za mało.

Szkoda, że te pytania za wiele nie sprawdzają. Ktoś kto z tymi problemami nigdy nie pracował jest w stanie na te pytania odpowiedzieć, o ile powtórzy/uzupełni sobie teorię. Dlatego nie lubię takich rozmów. Tak samo teraz są bardzo popularne pytania z patternów mikroserwisowych. Kumpel co pracował kilka lat tylko i wyłącznie z monolitami bezproblemowo odpowiedział na pytania typu co to jest SAGA, co to CQRS, co to circuit breaker, rate limiter, ... Bo jest masa pytań z odpowiedziami dostępnych w internecie. Tylko co to ma sprawdzić - czy kandydat wykuł jakieś regułki, a na oczy tego nie widział?

Fajne są pytania na myślenie albo takie, które sprawdzają jak rozwiążesz problem lub jakie problemy spotkałeś w karierze. Wolę zapytać kogoś co zrobić, gdy SQL query wykonuje się bardzo długo (indeksy, excution plan, zmiana strategii lockowania, ...) niż zadać pytanie co to jest indeks - bo duża szansa, że ktoś nie ma z tym w ogóle doświadczenia i nie będzie wiedział w praktyce nic, ale wyśpiewa mi piękną regułkę...

LU
  • Rejestracja:ponad 11 lat
  • Ostatnio:6 dni
  • Lokalizacja:Gdańsk
0

Na juniora zdecydowanie nie, na regulara są ok, na seniora te pytania to za mało.

Jakieś przykłady pytań na seniora?


P1
Chodziło mi, że moim zdaniem to za mało. Wiem, że niestety takie zadają, ale sama teoria nie odróżni skillowego seniora od kogoś, kto kopiuje wszystko ze stacka i nie ma pojęcia co faktycznie robi. Pytania powinny być jak najbardziej praktyczne i sprawdzać doświadczenie i wiedzę, ale głównie tą praktyczną. No i sposób rozwiązywania problemów przez kandydata. Fajnie też dać jakiś problem związany z planowaniem/projektowaniem architektury. Praktyczna znajomość bibliotek. Niskopoziomowe szczegóły, jeśli możliwe. Szybko idzie odróżnić specjalistę od nooba ;-)
LU
Moim zdaniem niektóre z tych pytań są już na poziomie seniora. Poza tym ja podałem tylko te "pierwsze" pytania, za którymi stały zwykle jakieś kolejne bardziej szczegółowe ;)
wiciu
  • Rejestracja:ponad 11 lat
  • Ostatnio:11 dni
  • Postów:1205
2
lookacode1 napisał(a):

Na juniora zdecydowanie nie, na regulara są ok, na seniora te pytania to za mało.

Jakieś przykłady pytań na seniora?

To chyba od firmy zależy, bo można powymyślać cokolwiek. Jak brałem udział w rekrutacjach na seniora, to część pytań można równie dobrze zadać na rolę juniora/mida, niektóre pytania były zupełnie bez sensu, a niektóre rozmowy były chyba głównie po to, żeby zobaczyć jak się ze mną gada, czy będzie się dało ze mną normalnie współpracować i nie miały w ogóle zbyt wielu jakichś wybitnie technicznych pytań : D. Natomiast techniczne umiejętności były czasem weryfikowane poprzez przeglądanie moich wypocin w internecie (github/stackoverflow/blog/itp.)

edytowany 1x, ostatnio: wiciu
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:16 dni
  • Postów:3277
5

Zadajemy niektóre z tych pytań na początku rozmowy. Jeżeli ktoś nie zna podstaw, to po co tracić czas na resztę tej przygody? Później pogłębiamy. Z ciekawości, w wielu wypadkach wystarczy lekko inaczej zadać pytanie i zaczynają się problemy. Przykładowo, po prostych pytaniach np. o wzorce projektowe jest całkiem nieźle. Po zadaniu pytania

Masz potrzebę monitorowania zmian w dowolnej implementacji List, przez jeden lub wiele obiektów, jak rozwiążesz taki problem?
Zaczyna się jazda.

Kolejny przykład, po popisie wiedzy na temat GC, edenach, survivors itp. pada pytanie

Jakie warunki muszą być spełnione, żeby GC nie mógł skasować obiektu, lub ich grupy trzymającej wzajemne referencje?

Okazuje się, że całkiem spora liczba kandydatów okazuje się nie wiedzieć o istnieniu GC roots

Z drugiej strony, jeżeli się zatrudnia seniora, to nie ma sensu iść w szczegóły. Programowanie nie polega na pamięciowym opanowaniu pełnej specyfikacji języka. Sensu pytania o jakieś szczegóły frameworka (np. Spring) kompletnie nie widzę.

edytowany 1x, ostatnio: piotrpo
Zobacz pozostałe 4 komentarze
LU
Stack / Heap albo jak są pod spodem przekazywane argumenty do metody czy tam inne podstawy to tak ale GC, edeny i te inne to osobiście nigdy z tej wiedzy nie skorzystałem zawsze sobie przypominam co nieco do interview tylko. Jakbym wiedział, że będę musiał zrobić jakiś tuning jvma to tak ale to też można się w trakcie douczyć.
piotrpo
@lookacode1: O edenach mówią sami z siebie (nie wiem po co), dlaczego wiedzach o GC roots jest ważna przekonasz się kiedy zetkniesz się z pierwszym wyciekiem pamięci w Javie. W serwerowej nie jest to zwykle problem, bo wystarczy ustawić wyższy limit.
LU
@piotrpo: A polecisz jakieś materiały gdzie można pogłębić wiedzę na ten temat?
piotrpo
@lookacode1: GC roots kiedyś były na poziomie SCJP, nie wiem jak jest teraz. Wszystko co trzeba pamiętać, to to, że jak obiekt nie jest dowiązany do zmiennej statycznej, nie zakończonego wątku, lub (kiedyś) UI, to GC może go uprzątnąć.
jarekr000000
Piękne : W serwerowej nie jest to zwykle problem, bo wystarczy ustawić wyższy limit.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
16

Na juniora zdecydowanie nie, na regulara są ok, na seniora te pytania to za mało.

Na regulara ok, ale na seniora to akurat za duże wymagania. Zaufajcie, znam trochę seniorów.

Ja bym na pytaniu 3. zaczął toczyć pianę z ust i odpadł, a byłem kiedyś seniorem.


jeden i pół terabajta powinno wystarczyć każdemu
piotrpo
Przecież to oczywiste, @PostConstruct służy do oznaczania złego kodu.
wiciu
  • Rejestracja:ponad 11 lat
  • Ostatnio:11 dni
  • Postów:1205
2
jarekr000000 napisał(a):

Na juniora zdecydowanie nie, na regulara są ok, na seniora te pytania to za mało.

Na regulara ok, ale na seniora to akurat za duże wymagania. Zaufajcie, znam trochę seniorów.

Ja bym na pytaniu 3. zaczął toczyć pianę z ust i odpadł, a byłem kiedyś seniorem.

O, to już mam pytanie na seniora: Co się stanie jak damy adnotację PostConstruct i PreDestroy na metodzie jednocześnie i co się stanie jak zamienimy te adnotacje kolejnością?
I pytanie bonus: Ile adnotacji na metodzie trzeba dodać, żeby podnieść ciśnienie userowi @jarekr000000, a ile adnotacji wyprowadzi go z równowagi? xD

TY
Odpowiadam na pytanie bonusowe: wystarczy jedna
vpiotr
Jakby chciał wyeliminować kandydata to bym zadał pytanie jak należy napisać finalize żeby dobrze działało i dlaczego nie należy stosować AutoClosable.
wiciu
@Tyvrel: gratulacje, zdał Pan xD
jarekr000000
Bez przesady: @override jest spoko.
vpiotr
Pascal: override, C++: override, Kotlin: override, Java... @Override.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Pytanie 11 zamieniłbym na "kiedy nie należy dodawać indeksów" ew. "co zrobić gdy Twoje zapytanie nie mieści się na 5 ekranach".
Pytanie 16 jest trochę za łatwe, zmieniłbym na "Co to jest phantom read i jak powinniśmy się przed tym zabezpieczać".

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
5
jarekr000000 napisał(a):

Ja bym na pytaniu 3. zaczął toczyć pianę z ust i odpadł, a byłem kiedyś seniorem.

Czekałem kto odpowie nia pytanie 3. jako pierwszy i się nie zawiodłem :D w zasadzie to po pytaniu 3. przestałem czytać listę ciesząc się że mnie to już nie dotyczy :P
BTW moja odpowiedź na pytanie 3. to Ta adnotacja służy do psucia kodu. Dziękuję, nie chce już u panstwa pracować (No chyba że mają naprawdę wysoki dodatek za pracę w szkodliwych warunkach, to mogę wytrzymać rok w 💩


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
Zobacz pozostałe 4 komentarze
piotrpo
Jeżeli potrzebujesz rzucać zależności klasy inaczej niż przez konstruktor, to masz ich za dużo. Jeżeli tworzysz zależności wewnątrz klasy, to cała idea (sensowna zresztą) IoC idzie się walić. Generalnie new Whatever(...) powinno dostarczać, nowy, sprawny obiekt klasy. To, że da się wejść do bebechów refleksją i coś mienić nie do końca jest najlepszą drogą (wstrzykiwanie pól).
LU
Akurat refleksji to bym unikał. Natomiast chodzi mi o to, że np. nie będziemy wstrzykiwać StringBuffer tylko klasa sama sobie stworzy tego typu podobne zależności i te new Whatever(...) też dalej będzie działało i stworzy się poprawny obiekt. I nie ma też sensu ich jakoś mockować czy podmieniać w testach.
KamilAdam
No ok, Ale po co ci @PostConstruct żeby zrobić new StringBuffer?
LU
Nie powiedziałem, że jest potrzebne. Jeżeli używamy wstrzykiwania przez konstruktor to wgl bym nie używał PostConstruct. Chodziło mi tylko o to, że nie wszystkie "zależności" zawsze bym dawał w parametrach konstruktora bo klasa sama może sobie je stworzyć klient klasy nie musi wiedzieć o wszystkich zależnościach.
SL
@lookacode1: jak klasa sama je tworzy to niech zawsze tworzy to samo, po co PostConstruct? Wstrzykiwanie przez konstruktor daje tą dodatkową zaletę, że to taka troche mini dokumentacja: po samym parametrach konstruktora widzę co ta klasa robi i co wpływa na to jak działa
Patryk Mieleszko
  • Rejestracja:około 4 lata
  • Ostatnio:około 3 lata
  • Postów:69
2

na seniora lista pytań nie ma zasadniczo sensu

senior ma "umieć zrobić wszystko samodzielnie" w obrębie tej firmy w której idzie rekrutacja, więc pytasz o technologie które są tu używane - senior powinien odpowiedzieć na pytanie o każdy szczegół in-house stacka (jeśli nie umi to nie jest to senior w obrębie tego housa, może gdzie indziej tak - np. w poprzedniej firmie, ale nie tu)

każdy senior wie też że nie wie wszystkiego (wie jak zajebiście szerkiem i głębokim tematem jest IT) i nie udaje wszystkowiedzącego - dlatego trzeba jeszcze sprawdzić jak reaguje na pytania trudne, najpewniej pytania o to "jak zrobiłby x mając y oraz będąc ograniczony z"

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

senior ma "umieć zrobić wszystko samodzielnie" w obrębie tej firmy

Raczej działa klasyka:

  • junior musi wiedzieć wszystko to co jest w google
  • mid musi umieć znaleźć wszystko co potrzebne w tym google
  • senior musi wiedzieć jak otworzyć wyszukiwarkę
  • a architekt musi wiedzieć jak znaleźć seniora

jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
piotrpo
Jest w tym bardzo, ale to bardzo dużo prawdy.
DC
Trochę śmieszne ale kurcze no trochę tak to właśnie wygląda ; ) Przynajmniej jak patrze na swoją dotychczasowa karierę. Zauwazylem jeszcze, że im więcej doświadczenia zbieram tym bardziej wydaje mi się, że nic nie wiem i każdą przyszłą rozmowę kw. typu quiz uwalę. Impostor syndrom mocno.
KR
Ostatnio zostałem rzucony do innego teamu głównie midów i juniorów abym im pomógł z przerobieniem czegoś w komponentcie X (zrobionym 3 lata temu przez inny zespół, który robił go z kolei przez 2 lata). Zrobiliśmy te przeróbkę 2x szybciej niż zakładał plan. Zadowolony szef tamtego teamu mówi mi komplement: "no, ściągnięcie eksperta od X do pomocy było strzałem w dziesiątkę, bez ciebie byśmy to robili rok, bo nikt u nas nie zna X". Uświadomiłem go że ja też nie znam. Cała moja znajomość X polegała na tym, że parę razy piłem piwo z szefem oryginalnego zespołu X. :D
WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 7 godzin
  • Postów:3183
1

Czyli jak ktos nie zna Springa nie nadaje sie na Java Seniora? :O

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

Czyli jak ktos nie zna Springa nie nadaje sie na Java Seniora? :O

Czy ktoś w ogóle zna Springa (poza Juergenem Hoellerem)?


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
Patryk Mieleszko
  • Rejestracja:około 4 lata
  • Ostatnio:około 3 lata
  • Postów:69
2

jak ktoś nie zna springa ale w tej firmie nie ma springa to wciąż może być seniorem

albo

jak ktos nie zna springa ale jest ogarniety (po 15 minutach z czlowiekiem na interview mozesz to ocenic) to i tak moze byc seniorem bo ogarnie szybciej i lepiej niz ktos kto "zna" springa

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

@WhiteLightning: to tak jakbyś zapytał czy jak ktoś nie zna Excela lub CSV to może być seniorem.

Patryk Mieleszko
ja znam csv tak samo jak znam txt, excela nie znam i nie chce znac
vpiotr
Tak naprawdę 90% programistów myśli że zna CSV. Niektórzy nawet piszą parsery przy pomocy np. (w Javie) String.split.
Patryk Mieleszko
to juniorzy a nie programisci
WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 7 godzin
  • Postów:3183
3

@vpiotr: ja przez kilkanascie lat pracy zasze trafiam do projektow w Javie gdzie Springa ani Spring Boota po prostu nie ma. (poza jednym projektem).

Zobacz pozostałe 13 komentarzy
KR
@WhiteLightning: O żesz, zapomniałem o tym. Muszę dać znać zespołowi pracującemu nad wydajnością kompakcji, że mogą się rozejść, bo na 4p znaleziono już rozwiązanie.
vpiotr
:-D
KR
Ja po prostu widziałem jakie "przykuce" robią ludzie w HPC w C/Fortranie żeby przetworzyć jakąś macierz wydajnie i schodzą przy tym np. 10x z czasem wykonania. Mam prosty POC czytający tabelkę i liczący celki - wersja Rust była jakieś 40x szybsza niż oryginalny kod Java. Od tamtego czasu wersja Java została wprawdzie ulepszona ale nadal jest daleko.
KR
tylko po co, skoro w Kafce problemem jest IO a nie mielenie bajtów - IO jest w ostatnich czasach bardzo szybkie. Mamy pamięci SSD o przepustowości 3+ GB/s i podobnie szybkie sieci. Naprawdę bardzo łatwo się nie wyrobić z mocą CPU nawet na głupiej deserializacji danych. Weźmiesz zły algorytm kompresji i już Twój SSD będzie się nudził.
vpiotr
Z tego co wiem są połączenia sieciowe szybsze niż IO pojedynczego dysku (infiniband?) ale nie znam szczegółów.
kevin_sam_w_domu
kevin_sam_w_domu
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 3 lata
  • Postów:196
0

W Polsce Java Developer jak nie zna Springa to raczej naprawdę krucho i współczuję.

edytowany 2x, ostatnio: kevin_sam_w_domu
P1
Nie. Wystarczy, że ktoś pracuje w toolingu albo jakichś alternatywnych frameworkach i może być dobrym java devem bez springa. Mam nawet wrażenie, że sporo firm zaczyna odchodzić od springa dla zasady. Z resztą ten spring wcale taki super nie jest...
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
1
kevin_sam_w_domu napisał(a):

W Polsce Java Developer jak nie zna Springa to raczej naprawdę krucho i współczuję.

Jak jeszcze mnie to interesowało to 10% ofert było bez springa, EJB i hibernate. To dalej duża pula z której można wybierać


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
kevin_sam_w_domu
kevin_sam_w_domu
powoli i Spring odchodzi w cień tak mi się wydaje że rzecz Micronaut/Quarkusa
KamilAdam
Cieszy mnie to niezmiernie :)
EL
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 9 godzin
  • Postów:138
10
kevin_sam_w_domu napisał(a):

W Polsce Java Developer jak nie zna Springa to raczej naprawdę krucho i współczuję.

Mylisz pojecia "programista" i "operator annotacji" (wzglednie, jesli jeszcze ktos uzywa, "operator xml").

JM
jackson-mike
operator annotacji <3
kevin_sam_w_domu
kevin_sam_w_domu
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 3 lata
  • Postów:196
1

@eleventeen: No ale powoli tak wygląda programowanie w Javie, że musisz "sklejać" wiele technologii na raz adnotacjami i wiedzieć też jak to "posklejać". Sam robię w Javie i masz rację, tutaj nazwałbym się bardziej po 4 latach jako operator frameworka, ale no pieniądze są spoko. Druga kwestia jest taka, że rynek jest jaki jest i w cenie są wyrobnicy, a nie goście co potrafią w CPP robić competitive programming. Choć tym drugim, no właśnie bliżej do bycia "programistą".

edytowany 3x, ostatnio: kevin_sam_w_domu
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:16 dni
  • Postów:3277
3

@eleventeen: Bez przesady, to, że adnotacje są bardzo nadużywane i często wyzwalają jakąś bardzo dziwaczną magię nieosiągalną "normalnymi metodami", to nie znaczy, że to sperma szatana. Moim zdaniem problem leży nie w tym, że ktoś używa adnotacji, tylko w tym, że nie wie co one robią i to na poziomie samej dokumentacji. Fakt, że Spring wybitnie prowokuje takie olewanie, przez wprowadzenie do kilku sensownych adnotacji kilkudziesięciu innych, które jedyne co robią, to scalają kilka innych pod niewiele mówiącą nazwą.

U większości "programistów Spring" pytanie o opisanie mechanizmu działania DynamicProxy, powoduje wyjście oczu z orbit, czyli, często przez lata, piszą kod, którego nie rozumieją.

EL
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 9 godzin
  • Postów:138
2
kevin_sam_w_domu napisał(a):

No ale powoli tak wygląda programowanie w Javie, że musisz "sklejać" wiele technologii na raz adnotacjami i wiedzieć też jak to "posklejać".

A to zalezy co sie robi. Mi sie zdazylo pisac ML, rozne serwery, wiekszosc nie dotykajace sie do springa, lata temu aplety, apki androidowe i pare innych rzeczy by sie znalazlo. Zgadza sie, wiekszosc pracy w javie to jakis paskudny web, i do tego w springu, ale nie zmienia to faktu ze java != spring.

piotrpo napisał(a):

Moim zdaniem problem leży nie w tym, że ktoś używa adnotacji, tylko w tym, że nie wie co one robią i to na poziomie samej dokumentacji.

Nie wiem co masz na mysli, ale przypomnialo mi sie jak cos probowalem zrobic w springu na podstawie dokumentacji. No i kompletnie nie dziala. Zagladam na stackoverflow i tam rozwiazanie kompletnie sprzeczne z dokumentacja. Dziala. I jaka ja mam gwarancje ze np. w nowszej wersji springa nie przestanie dzialac? Jaka ja mam w ogole gwarancje ze to dziala dla kazdej sytuacji poza ta ktora przetestowalem? To ma byc profesjonalizm? To tak jak by napisac aplikacje wielowatkowa kompletnie to olewajac, i mowic klientowi ktoremu sie wszystko sypie klasyczne "u mnie dziala" po przetestowaniu na 1 watku, albo nawet niech bedzie i na 100, ale akurat w testach lokalnych wyscigow nie ma.

No i oprocz tego "nie wie co one robią" tez moze wystepowac "nie wie ze kilka kiloplikow dalej od aktualnie edytowanego ktos wpisal annotacje ktora zmienila zachowanie calej aplikacji".

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:16 dni
  • Postów:3277
9

@eleventeen: Chodzi mi o podejście, w którym bez wiedzy o tym, co dana adnotacja faktycznie ma robić dostawia się ją (i ileś tam innych), aż osiągnie się efekt, który przejdzie testy.
Jak pisałem, dla mnie samo istnienie @whatever nie jest złe. Złe jest bezkrytyczne używanie frameworkowej "magii", często za wszelką cenę. Ja nawet cenię sobie, że zamiast pisać np. servlet z jakimiś tam filtrami na ścieżki można dostawić przy dowolnej metodzie @Endpoint, wpisać jaką ścieżkę ma obsługiwać i zrobione. Nie mam nawet problemu z użyciem jakiegoś wstrzykiwania zależności, chociaż oparte na refleksjach podejście springowe ma dużo wad. Gorzej kiedy korzystanie z narzędzia, jakim jest Spring staje się celem samym w sobie i muszę uczestniczyć w dyskusji typu:

  • musimy dodać a+b
  • (tydzień później) W Springu się nie da tego zrobić
  • jak się nie da, skoro to proste sumowanie 2 liczb, wiemy jakie to liczby, na czym polega sumowanie, to gdzie problem?
  • Bo spring nie ma takiej adnotacji, myślałem, że możemy użyć adnotacji X, ale nie możemy, bo używamy adnotacji Y, jest biblioteka która na to pozwala, ale ma konflikt z biblioteką, której użyłem do liczenia a * b i musimy wybrać, czy nasza aplikacja będzie dodawać, czy mnożyć, możemy tez podzielić to ma mniejsze serwisy jeden będzie dodawać, a drugi mnożyć.
  • A co przeszkadza napisać return a+b a w drugiej metodzie return a*b?
  • No może by i się dało, ale to nie będzie idiomatyczny kod, bo spring ma adnotacje do dodawania i taką do mnożenia i one są zajebiste, bo nie trzeba pisać kodu, ale nie mogą występować razem w projekcie.
  • To dopisz nad klasą @Bean będziesz miał idiomatycznie, faktycznie trzeba będzie napisać 2 linijki kodu, ale to chyba wyzwanie, z którym jesteśmy w stanie się zmierzyć?

Tutaj w zależności od rozmówcy następuje kolejna iteracja, albo lekki foch i dostarczenie rozwiązania które "działa, ale jest brzydkie".

.andy
Jak zawsze we wszystkim w życiu trzeba znać umiar.
PI
Hahah ten przykład mnie rozwalił, ale bardziej by chyba pasował do npma niż do Springa
piotrpo
@Pinek: To pasuje praktycznie do każdego frameworku na tyle popularnego, że pojawia się kategoria "Framework X programmer" zamiast "Language X programmer".
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
5

Bez przesady, to, że adnotacje są bardzo nadużywane i często wyzwalają jakąś bardzo dziwaczną magię nieosiągalną "normalnymi metodami", to nie znaczy, że to sperma szatana.

Właśnie odwrotnie, często można zupełnie to samo osiągnąć bez magii i adnotacji i przy tej samej ilości kodu. Tylko my w javie nie lubimy zbyt prostych rozwiązań.


jeden i pół terabajta powinno wystarczyć każdemu
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:16 dni
  • Postów:3277
1

@jarekr000000: Ale ja się zgadzam. Zwyczajnie sytuacje są różne i możemy sobie popisać, które częściej (chociaz sądzę, że tutaj mamy identyczną opinię). Wydaje mi się jednak, że nie masz nic przeciwko @Override, a jak by nie patrzeć, to też adnotacja, ok powinna być słowem kluczowym. To, że Spring doprowadził ich użycie do poziomu karykatury to oczywistość, podobnie jak całe wiadro bibliotek, które uznały tę magię za wspaniałość i poszły tym śladem. Co gorsza przesuwają moment wykrycia oczywistych błędów z etapu kompilacji na runtime.

Odrywając się od bibliotek, co sądzisz o np. takim problemie jak definiowanie zestawu endpointów w aplikacji, dla mnie "ideałem" było by coś co jest "przyjemne" w pisaniu i na etapie kompilacji sprawdza możliwie szeroko poprawność tej konfiguracji (np. czy nie zdefiniowano więcej niż raz tego samego endpointu. Możliwości są takie:

Springowe podejście:

Kopiuj
@GetMapping("/hello")
public String hello(){return "hello";}

@GetMapping("/hello")
public String bye(){return "bye";}

Tylko oczywisty błąd nie zostanie wychwycony do startu aplikacji.

Można podejść do tego od strony Javy, czyli z grubsza tak:

Kopiuj
Server.serverBuilder()
  .addEndpoint("/hello", controller::hello)
  .addEndpoint("/hello", controller::bye)
  .startServer()

Tylko błąd nadal nie zostanie wychwycony przed wykonaniem tego kawałka kodu

Wreszcie można pozwolić sobie na odrobinę magii i połączyć oba podejścia np. poprzez zmiany sposobu w jaki to GetMapping jest obsługiwane i przejście z tym z poziomu refleksji działających na refleksjach do poziomu kompliacji, czyli pozwolić napisać APTowi ten drugi kawałek kodu, przy okazji sprawdzając, czy np. ktoś nie próbuje podpiąć 2 różnych metod do tego samego endpointu.

MA
@piotrpo: tak z ciekawości, nie jestem javowcem - jaki tutaj błąd jest w tym kodzie? Bo tutaj nie ma gdzie być błędu moim zdaniem, jest mapowanie w postaci dekoratora i funkcja, która ma zwrócić wartość - co tutaj więcej potrzeba? >_<?
MA
@piotrpo: przykład w Flasku routingu: https://flask.palletsprojects.com/en/2.0.x/quickstart/ - gdzie @route jest po prostu funkcją kodu i spełnia tu rolę dekoratora i tyle.
piotrpo
Błąd polega na zamapowaniu 2 metod w kodzie na pojedynczy endpoint.
99xmarcin
Na to to tylko lepszy język który pozwala nazywać metody /foo/bar/hello :D
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
1

@piotrpo:
Co do mapowania do najbardziej podobają mi się rozwiązania w stylu:
https://github.com/softwaremill/tapir

ale to scala, w javie i kotlinie nie ma lekko.

Jakkolwiek i tak wolę podejście funkcyjne - też się może wyrypać w runtime, ale jednak testowanie łatwiejsze, a do tego można jednak funkcja to funkcja, można o wiele łatwiej parametryzować to API, nawet budować w pętli, albo rekurencyjnie (czego adnotacjami nie da się w ogóle zrobić).

Żeby ominąć trochę błędów zrobiłem sobie nakładkę na Ktora i API robię tak Kotlin):
https://github.com/jarekratajski/damagerGame/blob/88f4fd27d20e3d403ace07f14fca71add6f89f0b/src/main/kotlin/damager/web/Server.kt#L64

Nakładka trochę mi pomaga w unikaniu "nieobsłużonych" ścieżek, czasami jak coś się nie zgadza to się nie skompiluje (ale tylko bardzo czasami).

Kopiuj
rb.nested("/api/game") {
            rb.nested("/admin") {
                rb.get("/view") {
                    service.getView()
                } + rb.post("/reset") {
                    service.resetGame()
                }
            } + rb.nested("/player") {
                rb.nested("/command") {
                    rb.post {
                        val token = it.request.headers["token"]!!
                        runNee {
                            it.receive<Command>()
                        }.anyError().flatMap { cmd ->
                            service.postCommand(token, cmd)
                        }
                    }

                } + rb.post {
                    val name = it.parameters["name"]!!
                    service.registerPlayer(name)
                } + rb.get {
                    val token = it.request.headers["token"]!!
                    service.getOwnPlayer(token)
                }
            } + rb.get("/objects") {
                val token = it.request.headers["token"]!!
                service.getObjects(token)
            }

jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
Zobacz pozostałe 3 komentarze
jarekr000000
@sine co to znaczy centraluzowanie routingu???
SI
@jarekr000000: w jednym miejscu definiujesz mapowanie endpoint -> handler dla calej appki
SI
Wersja z githuba dużo przyjemniejsza, przyznaję! Ale ten kod z posta mało zjadliwy, a sporo takich widziałem u functional cowboyów :)
TheLearner
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Krypton
  • Postów:298
1

No niestety, nie znam odpowiedzi na sporo pytań, więc posiedzę sobie gdzie moje miejsce ;)


M0
czyli nie jesteś nawet stażystą ?
TheLearner
TheLearner
mentalnie to ja nie wiem co ro staż :|
S9
@TheLearner: ja też na sporo nie znam a mam 5 lata expa :P
S9
no dobra, z tym sporo to przesadziłem. Ale sekórity to musze ogarnąc :D
M0
nie jeden stażysta czai się na Twoje miejsce
PanamaJoe
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • Postów:310
1
piotrpo napisał(a):

Masz potrzebę monitorowania zmian w dowolnej implementacji List, przez jeden lub wiele obiektów, jak rozwiążesz taki problem?
Zaczyna się jazda.

Z ciekawości - jakie to ma praktyczne zastosowanie? Jakby mi ktoś takie pytanie zadał, to bym odpowiedział, że zrobiłbym ją final. Wtedy każda jej zmiana by skutkowała trudnym do przeoczenia komunikatem.


A poza tym sądzę, że bootcampy należy zniszczyć.
Zobacz pozostały 1 komentarz
PanamaJoe
Dobra, ale ja rozumiem monitorowanie, ma jakiś związek z niedeterministycznym zachowaniem tej listy, bo jaki sens byłby monitorowania tego. A chyba nie chcemy, żeby jakiekolwiek obiekty w tym listy zachowywały się w sposób niedeterministyczny? Jeżeli zaś ma to służyć do przechowywania danych, które zmieniają się w sposób niekontrolowany i potrzebujesz historie, tak jak metryki, to chyba wystarczy zaimplementować listę, w której każda zmiana idzie do jakiegoś loga. Względnie wyzwala coś? Serio nie przychodzi mi do głowy namacalne zastosowanie. Czy cybersecurity? Ochrona mem?
Hodor
@PanamaJoe: Wut, przecież final jest na referencję, a nie na zawartość.
SI
chodziło zapewne o immutability, tak zwane przejęzyczenie ;)
PanamaJoe
No tak, jak się pisze bez zastanowienia i List.of wejdzie za mocno.
DR
@PanamaJoe: ma to trochę sens bo każdy zna listę i jej interfejs (no, przynajmniej częściowo bo nasrali tam mnóstwo niepotrzebnych rzeczy) a chcesz sprawdzić tylko czy ktoś jest na jej podstawie coś zbudować i przewidzieć jakieś problemy. Można wymyślić jakiś customowy problem, ale niekoniecznie warto spędzać czas na rozmowie wprowadzając ludzi w problem który i tak nie ma znaczenia. Implementacja swojej listy albo jakiegoś wrappera na inne implementacje to też jakieś rozwiązanie. Pytanie czy jesteś w stanie porównać te kilka podejść.
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 6 godzin
  • Postów:3598
0

@PanamaJoe:

Jakby mi ktoś takie pytanie zadał, to bym odpowiedział, że zrobiłbym ją final. Wtedy każda jej zmiana by skutkowała trudnym do przeoczenia komunikatem.

Eee, final przecież tego nie rozwiąże. Na liście możesz wywołać clear() i będziesz miał modyfikację.

PanamaJoe
Autor napisał "zmian w dowolnej implementacji". Nie zrozumiałem tego jako zmian elementów listy. Sorry, faktycznie to głupie w kontekście tego co uściślił w poście poniżej.
W0
W sumie jeśli się tak zastanowić to faktycznie dało radę to tak zrozumieć.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.