Podsumowanie 3 lat doświadczenia na stanowisku programisty

Posted by

W odniesieniu do celów z poprzedniego roku:

Priorytety zmieniają się tak szybko, jak powstają nowe frameworki w JS, aby iść dalej i się rozwijać niestety trzeba pewne rzeczy porzucić. Tak też stało się z apką Rest’ową, którą planuje od dwóch lat napisać. Stwierdziłem, że na razie nie ma sensu do niej zasiadać, gdyż nie uda mi się poświęcić wystarczająco czasu na nią. Również tempo mojego rozwoju jest na tyle dynamiczne, że co bym zasiadł do niej to za kilka miesięcy mój punk widzenia by się zmienił na tyle, że pewnie zacząłbym ją przepisywać (i tak w kółko). Dla jasności – nie rezygnuję z niej, tylko odkładam na przyszłość, gdyż teraz prawie każdą wolną chwilę dot. programowania poświęcam na IoT. Za kilka lat, kiedy moje doświadczenie będzie na tyle duże, że napisanie takiej aplikacji zajmie mi dwa razy mniej czas niż teraz to do niej przysiądę. Teraz IMO szkoda na nią czasu.

Jako punkt drugi na liście celów wymieniłem takie pojęcia jak Docker, SSH oraz openvpn. Co do pierwszego tematu, to w pracy ingerowałem w konfiguracje Dockera, na próbę tworzyłem prywatny obraz oparty o NodeJS, umiem posługiwać się podstawowymi komendami dot. Dockera, więc myślę, że na tę chwile jest git. W przyszłości na pewno postawie swój pierwszy kontener, na którym będę pracował. SSH stało się już dla mnie oczywistością, takie rzeczy jak generowanie nowych kluczy, posługiwanie się nimi, nie stanowi dla mnie żadnego problemu. Napisałem na ten temat nawet dwa wpisy: autoryzacja SSH, generowanie kluczy SSH. Co do openvpn, to korzystam z niego na co dzień w pracy, lecz nie udało mi się skomunikować z własnym serwerem przez vpn. Raczej nie planuje realizować dalszych celów związanymi z tymi pojęciami, gdyż sporo już rozumiem, a reszta wiedzy przyjdzie sama, bo wykorzystuje te narzędzia na co dzień.

Systemu Linux używam już przez większość mojego czasu, a do programowania praktycznie zawsze, tylko uC (czyste Atmegi) programuje jeszcze z poziomu Windowsa. Cel został jak najbardziej osiągnięty. Szczególnie podoba mi się to, że na Raspberry Pi, software jest oparty własnie o Linuxa, co jeszcze bardziej przybliża mnie do zagłębienia się w ten system. Do komunikacji z serwerami, Pi wykorzystuję już praktycznie tylko CLI, więc chyba weszło mi to w krew. Także cele 3 i 4 jak najbardziej uznaje za zrealizowane 🙂

Kilka miesięcy temu ruszyłem w końcu temat IoT i Raspberry Pi, z czego jestem bardzo szczęśliwy. Przerobiłem ponad połowę książki o Internecie Rzeczy, na której postawie tworze swoją mapę myśli. Dzięki tej książce poznałem wiele rodzajów komunikacji bezprzewodowej takich jak: ZigBee, Bluetooth, LoRa itp. Model OSI bardziej mi się rozjaśnił oraz poznałem wiele problemów nakreślających się w dziedzinie IoT. Napisałem pierwszą aplikację na Raspberry Pi w TypeScript’cie, która pobiera dane z czujników i wysyła asynchronicznie przez kolejkę MQTT na chmurę, gdzie te dane są pobierane przez klienta za pomocą WebSocket’ów. Dowiedziałem czym, różni się IoT od WoT, oraz jak ważna jest warstwa aplikacji w tym świecie, dla utrzymania ładu i zgodności.

Cel związany z Reactem (Redux) przyszedł sam w mojej obecnej pracy, gdyż wykorzystujemy tam takie technologie. Dodatkowo cały kod Reacta jest w Typescripcie z podpiętym TSLintem, co podnosi poziom złożoności projektu. Do operacji na store wykorzystujemy Sagę. Poznałem dzięki temu wiele nowych rozwiązań jak generatory, funkcje bezstanowe.

ML i AI niestety mnie ominęły, nie miałem czasu za nie się zabrać, gdyż większość uwagi poświęciłem na IoT. Puki co te tematy odkładam na przyszłość, gdyż teraz nawet nie mam takiej potrzeby zagłębiać się w tą dziedzinę, a czas jest ograniczony. Kiedy uzbieram wystarczająco dożo danych z czujników i będę potrzebował je przeanalizować to będzie dobry moment na wdrożenie się w te dziedziny.

Temat własnej chmury ominął mnie jak powyższy, brak czasu i motywacji odwlekł to w czasie i na razie ratuję się wykupionym hostingiem. Z racji rozwoju i zapotrzebowania własnoręcznej konfiguracji serwera, myślę, że do następnego podsumowania powinienem dać rade ogarnąć jakąś chmurę na moje projekty. Cel nadal aktualny 🙂

Co nowego się nauczyłem?

Wreszcie uzmysłowiłem sobie, że baz danych się nie projektuje, a na pewno nie zaczyna się od tego projektu. Baza danych to tylko magazyn dla sparsowany obiektów. Aplikacje powinniśmy tworzyć z pomocą diagramu klas. Idąc dalej tym tematem, ruszyłem trochę naukę tworzenia takich diagramów, co naprawo prędzej czy później wykorzystam. Zrozumiałem jak działają User Story na tle tworzenia aplikacji oraz jak działają metodologie Scrum i Kanban. Poznałem takie ciekawe rzeczy jak EventStorming oraz duże niuansów związanych z projektowaniem, planowaniem i zarządzaniem aplikacjami.

W jednej prostej aplikacji na PWR użyłem jako magazynu danych MongoDB. Bardzo ciekawe podejście do baz danych, aby zapisywać je jako obiekty w formacie JSON. IMO w świecie obiektowym, jest to bardzo dobre posunięcie. Nie trzeba tworzyć całej abstrakcji parsowania obiektów na tabele w MySQL. Co do zapisywania danych, świetnym narzędziem okazał sie Redis. Jest to rodzaj bazy danych klucz-wartość z ustawionym TTL (czasem wygaśnięcia). W pracy często wykorzystujemy go jako np. cache.

Dzięki obecnej pracy poznałem i nauczyłem się dużo rzeczy związanych z mikroserwisami. Ich architekturę, sposób komunikacji, proces budowania i wydawania aplikacji (CI/CD). Nie będę się tutaj rozpisywał jakie zalety i wady ma taka architektura, ale powiem jakie narzędzia i rozwiązania poznałem programując w niej. CI/CD oparte o Jenkinsa oraz GitLab’a. RabbitMQ do komunikacji asynchronicznej pomiędzy aplikacjami. Obraz Dockera jako artefakt w całym tym procesie. Również przeczytałem całą książkę poświęconą temu tematowi oraz sporządziłem mapy myśli.

DDD stało się dla mnie czymś oczywistym co wykorzystuje na co dzień. Oczywiście nie poznałem dogłębnie tego tematu i na pewno nie znam jeszcze wszystkich „building blocks”, ale odnajduje się w tej strukturze i podoba mi się to podejście do projektowania aplikacji webowych, gdzie poznanie Domeny jest bardzo ważne. Co za tym idzie DDD wspiera dobre praktyki jak wzorce projektowe oraz trzyma się zasad SOLID co mi się bardzo podoba. W końcu coraz bardziej rozumiem czym jest SOLID i potrafię świadomie trzymać się tych zasad. Co do wzorców projektowych, to poznałem ich całkiem sporo. Kiedy rok wcześniej znałem dobrze tylko buildera, to teraz już znam: obserwatora, fabrykę, metodę wytwórczą, singleton, dekoratora, strategie, adapter i cały czas poznaję nowe.

Cele na kolejny rok:

  1. Poznanie głębiej świata DDD, TDD oraz nauczenie się i świadome wykorzystywanie wzorców projektowych.
  2. Lepsze zrozumienie jak działają kolejki (MQTT oraz RabbitMQ) oraz zacząć ich używać w swoich projektach
  3. Zacząć dokeryzowac swoje projekty, szczególnie te dla RaspberryPi, aby uniknąć konfliktów związanych z innymi środowiskami.
  4. Oczywiście cały czas mam w głowie projekt inteligentnego domu, wiec muszę dogłębniej poznać świat IoT, oraz problemy z nim związane.
  5. Nauczyć się używać UML’a i zmienić trochę podejście do programowania, tzn. najpierw wymyślić (wyobrazić sobie) pomysł i zapisać go na kartę w postaci diagramu klas. Następnie dopiero zacząć programować.

print

One comment

Leave a Reply

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *