Wymuszanie wspólnych bibliotek w mikroserwisach

Wymuszanie wspólnych bibliotek w mikroserwisach
PZ
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:6
1

Był monolit, są mikroserwisy. Architekci wymyślili sobie, by stworzyć wewnętrzny framework, który będzie zawierał libki konfigurujące wiele rzeczy jak connectory do kafki, klient http, dependencies, logowanie po to żeby była 1 wspólna konfiguracja dla wszystkich mikroserwisów. DRY.

Programiści nie chcą używać tego frameworka, bo jest napisany dziwnie np. klient http jest udekorowanym RestTemplate ,który zapodać możesz do klasy tylko przez beana, bo:

Kopiuj
FrameworkClient implements HttpClient {

  @Autowired
  private RestTemplate restTemplate;

  FrameworkClient() {

  }

  // nawet brak setterów
}

Jednocześnie we frameworku jest zdefiniowany primary bean resttemplate:

Kopiuj
@Bean
@Primary
RestTemplate restTemplate() {
...
}

inny z przykładów dziwności to konfiguracja kafki:

Kopiuj
KafkaConsumerConfig extends KafkaProducerConfig {
...
}
  1. Architekt: używajcie naszego frameworka do http
    Programista: ale używamy już FeignClienta
    Architekt: a uzgodnił ktoś z nami, że go używacie? Musicie go zastąpić

  2. Programista: leci mi błąd jak próbuję użyć tego klienta client.call(...) jakiś NPE, potrzebuję coś dokonfigurować? wiesz o co chodzi?
    Architekt: nie, nikt nie zgłaszał. To zanurkuj tam i obczaj o co chodzi.

  3. W międzyczasie programista2 z innego zespołu trafił na ten sam błąd i pewnie też stracił czas na rozkminiane tego. Ostatecznie nic nikomu nie powiedział, zamknął taska pisząc FRAMEWORK RZUCA NPE TO NIE BEDE GO UZYWAŁ

  4. Programista przeanalizował NPE, znalazł linię kodu, gdzie leci ten NPE i wyczaił, że błąd pojawia się, gdy client.call(...) jest użyty poza contextem RestControllera (nie jest w następstwie odpowiedzi endpointa, nie wiem ja kto nazwać). Programista odnalazł zespół za to odpowiedzialny i zgłosił im ten błąd.
    Twórca: zobacz sobie jak to jest użyte w tym i tym microserwisie, u mnie działa
    Programista: tam nie ma tego przykładu, zobacz.
    Programista napisał nawet im propozycję poprawki.
    Programista: moja propozycja, teraz działa. Poprawcie to albo wywalajcie UnsupportedOperationException z informatywnym msg
    Twórca: zgłoś buga.

  5. Po miesiącu.
    Twórca: a serio potrzebujesz wołać tego clienta poza contextem? To podaj przykład, gdzie tego potrzebujesz.
    Programista: tu i tu.
    Twórca: no to nie rób tak tylko użyj naszego frameworka i wtedy masz to w contextcie. Nie naprawiamy.

  6. Manager nietechniczny podchwycił temat i zrobił gównoburze, że tamci nie chcą naprawić błędu i że w ogóle ich biblioteka to syf i wszyscy na to narzekają.

  7. Twórca na to, że tu nie ma żadnego błędu tylko programista nie czai co do niego się mówi i że dostał info jak tego używać.

Co o tym sądzicie i co należałoby zrobić?

edytowany 2x, ostatnio: programista-z-cyrku
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
15

że czas odświeżyć CV


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Zobacz pozostałe 3 komentarze
SE
@programista-z-cyrku: Co to znaczy, nie moge uciec bo dopiero 3 miesiace pracuje? Ja z jednej roboty ucieklem po mniej niz 2 miesiacach i jakos zatrudnili mnie do nastepnej.
PZ
ech... a jakbym chciał walczyć, no bo za to mi płacą to co powinienem zrobić? będzie spotkanie z tym Twórcą i architektem
SE
@programista-z-cyrku: Jezeli jestes obcykany w temacie to wyjasnij im konstruktywnie i merytorycznie czemu ich rozwiazanie to szajs, a jezeli nie jestes no to w jaki sposob chcialbys ich do czegokolwiek przekonac? Cytujac odpowiedzi z 4p?
PZ
no ja już próbowałem z nimi gadać, to ci architekci mnie spuszczają na drzewo mówiąc np. tak się to robi. Chcę wiedzieć czy ja mam rację czy może ja się czepiam nadgorliwie
SA
Wg mnie możesz mieć rację, ta biblioteka wydaje się być jedynie ograniczeniem i nie powinna być narzucana z góry
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:4 minuty
  • Postów:8414
0
programista-z-cyrku napisał(a):

Był monolit, są mikroserwisy. (...)

Nie nazwałbym tego, co opisałeś, mikroserwisami. Bardziej "rozproszonym monolitem".

by stworzyć wewnętrzny framework, który będzie zawierał libki konfigurujące wiele rzeczy

W teorii brzmi dobrze, w praktyce u was jak sam piszesz się to nie sprawdza, skoro programiści zamiast niezależnie pracować nad swoją częścią, to muszą nurkować we framework:

  1. Programista: leci mi błąd jak próbuję użyć tego klienta client.call(...) jakiś NPE, potrzebuję coś dokonfigurować? wiesz o co chodzi?
    Architekt: nie, nikt nie zgłaszał. To zanurkuj tam i obczaj o co chodzi.

oraz tracony jest czas na bikeshedding i komunikację z innym zespołem:

  1. Programista przeanalizował NPE, znalazł linię kodu (...) odnalazł zespół za to odpowiedzialny i zgłosił im ten błąd.
    Twórca: zobacz sobie jak to jest użyte w tym i tym microserwisie, u mnie działa
    Programista: tam nie ma tego przykładu, zobacz.
    Programista napisał nawet im propozycję poprawki.
    Programista: moja propozycja, teraz działa. Poprawcie to albo wywalajcie UnsupportedOperationException z informatywnym msg
    Twórca: zgłoś buga.

Co o tym sądzicie i co należałoby zrobić?

Jeżeli chcesz zostać w tej firmie, to chyba dobrym posunięciem byłaby zmiana zespołu i dołączenie do "klasowych łobuzów", czyli do tych architektów, którzy robią sobie ten framework, którym mogą gnębić później innych i pokazywać dominację. if you can't beat them, join them.

Albo zmiana firmy.


edytowany 4x, ostatnio: LukeJL
SE
Nie nazwałbym tego, co opisałeś, mikroserwisami. Bardziej "rozproszonym monolitem". Rozproszony monolit dlatego, ze istnieje jakis wewnetrzny framework do konfiguracji roznych tooli? No calkiem smiala teza :D
PZ
@Seken to nie jest framework do konfiguracji tylko framework konfigurujący wszystko w taki sam sposób
LukeJL
@Seken odnosiłem się do całości posta.
SE
@programista-z-cyrku: Co to znaczy wszystko? Jezeli masz np klienta kafki i 3 mikroserwisy A, B, C, ktore korzystaja z kafki w taki sam sposob to nie rozumiem po co mialyby byc inaczej konfigurowane? Ja w tym temacie nie widze problemu dotyczacego tego pomyslu, a marne wykonanie i jakies aroganckie zachowania ze strony tworcow.
PZ
np. różne timeouty czy ilość nodów robiących ack czy to, że framework wymusza, by każdy msg dziedziczył po jakiejś tam klasie, a czasem chcę wysłać samego id z eventem np. createdDocument
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 4 godziny
  • Postów:3563
3
programista-z-cyrku napisał(a):

inny z przykładów dziwności to konfiguracja kafki:

Kopiuj
KafkaConsumerConfig extends KafkaProducerConfig {
...
}

Problem jest taki, że to ma sens ;)
Kiedyś sam pisałem pewne API, które służyło do szybkiego tworzenia pewnego rodzaju kodu i zauważyłem, że konfiguracja kafkowego producenta duplikuje część pól z kafkowego konsumenta.
Co prawda ja koniec końców postawiłem (i tak te klasy były wewnętrzne) na stare Properties, ale pokusa by zrobić coś takiego była.

Wracając do tematu - tworzenie bibliotek to ciężka robota, błędy będą. Z tego co piszesz biblioteka perfekcyjna nie jest, no i brakuje w niej dokumentacji. Zdarza się dużo częściej niż powinno, czasem trzeba z tym żyć. Natomiast to, co mnie uderza to naprawdę tępy vendor-locking - wymuszenie korzystania ze Springa. Ba, wymuszanie korzystania z field injection - jeśli ktoś sobie to wyłączy żeby nikogo w zespole nie kusiło wstrzykiwać inaczej niż przez konstruktor to framework jest martwy.

Ja pewnie zacząłbym się kłócić z panami architektami o to bo klient http, którego nie da się stworzyć poza kontekstem springowym jest dla mnie nieporozumieniem. Ewentualnie zrobił to, co zrobił programista nr. 2.

edytowany 1x, ostatnio: wartek01
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1
wartek01 napisał(a):

Ja pewnie zacząłbym się kłócić z panami architektami o to bo klient http, którego nie da się stworzyć poza kontekstem springowym jest dla mnie nieporozumieniem.

+1
Patologia.
O ile kod aplikacyjny od kontekstu S zależy, nie ma rady, to libki tak robione to patologia.

(ale w patrzeniu przenikniętym rozproszonym monolitem nie w tym nic nagannego)


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 2x, ostatnio: Riddle
SL
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 godziny
  • Postów:881
1

Klasyka. Architekci tworzą swojego liba, bo jest to fajne. Niestety tworzenie libów jest ciężkie. W takich sytuacjach bardzo przydaje się monorepo (bo każdy może zrobić zmianę na szybko, nie trzeba wersjonować) i ogarnięty team (który chce robić takie liby sam z siebie a nie, bo muszą).

Tak czy owak brzmi to jak patologia. Zewnętrzna biblioteka, która wymaga stanu globalnego (w typ przypadku Autowired) to zło i normalnie nikt takiego gówna by nie użył

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
10

Też potwierdzam, że klasyka.
Spring to patologia, ale firmowe frameworki oparte o springa, lub zauroczenie springiem (inner platform effect) to patologia do potęgi.
Pocieszające jest to, że zwykle da się to ignorować, po prostu nie pytasz tylko robisz swoje. A w międzyczasie warto powoli przygotować ewakuację.

Kiedyś moja firma dostała zlecenie, zrobienie jakiegoś tam serwisu w jednym banku i trafiłem tam, bo zespół (z mojej firmy) nie mógł sobie poradzić właśnie z takim frameworkiem. Wyszło, że po prostu nie może działać (powody classloaderowe - typowe dla patologicznych technologii - tu akurat JavaEE - czyli spring tylko jeszcze bardziej springowy - wszystko na adnotacjach ). Ale architekci z banku uparli się, że niemożliwe, że nie może, bo to ich standardowy framework - kazali nam sprawdzić jak to jest, że innym zespołom w banku działa. Więc dzwoniłem do tych zespołów - kilku, do których dostałem kontakt - wyszło, że wszystkie te bankowe zespoły totalnie olały standardowy bankowy framework :-)


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
SE
No bo skoro nikt nie narzekal, to znaczy ze im dzialalo :D
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:2 dni
  • Postów:5112
0

@slsy

Niestety tworzenie libów jest ciężkie.

uh? no fakt, tworzenie libów może być cięższe, bo złamanie kompatybilności ssie, ale takie problemy raczej nie są aż tak bolesne gdy jest to wewnętrzna libka, a nie np. publiczna libka mająca 10 000 aktywnych userów.

a zatem czym się różni pisanie liba od pisania zwykłego kodu?

no w teorii nie powinno niczym - w obu przypadkach chcesz zaprojektować dobre API, sensownie rozwiązać dany problem, uczynić ten subsystem modularnym, dobrze zamodelować itd itd., ale to trzeba chcieć :)

więc skąd ta różnica?

edytowany 4x, ostatnio: WeiXiao
Miang
powinni takie rzeczy pisać najlepsi programiści a firma daje to juniorom
WeiXiao
niech się uczą ;)
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10064
1

Strasznie mnie bawi to jak powszechne jest zjawisko degradacji pomysłów w IT. Jak rozważam różne pomysły, metodologie, wzorce, etc. to praktycznie w każdym widzę podobny schemat, tzn:

  • Pojawia się jakiś ogarniacz w danym temacie
  • Ogarniacz wymyśla jakiś proces, metodologię, rozwiązanie, o nazwie X.
  • Rozwiązanie jest bardzo dobre, i staje się popularne
  • Coraz więcej osób słyszy o rozwiązaniu
  • Dochodzi do momentu w którym spora cześć ludzi słyszała o rozwiązaniu, ale mało kto je rozumie
  • Powstają karykatury rozwiązania, które noszą tą samą nazwę, ale nie mają nic wspólnego z orginalnym pomysłem.

Tak się stało z MVC, Agile, XP, TDD, Open/Close, OOP, MVVM. Dochodzi do momentu że są "programiści" którzy myślą że jak dodają kilka testów do projektu to to jest TDD. I tak również jest z mikroserwisami.

Nie wiem czy wiecie, ale pomysł z mikroserwisami jest stary jak najstarsza sekwoja; i w tym pomyśle chodziło o to, że cała aplikacja składała się z (naprawdę) mikro-serwisów. Nie chodzi tutaj o małe, malutkie serwiski, tylko na prawdę mikro serwisy, takie które można było wyrazić jednym lub kilkoma plikami. Po co one były, zapytacie, ano idea była taka, żeby nie modyfikować kodu mikroserwisów. Że jak zmienią się wymagania, to nie modyfikuje się kodu w ogóle, tylko najzwyczajniej się się usuwa cały mikroserwis do kosza i pisze się nowy. To była idea za mikroserwisami, że napisanie nowego serwisu jest prostsze, lepsze i mniej problematyczne niż babranie się z dopasowaniem go do zmian. I to miało dużo zalet w odpowiednim środowisku. Teraz popularne "mikroserwisy" nie mają z tym praktycznie nic wspólnego, oprócz przetwarzania rozproszonego, właściwie, i niezależne deploy'owania (czasami), bo często są wprowadzane breaking change'a, takie że i tak musisz zdeployować dwie na raz. Kolejną zaletą takich mikroserwisów było też właśnie niezależność od bibliotek, bo jak tylko się pojawiła jakaś zmiana, był potrzebny jakiś update, to się właśnie wyrzucało cały serwis do kosza, i pisało nowy z nową/inną biblioteką.

Teraz to szkoda gadać.

Odpowiadając na pytanie OP: Uważam że wymuszanie tych samych bibliotek (albo na dobrą sprawę tych samych języków programowania) w różnych mikroserwisach to słaby pomysł.

edytowany 3x, ostatnio: Riddle
PZ
ciekawy pomysł z tymi prawdziwie micro serwisami tylko czy to wydajne by było, bo pewnie skończyłoby się na tym, że żeby np. dodać produkt do koszyka po sieci poleciało by 40 requestów
Riddle
@programista-z-cyrku: No oczywiście ze poleciałoby, i na tym to polegało. To był cały sens, i nie było wcale nie wydajne.
LukeJL
co do TDD, to wypaczenie tego z moich obserwacji nie polega na tym, że którzy myślą że jak dodają kilka testów do projektu to to jest TDD. (bo to po prostu mamy niewystarczające otestowanie) tylko jest o wiele gorzej - wiele (większość?) osób myśli, że w TDD trzeba testować szczegóły implementacyjne, a tymczasem to powoduje, że taki test jest do wyrzucenia przy jakiejkolwiek refaktoryzacji... Drugie nieporozumienie jest takie, że niektórzy myślą, że TDD polega na podzieleniu pisania kodu na dwa etapy, gdzie najpierw piszesz testy, a potem dopisujesz implementację...
LukeJL
...podczas gdy TDD ma polegać na czymś bardziej iteracyjnym, gdzie przeplata się pisanie testów z implementacją.
Riddle
@LukeJL: Tak, oczywiście jest bardzo dużo wariacji tego niezrozumienia.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:2 dni
  • Postów:5112
2

@Riddle:

Odpowiadając na pytanie OP: Uważam że wymuszanie tych samych bibliotek (albo na dobrą sprawę tych samych języków programowania) w różnych mikroserwisach to słaby pomysł.

tak, nie, zależy.

to że MS umożliwiają ci klepanie w 5 językach, to wcale nie oznacza że jest to pożądane

to że są jakieś tam libki od czegoś i każdy MS ich używa, to też jeszcze samo w sobie nic złego nie mówi

edytowany 3x, ostatnio: WeiXiao
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
2

tylko na prawdę mikro serwisy, takie które można było wyrazić jednym lub kilkoma plikami. Po co one były, zapytacie, ano idea była taka, żeby nie modyfikować kodu mikroserwisów. Że jak zmienią się wymagania, to nie modyfikuje się kodu w ogóle, tylko najzwyczajniej się się usuwa cały mikroserwis do kosza i pisze się nowy. To była idea za mikroserwisami, że napisanie nowego serwisu jest prostsze, lepsze i mniej problematyczne niż babranie się z dopasowaniem go do zmian. I

@Riddle: a to ciekawe, masz jakieś uzasadnienie tych swoich rewelacji czy to jakies kolejne tezy w które wierzysz tylko ty? (Podobnie jak to że obiekty w OOP powinny być niemutowalne itp)

A używanie wspólnych bibliotek może mieć sens (np. jakiś commons z typami typu Pesel + jakąs walidacją itp), ale takie coś jak u OP to na pewno nie ma sensu...


edytowany 2x, ostatnio: scibi_92
Riddle
Znaczy, ja się staram żeby obiekty w OOP były niemutowalne (moim zdaniem to jest lepsze), ale mutowalne obiekty to jest coś co jest zgodne z OOP. Jeśli tak gdzieś napisałem, to nie wiedziałem co mówię.
S9
@Riddle: tak, pisałeś z rok czy dwa lata temu,nie chce mi się teraz szukać.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10064
2
scibi_92 napisał(a):

A używanie wspólnych bibliotek może mieć sens (np. jakiś commons z typami typu Pesel + jakąs walidacją itp), ale takie coś to na pewno nie ma sensu...

Żaden commons biznesowy w microserwisach nie ma sensu, bo jakakolwiek wspólna dzielona odpowiedzialność, powinna być albo A. tylko w jednym z microserwisów, i nie powinna być współdzielona; albo B. jeśli musi być współdzielona to powinna być wydzielona do osobnego microserwisu z którego korzystają pozostałe.

Więc nie ma sensu współdzielić commonsów z biznesowymi odpowiedzialnościami jak Pesel, walidacja, etc.

edytowany 3x, ostatnio: Riddle
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
2

@Riddle: rozumiem że Guavy albo Apache Commonsów tez byś nie wykorzystywał?


Riddle
Odpowiem w poście wyżej, co by nie mnożyć postów.
S9
@Riddle: no bardzo moderatorskie podejscie, zaburzac porządek wypowiedzi...
somekind
@Riddle: nie jesteś w pracy, my tu nie mamy premii za zaoszczędzone idki. :P
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:2 dni
  • Postów:5112
1

@Riddle

Załóżmy że masz 2 MS, gdzie jeden odpowiada za przyjmowanie danych, a z drugi za wyrzucanie. W obu jest trochę logiki biznesowej.

Dane przychodzą i wychodzą w formacie dupaJsonCSV i zazwyczaj jest ich tak po 10GB na wejściu i podobnie na wyjściu

I mamy do tego firmową, proprietary libke dupaJsonCSVCompanyLib

I czy dobrze rozumiem - stosując twoje podejście tworzymy trzeci MS który będzie miał jedynie zależność od dupaJsonCSVCompanyLib, a pozostałe dwa MS będą uderzać do niego aby przeparsować dane lub je serializować?

edytowany 1x, ostatnio: WeiXiao
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10064
1
scibi_92 napisał(a):

@Riddle: rozumiem że Guavy albo Apache Commonsów tez byś nie wykorzystywał?

Ale rzeczy nie-biznesowe, jak Guavy i Commonsy, możesz dodawać oczywiście do microserwisów; tylko takich rzeczy również nie ma sensu współdzielić. Tzn możesz mieć commonsy w jednych, guave w drugich, jacksona w trzecich, gsona w czwartych etc.

Czyli:

  • biznesowe commonsy - nie warto wymuszać "wspólnych", bo jakiekolwiek wspólne powinny być wydzielone do osobnych serwisów (myśląc racjonalnie - jaki sens jest mieć microserwisy jak i tak mają zależności na sobie w postaci tych wspólnych bibliotek. Cały sens microserwisów idzie do kosza)
  • techniczne commonsy - nie warto wymuszać "wspólnych", bo różne mikroserwisy powinny móc same decydować o tym jak rozwiązują implementacyjne problemy, np jakiego StringUtils używają.
edytowany 1x, ostatnio: Riddle
PZ
uważam dokładnie to samo
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
1

@Riddle: czy suma kontrolna (czy jak to się nazywa) Peselu ma jeden ustalony algorytm? Bo z tego co wiem to tak, więc czym może się różnić sprawdzenie czy suma kontrolna dla peselu jest poprawna między różnymi serwisami, oraz dlaczego żeby to zrobić nalezy wysłać request HTTP?


Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10064
0
scibi_92 napisał(a):

@Riddle: czy suma kontrolna (czy jak to się nazywa) Peselu ma jeden ustalony algorytm? Bo z tego co wiem to tak, więc czym może się różnić sprawdzenie czy suma kontrolna dla peselu jest poprawna między różnymi serwisami, oraz dlaczego żeby to zrobić nalezy wysłać request HTTP?

Poruszasz dwie kwestie, więc odpowiem na nie osobno.

  • czy suma kontrolna (czy jak to się nazywa) Peselu ma jeden ustalony algorytm? Bo z tego co wiem to tak, więc czym może się różnić sprawdzenie czy suma kontrolna dla peselu jest poprawna między różnymi serwisami Jeśli algorytm w istocie jest taki sam, to nie powinno mieć znaczenia jakiej biblioteki użyjesz do jej sprawdzenia, a powinieneś móc mieć możliwość żonglować sobie implementacjami jak chcesz, możesz nawet napisać takie coś samemu i nie powinno być z tym problemu. Więc odpowiadając na pytanie OP; nie ma potrzeby wymuszania czegokolwiek.
  • oraz dlaczego żeby to zrobić nalezy wysłać request HTTP? jeśli zadajesz pytanie o zasadność żądań HTTP pomiędzy microserwisami, to tak na prawdę zadajesz pytanie o zasadność istnienia microserwisów. Pytanie w ogóle nie powinno brzmieć "czy to jest tak ważny element żeby zrobić request". Nie powinno brzmieć w ogóle "Jaka ilość skomplikowania logiki jest warta dodatkowego requestu". Pytanie powinno brzmieć tylko i wyłącznie: "Czy chce mieć różne elementy aplikacji oddzielone od siebie?" Jeśli tak, to dzielisz je na moduły albo microserwisy i każda konieczna komunikacja leci po HTTP; jeśli nie, to nie dzielisz ich na mikroserwisy i nie masz problemu z żadaniami.

Bo zobacz, niby dzielisz aplikacje na pod-aplikacje, żeby je odseparować od siebie. Ale potem dodajesz w inny sposób, zależności między nimi. Po co? Albo je rozdzielasz (i wtedy je rozdzielasz już całkiem), albo ich nie rozdzielasz i masz jedną aplikację. Co nie znaczy wcale że to musi być monolit, możesz mieć aplikacje jedną, ale rozsądnie podzieloną na moduły. Jeśli nie, to wtedy masz tylko sztukę, dla sztuki (tzn. "microserwis dla microserwisu"), dzielisz je, ale nie czerpiesz korzyści z rozdzielenia ich.

To jest swoją drogą kolejny przykład degradacji jakiegoś pomysłu. Teraz w "popkulturze" programistycznej się przyjęło, że każda, dowolna aplikacja która nie jest microserwisem, musi kategorycznie być monolitem.

edytowany 5x, ostatnio: Riddle
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
1

Więc odpowiadając na pytanie OP; nie ma potrzeby wymuszania czegokolwiek.

Tylko ja nie pisałem nic o wymuszaniu korzystania z biblioteki, tylko o tym że te biblioteki mają sens.


piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
6

Nie chcę krytykować decyzji kolegów nie znając powodów dla jakich podjęli takie, a nie inne decyzje. Jeżeli jednak nie wiesz dlaczego masz tak robić, to ktoś gdzieś dał ciała, bo skoro był powód, to powinien być znany każdemu programiście, który tego dotyka. Ogólnie rzecz biorąc, o ile rozumiem np. chęć jako-takiego ujednolicenia tech-stacku, bo to, że każdy uS może być napisany w innym języku, korzystać z innej bazy danych, kontenera z innym systemem itd. nie znaczy jeszcze, że warto. Natomiast wszystkie pomysły "zróbmy sobie framework" z jakimi się spotkałem były kompletnie z czapy. Zwykle kończyło się to tym, że takie framework faktycznie był wszędzie, w każdym miejscu w innej wersji, na szybko przerobionej pod konkretny serwis/aplikację.
Ogólnie uważam, że architekt powinien trzymać pewien dystans od tego poziomu decyzji. Jak jest jakiś zespół, który zna się na tym co robi, to dlaczego mam się z nimi kłócić o to jak zrobią to za co odpowiadają? Nie znaczy to, że nie uczestniczę w takich dyskusjach, staram się służyć swoją wiedzą i doświadczeniem, ale przecież jak komuś narzucę, że ma coś zrobić używając czegoś tam, to z łatwością i dziką satysfakcją "udowodni" mi, że jednak się nie da.

Mogę za to powiedzieć z pewną satysfakcją, że w pewnej firmie miałem możliwość takiego frameworka ubić.

ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1
Riddle napisał(a):

Strasznie mnie bawi to jak powszechne jest zjawisko degradacji pomysłów w IT. Jak rozważam różne pomysły, metodologie, wzorce, etc. to praktycznie w każdym widzę podobny schemat, tzn:
[ciach]

Tak, dokładnie.

Pamiętam pierwszy świstek z "wolnego świata", piąte ksero z trzeciego kwero z "Byte", że xxxx (życie pokazuje, po 30 latach nadal wystarczy tu wstawić dowolną technologię programistyczną, np microserwisy) jest jak seks nastolatków
wszyscy o tym ciągle mówią, ale niewielu robi
każdy myśli, że inni to robią (lepiej od niego)
ci nieliczni, którzy robią, nie robią tego dobrze ani bezpiecznie
... było tego wiecej

Czy ten dowcip kiedyś odejdzie w niebyt historii? Bo na razie sie nie zanosi.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
AN
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 4 godziny
  • Postów:973
1

@Riddle: "Strasznie mnie bawi to jak powszechne jest zjawisko degradacji pomysłów w IT"
Ale zdajesz sobie sprawę, że świat i terminy w IT po prostu ewoluują? Skoro każdy w tym Google itd. używa danego terminu w "nowym znaczeniu" to oznacza, że to właśnie to nowe znaczenie ma znaczenie


Zdalna praca dla Senior Python Developerów --> PW
edytowany 1x, ostatnio: anonimowy
AN
ZD
Gdybyż to była naturalna ewolucja... Zbyty często jest to zawłaszczanie słowa (mniej dyplomatycznie: kradzież) przez "IT marketing" A jak słowo zostaje wciągnięte w marketing, to już nie służy "komunikowaniu się" a "sprzedaży" czy "wpływaniu na decyzje"
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
1

Problem nie leży w tym, że pomysły ewoluują, tylko na stosowaniu ich bez zrozumienia po co są, a często nawet na czym polegają. Opisywany przez OP'a przykład może podpadać pod taki schemat. Jest DRY, które miał swój powód - mniej kodu do czytania, łatwiejsza zmiana, wymuszenie sensownego podziału na jednostki. A skończyło się w tym (i wielu innych przypadkach), na utworzeniu jakiegoś "wspólnego frameworku", który powoduje, że wejście w projekt jest trudniejsze, zmiany są bardziej skomplikowane, a w każdym serwisie ładowany jest ten sam zestaw dodatków, czy ma to sens, czy nie. W dodatku każdy błąd we "frameworku" spowoduje najprawdopodobniej konieczność przebudowy i zmiany wszystkich serwisów, które z niego korzystają. Jeżeli całość jest napisana na poziomie "technical excellency" jak przykład z wstrzykiwaniem beana na polu jakiejś owijki - to prawdopodobnie biedacy, którzy muszą tego używać większość czasu poświęcają na dostosowanie się do dupnych wymagań i użycie g... kodu "bo muszą" zamiast na sprawieniu, że to co piszą robi, to co ma robić.

Z moich własnych zawodowych traum, przypominam sobie akcję "mikroserwisy rozwiążą nasze problemy, wszystkie, co do jednego". Większość tych serwisów na koniec była postawiona na osobnych VM'kach, komunikowała się synchronicznie, nikt nawet nie pomyślał o skalowaniu horyzontalnym, deployment był ręczny. Jak uciekałem z tego projektu, to zwyczajnie całość nie działała i nie miała moim zdaniem szansy zadziałać w przyszłości. Wszystko dlatego, że był tam architekt, który kazał robić mikroserwisy, bo jemu inny architekt kazał robić mikroserwisy, a zrozumienie ich idei było śladowe.

edytowany 1x, ostatnio: piotrpo
AN
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 4 godziny
  • Postów:973
0

@piotrpo: Czyli zgaszasz się z Riddle, że mikroserwisy powinny być bardzo malutkie i nie powinny być zmieniane tylko wywalane do kosza jeśli biznes zmieni jakiekolwiek wymagania?


Zdalna praca dla Senior Python Developerów --> PW
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
0

@anonimowy: Częściowo. Uważam, że powinny być małe, ale z zupełnie innych powodów niż "wywalić i napisać od zera".

  • ograniczenie odpowiedzialności
  • "fizyczne" ograniczenie zakresu zmian
  • skalowalność

Z małego rozmiaru oczywiście wynika możliwość wywalenia i napisania od początku jeżeli komuś się tak spodoba, ale nie patrzę na tę cechę jak na cel sam w sobie.

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10064
1
anonimowy napisał(a):

@piotrpo: Czyli zgaszasz się z Riddle, że mikroserwisy powinny być bardzo malutkie i nie powinny być zmieniane tylko wywalane do kosza jeśli biznes zmieni jakiekolwiek wymagania?

Ja nie mówiłem, że takie powinny być, tylko że taka była początkowa ich idea.

W moim poprzednim poście napisałem, że powinno dać się móc je wywalić i napisać od nowa. Jako kryterium, czy masz dobrze napisany mikroserwis czy nie. Jeśli z jakiegoś powodu nie mógłbyś go wywalić i napisać nowa, to znaczy że masz ukryte powiązania, i cały microserwis trochę nie ma sensu i bardzo prawdopodobne że przynosi więcej szkody niż pożytku. Albo też może oznaczać że jest za duży.

edytowany 1x, ostatnio: Riddle
AN
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 4 godziny
  • Postów:973
1

Wyraźnie zaznaczyłeś, że powinny być mikro i nie powinny być edytowalne.
" ano idea była taka, żeby nie modyfikować kodu mikroserwisów"

Nie spotkałem się nigdzie z takim podejściem więc jest ono błędne bo nikt z niego nie korzysta. Jeśli taka była idea to znaczy, że jest przestarzała a nie źle zaadoptowana


Zdalna praca dla Senior Python Developerów --> PW
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10064
0
anonimowy napisał(a):

Nie spotkałem się nigdzie z takim podejściem więc jest ono błędne bo nikt z niego nie korzysta. Jeśli taka była idea to znaczy, że jest przestarzała a nie źle zaadoptowana

No okej, masz prawo do swojego zdania.

Ale obawiam się, że to znaczy że jesteś osobą o której pisałem tutaj: Wymuszanie wspólnych bibliotek w mikroserwisach. Że jeśli jakiś słaby pomysł stanie się dostatecznie popularny, to przestaje być słaby.

edytowany 3x, ostatnio: Riddle
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
2
piotrpo napisał(a):

Z małego rozmiaru oczywiście wynika możliwość wywalenia i napisania od początku jeżeli komuś się tak spodoba, ale nie patrzę na tę cechę jak na cel sam w sobie.

jak zwykle w inżynierii: tak małą, jak to potrzebne ALE NIE mniejsze
Kazda zbyt atomowa granujacja to rosnace koszty developmentu, złożoność, komunikacji, infrastrukturalne itd...
(javascriptowa libka do dodawania liczb)


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
DM
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 godziny
  • Postów:222
2

Najsmutniejsze w tym wszystkim jest to, że taki sam 'wzorzec' przyjmuje Spring.

Dodajesz jakaś zależność i nagle masz nowe beany 'za darmo' + aplikacja się wywala, mimo że jest tylko jedna klasa z main.

Nigdy nie zrozumiem, jak to się dostało do mainstreamu.

RequiredNickname
Wydaje mi się że po prostu taki spring rozwiązuje pewne problemy biznesowe i po to został stworzony, nie po to by ego devow było łechtane...
Riddle
@RequiredNickname: BS, Spring został stworzony z tego samego powodu co większość innych bibliotek. Spora część programistów pisała wielokrotnie ten sam kod, tak wiele że został wyniesiony do współ-użycia.
DM
@RequiredNickname: To jest czysto techniczne rozwiązanie(okropne w mojej opinii), problemy biznesowe nie mają nic do tego.Uważam, że dużo lepszym rozwiązaniem byłoby danie czystej zależności bez żadnych anotacji i pozwolić programiście samemu to sobie skonfigurować poprzez klasę @Configuration. Rozmawiamy tutaj tylko jak zintegrować nową zależność do aplikacji Springowej. Sam Spring to jeszcze inna, ciężka dyskusja :)
SI
  • Rejestracja:ponad 3 lata
  • Ostatnio:19 dni
  • Postów:12
3
programista-z-cyrku napisał(a):

Co o tym sądzicie i co należałoby zrobić?

Architekci powinni zatrudnić Dev Rel'a, żeby chodził i reklamował ich biblioteki. A Ty powinienes - jak już ktoś mądrze wspomniał - odświeżyć CV ;)

edytowany 1x, ostatnio: sine
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)