Jak nie pisać kodu…

…czyli update mojego projektu. Będzie trochę inaczej niż sobie zaplanowałem, ale dzięki temu wpis będzie przy okazji przestrogą dla innych programistów.

Jak wiecie z poprzednich postów, zajmuję się projektem, którego celem jest zbudowanie inteligentnej stacji pogodowej na bazie arduino. Ten wpis miał być tylko prostym update’em pokazującym, na jakim etapie są prace. Jednak okazało się, że jest to jedna wielka katastrofa.

Zaczynając od początku – logistyka. Części potrzebne do jej zbudowania były zamawiane w dwóch falach z Chin. Na początku wydawało się, że to, co zamówiliśmy starczy, jednak przed tym nie zastanowiliśmy się wystarczająco długo. Trzeba było zamówić te części raz jeszcze. Co najlepsze, data prezentacji projektu to 12 grudnia, my musimy za kilka dni dostarczyć w pełni działający prototyp, a części nadal dochodzą, choć na szczęście jedyna rzecz, która jeszcze nie zdążyla przyjść to dodatkowe kableki do płytek stykowych. Zawsze podczas wykonywania jakiegoś zadania w projektcie trzeba mieć jego plan, by się nie zagubić, tak jak moja ekipa.

Kolejnym problemem jest sama ekipa. Nie ukrywając, jakieś 75-80% pracy wykonuję ja. A jest nas czterech. Po prostu się z tym nie wyrabiam, dlatego między innymi nie było posta w piątek. Niestety, nikt nie kontroluje tego, ile robili oni, a ile ja. Pewnie i tak będą potraktowani jako pełnoprawni uczestnicy projektu, ale w sumie mnie to nie obchodzi.

Przechodząc do problemów czysto technicznych, nigdy nie bierzcie się za coś, w czym nigdy nie maczaliściście palców. Nawet, jeżeli wydaje się wam, że to proste. Ja nigdy nie napisałem niczego w C++, a wziąłem się za pisanie programu na Arduino. I owszem, w przeważającej części radziłem sobie doskonale, mając już doświadczenie z Javą i Pythonem. Ale ani Java, ani Python to nie C++. Byłem zbyt pewny siebie, pisząc kolejne elementy systemu. Pisząc kod, wybierałem najprostrze rozwiązania na moment pisania go, co okazało się zgubne właśnie teraz. Nie wiedziałem dokładnie, jak stosować pliki nagłówkowe, więc pisałem je, tak jakby były one tozsame z plikami klas w Javie. Nie domyslałem się nawet, że służą one tylko i wyłącznie do deklaracji zmiennych/klas/funkcji. W rezultacie wychodziły takie ptaszki, jakie możecie zobaczyć w repo projektu. W obecnym kodzie po prostu nie da się poruszać. Nic tam nie widać. Struktura kodu jest tragiczna. Oprócz tego, widać tam, że na początku starałem się nie używać obiektowości. Było to dla mnie po prostu zbyteczne. Teraz, gdy na to patrzę, powinienem pisać cały program od początku z myślą o obiektach. Robiłem tak, bo widziałem proste programy pisane na Arduino przez innych, które nie zawierały wsobie obiektowości. To daje radę, ale tylko w przypadku małych projektów. Jako, że moim głównym językiem jest Java, która jej wymaga,  jest to dla mnie nie do przyjęcia. Ja po prostu nie wierzę, ze napisalem ten kod. Dodanie jakiejkolwiek nowej funkcjonalności jest wręcz niemożliwe. Jedynym modułem, który jest napisany idealnie, jest Timer. Jest podzielony na plik .h z deklaracjami i plik .cpp z implementacjami. Jest klasą. Jako jedyny moduł, wygląda i działa bez zarzutu. Wstydzę się tego co napisalem, ale mimo wszystko napiszę ten program od nowa, tak jak powinienen wyglądać. Zrobię to jednak po tym, jak poznam dokładniej C++ oraz będę mieć na to czas.

Oprócz tego, zaważył także czas. Kurs, szkoła – to zajmowało tyle czasu, że na robienie projektu zostawało go bardzo niewiele. I tak oto z ambinego projektu, w którym miał zagościć dostęp do internetu oraz wykresy na wyświetlaczu została zwykła stacja pogodowa, jaką mozecie kupić za około 75 zł. Zresztą, nawet mając więcej czasu, dopisanie tych funkcjanlności jest niemożliwe ze względu na to, co siedzi w kodzie. A jedyną możliwością ich dopisania jest przepisanie całego kodu, bo refactoring tu już nie starcza.

I ostania rzecz: nigdy nie używajcie Arduino IDE do większych projektów. Jest bardzo niewygodne, nie ma tylu funkcji co profesjonalne IDE. Obsługa wielu plików w projekcie jest po prostu tragiczna, nie da się zamknąć żadnej zakładki bez usuwania pliku z nią skojarzonego. A ten projekt jest już na tyle duży (był by jeszcze większy, gdybym pisał poprawnie i rozdzielał moduły na pliki .h i .cpp) że zakładki nie mieszczą się na ekranie. Polecam tu 3 alternatywy, w zależności co lubicie bardziej: Stino dla Sublime Text, Visual Micro dla Visual Studio i plugin Arduino dla Eclipse. Jest też ciekawe IDE stand-alone, MariaMole. Jego nie testowałem, ale także wygląda na ciekawą alternatywę. W każdym bądź razie, wszytko to jest lepsze od Arduino IDE.

NIGDY nie bierzcie się za poważniejszy projekt w języku, którego dobrze nie znacie. Nie bierzcie ze mnie przykładu. Jedyną dobrą rzecz, jaką można wyciągnąć z tego kodu to antywzorzec pisania w C++. Jest to jeden wielki błąd. On nie powinien powstać w takiej postaci. Kod ten działa (prawie, muszę jeszcze dodać obsługę wilgotności), ale uruchamiacie i modyfikujecie go na swoje ryzyko. Ja za niego nie odpowiadam, bo czuję się jak bym go nie pisał.

  • Dobry artykuł.

  • Pingback: Arduino dla początkujących – Programowanie – Część 2. | Programistyczne piekło()

  • Igor

    Popatrzylem troche i twoj mozna zrefaktoryzowac. Nie trzeba go przepisywac. 🙂

    • Igor

      Masz tam nieco switchy, ktore mozna by opakowac chocby w fabryke abstrakcyjna. Jakies dziwne czesci kodu, ktorych nie chce mi sie rozumiec, mozesz opakowac w metody, ktore opiauja ten kod. Definy z funkcjami mozna opakowac w jakies klasy do obslugi tego i tego. Mozna pozmieniac nazwy klas i zrobic te pliki cpp.

  • Igor

    I ponazywac odpowiednio zmienne, bo one tez opisuja kod. xd