Studium przypadku · EDK Mobile · Application takeover
Przejęcie aplikacji EDK i odzyskanie kontroli nad jej rozwojem.
Od sierpnia 2025 przejąłem rozwój stabilnego i bardzo dobrze napisanego produktu Flutter. Zbudowałem trwały, wersjonowany kontekst projektu dla Claude Code oraz przebudowałem mapę, nawigację, działanie offline i wydajność. Celem było obniżenie kosztów oraz odzyskanie przez Fundację zwinności w planowaniu, weryfikowaniu i wydawaniu kolejnych zmian.
Porozmawiajmy o przejęciu Twojej aplikacji →Przejęcie działającej aplikacji to praca na żywym produkcie, którego decyzje architektoniczne, zależności i ukryte założenia powstawały wcześniej. W EDK musiałem jednocześnie zachować ciągłość dla uczestników, odtworzyć rzeczywisty model działania kodu i stworzyć proces, w którym kolejne zmiany są małe, sprawdzalne oraz objęte moją odpowiedzialnością. Claude Code przyspieszał moją analizę i implementację, ale dopiero trwały kontekst repozytorium, jasno ograniczone zadania, review, testy na urządzeniach i kontrolowane wydania pozwalały mi zamieniać wygenerowany kod w bezpieczny rozwój produktu.
1.8.0 → 1.10.5
Rozwój aplikacji w kolejnych kontrolowanych wydaniach
MapLibre
Migracja na wektorowy silnik map z obrotem i kompasem
3 tryby GPS
Przeglądanie mapy, śledzenie pozycji i orientacja zgodna z kierunkiem ruchu
Warunki użycia
Mapa jest częścią bezpieczeństwa i ciągłości doświadczenia
Ekstremalna Droga Krzyżowa prowadzi uczestnika nocą przez trasę liczącą około 40 kilometrów, często poza głównymi drogami i w terenie o słabym zasięgu. Telefon nie jest wtedy dodatkiem do wydarzenia. Pomaga rozpoznać przebieg trasy, własne położenie i kierunek marszu, a równocześnie udostępnia rozważania przypisane do kolejnych stacji. Drobny problem interfejsu, który w codziennej aplikacji byłby tylko niedogodnością, po ciemku może przerwać skupienie i utrudnić podjęcie właściwej decyzji na skrzyżowaniu.
Mapa, GPS i kompas są podstawowymi narzędziami prowadzącymi uczestnika przez trasę. Muszą współpracować: pozycja powinna być czytelna, kierunek zrozumiały, a widok mapy powinien zachowywać się przewidywalnie także wtedy, gdy użytkownik idzie, obraca telefon albo zmienia skalę. Aplikacja powinna przekazywać wystarczająco dużo informacji, lecz nie konkurować o uwagę z samą drogą i refleksją. Ten kontekst wpływał na moje priorytety techniczne równie mocno jak kod.
Równie operacyjny jest dostęp offline. Trasa może przebiegać przez las, pola i miejscowości, w których transmisja danych zanika. Uczestnik potrzebuje wcześniej pobranej mapy w jasnym lub ciemnym wariancie oraz lokalnie dostępnych materiałów, bez założenia, że sieć wróci w odpowiednim momencie. Dlatego objąłem pracą nie tylko widok mapy online, lecz także pobieranie, przełączanie motywu, obsługę błędów i zachowanie aplikacji przy zmianach cyklu życia.
Punkt wyjścia
Model zewnętrznego utrzymania i rozwoju aplikacji
Aplikacja była stabilna i bardzo dobrze napisana. Poprzedni dostawca specjalizował się w produktach mapowych, dbał o wersjonowanie i jakość oraz stosował rozsądne zasady wydawania - na przykład nie publikował wydań w piątki. Nie przejmowałem produktu, który wymagał ratunku technicznego, i nie mam zastrzeżeń do jakości pracy poprzedniego zespołu.
Wyzwanie dotyczyło dopasowania modelu do aktualnych potrzeb Fundacji. Zewnętrzne utrzymanie wiązało się z określonym kosztem i naturalnym procesem uzgadniania większych zmian. Nie była to wada po stronie dostawcy, lecz cecha tego modelu współpracy. Fundacja potrzebowała bardziej zwinnego modelu rozwoju: możliwości szybkiego sprawdzania hipotez, dzielenia zmian na małe etapy i uczenia się na podstawie zachowania prawdziwych urządzeń.
Najlepiej pokazał to temat obrotu mapy. Wymagał zmiany dotychczasowego podkładu na mapę wektorową, a więc także zmiany silnika renderującego, stylów, warstw, obsługi widoku mapy i części interakcji. Dostawca sygnalizował, że zakres będzie wymagał wielu godzin pracy. Dla Fundacji był to argument za zbudowaniem własnej zdolności do szybkiego rozwijania produktu. Przejmując odpowiedzialność techniczną, mogłem prowadzić modernizację w małych, sprawdzalnych krokach.
Odzyskanie wiedzy
Przejęcie zaczęło się od rekonstrukcji, nie od przepisywania
Zacząłem od rekonstrukcji architektury istniejącej aplikacji Flutter: przepływów użytkownika, zależności między ekranami, źródeł danych, stanu mapy, integracji Firebase, zachowania GPS i obszarów szczególnie podatnych na regresje. Nie wynikało to z chaosu w kodzie, lecz z odpowiedzialności za poznanie dobrze zbudowanego produktu przed rozpoczęciem dużej modernizacji. Wiedzę rozproszoną w kodzie i historii zmian zamieniłem w jawny model produktu.
Następnie przygotowałem wersjonowane reguły i kontekst projektu dla Claude Code. Opisałem w nich architekturę, konwencje, ograniczenia, sposoby uruchamiania kontroli jakości oraz kryteria akceptacji. Dzięki temu kolejne sesje nie zaczynały od zgadywania, a ważne ustalenia pozostawały w repozytorium razem z kodem. Kontekst nie zastępował dokumentacji produktu; łączył ją z praktycznymi instrukcjami potrzebnymi do bezpiecznego wykonania konkretnej zmiany.
Każdemu zadaniu dla Claude Code nadawałem ograniczony zakres i obserwowalny rezultat. Po implementacji wykonywałem review, uruchamiałem testy, budowałem aplikację i sprawdzałem jej zachowanie na rzeczywistych urządzeniach. Problemy kierowałem do kolejnej małej iteracji zamiast pozwalać im ginąć w dużym pakiecie zmian. Kontrolowałem wydania, aby móc powiązać regresję z konkretnym zakresem i szybko zdecydować o poprawce.
To ja odpowiadałem za cały ten system pracy: wybór kierunku architektonicznego, zakres zadań, ocenę kodu, testy urządzeniowe, interpretację awarii i decyzję, co jest gotowe do wydania. Claude Code wspierał mnie w analizie i pisał znaczną część implementacji, lecz nie przejmował odpowiedzialności za produkt. To rozróżnienie było kluczowe w aplikacji używanej nocą, w ruchu i poza stabilnym zasięgiem.
01 · Rekonstrukcja
Odtworzenie architektury, przepływów, integracji i ryzyk na podstawie kodu, historii oraz zachowania aplikacji.
02 · Wersjonowany kontekst
Zapisanie w repozytorium reguł, konwencji, ograniczeń i wiedzy produktowej potrzebnej Claude Code.
03 · Ograniczone zadanie
Podział modernizacji na mały zakres z konkretnym rezultatem i jawnymi kryteriami akceptacji.
04 · Implementacja i review
Wykorzystanie agenta do analizy oraz kodowania, a następnie przegląd decyzji, różnic i wpływu na istniejące zachowanie.
05 · Walidacja urządzeniowa
Budowa aplikacji i sprawdzenie mapy, GPS, kompasu, offline, motywów oraz cyklu życia na prawdziwych telefonach.
06 · Kontrolowane wydanie
Publikacja zweryfikowanego zakresu, obserwacja stabilności i wykorzystanie ustaleń w następnej iteracji.
Nawigacja w terenie
Od statycznej mapy do przewidywalnego narzędzia nawigacyjnego
Przeprowadziłem migrację do MapLibre, przenosząc aplikację na renderowanie wektorowe i tworząc podstawę dla obrotu mapy, kompasu oraz płynniejszej pracy widoku mapy. Zmiana objęła zarówno technologię warstwy bazowej, jak i logikę zachowania widoku. Musiałem zachować spójność widoku mapy, znacznika użytkownika i orientacji urządzenia, aby obrót ekranu nie powodował dezorientacji, a powrót do śledzenia lokalizacji był oczywisty.
Zaprojektowałem trzy stany GPS odpowiadające różnym intencjom użytkownika: swobodne przeglądanie mapy, śledzenie własnej pozycji oraz prowadzenie z orientacją zgodną z kierunkiem ruchu. Dodałem kompas pozwalający wrócić do północy i zadbałem o to, aby automatyczne śledzenie nie walczyło z ręcznym przesunięciem mapy. Zbliżyłem wzorce interakcji do tych znanych z Google Maps, ponieważ rozpoznawalne zachowanie zmniejsza koszt poznawczy w sytuacji, gdy uwaga powinna pozostać na trasie.
Mapa pokazuje jednocześnie wiele typów informacji. Dodałem klastrowanie wydarzeń i stacji, aby ograniczyć wizualny chaos przy oddaleniu, oraz rozwijany panel trasy, który udostępnia szczegóły bez trwałego zasłaniania mapy. Zbudowałem także interaktywny wykres przewyższeń, który łączy profil wysokości z przebiegiem drogi i pomaga zrozumieć wybraną trasę przed marszem oraz w jego trakcie. Potraktowałem te elementy jako część jednego systemu informacji, a nie osobne widżety.
Przebudowę prowadziłem etapami, abym mógł porównywać nowe zachowanie ze znanymi scenariuszami. Najpierw zbudowałem stabilną podstawę renderowania, następnie orientację i stany GPS, a później warstwy, klastry, panel oraz wykres. Taka kolejność ograniczała liczbę zmiennych podczas diagnozy i pozwalała mi zachować działający produkt pomiędzy wydaniami.
MapLibre i wektory
Wektorowe renderowanie zapewniło podstawę dla rotacji, własnych stylów, kontrolowanych warstw i pracy w jasnym oraz ciemnym motywie.
Trzy stany GPS
Użytkownik może przeglądać mapę, śledzić pozycję albo włączyć orientację zgodną z kierunkiem ruchu bez niejasnych zmian widoku mapy.
Kompas i orientacja
Widok mapy, znacznik oraz kierunek urządzenia są ze sobą spójne, a kompas daje czytelny powrót do orientacji północnej.
Znane gesty
Przesuwanie, obracanie i powrót do lokalizacji korzystają ze wzorców znanych z Google Maps, dzięki czemu nawigacja nie wymaga nauki w drodze.
Klastry i panel trasy
Wydarzenia i stacje są grupowane przy oddaleniu, a zwijany panel pokazuje szczegóły bez odbierania mapie całego ekranu.
Wykres przewyższeń
Interaktywny profil wysokości łączy trudność odcinków z przebiegiem trasy i pomaga przygotować się do nocnej drogi.
Odporność produktu
Płynność i nowe funkcje bez utraty stabilności
Rozszerzyłem tryb offline o pobieranie jasnych i ciemnych map. Uwzględniłem współbieżność pobrań, błędy sieciowe, częściowe niepowodzenia i czytelny stan dla użytkownika, zamiast zakładać idealne połączenie. Zadbałem także o poprawne użycie lokalnych danych po zmianie motywu, tak aby przygotowana wcześniej mapa pozostała użyteczna wtedy, gdy urządzenie nie może pobrać innego wariantu.
Poprawiłem wydajność mapy, ograniczając zbędne repainty i konsolidując warstwy renderowania. Moim rezultatem było wyeliminowanie przycięć i przywrócenie płynnego działania mapy na budżetowych urządzeniach z Androidem, bez publikowania nieudokumentowanego pomiaru liczby klatek. Optymalizację oparłem na obserwacji prawdziwego zachowania, analizie ścieżek aktualizacji stanu i zmniejszaniu pracy wykonywanej przy każdej zmianie pozycji lub widoku mapy.
Rozbudowując centralny element produktu, musiałem zachować wysoką jakość, którą aplikacja miała już wcześniej. Dlatego zabezpieczyłem nowy stos przed awariami SIGSEGV związanymi z MapLibre, dopracowałem aktualizacje GPS, przełączanie jasnego i ciemnego motywu, Firebase Remote Config, cykl życia oraz bezpieczne obszary interfejsu. Problemy, przed którymi zabezpieczałem modernizowany stos, nie były wadami odziedziczonej aplikacji, lecz ryzykiem związanym z wprowadzaniem nowego silnika map i kolejnych funkcji.
Każdą poprawkę weryfikowałem nie tylko w izolacji, lecz także w połączeniu z mapą, nawigacją i przechodzeniem aplikacji między tłem a pierwszym planem. Dzięki temu naprawa jednego przypadku nie mogła bez kontroli naruszyć innego. Testami na urządzeniach uzupełniałem automatyczne kontrole tam, gdzie znaczenie miały sensory, sterowniki graficzne, zasoby telefonu lub zachowanie systemu operacyjnego.
Zakres modernizacji
Etapy przejęcia i modernizacji
Sierpień - wrzesień 2025
Przejęcie i odbudowa kontekstu
Zrekonstruowałem architekturę aplikacji Flutter, utrwaliłem zasady projektu dla Claude Code, uporządkowałem proces review i wdrożyłem pierwsze poprawki, przejmując bezpośrednią odpowiedzialność za dalszy rozwój.
Luty 2026
Transformacja mapy i nawigacji
Przeprowadziłem migrację na MapLibre i mapę wektorową, a następnie dodałem obrót, kompas, trzy stany GPS, spójną orientację widoku mapy i znacznika, klastry, panel trasy oraz interaktywny wykres przewyższeń.
Luty - marzec 2026
Offline, płynność i bezpieczne wydania
Dopracowałem pobieranie jasnych i ciemnych map oraz obsługę współbieżności i błędów. Ograniczyłem repainty, skonsolidowałem warstwy i zabezpieczyłem modernizowany stos w obszarach MapLibre, GPS, motywów, Remote Config, cyklu życia oraz safe area.
Rezultat
Kontrolowany rozwój od wersji 1.8.0 do 1.10.5
Od kiedy przejąłem aplikację, rozwinąłem ją z wersji 1.8.0 do 1.10.5. Ważniejsza od liczby wykonanych zmian jest jednak zmiana sposobu działania: Fundacja ma jawny kontekst techniczny, możliwą do przeglądu historię decyzji i proces, w którym większy kierunek rozwoju można rozłożyć na sprawdzalne etapy bez utraty odpowiedzialności za całość.
Nie obiecuję prostego związku między zakresem zmian a ocenami. Dzięki mojej pracy Fundacja zyskała większą zwinność rozwoju przy zachowaniu wysokiej jakości produktu: nową mapę wektorową, przewidywalną nawigację, bardziej odporne działanie offline, lepszą płynność oraz infrastrukturę kontekstu dla pracy z Claude Code. Razem tworzą bazę, na której kolejne potrzeby uczestników mogą być oceniane i realizowane w kontrolowany sposób.
Playbook przejęcia
Wnioski możliwe do zastosowania w innych przejęciach
- 01
Kontekst przed kodem
Najpierw trzeba odtworzyć zachowanie produktu, ograniczenia i ryzyka; dopiero wtedy agent może bezpiecznie pomagać w implementacji.
- 02
Infrastruktura agenta jest wersjonowana
Reguły, decyzje i kryteria zapisane obok kodu tworzą trwałą pamięć projektu i ograniczają zgadywanie między sesjami Claude Code.
- 03
Modernizacja jest przyrostowa
Centralny element produktu warto zmieniać etapami, aby każdą warstwę zachowania porównać z działającym punktem odniesienia.
- 04
Prawdziwe urządzenie jest częścią walidacji
Mapa, GPS, sterownik graficzny, cykl życia i ograniczenia zasobów ujawniają problemy, których nie pokazuje sam emulator ani test jednostkowy.
- 05
Odpowiedzialność pozostaje ludzka
Agent może analizować i pisać kod, ale człowiek nadal odpowiada za architekturę, zakres, review, dowody jakości oraz decyzję o wydaniu.
Rozwój wspierany przez agentów
Chcesz połączyć tempo Claude Code z odpowiedzialnym dowożeniem produktu?
Pomagam budować trwały kontekst, ograniczać zadania, walidować rezultat i prowadzić kontrolowane wydania w istniejących systemach.