Perypetie początkującego programisty samouka

Z programowaniem stykałem się od początku technikum. To wtedy dowiedziałem się, że jest coś takiego jak kod źródłowy czy kompilator, który tłumaczy go na język zrozumiały dla maszyny. Mając do czynienia z elektroniką odkryłem mikrokontrolery, z którymi intensywnie bawiłem się do początków studiów. Po znalezieniu pracy w branży chęć dodatkowego majstrowania w elektronice po godzinach umarła we mnie na dobre, przechodząc się na taniec. Postanowiłem przenieść zapasowe zasoby czasu na naukę programowania Androida z ogólnodostępnych zasobów. Dlaczego? Każdy ma smartphone'a, więc na pewno rozwój w tym kierunku nie będzie bezużyteczny. W tym wpisie opowiem Wam jak w dwa miesiące praktycznie od zera przeszedłem do pełnej aplikacji opublikowanej w Google Play z możliwością dalszego rozwoju. 

Znajdź problem do rozwiązania

Tak samo jak przy mikrokontrolerach, tak i przy Androidzie nie chciałem się uczyć na suchych przykładach, które nie tworzą po skompilowaniu kodu niczego co by się mogło przydać. Nie wiem czy jest to poprawne podejście, ale samo suche poznawanie poszczególnych klocków szybko mnie nudzi. Dlatego założyłem sobie na początek konkretny problem do rozwiązania, gdzie kroczek po kroczku będę maszerował do celu. 

Czy ktoś jeszcze pamięta o Dogecoinie? Okazuje się, że społeczność tej kryptowaluty dalej żyje po latach i ma się całkiem dobrze, mając ponad 100 tysięcy obserwatorów na Reddicie. Należę do niej także i ja, natrafiłem na tym subreddicie na temat z ogłoszeniem prostej aplikacji do śledzenia portfeli. Idea była banalna, posiadając adres publiczny portfela dodajemy go do appki, mając podgląd na bieżąco na stan jego konta z przeliczeniem do walut FIAT. Autor wypuścił ją pod iOS, szukał kogoś kto wykona jej port na Androida. Przejrzałem rzeczy które bym musiał się nauczyć, stwierdziłem: "Okej, dość sporo tego jak na początek, ale jest to do ogarnięcia". 

Od pomysłu do realizacji

Plan działania rozbiłem sobie na malutkie kroczki, mając spisane założenia do projektu wiedziałem, co po czym będę robił. Z samym Android Studio miałem tyle o ile do czynienia, składając 'kod' (będący de facto zlepkiem przykładów) na potrzeby odczytów danych z moich stacji pogodowych, bazujących na ESP8266. Naukę obsługi samego środowiska, debugowania z użyciem fizycznego urządzenia miałem już z głowy, zatem mogłem przejść do budowy pierwszym aktywności/widoków mojej aplikacji.

Na początku chciałem dogadać się (sam ze sobą), jak, przynajmniej z grubsza, mają wyglądać poszczególne widoki aplikacji. Wizja zmieniała się parokrotnie, jednakże koniec końców ustaliłem zestaw, który w niezmienionej formie przetrwał do wersji wydanej w Google Play. Oprogramowałem wówczas wyłącznie interakcje przejść pomiędzy nimi. Mając tak gotową gotową bazę zabierałem się za opracowywanie kolejnych funkcjonalności.

Niech stanie się kod

Na początku "na ruszt" poszła nauka obsługi obiektów JSON. Odczyt danych z serwera, oraz wrzucenie ich w odpowiednie miejsce w layoucie. Sprawa okazała się banalna, aczkolwiek zagranie chciwie i wstawienie do programu mechanizmu bez zrozumienia jego działania zafundowało mi błąd, na którego rozwikłanie musiałem poświęcić koło dwóch wieczorów. Pierwszy odczyt danych po otwarciu aplikacji zwracał zera w kursach wymiany pieseła. Kiedy zdałem sobie sprawę że pobieranie danych następuje asynchronicznie wszystko stało się jasne - muszę w jakiś sposób zaczekać, aż zostaną pobrane przed wstawieniem ich do widoku. 

Następnie przeszedłem do drugiej, bardziej złożonej funkcjonalności. Musiałem stworzyć małą bazę danych, która mieściłaby w sobie obecnie zapisane portfele wraz z ich ostatnio pobranymi stanami kont. Trzeba było również pomyśleć o możliwości dodawania, usuwania, nadpisywania konkretnych obiektów z tej bazy. Do tego celu również wykorzystałem obiekt JSON. Nie chciałem tworzyć algorytmów zapisu do pliku zewnętrznego, więc jako pamięć posłużyła mi biblioteka SharedPreferences, gdzie zapisywałem obiekt JSON pod postacią najpospolitszego Stringa. Jako że przy tworzeniu "bazy danych" było nieco więcej operacji do opracowania niż przy odczycie kursu waluty z serwera zewnętrznego, zajęło mi to proporcjonalnie więcej czasu. Tak czy owak po niecałym miesiącu miałem już minimalną, aczkolwiek gotową do wydania aplikacje.

Klucznik Gerwazy

Aby upewnić się czy aplikacja zadziała nie tylko u mnie, wygerenowałem plik gotowy apk i przekazałem znajomym. Żaden z nich nie mógł zainstalować aplikacji. Tu również okazało się że z niewiedzy wygenerowałem niepodpisaną aplikację, która poza emulatorem nie zainstaluje się nigdzie. Utworzyłem własny klucz, po czym podpisałem nim aplikacje, uff... ruszyło. O dziwo aplikacja chodziła tak jak powinna, nawet skalowanie interfejsu zadziałało prawidłowo na mniejszych ekranach. Nikomu z moich pierwszych testerów nie udało się jej zawiesić, zatem nadszedł czas aby odwiedzić sklep Google "od zakrystii". 

Publikacja w Google Play

Na wstępie Google zażyczyło sobie 25 dolarowej opłaty rejestracyjnej, co też uczyniłem. Nie mam pojęcia czy przyda mi się na przyszłość konto dewelopera, ale sam fakt posiadania własnej aplikacji w Google Play i możliwość sprawdzenia jak wygląda całość od drugiej strony do opłaty mnie przekonał. Przeszedłem do publikacji. 

Natrafiłem na kolejną zagwozdkę dotyczącą kluczy podpisywania aplikacji. Google proponuje własną usługę Podpisywanie aplikacji Google Play. W standardowym scenariuszu podpisujemy aplikacje swoim własnym kluczem, przesyłamy ją do publikacji i klucz ten pozostaje w niej aż do użytkownika końcowego. Jest to optymalne rozwiązanie poza przypadkiem kiedy z jakiegoś powodu stracimy dostęp do naszego klucza - wtedy już nie będziemy opublikować naszej aplikacji pod użytą nazwą pakietu. 

W przypadku użycia Podpisywania aplikacji Google Play do sklepu przesyłamy .apk podpisane kluczem przesyłania, Google usuwa ten klucz i wstawia za niego klucz podpisywania aplikacji, który przesyłamy przed pierwszą publikacją programu. Kiedy zgubimy klucz przesyłania, możemy poprosić o jego zresetowanie... co później uratowało mi skórę. 

Dopracowałem opis, wykonałem screeny, kliknąłem "opublikuj" i tak oto pojawiła się aplikacja w sklepie. Pierwsi "Reditorzy" przetestowali i pobrali, opinie były bez większych zastrzeżeń. Obserwując statystyki z Konsoli Play widziałem że w pierwszym tygodniu było koło 20 pobrań i co najważniejsze, nikomu jeszcze DogeTracker się nie zawiesił. Jedyne awarie były spowodowane na moim telefonie, powstałe w trakcie tworzenia programu. 

Ciekawostka: Debugowanie na fizycznym urządzeniu spowodowało, że w Konsoli Play miałem podgląd na raporty awarii jeszcze sprzed daty opublikowania jej w sklepie.

Wiedziałem że moja apka prosi się o dalszy rozwój więc zacząłem pracować nad kolejną wersją. Jednak hola, hola, nie tak szybko przyjacielu...

Miłe złego początki 

Już miałem się zabierać ochoczo do pracy nad kolejnymi ficzerami... a tu nagle zderzyłem się ze ścianą. Mój kod był napisany na tyle niezrozumiale, że nawet ja - sam autor - musiałem po miesiącu w co niektórych miejscach przez dłuższą chwilę się zastanowić, o mi chodziło. "Ooo nie, tak to nie będzie" - opierniczyłem sam siebie. Z pomocą przyszła książka "Czysty kod". Kolejne 10 wieczorów poświęciłem na samo upraszczanie i oczyszczanie kodu na bazie tylko pierwszych rozdziałów. 

Po doprowadzeniu kodu aplikacji do względnego porządku dodałem planowane ficzery do wersji 1.1. Jest już ona najbliższa temu, co stworzył mój kolaborant pod iOS'em. Aplikacje pobrało jak dotąd 50 osób. Jeśli wierzyć na słowo grupie docelowej, nie odnaleziono jak dotąd poważnych błędów widocznych od strony użytkownika. 

Podsumowanie

Pierwsze dwa miesiące nauki Androida jak i kontynuacji nauki Javy pokazały, że trzeba mieć trochę pokory do tej tematyki. Rzucanie się na gotowe rozwiązania bez zrozumienia ich mechanizmów jest rozwiązaniem działającym tylko na krótką metę. Zgodnie z efektem Krugera-Dunninga moja pewność siebie zaliczyła spadek po pikowaniu na 100% i jest gdzieś w minimalnym punkcie na wykresie:

W dalszym ciągu mam wrażenie że mój kod ledwo ociera się o akceptowalny poziom, w dalszym ciągu odnajduje pola do uproszczeń. Nie od razu Rzym zbudowano. Po tym "okresie" próbnym nauki wiem jakich podstawowych błędów należy kategorycznie unikać oraz uczyć się programowania tak, aby nie zrobić sobie krzywdy przy dalszym rozwoju. Nauka nie poszła w las, aż by się chciało rzec. 

Dla zainteresowanych linki do omawianego projektu:

https://github.com/avrland/DogeTracker_Android

https://play.google.com/store/apps/details?id=kowoof.dogetracker

https://www.reddit.com/r/DogeTracker/