W tym artykule opiszę moje zmagania z zadaniem programistycznym, które miałem wykonać.

Wstęp

W tym momencie samo zadanie nie jest istotne. Chodzi o przedstawienie etapów, problemów, z którymi musiałem się zmierzyć, które moim zdaniem są wspólne dla większości problemów programistycznych.

Moje zadanie programistyczne

Musiałem stworzyć aplikację na Android (w języku Java), która będzie miała tylko jeden ekran (GUI) podzielony na dwie sekcje (fragmenty).

Moje etapy zmagania się z zadaniem

Poniższa lista jest moją próbą przedstawienia i usystematyzowania etapów zmagania się z dowolnym zadaniem programistycznym.

  1. Brak planowania i podziału zadania – nawet najmniejsze zadanie należy zaplanować i podzielić na mniejsze elementy.
  2. Niedoszacowanie złożoności zadania – niewiedza, bagatelizowanie zadania.
  3. Składanie zadania z mniejszych elementów w jedną całość – użycie dwóch różnych bibliotek, metod implementacji framework’a.
  4. Niezgłębienie wiedzy teoretycznej danej biblioteki, framework’a – korzystając z nowych bibliotek, framework’ów należy przynajmniej przeczytać oficjalną dokumentację wybranego zagadnienia.
  5. Ograniczenia w dokumentacji i tutorial’ach – oficjalna dokumentacja i tutorial’e opisują i przedstawiają jedynie wyizolowane, idealne rozwiązania.
  6. Proof Of Concept, PoC, izolowanie problemu – jeżeli, to możliwe tworzymy mniejsze, oddzielne projekty, w których sprawdzamy działanie jednego elementu.
  7. Wprowadzanie pojedynczych zmian – zmiany w kodzie robimy w jednej linijce, testujemy i dopiero wtedy wprowadzamy kolejną zmianę; najlepiej użyć TDD – Test Driven Development.
  8. Niesprawdzenie wymagań dla aplikacji – bardzo często jest tak, że programista wie jak rozwiązać dane zadanie, ale nie upewni się jak ma wyglądać całość projektu i wtedy musi „zaczynać wszystko od nowa”, a wystarczyło zapytać „co dokładnie ma robić aplikacja jako całość”.
  9. Czasem trzeba zacząć od początku i nie brnąć dalej.
  10. Poboczne zadania niezwiązane z programowaniem – nieraz trzeba będzie coś skonfigurować np. serwer, uzyskać dostęp do czegoś np. klucz do API.
  11. Efekt końcowy nie cieszy tak bardzo jak sama droga w trakcie rozwiązywania problemu – jeżeli masz takie podejście, to programowanie jest dla Ciebie.

Przykład zadania, z którym się zmagałem – 7 dni

Pierwszego dnia sprawdziłem, że szkielet aplikacji można wygenerować z kreatora do tworzenia projektów w Android Studio (wersja IntelliJ dla Android). Jest również wiele tutorial’i na ten temat w internecie. Pomyślałem skoro coś można wygenerować z kreatora, to na pewno nie będzie to trudne zadanie, zabiorę się za to jutro. Punkt 1. – Etapy zmagania się z zadaniem.

Drugiego dnia, po wygenerowaniu projektu wszystko działało, wyświetlał się tekst i przycisk reagował na kliknięcie. Ogłosiłem wielki sukces i resztę zadania odłożyłem na następny dzień. Punkt 2. – Etapy zmagania się z zadaniem.

Trzeciego dnia zabrałem się za dzielenie ekranu na sekcje, fragmenty. Okazało się, że i to również można wygenerować za pomocą kreatora i jest wiele tutoriali na ten temat w internecie. Wygenerowałem kolejny projekt, który korzysta z fragmentów. W tym momencie miałem dwa oddzielne projektu zawierające dwie różne metody, dwa różne sposoby korzystania z framework’a Android. Fragmenty również działały poprawnie. Kolejny sukces, zadanie dokończę następnego dnia.

Czwartego dnia przyszedł czas na połączenie dwóch projektów w jedną całość. Przecież na pewno się da, to zrobić, bo widziałem gdzieś w internecie, że tak można. Stworzyłem trzeci projekt, który będzie zawierał pierwszy projekt z szablonem aplikacji oraz drugi projekt z fragmentami. Niestety tego już nie było w oficjalnej dokumentacji, tutoriale również milczały w tej kwestii. Musiałem samemu metodą prób i błędów połączyć wszystkie projekty w całość. Po dłuższych zmaganiach udało się to osiągnąć. Punkt 3. – Etapy zmagania się z zadaniem.

Dlaczego od razu nie dodałem fragmentów do szablonu projektu, tylko stworzyłem trzeci projekt? Zawsze, jeżeli, to możliwe tworzymy tzw. PoC – Proof Of Concept, weryfikujemy czy dana funkcjonalność działa tak jak chcemy. Następnie łączymy mniejsze PoC w jedną całość, tego w większości przypadków nie będzie w oficjalnej dokumentacji lub w tutorial’ach, tutaj należy wykazać się logicznym myśleniem. Punkt 6. – Etapy zmagania się z zadaniem.

Piątego dnia do tworzonej aplikacji „przyszło” nowe wymaganie, o którym wcześniej nic nie wiedziałem – należy wyświetlić dane na mapach Google. Oczywiście jest kreator i są tutoriale, zabrałem się za tworzenie czwartego projektu. Dla map Google należało jeszcze wykonać kilka czynności nie związanych z programowaniem, a mianowicie stworzyć klucz do API dla map Google. Punkt 8 i 10. – Etapy zmagania się z zadaniem.

Teraz miałem cztery aplikacje – projekty PoC:
– pierwszy, szablon aplikacji dla Android,
– drugi, fragmenty w ekranach GUI,
– trzeci, połączenie projektu pierwszego i drugiego,
– czwarty, aplikacja z podłączonymi mapami Google.

Szóstego dnia okazało się, że bezproblemowo da się połączyć projekt „czwarty” z „drugim”, ale już nie da się połączyć „trzeciego” z „czwartym”. Tak więc, łączenie projektów zaczęło się od nowa. Stworzyłem nowy projekt „pierwszy”, naniosłem na niego projekt „czwarty”, a następnie dodałem projekt „drugi”. Tak, tak, inaczej się nie dało. Zapytasz pewnie, ale jak, to? W oficjalnej dokumentacji nie było takiej konfiguracji, a tutorial’e skupiały się na pojedynczych wyizolowanych zagadnieniach, np. fragmenty w ekranach GUI, mapy Google w Android. Przez chwilę próbowałem połączyć projekt „trzeci” i „czwarty”, ale lepiej było zacząć od początku i tak też zrobiłem. Punkt 4, 5 i 9. – Etapy zmagania się z zadaniem.

Siódmego dnia tłumaczyłem osobie odbierającej aplikację dlaczego aplikacja nie wygląda i nie działa tak jak się tego spodziewał 😉

Podsumowanie

Samego kodu Java było niewiele, większość czasu spędziłem na zapoznawaniu się z nowym framework’iem, w tym przypadku Android framework, ale może, to być np. Spring Framework, Hibernate itp.

Oczekiwania vs rzeczywistość

Różne osoby w odmienny sposób postrzegają zamawiane oprogramowanie, należy o tym cały czas pamiętać – poniższy obrazek idealnie, to oddaje.

Tworzenie oprogramowania, aplikacji - oczekiwania vs. rzeczywistość :)
Tworzenie oprogramowania, aplikacji – oczekiwania vs. rzeczywistosc 🙂

Wnioski

Jak wynika z powyższego realizacja „małego” projektu zajęła mi sześć dni. Zalecam nie siedzenie po nocach i zakładania, że da się, to zrobić „w jeden dzień”. Lepiej podejść do tematu zdroworozsądkowo i założyć więcej niż jeden dzień na realizację danego zdania. Dodam jeszcze, że opisuję sytuację, w której tylko ja samemu pracowałem nad danym zadaniem. Sytuacja się komplikuje, jeżeli zdanie ma wykonać zespół programistów.

Dodatkowym elementem, którego nie spodziewałem się było samo wyszukiwanie rozwiązań w wyszukiwarce. Szukając hasła „Android Google Maps” otrzymywałem linki do aplikacji na Android z mapami Google, podobnie było z innymi słowami kluczowymi. Okazało się, że należy dodać słowo „developer” w zapytaniu dla wyszukiwarki np. zamiast „Android Google Maps” należało wyszukać „Android developer Google Maps”.