Overengineering jako wzorzec projektowy

Overengineering jako wzorzec projektowy
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 13 godzin
  • Postów:3277
7

Z mojego skromnego doświadczenia wychodzi, że dość często w projektach używa się ostro przegiętej architektury doprawionej miljonem zależności do rozwiązywania banalnych problemów. Typowe przykłady:
Aplikacje mobilne składające się z 5 ekranów na krzyż mają w sobie:

  • Biblioteke do IoC
  • ORM
  • Event Bus
  • Jakieś customowe biblioteki do MVVM

Proste aplikacje serwerowe z pojedynczym endpointem ładują Springa z wszystkimi dobrodziejstwami, 5 bibliotek do wrzucenia paru linijek logów i również ORM'a do realizacji banalnych zadań.

Zastanawiam się, czy ma to jakiś ukryty sens, czy chodzi o takie sprawy jak:

  • Na blogu przeczytałem, że RxJava to super rzecz i chcę tego użyć.
  • Wszyscy teraz chcą programistów Spring, więc użyjmy tego frameworka, bo chcę go mieć w CV.
  • A co jak nasza aplikacja za 5 lat będzie większa i wtedy to się przyda?

Do tego sprawa trochę poboczna, ale chyba wpisująca się w ten trend - fetysz clean code, polegający na niekończących się dyskusjach, jak nazwać zmienną, żeby zamiast 20 znaków miała 15 znaków i dalej mówiła co przechowuje. Czepianie się o if(obj==null) zamiast if(null==obj), bo w C++ można pomylić porównanie z przypisaniem, my co prawda piszemy w Javie, ale na wszelki wypadek...

S9
  • Rejestracja:około 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
6

Proste aplikacje z jednym endpontem?
Ktoś tak robi na produkcji?

Wszyscy teraz chcą programistów Spring, więc użyjmy tego frameworka, bo chcę go mieć w CV.

Powiem szczerze że to mnie dziwi. Większość firm szuka programistów Springa, Angulara itp więc wielu ludzi się boi wykluczenia z rekrutacji.
Poza tym produkcja to nie eksperyment na projekt w Githubie, i tam używa się czegoś czego się zna.
To czy jar wazy 100 czy 200 mb to żadna różnica w porównaniu do rozmiaru community, dobrej dokumentacji itp


IH
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 dni
  • Postów:103
2

To nie wiem gdzie pracujesz.. chociaż z clean coderem miałem do czynienia. Na końcu każdego pliku, między nawiasem kończącym klasę, a drugim kończącym ostatnią metodę musiał być enter xD

Pixello
To jakiś masochista, nie clean coder, clean coder by wsadzil task do potoku kompilacji zeby frajerom z automatu poprawialo >.<
S9
  • Rejestracja:około 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
7

@IHaveHandedInMyResignation:
A to ja kiedyś miałem taki przypadek, gość robił logikę w kontrolerach, klasy z 10 polami itp ale jak były u mnie przez przypadek dwie linie odstępu to afera xD.
Ja się nauczyłem formatowania, typ dobrego kodu raczej nie...


SW
Logika w kontrolerach to całkiem częste zjawisko. Niektórzy nie zastanawiają się, że można inaczej. A kiedy się już zastanowią, to znak, że kupa jest tak wielka, że nikomu nie chcę się jej ruszać :)
Miang
bo w przykładzie kóry miał ilustrować coś zupełnie innego akurat taka logika była, a konkretnie były dwie linijki tej logiki. W danym kursie model nie był jeszcze w tym miewjscu omawiany, ale po co doczytać lub obejrzeć do końca....
somekind
No cóż, brutalna prawda jest taka, że większość korzystających z MVC nie wie, do czego te kontrolery właściwie służą.
CR
  • Rejestracja:około 6 lat
  • Ostatnio:24 minuty
  • Postów:112
1

OP: Mówisz o projektach komercyjnych czy amatorsko-edukacyjnych? Jeżeli to drugie, to nie widzę w tym nic dziwnego - ludzie chcą na jakimś prostym przykładzie ogarnąć, jak dane narzędzie działa.

edytowany 1x, ostatnio: Crazy_Rockman
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
5

A jeszcze lepiej kiedy:

  • design jest fancy,
  • zrobione ASAP,
  • project jest flexible,
  • itp itd.

Coraz częściej rzeczy jest możliwych do wyklikania. Potrzeba pisania czegoś samemu jest coraz rzadsza. Zarządy firm kumają IT w stopniu najwyżej miernym. Dla nich ważne, że jest zrobione. Ktoś rzucił buzzwordem typu Spring, który pozwala w krótkiej perspektywie zaoszczędzić parę tysięcy¿ "Me gusta¡" - krzyczą członkowie zarządu i godzą się na takie fajerwerki. Ale, że RAMu trzeba dołożyć albo potem poprawki robić, to nikt nie wie czemu tak się dzieje. Tzn. programiści wiedzą, ale ich mało kto słucha.


Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
edytowany 1x, ostatnio: PerlMonk
piotrpo
Programiści często są źródłem takich pomysłów.
Miang
popraw wykrzykniki na hiszpańskie ;)
PerlMonk
@Miang: Bangla. Kropek tylko nie chciało mi się szukać :]
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 13 godzin
  • Postów:3277
4

Mam takie doświadczenia ze sporej liczby komercyjnych projektów, które miały miejsce w sporej liczbie firm. Jak ktoś sobie chce coś prywatnie wyrzeźbić, to nic mi do tego - edukacyjnie wiadomo, że ma to sens. Ale jak chodzi o zrobienie prostej aplikacji do obsługi jakiejś tam promocji, serwisu, który ma szybko dostarczyć jakąś banalna funkcjonalność, czy innego przysłowiowego CRUD'a, to już zaczyna to przypominać trochę kult cargo, w efekcie czego mamy np. aplikacje mobilną z paroma guzikami na krzyż, gdzie zamiast zwyczajnie zareagować na kliknięcie jest rozgłaszany event o naciśnięciu guzika, jakis serwis go przechwytuje, pobiera dane, wysyła inny event, że dane pobrane, co znowu jest przechwytywane przez jakiś ekran i pokazane na ekranie. W efekcie czego po zajrzeniu w taki kod nie wiadomo kompletnie nic, stack trace z exceptionami pokazuje wszystko co możliwe, ale zero odwołań do własnego kodu. Jak przychodzi zrobić jakąś prostą zmianę, to po tygodniu odpowiedź brzmi, że się nie da, bo nie ma takiej adnotacji, ew. ta biblioteka, co jej uzywamy już od tygodnia jest niemodna i trzeba poświęcić miesiąc na jej podmianę do modniejszej. A po przeczytaniu paru rozdziałów z "Clean Code" (nie żebym miał cos przeciwko) 20% czasu w projekcie jest przepalane na dyskusje o wyższości spacji nad tabami.

maszrum
to chyba nazywa się Curriculum Vitae Driven Development
Miang
@maszrum: +1 , ja mówię résumé driven development ;)
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
5

Biblioteke do IoC
(...)
Proste aplikacje serwerowe z pojedynczym endpointem ładują Springa z wszystkimi dobrodziejstwami

NIe znam ekosystemu Javy ale czytając posty na forum coraz częściej odnoszę wrażenie że problemem tak naprawdę jest ten cały Spring, który rzutuje negatywnie na pewne inne, całkowicie normalne aspekty. I winą tutaj po części jesteście Wy szanowni programiści Java, bo wykazujecie się trochę arogancją i nie bierzecie pod uwagę że framework którego Wy używacie nie jest jedyną miarą. Później pojawiają się geniusze którzy wszem i wobec głoszą że te całe IoC to w ogóle zło i tyle, i po co to w ogóle używać.W przypadku IoC ja uważam że nawet w prostszych aplikacjach IoC można stosować i nie ma w tym nic złego, tym bardziej że jest tyle lekkich bibliotek do tego.Oczywiście wszystko ma swoje granice i zależy od wymagań, więc zdaję sobie sprawę że są przypadki gdzie faktycznie podejmuje się próby przeinżynierowania prostych problemów. W 99% przypadków nie zaliczał bym do tego IoC- zakładając że używa się do tego coś normalnego.

fetysz clean code, polegający na niekończących się dyskusjach, jak nazwać zmienną, żeby zamiast 20 znaków miała 15 znaków i dalej mówiła co przechowuje. Czepianie się o if(obj==null) zamiast if(null==obj), bo w C++ można pomylić porównanie z przypisaniem, my co prawda piszemy w Javie, ale na wszelki wypadek...

Ale co do ma wspólnego z czystym kodem? Brzmi to bardziej jakby ktoś sam nie wiedział co chce osiągnąć.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
Shalom
problemem tak naprawdę jest ten cały Spring ja osobiście nie rozumiem o co ludziom chodzi. W moich pracowych projektach cokolwiek związane ze springiem to jest <5% codebase. Dosłownie tylko definicje endpointów i security. Reszta to logika domenowa aplikacji.
Aventus
Mnie nie pytaj, ja tylko wysuwam taki wniosek na podstawie tego co często ludzie piszą na forum.
piotrpo
Ani Spring, ani IoC ani młotek nie jest "zły". To narzędzia, np. młotek słabo nadaje się do prostowania nóżek procesora. IoC generalnie też jest fajnie, ale już używanie bibliotek / frameworków do DI bywa dość upierdliwe, kiedy zamiast jednego "new" w jednej dodatkowej klasie piszesz jakieś konfiguracje i w rezultacie ukrywasz błędy przed kompilatorem, albo maskujesz zależności klasy.
S9
  • Rejestracja:około 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
3

@piotrpo: jak pisałem, obawiam się że to w dużym stopniu wina firm. Szukają ludzi którzy mają doświadczenie z 20 technologiami więc ludzie wciskają reactjx itp do tego Androida.
Oczywiście ktoś napisze ze trzeba iść do cywilizowanej firmy która szuka programistów a nie klepaczy Springa, Angulara etc, zgoda - tylko mówię to co widzę.


edytowany 1x, ostatnio: scibi_92
Miang
tylko po czym poznać taką firmę, jak znaleźć ogłoszenia?
PerlMonk
Nie po słowach, a po buzzwordach ich poznacie. Chyba im prostsze ogłoszenie tym lepiej.
Miang
@PerlMonk: dupa, właśnie się na takie proste nabrałam , było o algorytmach i analizie danych a okazało się proponują pracę dla kodera
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
5

Szefostwo jest niekompetentne i koderzy potrafią wmówić zalety takich rozwiązać, o których przeczytali bo doświadczenia przecież z tym nie maja,. Doświadczenie chcą właśnie móc se wpisać dzięki danemu projektowi. Oczywiście tego doświadczenia nadal nie mają bo jak się pojawiły problemy z daną technologią to sp* z firmy, potem jak masz naprawić ten bajzel to nawet nie ma kogo spytać dlaczego takie rozwiązanie. Zostajesz z transakcjami rozproszonymi w MySQL obejmującymi kod w javie :(


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
piotrpo
To nie szefostwo jest niekompetentne - jak jest jakiś właściciel hurtowni bananów i potrzebuje serwisu, żeby klienci mogli wpisywać ile tych bananów ma dostarczyć i pod jaki adres, to przecież nie należy od niego wymagać, że będzie uczestniczył w rozmowach na temat wyższości Reacta nad Angularem. To odpowiedzialnością zespołu dev. jest dobranie technologii do zastosowania i wzięcie za to odpowiedzialności.
Miang
@piotrpo: szefostwo w sensie kierownik zespołu
piotrpo
To chyba generalnie jest problem świeżości naszego IT - to pospolite ruszenie trwa od kilku zaledwie lat i "szefowie" wielu zespołów mają dość skromne doświadczenie.
Miang
@piotrpo: w przypadkach o których tu myślę szefami byli kolesie, wiekowo nawet nie świeżaki, ale po prostu durnie którzy meli stanowisko po znajomości
SW
  • Rejestracja:około 5 lat
  • Ostatnio:3 miesiące
  • Postów:250
3
Aventus napisał(a):

Biblioteke do IoC
(...)
Proste aplikacje serwerowe z pojedynczym endpointem ładują Springa z wszystkimi dobrodziejstwami

NIe znam ekosystemu Javy ale czytając posty na forum coraz częściej odnoszę wrażenie że problemem tak naprawdę jest ten cały Spring, który rzutuje negatywnie na pewne inne, całkowicie normalne aspekty. I winą tutaj po części jesteście Wy szanowni programiści Java, bo wykazujecie się trochę arogancją i nie bierzecie pod uwagę że framework którego Wy używacie nie jest jedyną miarą. Później pojawiają się geniusze którzy wszem i wobec głoszą że te całe IoC to w ogóle zło i tyle, i po co to w ogóle używać.W przypadku IoC ja uważam że nawet w prostszych aplikacjach IoC można stosować i nie ma w tym nic złego, tym bardziej że jest tyle lekkich bibliotek do tego.Oczywiście wszystko ma swoje granice i zależy od wymagań, więc zdaję sobie sprawę że są przypadki gdzie faktycznie podejmuje się próby przeinżynierowania prostych problemów. W 99% przypadków nie zaliczał bym do tego IoC- zakładając że używa się do tego coś normalnego.

Problemem jest chyba to, że ludziom wydaje się, że magia adnotacji to nic złego. Wtedy Spring przecieka do głębszych warstw niż kontrolery w postaci sławnego @Transactional, różnych Before, After, Pre, Pro, całego Spring Expression Language i AOP. Dokładamy do tego przemycanie np. SecurityContextu i karuzela rusza :) A wystarczyłoby przestać polegać na magii i pisać normalny kod.

edytowany 2x, ostatnio: SkrzydlatyWąż
S9
Czemu mnie wołasz?
SW
Sorry, już wyedytowałem :)
Bonanzaa
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:168
4

Jakbym czytał o mojej poprzedniej firmie zatrudniającej "programistów z wyższej półki". Ostatni projekt to zwykły CRUD który musiał mieć CQRS, 2 oddzielne bazy na read i write synchronizowane eventami. Niekończące się code review co do literki w zmiennych. Dodanie prostego endpointa szło w dni/tydzień a projekt wyceniony oczywiście jak zwykły CRUD. Wieczne pożary z powodu błędów bo ogarnięcie wszystkich zbędnych klas przy presji czasu przekracza ludzkie możliwości a projekty były małe kilkumiesięczne więc ludzie wrzucani często nie pracowali nigdy z połową technologii. Podejrzewam, że takim firmom chodzi o przyciągnięcie nowych pracowników których nie chcą przyciągnąć zarobkami tylko perspektywą rozwoju w nowoczesnych buzzwordach, albo przyciągnięcie klientów chwaleniem się czego to nie robią ich pracownicy.

edytowany 1x, ostatnio: Bonanzaa
piotrpo
A do tego pierwsze pytanie na rozmowie rekrutacyjnej o YAGNI i KISS :)
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
3

@SkrzydlatyWąż a ja właśnie o tym piszę- wspominasz jakieś adnotacje o których ja nawet nie mam pojęcia, i nigdy na myśl by mi nie przyszło że to może mieć coś wspólnego z IoC. Czyli potwierdza się to co pisałem wcześniej- jest grupa programistów którzy używali/używają Springa, są na tyle rozsądni że widzą w nim problemy, ale nie na tyle rozsądni żeby przestać utożsamiać Springa z definicją IoC. Skutkiem tego stosują "Spring" i "IoC" zamiennie.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
9

Ja widzę dwa niezależne zjawiska:

  • resume driven development - uprawiane i przez programistów i przez firmy
    Firmy technologiczne też lubią mieć pokemony w portfolio.
    RDD nie jest do końca złe - gdzieś trzeba sie uczyć, a najlepiej na produkcji. Tak serio - jeśli projekt jest niekrytyczny, wszyscy jasno wiedzą (łącznie z klientem), że robimy jakiś ekspertyment technologiczny - to sprawa jest dla mnie ok. To, że w projektach hobby uprawiamy RDD to oczywistość. Rozwój polega na robieniu eksperymentów i częstych niepowodzeniach. Jakkolwiek - jeśli robimy po raz 20ty Springa w CRUDzie na dwie tabelki - to pewnie to już nie jest żaden rozwój.
  • cargo cult - wrzucamy framework, pattern, bazę danych - bo dziadowie też tak robili i im działało - to jest coś co mnie wnerwia naprawdę. Cargo cult jest o tyle trudny do zwalczenia, że większość tak używanych "wzorców" co prawda nie pomaga, ale i nie szkodzi (coś jak modlitwa). Niestety, wytłumaczenie, że coś jest bez sensu, skoro produkcja nadal działa, jest całkiem trudne. Większość cargo cultowanych rozwiązań miała kiedyś sens, w pewnym kontekście, w pewnych projektach. Często sens polegał na tym, że mainstream akurat nie znał wtedy lepszego rozwiązania.
    Ten sens dawno zginął, a deweloperzy nie pytają - tylko walą w te klawisze jak Rambo.

sometimes it takes years to realize how suckish some practices are (Venkat)


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
S9
  • Rejestracja:około 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
0

@Aventus: a jak działa [Transaction] w .net?


Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

@Aleksander32: nie wiem, nigdy nie używałem. Tym bardziej w kontekście IoC.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

@piotrpo weź pod uwagę że celem jest rozwiazanie problemu biznesowego, a nie pokazanie że umiesz naklepać od zera webserwer albo driver do bazy danych ;)
Nawet jak masz jeden endpoint, to może wolisz wrzucić sobie zależność do jakiejs libki i mieć to z głowy i zająć się faktycznym celem aplikacji? Zresztą w 9 na 10 przypadków aplikacja będzie rozwijać się dalej i jak na początku zrobiłeś na szybko jakiegoś hacka (żeby uciec przez overengineeringiem) to jutro okaże sie że musisz to przepisać od zera.

Moim zdaniem problem istnieje, ale trochę innej natury. Np. zaczynamy nowy projekt, jeszcze nie wiadomo dokładnie jakie są wymagania i ograniczenia, a ktoś w zespole już konfiguruje ci bazę danych, a inna osoba już zrobiła repo i wrzuciła w zależności springa i hibernate ;) A może ta aplikacja w ogóle nie będzie potrzebować trwałego zapisywania danych? ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
S9
  • Rejestracja:około 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
0

@Aventus: generalnie znaczącą część frameworków ma jakieś potencjalnie niebezpieczne konstrukcje, przeciekające abstrakcje itp.
Nie sądzę żeby Spring jakoś był dużo gorszy od tego, moje jedyne podejrzenie jest takie że średnio programiści .net mogą być bardziej ogarnięci od tych Javovych i stosują lepsze mechanizmy.
Spring też ma duży ekosystem, ale można po prostu wykorzystać core bez pobierania wszystkich innych jarów.


M3
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:55
3

Ja byłem w projekcie team leaderem gdzie chłopaki na siłę wcisnęli Webfluxa. Po roku pisania w tym tylko więcej czasu im zajmowało debugowanie, pisanie kodu. A dla biznesu to było wsio ryba czy Webflux czy normalnie blokujący kod. Przeprowadzałem analizę tego później i starty przez to że ktoś zaczął robić Webfluxa były ogromne. Gdy wytłumaczyłem biznesowi co inicjatorzy projektu nawymyślał i technologii to aż wstyd. Niestety programiści coś mają na punkcie słów typu Hazelcast, Webflux, RxJava a potem płacz bo za bardzo zagmatwany projekt. Albo teksty po jakimś czasie "mogliśmy jednak użyć Oracle" czy "po co nam ten Webflux"

edytowany 1x, ostatnio: Marcys32
Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
7

Nawet na tym forum widzę, że przychodzą ludzie absolutnie zieloni i jednocześnie rzucają się od razu na frejmłorki, o których sama nie mam pojęcia (i niezbyt mam ochotę mieć pojęcie). Ktoś tu niedawno pisał nawet o: skryptach jQuery w sposób, który sugerował, iż uważa je za coś natywnego.
Ludzie nie uczą się języków tylko frejmłorków i bez nich pewnie często niewiele nawet potrafią.


AK
Np problem z Map<K,V> zostaje otagowany spring
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
3

wiekszosc projektow ktore pisze przez ostatnie ~2 lata maja wlasnie po 10-20 klas i w sumie rzadko zmieniaja sie w cos duzo wiekszego.
pierwsze co robie to dorzucam w pom.xml pare rzeczy typu vavr, guice, loggera, config parser, 5 libek do testow, i event/queue lib. po co wymyslac kola na nowo?
fetyszystow od clean code zalatwia sie wspolnym code guidlines zaimportowanym do ide...

Zobacz pozostałe 2 komentarze
AM
a to są Twoje projekty w pracy czy prywatne? bo 20 klas to wydaję się strasznie mało, ale może dlatego że pracuję teraz przy mega kolosie ;)
superdurszlak
@jarekr000000: potwierdzam, IJ namiętnie stwierdza, że wie lepiej niż ktlint. Co więcej, ktlint pod Windows często uważa inaczej niż ktlint na linuksowym serwerze CI i np. olewa zbędne importy, o które później krzyczy sobie na serwerze CI :)
Schadoow
@jarekr000000: u mnie zadziałało w zespole przypięcie linterów do githooków. Minus taki, że commity wtedy potrafią trochę trwać.
jarekr000000
@Schadoow: u mnie działa na CI/build - jak nie da się zrobić builda to raczej każdy się przejmie. Chociaż kiedyś wylądowałem w zespole, któremu niebudujące się projekty nie przeszkadzały (aż tak był "agilny"), ale udało mi się ten zespół "trochę naprawić".
Schadoow
Tutaj bym polemizował :p. Znałem takich gagatków co z automatu mieli podpięte w ide run builda z skippowaniem testów a na CI wchodzili jak ktoś się wydarł na review ze build na czerwono. A na githooku jak nie naprawi to nie wrzuci zmian :). Oczywiście mógłby na chwilę usunąć konfiguracjie githookow ale wtedy nie ma "nie zauważyłem".
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:2 dni
  • Lokalizacja:Wrocław
4
piotrpo napisał(a):

Zastanawiam się, czy ma to jakiś ukryty sens, czy chodzi o takie sprawy jak:

  • Na blogu przeczytałem, że RxJava to super rzecz i chcę tego użyć.
  • Wszyscy teraz chcą programistów Spring, więc użyjmy tego frameworka, bo chcę go mieć w CV.

Ludzie jarają się technologiami, nie designem, więc tak to wygląda. Nieważne, czy coś ma sens, ważne aby było nowe i modne.

  • A co jak nasza aplikacja za 5 lat będzie większa i wtedy to się przyda?

Kiedyś brałem udział w czymś, co miało 11 warstw na backendzie (3 fizyczne), 4 na frontendzie (projekt trwał tak długo, że był tam Angular, Knockout i jQuery jednocześnie), a logikę biznesową generalnie i tak w triggerach.
Nic nie miało sensu, ale nazywali to "skalowalną architekturą".
To był publicznie dostępny system. Przez 5 lat na produkcji zarejestrowały się dwie osoby. Po prostu nie dało się tego używać tak bardzo, że ludzie woleli przyjść do oddziału firmy i na miejscu skorzystać z usług zamiast załatwić sprawy przez internet.

Do tego sprawa trochę poboczna, ale chyba wpisująca się w ten trend - fetysz clean code, polegający na niekończących się dyskusjach, jak nazwać zmienną, żeby zamiast 20 znaków miała 15 znaków i dalej mówiła co przechowuje. Czepianie się o if(obj==null) zamiast if(null==obj), bo w C++ można pomylić porównanie z przypisaniem, my co prawda piszemy w Javie, ale na wszelki wypadek...

To nie jest clean code.

Aleksander32 napisał(a):

@Aventus: a jak działa [Transaction] w .net?

Najlepiej jak to możliwe - nawet się nie kompiluje, bo go nie ma. :)
Możesz sobie oczywiście taki zaimplementować. Na jakim poziomie chcesz: filtra w WebAPI, pipeline w mediatorze albo nawet jako interceptor jednego z wielu frameworków IoC. Tylko, żeby zaimplementować samodzielnie trzeba wiedzieć co się robi i po co. Jeśli w Javie jest taki mechanizm wbudowany, a do tego 3/4 programistów nie doczyta dokumentacji i będzie traktować go jako magię, która "sama działa", to nieszczęście chyba gotowe.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
Zobacz pozostałe 6 komentarzy
S9
A jak nie zadziała to dać więcej adnotacji. ;]
S9
@Shalom: ale tak na serio to ktoś się pytał czy zapytanie restowe da się zrollbackować użyciem transactional?
Shalom
Dobra chwile mi zajęło znalezienie: Transakcje między aplikacjami ;)
S9
O dzizas, myślałem że to jakiś typowy junior wannable mógł zadać takie pytanie a tu ktoś kto pracuje oO
UR
Jeszcze transactional brakuje do tego cyrku, żeby nurkować w paździerzu naklepanym przez osoby piszące w ormie i nie mających pojęcia co robią, a jakby zaczęli jeszcze to spinać z atrybutami trzymającymi transakcję bazodanową, to chyba bym uciekł wykładać towar w lidlu.
AM
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:68
0

Ja będe na siłę wciskał do mojego projektu biliboteki/rozwiązania których się używa przy androidowych projektach. Nie widzę nic w tym złego, nie potrzebuję daggera w moim projekcie ale wypada go znać(lub jakieś inne DI) jak człowiek idzie się rekrutować.

edytowany 1x, ostatnio: alMarko
ON
  • Rejestracja:około 6 lat
  • Ostatnio:18 dni
  • Lokalizacja:Polska
0

Over engineering to dość powszechny problem. Wczoraj miałem live coding podczas rozmowy rekrutacyjnej. Jedno proste zadanie, które może być obsłużone jedną klasą z miejsca ma klasę i jakiś serwis. Dla przykładu została stworzona klasa Request to wykonywania zapytań http po stronie klienta i logika do wykonywania retry przez oddzielny serwis. Problem jest taki, że nie widzę potrzeby tworzyć dodatkowo niepotrzebnej abstrakcji, w dodatku klasa Request była prawie pusta.

Shalom
w dodatku klasa Request była prawie pusta ale w praktyce takich requestów będzie dużo z różnych miejsc i wydzielenie tego w osobne miejsce ma jak najbardziej sens ;)
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8397
3
somekind napisał(a):

Kiedyś brałem udział w czymś, co miało 11 warstw na backendzie (3 fizyczne), 4 na frontendzie (projekt trwał tak długo, że był tam Angular, Knockout i jQuery jednocześnie)

A to już wiem, skąd ostatnio moda na gadanie o mikrofrontendach - widocznie wiele firm ma takie nagromadzenie legacy kodu w różnych frameworkach, że szuka sposobu na jego odizolowanie, żeby nie popaść już w totalne spaghetti.
(bo ponoć podejście mikrofrontendowe pozwala na pisanie aplikacji w kilku różnych frameworkach i przez kilka oddzielnych teamów i to ma być jego zaleta czy coś takiego).

Myślałem, że mikrofrontendy to po prostu odkrycie zasady enkapsulacji przez frontendowców, ale może chodzi bardziej o to, żeby zamieść pod dywan legacy kod.

Bo jak brzmi lepiej
projekt trwał tak długo, że był tam Angular, Knockout i jQuery jednocześnie)
czy:
projekt ma taką skalę, że używa aż 3 różnych frameworków, które nawzajem się komunikują przez mikrofrontendy! Amazing

O ile faktycznie są to niezależne moduły, a nie że przeplatają się nawzajem.


edytowany 2x, ostatnio: LukeJL
ON
Mikrofrontendów też nie lubię, ale mikroserwisy po stronie backendu też są używane by zamieść pod dywan legacy code :D
piotrpo
Ja dobrze rozumiem, że całe te mikrofrontendy to rozdzielenie SPA na kilka SPA, w stylu mam SPA do edytowania profilu użytkownika, SPA do wyświetlania listy towarów, SPA do obsługi koszyka itd?
E9
@piotrpo: nie wiem czy taki podział ma sens. U nas mamy (chyba) coś na wzór mikrofrontendów - jest jedna duża aplikacja, której użytkownik może konfigurować dashboard wedle potrzeb, np. dodać wykres A, tabelke B, itp. Każdy z takich komponentów jest tworzony przez inny zespół jako osobny projekt, jedynie trzeba kierować się kilkoma zasadami, np. żeby zachować spójny look&feel. I nawet ma to sens, przykładowa tabelka i wykres mogą być z zupełnie innych domen, czyli pod spodem siedzą zupełnie inne aplikacje backendowe.
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

@LukeJL: w mikrofrontendach głównie chodzi o to aby każdy mikroserwis miał swój odpowiadający frontend, z tym że najczęściej chodzi o to że taki frontend to bardziej biblioteka komponentów UI I ich zachowań (np. komunikacja z mikroserwisem do którego ten frontend "należy") niż aplikacja UI sama w sobie. Aplikacja UI jest zazwyczaj jedna, i spina ona te wszystkie biblioteki komponentów (mikrofrontendy) w jedną całość. Chodzi po prostu o ideę że skoro mamy zakresy odpowiedzialności wydzielone do mikroserwisów, to na tej samej zasadzie wydzielamy odpowiedzialność aplikacji klienckiej, tak że nie mamy jednego wielkiego frontendu (kodu) który wie wszystko o wszystkim.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
KA
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:27
3

Bardzo ciekawe rzeczy tutaj piszecie, ale moje doświadczenia wskazywały na dużo prostszą przyczynę tego stanu rzeczy. Jeśli dajecie nowy projekt do zrobienia programiście Springa, to pewnie zrobi go w Springu, bo tak jest dla niego szybciej i łatwiej. A że większość programistów Java w korpo to programiści Springa, to jest to co jest...

S9
  • Rejestracja:około 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
2

Myślałem, że mikrofrontendy to po prostu odkrycie zasady enkapsulacji przez frontendowców, ale może chodzi bardziej o to, żeby zamieść pod dywan legacy kod.
Mikrofrontendów też nie lubię, ale mikroserwisy po stronie backendu też są używane by zamieść pod dywan legacy code :D

Dlaczego legacy kod?
Po prostu praca zbyt dużej ilości osób nad wspólnym kodem w repozytorium jest cięzka, i stąd się biorą tego typu twory. Wyobrażasz sobie żeby amazon.com był jednym wielkim monolitem? Kilkaset albo i więcej osob pracujących na jednym repo gitowym, restart aplikacji trwający godzine odbywający się co 4 godziny bo coś nowego trzeba wrzuć na produkcje? To że część osób używa mikroserwisów żeby poczuć się cool i jazzy to już nie wina mikroserwisów.

@Kalrais ale przeciez o tym pisałem. Kod pisze się żeby przynosił hajs, a PO nie obchodzi czy to Spring czy Ktor czy jakaś Akka HTTP.


edytowany 1x, ostatnio: scibi_92
LP
  • Rejestracja:około 7 lat
  • Ostatnio:około miesiąc
  • Postów:365
2

Aplikacje mobilne składające się z 5 ekranów na krzyż mają w sobie:

Biblioteke do IoC - dagger / koin / hilt jak najbardziej w projekcie. Teraz hilt na topie, znam apkę 1mln + pobrań która ją używa na produkcji, bardzo mało problemów. Ja mówię nie - jest w alphie a ja mam dość purystyczne podejście do libek w projekcie.

ORM - to zależy od biznesu. Jeśli aplikacja wymaga filtrowania po dużej liczbie danych to room może się przydać, jeśli nie to pewnie shared preferences i lecimy.

Event Bus - od razu usuwam z projektu. Libka która ukrywa problemy związane za architekturą, bardzo ciężko się debuguje, bardzo ciężko zrozumieć flow, liczna problemów z tą libką jest większa niż kod bez niej.

Jakieś customowe biblioteki do MVVM - customowe libki do mvvm? Od razu do kosza. Tak samo jak event bus - zło. Prosty kod od googla i lecimy.

rxjava to zło - rxjava to zło jak doda się ezoteryczne operatory które zna 10% programistów. Ja w projektach używam rxa w najprostszy sposób: map/flatmap, single, subscribe, zip/combine latest to już max jest skomplikowania. Dlaczego? Prostsze utrzymanie projektu, łatwiej zrozumieć kod. Jeśli jest potrzeba napisania własnego operatora to pewnie da radę napisać go składając powyższe operatory. Rx dla mnie to tak naprawdę fork and join + mapowanie. Dodatkowy plus takiego rozwiazania to to że każda libka do async będzie to wspierać - podmiana np na korutyny to bajka to to tam też jest dodane w przystępny sposób.

"aplikacje mobilną z paroma guzikami na krzyż, gdzie zamiast zwyczajnie zareagować na kliknięcie jest rozgłaszany event o naciśnięciu guzika, jakis serwis go przechwytuje, pobiera dane, wysyła inny event, że dane pobrane, co znowu jest przechwytywane przez jakiś ekran i pokazane na ekranie. W efekcie czego po zajrzeniu w taki kod nie wiadomo kompletnie nic, stack trace z exceptionami pokazuje wszystko co możliwe, ale zero odwołań do własnego kodu." Wypisz wymaluj problemy z roku 2014 z eventbusem bez sticky events albo rxjava ze złym logowanie błędów albo kosmiczny redux. Byłem widziałem.

edytowany 2x, ostatnio: lubie_programowac
Zobacz pozostałe 7 komentarzy
Shalom
@somekind: ale to wszystko kosztem braku jasnego przepływu sterowania w aplikacji, bo żeby widzieć skąd jakiś kod jest zawołany musisz sprawdzić skąd mogą być emitowane dane eventy i analogicznie emitując event z nowego miejsca musisz upewnić się, że wszyscy jego odbiorcy mogą go poprawnie obsłużyć ;)
somekind
No ok, u mnie to raczej requesty/commandy są niż eventy. Ale nawet jeśli byłyby eventami, to znalezienie wszystkich użyć danej klasy w IDE to banał jest, a u mnie do tego by się to sprowadzało.
piotrpo
@somekind: Te, które widziałem działały tak, że po jednej stronie mogłeś sobie wrzucić jakiś obiekt w rurę, po drugiej miałeś metodę przyjmującą jako parametr typ tego obiektu z dopisaną adnotacją (jak by inaczej) @Subscribe i metoda "sama się wywołuje" jak poleci taki obiekcik. I to nawet jest wygodne, jak się pisze. Trochę mniej jak się to debuguje.
Shalom
@piotrpo: używałem tego mechanizmu raz -> jak pisałem skomplikowane desktopowe GUI i niektóre akcje potrzebowały wprowadzić zmiany w wielu różnych kontrolkach UI. W takiej sytuacji było to strasznie wygodne, bo z Prezentera/Kontrolera wrzucałeś sobie event XYZ i wszystkie kontrolki które były nim zainteresowany łykały sobie ten event i zmieniały zgodnie z oczekiwaniami. Ale tak jak wspomniałem wyżej, dzieje sie to kosztem braku jasnego przepływu sterowania w aplikacji, ale w tym wypadku było to lepsze niż kaskadowe przepychanie informacji przez całe GUI.
piotrpo
@Shalom: Ja się nie czepiam każdego z tych rozwiązań z osobna, bo mogą zwyczajnie mieć sens użyte osobno, lub razem w konkretnych przypadkach. Chodzi mi wyłącznie o tendencję do ładowania pół githuba do projektu, bez patrzenia na skutki, często jeszcze w sytuacji niedostatecznych kompetencji. Jak ktoś potrzebuje i potrafi, to niech używa. Problem się zaczyna, jak ktoś po zakupy do biedronki jedzie tirem i brak prawa jazdy go nie powstrzyma.
S9
  • Rejestracja:około 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
0

Troche offtopic - ale czy jak mamy courutines to ta RxJava jest potrzebna?


Michał Sikora
Michał Sikora
Korutyny i RxJava są na innym poziomie abstrakcji. Mechanizm schedulerów z RxJavy to zasadniczo implementacja korutyn w Javie. Flow to taki odpowiednik RxJavy i faktycznie można jedno drugim zastąpić.
S9
No ja własnie ten Flow kojarze, nie korzystałem ale myślałem że korutyny też wspierają programowanie reaktywne
Michał Sikora
Michał Sikora
To są ortogonalne kwestie. Korutyny mogą być do tego wykorzystane i Flow właśnie z nich korzysta. Równie dobrze mógłbyś wnętrzności RxJavy przepisać na korutyny i dalej by działała tak samo.
xxx_xx_x
Można już wywalić RxJava z androida, Kotlin + Coroutine + Flow + Channel
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)