O co chodzi z Domain Driven Design?

O co chodzi z Domain Driven Design?
DO
  • Rejestracja:ponad rok
  • Ostatnio:ponad rok
  • Postów:1
5

Cześć,

Jestem inżynierem/programistą, skończyłem 8 lat temu politechnikę, a programuję już jakoś od liceum. Zawodowo pisałem programy w Javie, Scali, aktualnie już całkowicie przeszedłem na Go-langa z pobudek osobistych. W międzyczasie udało mi się dostać do jednej z firm zaliczanej do FAANG.

Czasem chodzę na różne konferencje, oglądam Youtuby i aż mnie skręca jak widzę kolejnych "szamanów" opowiadających o DDD, używając słowotoku i nowomowy z której nic nie wynika na samym końcu. Też macie takie odczucie? Czy to jest jakiś sposób na robienie hajsu na Juniorach? Coś jak sprzedawanie dawniej garów po wioskach czy poduszek leczniczych?

Radzę nieraz się wsłuchać przez 20-30 minut i po tym czasie wypisać chociaż 5 konkretnych punktów...

Jeżeli kod jest dobrze napisany np. stosujemy wzorce projektowe typu porty-adaptery to i trzymamy się dobrze założeń, dzielimy kod na pakiety porządnie to raczej nie powinno być żadnych problemów. Chodzi mi o to, że czuję już frustrację jak jestem na konferencji i ktoś po raz n-ty gada o tym samym czyli DDD/Agregaty/CSQR'y/Clean Architecture i tym podobne. Niech weźmie pokaże jak kodzi lepiej. np. jakiś prostu algorytmik. Naprawdę, ale już po prostu mam dość robienia z ludzi debili.

8 lat programuję po różnych korporacjach i ani razu nikt mi o tym nie gadał w żadnej firmie, normalnie się pracowało i jakoś doszedłem do pozycji Tech Leada i tak naprawdę ja wciąż nie wiem o co chodzi w tym Domain Driven Design? Co to jest? Ja tego nie umiem.

edytowany 1x, ostatnio: Daniel_O
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1661
4

Design czyli projektowanie, a nie kodowanie


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
Riddle
Co za bzdura.
SA
  • Rejestracja:około 12 lat
  • Ostatnio:mniej niż minuta
  • Postów:1431
10
Daniel_O napisał(a):

8 lat programuję po różnych korporacjach i ani razu nikt mi o tym nie gadał w żadnej firmie, normalnie się pracowało i jakoś doszedłem do pozycji Tech Leada i tak naprawdę ja wciąż nie wiem o co chodzi w tym Domain Driven Design? Co to jest? Ja tego nie umiem.

Dobrze rozumiem, że czujesz się od innych lepszy, bo czegoś nie umiesz? A agendy konferencji są znane, jak Cię coś nie interesuje ani jest Ci potrzebne to nie słuchaj. Strasznie atencyjny ten post wyszedł.

Dla równowagi powinien być jeszcze tu post seniora z 30-letnim stażem, który będzie udowadniał, że jemu żadne wzorce nie bylo potrzebne i żyje.

RJ
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 12 godzin
  • Postów:433
0

W Domain Driven Design chodzi o to, że projektujesz system, biorąc sobie problem biznesowy i powiązane z nim procesy jako centrum rozwiązania.
Klasycznie zaczyna się to od sesji event stormingowej, na której jest biznes i developerka i robią burze mózgów odnośnie wydarzeń, które muszą istnieć w domenie.
Pięknie się DDD uzupełnienia z EDA i w sumie bez niego nie istnieje i pięknie idzie też wraz z mikroserwisami.
Jest masa literatury na ten temat i polecam, bo chociaż na takiej sesji event stormingowej nigdy nie byłem to wydaje się to być bardzo rozsądne i fajne podejście do tworzenia oprogramowania.
Z racji tego, że zamykamy domenę to stąd Clean Architecture, bo jak się tech zmieni to rozwiązanie domeny już będziemy mieli i jest framework agnostic.

TLDR: behaviour > data

A jak kodzisz tyle lat i nie jesteś w stanie tego pojąć to zostawię bez komentarza 😉

edytowany 3x, ostatnio: rjakubowski
Zobacz pozostałe 8 komentarzy
WeiXiao
przecież zasada tego na czym DDD polega się nie zmienia, więc co ma do tego liczba osób w projekcie czy budżet? Zasady działania pozostają takie same, ale to jak dane podejście/rozwiązanie/itd się sprawdzi już ulega zmianie w zależności od tego "kontekstu". Przykład: 2 mikroserwisy - jeden jest dla usera (frontend, 2 instancje gdzie druga to failover), a drugi to jakiś worker np. 20 instancji do obliczen. I rozważmy 2 przypadki: W przypadku A jest to klepane przez 1 osobę, a w przypadku B są 2 zespoły po 5 os.
WeiXiao
I jakie dochodzą problemy przy B? koordynacja deploymentu lub wersjonowanie API / może jakieś wersjonowanie libek? i pewnie więcej by wymieniły osoby z większym expem. Więc w sumie robimy to samo (mikroserwisy). ale mogą dojść pewne "wyzwania".
RJ
@WeiXiao: no tak, jak najbardziej, ale sam widzisz, że nie mówisz już o DDD tylko stricte technicznych tematach. Nie ma na nic silver bulleta niestety i tego nie przeskoczymy, ale jeśli można mieć wspólny język między biznesem, a programistami to gra jest warta świeczki, bo nawet jak będziesz miał zespół dziesięciu najlepszych technicznie programistów na świecie, a komunikacja z biznesem będzie kuleć to z tego nic. Co z tego, że się uda napisać projekt, który jest technicznie wspaniały, ale nie realizuje zamysłu biznesowego?
WeiXiao
@rjakubowski: Ja się zgadzam, ale patrz: ty piszesz o komunikacji, a OP oglądając te konfy odnosi wrażenie że chodzi o jakieś ktoś po raz n-ty gada o tym samym czyli DDD/Agregaty/CSQR'y/Clean Architecture i tym podobne. O jakieś buzzwordy. On chyba szuka wskazówek na poziomie kodu.
RJ
@WeiXiao: odesłałem go do literatury z przykładami 😉
ledi12
  • Rejestracja:ponad 5 lat
  • Ostatnio:26 dni
  • Lokalizacja:Wrocław
1

DDD to nie był ten pattern z "repository classes"? Generalnie dużo abstrahowania co do małych projektów jest overkillem :P


Robię http response status cody w martwych ciągach
neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 12 godzin
  • Lokalizacja:Kraków
  • Postów:1114
13

Definicja DDD w jednym zdaniu:

W DDD chodzi o to by wszystkie strony zaangażowane w powstawanie oprogramowania używały wspólnego wszechobecnego języka domenowego do rozwiązania problemu co ma ułatwić komunikację, i aby dzielić większe problemy na mniejsze (nieśmiertelne divide-and-conquer).

Ogólnie Eric Evans zauważył że różne strony zaangażowane w powstanie oprogramowania, strona biznesowa, architekci, programiści, testerzy, używają różnego języka i tworzą własne modele powstającego oprogramowania (które często się rozsynchronizowują z czasem). Więc idea jest by wypracować wspólny język najlepiej wywodzący się z domeny problemu, i dążyć w ideale do jednego modelu nad którym pracują wszyscy zainteresowani. I tym modelem właśnie ma być kod powstającego oprogramowania, i co za tym idzie są zaproponowane pewne wzorce projektowe by to ułatwić. Ale jest to sprawa drugorzędna, bo głównie chodzi o to by wszystkich przybliżyć do siebie i żeby pracowali razem ze sobą jak najbliżej, bez tworzenia modeli zrozumiałych tylko dla poszczególnych grup ludzi.

Także jak najbardziej można robić i dojść do DDD naturalnie i nieświadomie jak się ma zgrany zespół.

Jak się nie osiągnie tego naturalnie, no to właśnie mamy różne techniki prezentowane na konferencjach, mówiące głównie o tym jak zbliżyć biznes do programistów, jak ułatwić im rozmawianie ze sobą, skoro naturalnie tego nie potrafią osiągnąć.


edytowany 5x, ostatnio: neves
markone_dev
  • Rejestracja:około 3 lata
  • Ostatnio:około 9 godzin
  • Postów:816
1

Cały twój wywód jest błędny bo skupiłeś się tylko na kodzie (wzorce taktyczne DDD, ktore w mniejszych projektach faktycznie mogą być overkillem) całkowicie pomijać wzorce strategiczne, czyli odkrywanie i destylacja domeny, definiowanie wspólnego języka, wydzielanie kontekstów ograniczonych i wiele więcej, mających na celu zsynchronizowanie biznesu i IT jak wyłożył @neves.

No i warto wspomnieć, że można i powinno się stosować strategiczne DDD w projekcie każdego rozmiaru.

Do tego strategiczne DDD jest podstawą przy projektowaniu systemów opartych o architekturę mikrousługową bo ładnie widać jak rozkładają się poszczególne usługi, zależności pomiędzy nimi i odpowiedzialności.

I to wszystko zanim napisaliśmy jakąkolwiek linijkę kodu.


Programujący korpo architekt chmurowy.
Udzielam konsultacji i szkoleń w obszarze szeroko pojętego cloud computingu (Azure, AWS) i architektury systemów IT. Dla firm i prywatnie.
DevOps to proces nie stanowisko.
edytowany 5x, ostatnio: markone_dev
SZ
  • Rejestracja:prawie 2 lata
  • Ostatnio:3 miesiące
  • Postów:52
2

Nie wydaje wam się że z całego DDD wartościowe to w zasadzie jest tylko wprowadzanie biznesowego nazewnictwa zidentyfikowanych procesów i ich składników,a taktyczne i strategiczne DDD lepiej opisują pojęcia jak skalowalność , throughput, latency, AP/CP , integralność danych, transakcyjność. Czy nie należy po rozpoznaniu procesów i ich wymagań skupić się tylko na ich grupowaniu w usługi zwracając uwagę na unikanie transakcji rozproszonych( kosztem replikacji danych), podobne zbiory danych, te same wymagania co do skalowalności, wydzielanie procesów o rożnych wymaganiach read/write , throughput, latency. Potem może się okazać że w jeden serwis to lepiej wsadzić jakiś proces z innego bounded contextu bo unikamy transakcji rozproszonej a niefunkcjonalne wymagania mamy te same. Jest bezpieczniej i prościej, a strategiczne DDD idzie papa. Przerobiłem trochę kursów o projektowaniu systemów, microservices design patterns, wiele przykładowych systemów na miliony użytkowników od architekta Googla - w ŻADNYM z nich nie padło słowo DDD.

MA
a propoS kursów które przerobiłeś - zapodasz te które najbardziej polecasz?
SZ
szukaj Michael Pogrebinsky
KE
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 11 godzin
  • Postów:664
0
Daniel_O napisał(a):

Też macie takie odczucie? Czy to jest jakiś sposób na robienie hajsu na Juniorach? Coś jak sprzedawanie dawniej garów po wioskach czy poduszek leczniczych?

Tak. Dawno już nie programuję stricte, ale pamiętam kilka lat temu to był dramat. Wielu szkoleniowców postanowiło sobie wziąć temat DDD pod swoje skrzydła, pewnie chcieli dobrze, ale wyszło bardzo niesmacznie - bo odbierałem to jako "hej, kup nasze szkolenie, bo sam nie dasz rady z netu, to jest trudne, ale z nami dasz radę i wejdziesz do ekskluzywnego klubu znawców DDD i będziesz lepszy od tych żałosnych CRUDowców co tylko gettery i settery piszą".

A szkoda - bo DDD jest zbiorem fantastycznych praktyk. Nie zawsze się sprawdza, no ale to chyba znając DDD wiemy gdzie się nie sprawdzi. :)

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

DDD to w skrócie zbiór pewnych metodologii metodyk. Ich celem byłoby wytworzyć oprogramowanie które jest niezależne od zewnętrznych elementów (jak baza danych, io, system), a skupia się na zasadach biznesowych - takich które byłyby utrzymywanie nawet w przypadku braku tego softu.

Ciężko to opisać w jednym zdaniu, wymagałoby pensie kilkunastu godzin przyswajania tematu.

edytowany 1x, ostatnio: Riddle
Zobacz pozostałe 3 komentarze
SZ
Z tymi metodologiami to chyba tak jak z TDD jak Kent Beck poszedł do Facebooka.
Riddle
@Miang: tym jednym zdaniem mi udowodniłeś, że lepiej dla wszystkich gdyby ignorowali Twojej rady w kontekście dobrej architektury.
somekind
metodologia to nauka o metodach badań naukowych
Schadoow
  • Rejestracja:około 13 lat
  • Ostatnio:około 12 godzin
  • Postów:1067
2

i teraz pięknie zestawmy to z tym, ze biznes nie umie formułować wymagań tylko przychodzi z „wizja” która dopiero rozwija się w trakcie developmentu i potrafi core wizji obrócić o 180* :)

Pomijam, ze te naprawdę ogromne korpo które zleca w SH projekty mało kiedy chce marnować czas na dodatkowe spotkania itd. Zazwyczaj PO jest po stronie SH a jak nie spodoba się interpretacja wizji to po prostu więcej z danym SH nie robią xD.

Wiec często ciężko skupić się na „behavior” i projektować według tego bo po prostu to nie istnieje :p

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

Nie wiem o co chodzi w DDD.

Jedno użyteczne pojęcie, które poznałem to Bounded Context.

Cała reszta jest jakaś mętna.

Agregat, Encja, Repozytorium brzmią ciekawie, ale w postaci jakiej są prezentowane w DDD, nie mają dla mnie sensu.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
Escanor16
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:366
0

DDD to bardzo proste podejście do rozwijania oprogramowania gdzie domena projektu jest w jej centrum ale wszędzie (takze tutaj) znajdą się ludzie którzy pozjadali wszystkie rozumy i nie potrafią tego w prosty sposób wytłumaczyć tylko po to by się swoim słowotokiem poflexowac przed innymi


Nie chciałem być programistą jednak tego zechciał świat.
KE
No to wytłumacz nam i OPowi w "prosty sposób" to podejście :) może faktycznie red/blue book to ściema i wyjaśnienie tego to kwestia kilku minut.
Miang
domena, poflexować - mówisz prosty język? ;)
PP
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 miesięcy
  • Postów:146
1
szmeterling napisał(a):

Nie wydaje wam się że z całego DDD wartościowe to w zasadzie jest tylko wprowadzanie biznesowego nazewnictwa zidentyfikowanych procesów i ich składników,a taktyczne i strategiczne DDD lepiej opisują pojęcia jak skalowalność , throughput, latency, AP/CP , integralność danych, transakcyjność. Czy nie należy po rozpoznaniu procesów i ich wymagań skupić się tylko na ich grupowaniu w usługi zwracając uwagę na unikanie transakcji rozproszonych( kosztem replikacji danych), podobne zbiory danych, te same wymagania co do skalowalności, wydzielanie procesów o rożnych wymaganiach read/write , throughput, latency. Potem może się okazać że w jeden serwis to lepiej wsadzić jakiś proces z innego bounded contextu bo unikamy transakcji rozproszonej a niefunkcjonalne wymagania mamy te same. Jest bezpieczniej i prościej, a strategiczne DDD idzie papa. Przerobiłem trochę kursów o projektowaniu systemów, microservices design patterns, wiele przykładowych systemów na miliony użytkowników od architekta Googla - w ŻADNYM z nich nie padło słowo DDD.

W punkt, to malo powiedziane. Stary, nie wiem ile Ci placa, wiem jednak, ze stanowczo za malo.

SZ
Stanowczo za mało to za mało powiedziane. Nie ta branża :/
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)