Od początku mojej kariery minęło już trochę czasu (dokładnie 4 lata :p), co pozwoliło mi nauczyć się wielu nowych rzeczy i ugruntować te, które już znałem. Również pozwoliło zmienić kilkukrotnie podejście do programowania, jak i stosunek do pewnych praktyk, które opisuje poniżej. Z każdym rokiem jak czytam poprzedni wpis z tej kolekcji, śmieje się, a jednoczenie cieszę jak mało wiedziałem w poprzednim roku a jak wiele się nauczyłem :). Cele z poprzednich lat często się zmieniają i trzeba z nich zrezygnować albo je odłożyć w czasie. To chyba pierwsze podsumowanie gdzie je wszystkie udało mi się zrealizować i z takim progresem, że jestem z tego dumny 😀
W odniesieniu do celów z poprzedniego roku:
Z racji, że DDD wykorzystuje na co dzień to, co chwila, ulepszam swój system pojęć oraz procesów wytwarzania oprogramowania (kodowania ;p). Adaptując jakieś wymaganie biznesowe (bo głównie takie aplikacje piszę w pracy) podchodzę do tego w sposób bardziej abstrakcyjny niż w poprzednich latach. Świadomie sięgam po wzorce projektowe, których znam już coraz więcej (…, fasadę, dekoratora, itd). Schemat klas sam mi się już układa w głowie i nie plończę tego z magazynami danych jak kiedyś. Fajne w tym jest, że są to rzeczy niezależne od technologii więc czy koduje cos w PHP, czy w NodeJS, czy jeszcze w innym języku to myślę podobnie.
MQTT i RabitMQ wykorzystywałem już nie raz, ale nie miałem jeszcze okazji samemu pobawić się w stawianie brokerów i całej infrastruktury z tym związanej, oraz adaptować to od zera w złożonych aplikacjach (tylko prostych). Pomimo tego i tak, dość daleko zaszedłem w tym kierunku i wiem co się, z czym je, a to na razie najważniejsze, bo na praktyczne zastosowanie w moich projektach (Smarthome) niedaleka droga.
Z dokerem jest śmiesznie, bo o ile miałem się poddać, bo rzucał mi sporo kłód pod nogi, szczególnie w zaawansowanych projektach (kiedy konfigurowałem go sam od zera) to postanowiłem kupić książkę, która bardzo dużo mi uzmysłowiła i poukładała wcześniej zdobytą wiedzę. Teraz konfigurowanie projektu na Dokerze, środowiska developerskiego z użyciem docker-compose, oraz budowanie deploy’ów opartych o Dockera (pull, run) jest chlebem powszednim. Zrozumiałem, jak działa plik Dockerfile, jak można go podzielić na sekcje. Poznałem czym są sieci dokera oraz volumeny i jak działa to pod spodem. Dla zbudowanych obrazów wykorzystuje registry, skąd mogę pobierać je i uruchamiać na dowolnym serwerze.
Projekt inteligentnego domu wreszcie ruszył pełną parą. Zacząłem od przygotowania kilku czujników jak: bathroom-hygrostat oraz energy-meter po to, aby móc skonfigurować infrastrukturę, oraz napisać aplikacje frontend i backend. Dashboard na którym wyświetlam wszystkie informacje dot. czujników, wykresy itp. napisany jest w React, niestety (albo stety) bez Typescript, gdyż za dużo czasu wymaga pisanie aplikacji frontendowych z użyciem jego. Testów i tak nie planuje pisać do frontendu. Backend natomiast jest rozłożony na mikroserwisy. Póki co są dwa, jeden główny (taki apigateway), przez niego się komunikuje frontend, oraz drugi do zbierania danych z czujników i magazynujący je w bazie danych.
Aby, móc w pełni zarządzać architekturą inteligentnego domu kupiłem sobie serwer VPS, na którym uruchamiam obrazy Dockera z poszczególnymi aplikacjami. W tym roku planuje pójść jeszcze dalej w tym kierunku i chciałbym mieć już pierwszą wersję smarthome gotową, tak aby jej rozwój był względnie prosty :).
Co nowego weszło mi do głowy?
Dzięki IoT i kupieniu własnego VPS mój poziom zaznajomienie z terminalem urósł diametralnie. Operowanie na plikach, zarządzanie procesami, konfigurowanie różnych aplikacji terminalowych jest już chlebem powszednim. Programuje w 100% na Linux’ie wiec pierwszą rzecz, jaką uruchamiam po włączeniu komputera jest właśnie terminal :D. Coraz więcej rzeczy zamiast „wyklikiwać” wykonuje właśnie przez niego.
Podszkoliłem się również solidnie w NodeJS. Na końcu poprzedniego roku i początku aktualnego, wraz z dwoma kolegami wystartowaliśmy w konkursie, w którym musieliśmy napisać aplikacje crawlującą internet pod względem przekazanych parametrów: tagów, obrazków, zakresu IP. Główna część aplikacji została napisana w NodeJS z użyciem frameworka NestJS. Całość powstała w TypeScript z wykorzystaniem DDD oraz pisaniem testów jednostkowych, oraz integracyjnych. Co ciekawe aplikacja działa jako natywna i oparta jest o framework Electrona, aby moc zostać uruchomiona na komputerze. Projekt bardzo rozwojowy i wiele mnie nauczył 🙂
Będąc jeszcze w świcie IoT to na pewno sporo się nauczyłem dzięki mikrokontrolerom ESP. Pozwoliły tworzyć one mini serwery WWW. Wykorzystałem do tego narzędzie PlatformIO, które pozwala w bardzo łatwy sposób tworzyć oprogramowanie na różne rodzaje mikrokontrolerów z wykorzystaniem biblioteki Ardiuno, która ułatwia prace. Na moim Gitlabie jest dostępne kilka przykładów działających czujników.
Bardzo spodobało mi się podejście gitlab’owe do CI/CD oraz to, że oferuje ono registry gdzie można trzymać zbudowane obrazu docker’owe. Nauczyłem się budować pliki gitlab-ci oraz konfigurować runnery na własnym serwerze. Ułatwiło mi to dużo pracy związanej z budowaniem aplikacji oraz jej późniejszym deploy’em na serwer.
Plany na kolejny rok:
- Na pewno parcie w IoT i rozbudowywanie infrastruktury inteligentnego domu, jest to mój główny cel, który łączy oraz otwiera wiele nowych dróg.
- Może znalazłoby się trochę czasu na Pythona, ML oraz AI. Mam kilka ciekawych pomysłów na wykorzystanie tego w praktyce, więc jak znajdzie się wolna chwila to z chęcią do tego przysiądę.
- Asynchroniczna komunikacja między serwisami jak MQTT oraz RabbitMQ. Postawienie brokera na własnym serwerze oraz samodzielne skonfigurowanie całej infrastruktury z tym związanej.