Dobry kod to taki, który łatwo usunąć – o potędze usuwalności i AI w nowoczesnej architekturze
Usuwalność kodu jako fundament dobrej architektury
Najbardziej wartościową umiejętnością architekta nie jest pisanie kodu, lecz umiejętność projektowania systemów, w których kod można łatwo usuwać i podmieniać. Słuchając dzisiaj podcastu Patoarchitekci, gdzie Łukasz i Szymon komentowali artykuł na temat dzielenia monolitów na mikroserwisy, usłyszałem zdanie, które idealnie podsumowuje moje doświadczenia: dobry kod to taki, który łatwo usunąć.
Im więcej kodu napisałem i im więcej systemów projektowałem, tym bardziej doceniam tę prostą zasadę. Chodzi o coś więcej niż tylko o czytelność czy elegancję – chodzi o praktyczny wymiar pracy z kodem w dłuższej perspektywie czasowej.
Monolity vs. mikroserwisy – fałszywa dychotomia
W debacie o architekturze oprogramowania często stawiamy monolity i mikroserwisy na przeciwległych biegunach. Prawda jest jednak bardziej złożona.
Widziałem rozproszone systemy, teoretycznie składające się z niezależnych mikroserwisów, w których źle wydzielone wspólne moduły sprawiały, że wszyscy programiści i tak czekali w kolejce, aby zmodyfikować jeden współdzielony fragment. Fizyczny podział kodu nie gwarantował niezależności pracy.
Z drugiej strony, pracowałem z monolitami tak dobrze podzielonymi na moduły, że nie musiałem nawet wiedzieć nad czym pracują inni członkowie zespołu – moje pull requesty praktycznie nie wpływały na ich pracę.
W firmie, dla której pracuję, mój kolega Kamil Bączek jest jednym z ewangelistów modularnych monolitów. Obaj zgadzamy się, że dobra separacja funkcjonalności i jasny podział na małe, spójne komponenty pozwalają wielu programistom, a nawet wielu zespołom, swobodnie pracować nad jedną aplikacją.
Usuwalność kodu jako klucz do szybkiego eksperymentowania
Gdy mówimy o zaletach modularności, często wymieniamy łatwość utrzymania, testowania czy skalowalności. Jest jednak jeszcze jedna, kluczowa korzyść, która drastycznie zmienia sposób pracy zespołów deweloperskich – możliwość bezpiecznego usuwania i podmieniania całych fragmentów kodu.
Mając jasne granice, gdzie kończy się funkcjonalność, mogę:
- Całkowicie usunąć kod i napisać go od nowa bez wpływu na resztę systemu
- Stworzyć alternatywną implementację i przełączać się między nimi za pomocą feature flag
- Przeprowadzać radykalne eksperymenty bez obawy o konsekwencje dla stabilności całości
To właśnie ta usuwalność pozwala nam eksperymentować na niewyobrażalną wcześniej skalę. Mogę użyć jednej feature flagi do przełączenia na nowy kod i błyskawicznie przetestować, czy inne podejście nie sprawdzi się lepiej – bez koszmarów o tym, że zepsuję połowę systemu.
Ta sama zasada rewolucjonizuje dodawanie nowych funkcjonalności. Gdy ktoś proponuje nowy raport lub nowy typ zniżek, dzięki jasnym granicom dokładnie wiem, gdzie mogę się wpiąć i z czego skorzystać. Nowy fragment kodu działa praktycznie jak niezależna aplikacja, która można łatwo usunąć, jeśli eksperyment się nie powiedzie.
Rewolucja AI w kontekście usuwalnego kodu
Usuwalność kodu w połączeniu z AI tworzy potężny tandem, który radykalnie zmienia podejście do tworzenia oprogramowania. Dobrze zaprojektowane granice między modułami sprawiają, że sztuczna inteligencja staje się niezwykle efektywnym współpracownikiem.
Jak AI wykorzystuje potencjał usuwalnego kodu:
- Generowanie alternatywnych implementacji – AI może stworzyć kilka różnych podejść do rozwiązania tego samego problemu, które łatwo testujemy dzięki modularności
- Błyskawiczne prototypy – AI generuje w kilka minut kompletne rozwiązania, które można bezpiecznie przetestować i równie bezpiecznie usunąć
- Eksperymenty z nowymi technologiami – możemy poprosić AI o przepisanie modułu w innym stylu lub z wykorzystaniem innych bibliotek, bez ryzyka dla całego systemu
- Refaktoryzacja w skali modułów – AI może wziąć na warsztat cały moduł, jeśli jest on dobrze odgraniczony od reszty systemu
Jasne API do wpięcia się w istniejący kod i brak konieczności grzebania w całym systemie umożliwiają stworzenie proof of concept z pomocą AI w kilka chwil. Z czystymi granicami między modułami możemy błyskawicznie wdrożyć wygenerowany przez AI kod, sprawdzić na realnych danych, czy wynik nas satysfakcjonuje, a następnie bezboleśnie go usunąć lub wyłączyć – nie zakłócając pracy pozostałym członkom zespołu.
Usuwalność kodu nie wymaga mikroserwisów
Kluczowa obserwacja: łatwo usuwalny kod i wszystkie płynące z tego korzyści nie wymagają od razu podziału na mikroserwisy, wprowadzania skomplikowanych systemów kolejkowych albo architektury opartej o zdarzenia.
Co więcej, słabo przemyślany projekt rozproszony, mimo fizycznego podziału, nie da nam prawdziwej usuwalności komponentów i będzie koszmarem do utrzymania. Czasami wystarczy, że:
- Poszczególne funkcjonalności będą miały własne tabele w bazie danych
- Moduły będą komunikować się przez jasno zdefiniowane interfejsy
- Komponenty będą korzystać tylko z zasobów dostępnych w najbliższym module
Nawet monolityczna aplikacja z takimi cechami może oferować doskonałą usuwalność poszczególnych części i wszystkie korzyści, które z tego płyną – łącznie z pełnym wykorzystaniem potencjału AI.
Projektuj pod kątem usuwalności zanim zaczniesz kodować
Kluczem do sukcesu jest projektowanie jeszcze przed napisaniem pierwszej linii kodu, ze szczególnym naciskiem na możliwość łatwego usuwania i podmieniania komponentów. Wyznaczenie granic między modułami, określenie interfejsów i interakcji, a także przewidzenie potencjalnych obszarów zmian to fundament dobrej architektury.
Pytanie, które warto zadawać na etapie projektowania: „Jak łatwo będzie usunąć lub zastąpić ten moduł za rok, gdy pojawią się nowe wymagania lub lepsze narzędzia, w tym bardziej zaawansowane modele AI?”
Pamiętajmy, że usuwalność kodu to nie binarny wybór między monolitem a mikroserwisami – to fundamentalna cecha dobrej architektury, którą możemy osiągnąć na wiele sposobów, dostosowanych do specyfiki naszego projektu i zespołu.
Potrzebujesz konsultacji w zakresie architektury systemów, projektowania pod kątem usuwalności kodu lub integracji AI w procesie rozwoju oprogramowania? Skontaktuj się ze mną: contact@zajacmarek.com
Leave a Comment