Co musisz umieć by zostać programistą embedded?
Język C
Musisz znać ten język na poziomie zaawansowanym. Jest najpopularniejszym językiem wykorzystywanym w projektach embedded i dobrą bazą do nauki C++. Język ma prostą składnie i możesz się go nauczyć szybko. Proponuję sięgnąć po książkę “Język ANSI C” autorstwa Dennisa Ritchie i Briana Kernighana, żeby opanować podstawy. Następnie trzeba połączyć wiedzę o języku z wiedzą o mikrokontrolerach. Musisz dokładnie wiedzieć jak konfigurować hardware (HW) przy jego użyciu oraz jak konkretne konstrukcje językowe wpływają na zużycie zasobów sprzętowych. Jako ciekawostkę dodam, że podczas mojej pierwszej pracy uważałem, że znam C bardzo dobrze. Architekt w naszym zespole zajmował się dodatkowo “szlifowaniem” świeżaków. Oj musiał się bardzo napocić, żeby nas naprostować. Dobrze to zjawisko przedstawia wykres opisujący efekt Dunninga-Krugera.
Po prostu początkująca osoba tworzy w głowie pewne przeświadczenie jak coś działa, a nie jak to wygląda w rzeczywistości. Potrzebny jest czas na zdobycie doświadczenia. Więcej informacji o językach programowania w embedded znajdziesz na moim blogu w tym artykule.
Podstawowa wiedza z elektroniki
Do takich podstawowych umiejętności elektronicznych zalicza się:
- umiejętność czytania schematów elektronicznych,
- używanie analizatora logicznego i oscyloskopu,
- używanie lutownicy i multimetru.
Najlepiej je zdobywać robiąc kursy i projekty. Jako taki punkt startowy polecam kurs elektroniki na FORBOT, a później wykonanie robota i zaprojektowanie płytki. Sam się w ten sposób uczyłem podstaw elektroniki i mikrokontrolerów. Jest przy tym wiele zabawy, można się bardzo rozwinąć i taki projekt dobrze wygląda w CV.
Budowanie oprogramowania
Ważna jest znajomość procesu budowania oprogramowania i narzędzi z tym związanych. Na początku warto się nauczyć szczegółowo procesu kompilacji i linkowania oprogramowania. Do tego warto wykorzystać ogólnodostępny gcc (gnu compiler collection) i wywoływać komendy z poziomu konsoli. Gdy usystematyzujmy sobie tę wiedzę, opłaca się sięgnąć po narzędzia związane z automatyzacją procesu kompilacji tj. Make (buildsystem), CMake (buildsystem generator). Polecam napisać samemu skrypty wykorzystujące te narzędzia, ponieważ ciężko jest zrozumieć ich właściwości nie brudząc sobie rąk.
Podstawy mikrokontrolerów
Lista pojęć z którymi powinieneś się zaznajomić:
- ADC, DAC - czym są te konwertery sygnałów, zaznajomić się z procesem zamiany sygnału, jego dokładności oraz spróbować od strony praktycznej wykorzystać ADC podczas odczytu pomiarów z jakiś czujników np. temperatury, odległości,
- Timery, Countery - czym są, do czego służą,
- PWM - praktyczna znajomość PWM np. do wysterowania silnikiem DC lub jasnością diody LED,
- DMA (direct memory access) - kiedy i jak korzystamy z modułu DMA,
- Watchdog - jak wykorzystuje się watchdog do sprawdzenia poprawności działania oprogramowania, co robimy po wykryciu błędu,
- I2C, SPI, UART - znajomość podstawowych sposobów komunikacji w mikrokontrolerze od strony praktycznej,
- Przerwania - co się dzieje z wykonywanym kodem podczas przerwania, jak się wykorzystuje przerwania, czym jest IPL (interrupt priority level),
- ISA (Instruction Set Architecture) - wiedzieć czym jest jak się łączy model z CPU. Skupić się na poznaniu dwóch architektur CISC oraz RISC i rożnic pomiędzy nimi,
- Architektura Harvard/Von Neumann - czym się charakteryzują i różnią.
System kontroli wersji
System ten umożliwia śledzenie zmian w kodzie oraz ułatwia współpracę wielu programistom pracującym nad jednym projektem. Obecnie najczęściej wykorzystywanym systemem jest GIT. Najlepiej jest się nauczyć gita na swoim projekcie z wykorzystaniem zdalnego repozytorium na GitHubie. Dzięki temu nauczysz się podstaw oraz będziesz mógł łatwo pokazać pracodawcy, co potrafisz.
Podstawy inżynierii oprogramowania
Warto zapoznać się także z cyklem życia oprogramowania. Po pierwsze, dlatego że pytania z tego zakresu padają na rozmowach rekrutacyjnych, a po drugie wiedza ta pomaga później w ułożeniu sobie w głowie co się właściwie dzieje w projekcie i dlaczego. Dodatkowo polecam przejrzeć czym są metodologie zarządzania agile i konkretnie SCRUM, ponieważ jest on obecnie najczęściej wykorzystywany przy projektach IT.
Dobre umiejętności komunikacyjne
Przy projektach musimy umieć pracować w zespole, ponieważ sukces osiąga się współpracą. Musimy jasno i precyzyjnie się wyrażać, nie tylko ustnie, lecz także pisemnie. Zawsze przedstawiamy fakty, ponieważ jesteśmy inżynierami, a nie ludźmi od biznesu. Mówię to z doświadczenia, ponieważ inne osoby na podstawie naszych informacji podejmują decyzję. Ta cecha jest również ważna podczas rozmowy kwalifikacyjnej, ponieważ wciskanie bullshitu przekreśla nas natychmiast, a powiedzenie, że się czegoś nie wie jest przyjęte normalnie. Na koniec umiejętności negocjacyjne do uzgodnienia satysfakcjonującej pensji :)
Język angielski
Język angielski musimy znać na poziomie B1/B2. Dokumentacja techniczna, oprogramowanie, współpraca z zagranicznymi firmami opiera się właśnie o ten język, stąd takie wymagania w pracy. Słownictwo możemy zdobywać czytając tutoriale techniczne w języku angielskim lub filmy instruktażowe o mikrokontrolerach z angielskimi napisami. Jeśli nie czujesz się pewnie, polecam także przed rozmowami rekrutacyjnymi pójść na kilka korepetycji językowych i skupić się na mówieniu o sobie, Twoich projektach i zainteresowaniach, bo w ten sposób jest weryfikowana Twoja znajomość tego języka. To nie jest tak, że musisz być wyjadaczem zanim rozpoczniesz pracę, rozwiniesz go w jej trakcie, jak będziesz z niego korzystać, ale coś trzeba jednak umieć na starcie.