PiszeO.IT

ChatGPT i Domain Driven Design. Czy AI może nam pomóc w modelowaniu?

ChatGPT od OpenAI to narzędzie, które pozwala zwiększyć naszą produktywność. Osobiście coraz rzadziej korzystam z wyszukiwarek internetowych, ponieważ w wielu przypadkach ChatGPT jest w stanie podać mi bardzo satysfakcjonującą odpowiedź w krótszym czasie.

W momencie, kiedy piszę ten tekst, narzędzia sztucznej inteligencji wymagają dostarczenie odpowiedniego kontekstu (tzw. promptu). Dzięki niemu odpowiedzi generowane przez ChatGPT są bardziej satysfakcjonujące i dostosowane do naszych potrzeb.

Często powtarzam — KONTEKST is the KING.

Grafika wygenerowana na potrzeby tego artykułu przez Midjourney (AI generujące obrazy)

Co to ma wspólnego z Domain Driven Design i jak może mi to pomóc?

Domain Driven Design oraz społeczność skupiona wokół tego podejścia oferuje wiele ciekawych technik i heurystyk, które pomagają zrozumieć problem. W najbliższym czasie sztuczna inteligencja nie zastąpi nas w tej kwestii.

Jednak uważam, że takie narzędzia jak ChatGPT mogą być pomocne w prototypowaniu rozwiązań, ponieważ pozwala w bardzo krótkim czasie sprawdzić nasze założenia, np. poprzez generowanie kodu lub jego fragmentów. ChatGPT pamięta kontekst całej rozmowy, dzięki czemu możemy prosić go o wygenerowanie konkretnych klas i ich późniejszą transformację zgodnie z naszymi wytycznymi, lub dodanie elementów związanych z obsługą infrastruktury (frameworka) lub dopisanie testów.

Innym przykładem zastosowania może być wrzucenie jako promptu swojego kodu i poproszenie ChatGPT o stworzenie alternatywnych rozwiązań.

Pomyśl o ChatGPT jak o koleżance lub koledze, któremu musisz wytłumaczyć, czego od niego oczekujesz. Następnie zrób code review, a AI dostosuje kod do uwag, które przekażesz. Tak też wyobrażam sobie użycie tego narzędzia w przyszłości w naszych IDE.

Czy zdarza się Wam czasem, że potrzebujecie zobaczyć „coś” w kodzie? 🙂 Mnie się to zdarza! Mimo tego, że stosuję Event Storming Design Level, to zobaczenie kodu daje mi dodatkową perspektywę.

Z moich eksperymentów wynika, że w niektórych przypadkach ChatGPT jest w stanie dostarczyć mi ok. 90% kodu potrzebnego do uruchomienia danej funkcjonalności na produkcji. Oczywiście wymaga to odpowiedniego poinstruowania narzędzia, dodanie kontekstu i ewentualne korekty. To Ty musisz wiedzieć, co chcesz osiągnąć — Twoja wiedza jest kluczowa. ChatGPT czasem kłamie, czasem upraszcza i trzeba mieć to na uwadze. Mimo to finalnie pozwala to zaoszczędzić sporo czasu i skupić się na bardziej złożonych zadaniach.

Ponieważ ChatGPT nie jest w 100% przewidywalny, to nigdy nie możemy być pewni, jaki otrzymamy rezultat (czy będzie taki sam jak u kogoś innego). Natomiast może być zaleta, bo zawsze warto rozważyć kilka opcji — otwiera to nas na różne, czasem na pierwszy rzut oka nieoczywiste rozwiązanie, które finalnie mogą okazać się lepsze.

Aby to wszystko zadziałało, musimy najpierw „odrobić zadanie” i dokładnie przeanalizować problem, który chcemy rozwiązać np. poprzez wykorzystanie Event Stormingu czy rozpisania scenariuszy na zasadzie „specification by example”. Dzięki temu możemy wykorzystać ChatGPT do wygenerowania rozwiązania, które już w dużym stopniu mamy w głowie, na tablicy lub na kartce.

ChatGPT nie zastąpi nam spotkań, warsztatów, wspólnego „rozkminiania” czy programowania w parach. To są elementy, które przynoszą największą wartość dla zrozumienia problemu i przygotowania najlepszego rozwiązania. Zasada „ludzie i interakcje ponad procesy i narzędzia” z manifestu Agile jest i będzie aktualna!

Dlatego uważam, że najbliższych latach wszystkie techniki i narzędzia związane z Domain Driven Design, czy Extreme Programming staną się jeszcze bardziej kluczowe przy projektowaniu aplikacji biznesowych. Warto się ich uczyć i praktykować, bo ich znajomość da nam ogromną przewagę konkurencyjną na rynku.

ChatGPT może być dodatkiem do całego wachlarza inny narzędzi i technik modelowania oraz implementacji. Świat w ostatnim czasie zmienia się bardzo szybko. To, co dzieje się w obszarze AI, jest moim zdaniem game changerem, który prędzej czy później będzie miał coraz większy wpływ na nasze życie. Warto te tematy eksplorować, abyśmy nie „przespali” tych zmian. Zwłaszcza że to dopiero początek tego, co nasz czeka w przyszłości…

Grafika wygenerowana na potrzeby tego artykułu przez Midjourney (AI generujące obrazy)

Warto wspomnieć, że w ostatnich dniach pojawiają się plotki, na temat tego, że w ciągu najbliższych dni, światło dzienne ujrzy nowa wersja silnika GPT, czyli GPT-4, która ma być znacznie potężniejsza i oferować multimodalność. Koncepcja multimodalności jest związana ze zdolnością sztucznej inteligencji do pozyskiwania informacji z różnych typów źródeł, w tym filmów i obrazów, umożliwiając sztucznej inteligencji odczytywanie i interpretowanie audio, wideo i obrazów. Być może ChatGPT po tych zmianach, będzie w stanie zrozumieć nasze karteczki z Event Stormingu? Kto wie. Jestem bardzo ciekawy, jakie zmiany finalnie zostaną wprowadzone w porównaniu do obecnej wersji.

Poniżej przykład tego, co potrafi ChatGPT. Oczywiście to tylko proste próbki, ale pozwala błyskawicznie na dalsze eksperymentowanie z wygenerowanym kodem i przekształcanie go w kierunku, który nas satysfakcjonuje. Jest to też już „coś”, nad czym możemy podyskutować w zespole.

Link do ChatGPT: https://chat.openai.com/

Przykład 1 (prompt):

Programuję w języki PHP w wersji 8.2 i chcę żebyś stosował bogaty język domenowy. Wygeneruj mi agregat, ktory zamodeluje Wallet, w ramach, którego będę mógł wpłacać i wypłacać pieniądze. Agregat powinien pilnować reguły, która mówi, że wartość Wallet nie może być poniżej 0. Dodatkowo utwórz mi osobną encję WalletOperation, która będzie niezależna od Wallet. W ramach WalletOperation chce wiedzieć jaki był powód wpłaty lub wypłaty oraz kiedy ona nastąpiła. WalletOperation powinno tylko wiedzieć jakiego WalletId dotyczy operacja. Kwota w ramach Wallet i WalletOperation powinna być zamodelowana jako osobny ValueObject Money.

 

Przykład 2 (prompt):

Programuję w języki PHP w wersji 8.2 i chcę żebyś stosował bogaty język domenowy. Wygeneruj mi agregat w PHP, który pozwoli zrealizować poniższy scenariusz:

Funkcja: Przelew środków pomiędzy rachunkami Aby lepiej zarządzać własnymi środkami finansowymi Chcę jako klient banku mieć możliwość przelewania środków pomiędzy moimi rachunkami zawsze gdy tego potrzebuję

Scenariusz 1: Przelew środków na rachunek oszczędnościowym

Zakładając saldo mojego rachunku bieżącego wynosi 1000.00 PLN
I saldo mojego rachunku oszczędnościowego wynosi 2000.00 PLN
Gdy przeleję 500.00 PLN z rachunku bieżący na rachunek oszczędnościowy
Wtedy powinienem mieć saldo 500.00 PLN na moim rachunku bieżącym
I powinienem mieć saldo 2500.00 PLN na moim rachunku oszczędnościowym

Scenariusz 2: Przelew przy niedostatecznej ilości środków
Zakładając saldo mojego rachunku bieżący wynosi 1000.00 PLN
I saldo mojego rachunku oszczędnościowy wynosi 2000.00 PLN
Gdy przeleję 1500.00 PLN z rachunku bieżący na rachunek oszczędnościowy
Wtedy powinienem uzyskać komunikat o błędzie 'niewystarczające środki’
Wtedy powinienem mieć saldo 1000.00 PLN na moim rachunku bieżący
I powinienem mieć saldo 2000.00 PLN na moim rachunku oszczędnościowy

 

Miłosz Karolczyk

Nazywam się Miłosz Karolczyk i tworzenie oprogramowania jest moją pasją.

Jestem gorącym zwolennikiem architektury ewolucyjnej, podejścia Domain Driven Design, Event Stormingu oraz modularyzacji. Uwielbiam proste rozwiązania i szczupłe podejście do zarządzania oraz tworzenia produktów.