Wzorce strategiczne kontra wzorce taktyczne - które są ważniejsze?
Cześć!
Zanim przejdę do właściwego tematu blok informacyjny. Wszyscy teraz robią webinary, więc robię i ja, oto rozkład na najbliższy okres:
- “Blaski i Cienie Event-Driven Design” - jutro o godzinie 10 (wtorek 7.04) będzie prapremiera mojego wystąpienia na SegFault , będzie okazja przedyskutować też na żywo na czacie - zapraszam na https://www.watch2gether.com/rooms/w80e1pu40jhzwy11ff?lang=pl (będzie też potem AMA, ale już się rozeszły miejsca). To będzie ciekawe doświadczenie, komentować i dyskutować swoje wystąpienie patrząc na nie z boku. Podobno taki Gogglebox - pewności nie mam bo nie ma telewizji.
- “Testy macierzowe w Azure Devops” - w najbliższy czwartek o 17:30 (9.04) będę prezentował moją prelekcję z Azure Day - będzie to przy okazji test nowej platformy mojego kolegi Marka Będkowskiego https://ekursy.live/ więc liczę, że serwery uciągną!
- “Event Sourcing w praktyce przy użyciu Marten” - we wtorek 21.04 o godzinie 19:00 na spotkaniu online Wrocławskiej Grupy .NET https://www.meetup.com/pl-PL/wrocnet/events/268145624/
Zapraszam gorąco, tak jak wiesz zapowiadałem webinary już jakiś czas temu, ale nie mogłem się zebrać, ale na szczęście dobrzy ludzie mnie zmotywowali. Nie martw się, żadnej sprzedaży kursu na nich nie będzie.
No dobrze, poinformowane, to przejdźmy do meritum. Temat, który wynikł z dyskusji mailowej po jednym z newsletterów. Wzorce strategiczne kontra wzorce taktyczne. Jajko kontra kura.
Zacznijmy od podstaw czyli co to jest strategia, a co to jest taktyka. Jeśli bylibyśmy generałami to strategią by był nasz plan na wojnę, taktyką konkretne poprowadzenie bitwy. Jeślibyśmy byli trenerem piłkarskim to strategią by było, że gramy np. defensywnym ustawieniem, taktyką by było np. “parkowanie autobusu” bo gramy z Barceloną.
Jakbyśmy byli architektami to naszą strategią by był odpowiedni podział naszej aplikacji na moduły (“bounded contexts”), wyodrębnienie co jest najważniejszym elementem biznesowym naszego systemu (“core domain”), ustalenie wspólnego języka z biznesem (“ubiquitous language”), dobór ogólnych technologii, itd.
Naszą taktyką by było odpowiednie zamodelowanie agregatów, decyzja czy używamy konkretnego API/bazę danych czy chowamy to za repozytorium, decyzji w jaki sposób tworzymy Value Object (np. czy robimy je immutable itd.), czy programujemy funkcyjnie czy klasycznie imperatywnie, jak dzielimy naszą domenę na warstwy, jakich konkretnie (i czy w ogóle) w niej frameworków użyjemy.
Eric Evans, swoją “Niebieską Książkę” zaczął od wzorców taktycznych. Powiedział potem, że teraz by zrobił inaczej, bo niestety część ludzi nie dobrnęła do wzorców strategicznych i pozostała przy literalnym użyciu wzorców taktycznych, podczas gdy patrząc z perspektywy wzorce strategiczne uważa za dużo ważniejsze. Ogólnie czytanie i oglądanie Erica jest trudną sprawą, ale warto przebrnąć, zwykle mówi mocno abstrakcjami i trzeba to wszystko przetrawić. Dopiero po czasie następuje moment “Aha! To to miał na myśli” (zachęcam do przebrnięcia przez tę: https://www.youtube.com/watch?v=R2IAgnpkBck lub tę: https://www.youtube.com/watch?v=xyuKx5HsGK8).
Taki też ton niestety bardzo często przyświeca całej społeczności DDD. Mam czasem wrażenie, że programowanie i pokazywanie kodu w mówieniu o wytwarzanych systemach jest rzeczą na wskroś wstydliwą. Często prezentacje czy wpisy na blogach, które pokazują kod wyglądają tak, że autor mówi “no wiecie, mam tutaj taki mały, ale spokojnie, nie za duży, tylko poglądowy, nie bójcie się… kod”. Nie zrozum mnie źle, wzorce strategiczne są podstawą, tak jak odpowiednia strategia wojenna jest podstawą - nie chcesz atakować jazdą konną czołgi. Ale czy to są tak naprawdę wzorce? Wg mnie to nie są wzorce, to są heurystyki. One są wg. mnie zbyt nieokreślone, żeby nazywać je wzorcami. To jest wręcz sztuka. Wymagają doświadczenia - iluś zepsutych systemów ileś popełnionych błędów. Heurystyka to taka ścieżka przez trawnik, którą udeptali ludzie. Ciężko ją porównywać z wytyczoną drogą. Wyszło w praktyce, że tak powinna wyglądać, ale czy taki był na pewno pierwotny plan? Czy wiedząc, że przed Twoim domem ktoś wydeptał ścieżkę możesz z pewnością widząc inny świeżo zasadzony trawnik na nowym osiedlu powiedzieć czy ktoś na nim wydepcze taką ścieżkę?
Często też w rozmowie spotkałem opinię, że jak dobrze podzieli się system na moduły to przynajmniej będzie miało się burdel wewnątrz, ale na zewnątrz nie. Jak jeden moduł nie wyjdzie, to może chociaż inne wyjdą. Mój kolega mówił, że zrobi sobie 6 dzieci, bo zwiększa szanse, że któremuś dziecku wyjdzie i go będzie utrzymywać.
Broń Boże nie chcę powiedzieć, że wzorce taktyczne są ważniejsze od strategicznych, nawet że są równie ważne. Nie chcę w ten sposób dyskutować. To co chcę powiedzieć to to, że jedne muszą iść razem z drugimi. Jestem fanem podejścia Mistrza Miyagi i jego malowania płotów. Jak nie będzie się przywiązywało uwagi do małych rzeczy to ciężko osiągnąć sukces w dużych. Oczywiście, nie można podchodzić literalnie i purystycznie do wzorców taktycznych, bo to tylko narzędzia, jeśli uznamy je za najważniejsze to możemy sobie wyrządzić nimi krzywdę. Oczywiście dobry plan działań to podstawa, odpowiedni podział na moduły, agregaty, schemat komunikacji i zależności. Niestety nawet najlepszy plan z beznadziejnym wykonaniem nie zadziała. Najlepsza strategia wojenna nie pomoże, jeśli będziemy przegrywać bitwę za bitwą przez głupie błędy. Często zapominamy, że jesteśmy tylko i aż inżynierami, rzemieślnikami. Mamy zrobić tak system, żeby robił to co ma robić.
Na koniec zamiast kącika muzycznego, zostawię Cię z sucharem:
Poszedł facet ze swoim jamnikiem na spacer do parku, a tam odbywały się wyścigi hartów. Nagle jamnik mówi do faceta: - Zapisz mnie proszę na wyścig - na pewno wygram! Zobaczysz… - Fafik to Ty mówisz? Jak mam Cię zapisać, masz krótkie nóżki, nigdy nie widziałem, żebyś biegał, jak masz wygrać? Nie dasz rady. - No człowiek mówię ci, że dam, proszę zapisz mnie. Postaw jeszcze hajs to będziesz bogaty! Facet pomyślał, skoro ten pies gada to może i jest magiczny i biegać potrafi. Zapisał go więc na wyścigi i postawił na niego całe swoje oszczędności. Po chwili wszystkie psy stanęły na starcie, a wśród nich Fafik. sędzia dał znać, otworzyły się boksy i psy wystartowały. Pierwsze okrążenie i Fafik przebiega linię mety ostatni. Właściciel zaniepokojony wydziera się z trybun: - No i co? jesteś ostatni! - Spoko spoko, wygram to jeszcze mam plan. Drugie okrążenie i pies znów przebiega przez metę na samym końcu. facet się wydziera: - Fafik, co jest?! - Spoko spoko, wygram to jeszcze mam plan Przed ostatnim okrążeniem pies znów ostatni przebiegł linię mety. facet krzyczy: - Fafik, co jest? dasz radę?! - Dam, spoko spoko. Na ostatniej prostej pies znów był najgorszy i przybiegł na metę ostatni. po wyścigu podchodzi do niego pan: - No i co? mówiłeś, że dasz radę. Co jest Fafik? - Wiesz, nie wiem.
A jakie jest Twoje zdanie? Daj znać, chętnie podyskutuję, szczególnie jeśli masz danie inne niż ja. Pozdrawiam. Oskar
p.s. daj znać czy będziesz, na którymś webinarze, a jeśli będziesz to liczę na maila z feedbackiem, konstruktywną krytyką. Dzięki z góry! Jak nie dasz rady być to będzie mi miło jak ściśniesz za mnie kciuki.