Co musisz umieć do pierwszej pracy w embedded?

Pytania o wymagania na pozycję junior developera są bardzo popularne. Dotyczą one zwykle frontendu, Javy, czy C# i w internecie można znaleźć na ten temat już całkiem sporo, o embedded natomiast takich informacji brakuje. Są osoby, które traktują systemy embedded jako hobby – lubią sobie dłubać przy Arduino, czy Raspberry Pi, ale pracy szukają w prawdziwym programowaniu. Jednak jeżeli sprawia Ci to przyjemność, dlaczego nie zamienić hobby w stałą pracę? W tym wpisie przedstawie jakie musisz spełnić wymagania, żeby zdobyć pierwszą pracę w systemach embedded.

Dlaczego embedded?

Potrzeba coraz więcej programistów i systemy embedded nie różnią się tutaj od reszty branży. W Polsce nieustannie rośnie ilość firm robiących projekty embedded, a rąk do pracy nieustannie brakuje. Oczywiście najbardziej brakuje specjalistów, ale oni też musieli gdzieś zaczynać. Jak to ktoś kiedyś powiedział (nie pamiętam czyje to słowa) – Zatrudniamy tylko seniorów, ale niektórych jeszcze zanim awansują.

Podstawowy warsztat, a także pożądane cechy charakteru nie różnią się zbytnio od innych gałęzi programowania. Dlatego wybierając branżę embedded nie zamykasz sobie żadnych drzwi. Tak samo piszesz kod, debugujesz, testujesz, pracujesz w zespole, estymujesz zadania itp. Oczywiście na poziomie szczegółów są znaczące różnice, ale jak zechcesz później zmienić ścieżkę, zobaczysz, że to takie samo programowanie, a dodatkowa wiedza o niskopoziomowych niuansach może się nawet okazać atutem.

Zestaw potrzebnych umiejętności

Termin systemy embedded jest dosyć pojemny. Poza programowaniem mikrokontrolerów zawiera również choćby systemy oparte na Linuxie, czy FPGA. Jednak ja się skupię na mikrokontrolerach. Zestaw umiejętności potrzebnych do pierwszej pracy w systemach embedded to dla mnie:

  • znajomość składni języka C – szczególnie wskaźniki, volatile, wskaźniki na funkcje. Innymi językami nie ma co sobie na początku zaprzątać głowy.
  • wiedza o działaniu programów – co to jest stos, heap, przerwania, rejestry.
  • Znajomość dowolnej rodziny mikrokontrolerów – co to RAM, FLASH, CPU, DMA itp. Do tego obsługa podstawowych peryferiów (GPIO, UART, SPI, I2C, ADC, Timery).
  • Podstawy RTOSów – mutexy, semafory, kolejki, taski, priorytety, deadlocki.
  • Obsługa narzędzi – miernika, oscyloskopu, analizatora, zasilacza (wystarczy po jednym filmiku na YT z obsługi każdego).
  • Podstawy elektroniki – pull-up/down, open drain, wpływ zakłóceń, sterowanie silnikami DC, czytanie schematów.
  • Podstawowa znajomość gita – push, pull, commit, merge, rebase.
  • Język angielski.

Zrobienie 2-3 większych projektów na studiach albo hobbystycznie powinno wystarczyć do nabycia całej tej wiedzy. Ja polecam na projekt roboty – na przykład Line Follower. Chociaż inne projekty jak na przykład własny system inteligentnego budynku nadają się równie dobrze. Po takim przygotowaniu będziecie wystarczająco samodzielni, żeby coś wnieść do projektu, będziecie rozumieć otrzymywane zadania i będziecie potrafili zadać pytania jeżeli czegoś nie wiecie. Na początek to już dużo. A zebrana w ten sposób wiedza to dobra baza do dalszej nauki.

Później tą bazę można rozszerzać o C++, Asemblera, Makefile i ogólnie buildowanie, dobre praktyki, clean code, wzorce projektowe, testowanie, debugowanie i ogromną ilość innych aspektów. To one odróżniają juniora od doświadczonego programisty i wiedza o nich naturalnie przychodzi z czasem w miarę rozwiązywania codziennych zadań.

Przykładowe pytania na rozmowę

Rozmowa rekrutacyjna powinna sprawdzać wymienione wyżej umiejętności. Nie może więc na niej zabraknąć pytań z C. Musisz być w stanie napisać prosty program na tablicy albo na kartce np. FizzBuzz, printowanie stringa od tyłu albo printowanie ASCII artów. Celem takiego zadania jest upewnienie się, że potrafisz się posługiwać ifami, pętlami i zmiennymi.

Dalej pora na trudniejsze pytania sprawdzające wiedzę o wskaźnikach, stosie, czy przerwaniach. Na przykład:

uint32_t *ptr1 = 0x4000;
uint8_t *ptr2 = ptr1;
ptr1++;
ptr2++;

Jakie adresy wskazują ptr1 i ptr2? Istnieją również pytania, które można zadać każdemu i w zależności od doświadczenia spodziewać się innych odpowiedzi, albo prowadzić dalszą dyskusję na inne tory. Dobry przykład został opisany na Embedded Artistry.

Pytania powinny dotyczyć problemów możliwych do natrafienia w pracy. Pytania o kruczki są bez sensu. W końcu nie rekrutujemy do Obfuscated Code Contest

Obowiązkowe jest również pytanie o najciekawsze projekty kandydata, gdzie może on trochę opowiedzieć o rozwiązywaniu typowych problemów i wadach oraz zaletach zastosowanych rozwiązań technicznych. Przy okazji możemy od razu zobaczyć, czy mówi z zaangażowaniem i go to interesuje.

Podsumowanie

Jak widać, wykonanie kilku projektów powinno zapewnić wystarczające umiejętności, aby znaleźć pierwszą pracę w embedded. W przyszłości może to się zmienić – w końcu rynek jest dużo mniejszy niż w innych dziedzinach programowania. Jednak jeżeli ktoś ta ścieżka interesuje i jest dobry – zawsze da sobie radę.

Trafiając do pierwszej pracy nie musisz wiedzieć wszystkiego. Powinieneś zwracać uwagę na odpowiednie środowisko do podnoszenia umiejętności – mieć kontakt z doświadczonymi inżynierami chętnymi do dzielenia się wiedzą, projekt, w którym przestrzegane są dobre praktyki i firma, która inwestuje w rozwój pracowników.

11 Comments

  1. Bardzo ciekawy artykuł, pozdrawiam

  2. Jak właściwie wygląda taka praca ? dostajemy schemat analogowy i działamy? programista ma wpływ na połączenia analogowe?Jest człowiek od algorytmów ? czy programista sam sobie kombinuje w jaki sposób dany problem rozwiąże ?Sterowanie zewnętrznymi komponentami np. ADC,pamięć, wyświetlacze itp. też na naszej głowie oczywiście ? sam programista oczywiście nie może sobie dobrać lekkiego w programowaniu komponentu ? 🙂 tylko użerać się z mało przyjaznymi notami katalogowymi ?:)

    • GAndaLF

      2 kwietnia 2019 at 23:57

      To jak wygląda praca zależy mocno od firmy/projektu w którym wylądujesz. Zwykle schemat, pcb i wybór elementów robi ktoś inny, ale jako programista mamy na to wpływ. Bierzemy udział w dyskusjach projektowych, dostajemy do sprawdzenia wyprowadzone piny i zastosowane układy.

      Jeżeli chodzi o człowieka od algorytmów, to zwykle sami decydujemy o implementacji wewnętrznej modułu, z góry mamy narzucone tylko ograniczenia architektury.

      Co rozumiesz przez dobranie lekkiego w programowaniu komponentu? Każdy układ ma noty katalogowe i jak nabierzesz trochę wprawy to nie są one aż takie straszne (mówię tu o głównych producentach, bo mniejsi czasem mają tragiczne).

  3. Świetny, rzetelny, merytoryczny artykuł. Wszystko co trzeba zawarte w pigułce. Czyta się niezwykle lekko i płynie. Gratulacje dla autora, czekam na więcej.

  4. Świetny artykuł! Dopiero trafiłem na ten blog i napewno zostanę na dłużej! Czekam na więcej z embedded.

  5. Nie zgodzę się z tym, że wystarczą dwa projekty na studiach, aby poznać branżę na tyle, by dostać pracę. Chyba, że mówimy o pracy za 2500 brutto, czyli mniej niż w Biedronce na kasie.

    • GAndaLF

      1 lutego 2020 at 23:37

      A co złego jest w pierwszej pracy za 2500 brutto? Sam pierwsze dwie prace w zawodzie miałem właśnie za podobne stawki, ale po roku kolejną już za 2x więcej. Idea jest taka, żeby nauczyć się solidnych podstaw i zyskać wystarczające doświadczenie, żeby dostać się gdzieś do pracy. Tak naprawdę pierwsza praca nie jest zwieńczeniem twoich starań tylko kontynuacją nauki, z tym że już nie za darmo i w otoczeniu ludzi, którzy mogą Ci pomóc.

      Pensja w pierwszej pracy naprawdę nie jest aż tak ważna, bo Twoje aspiracje i tak powinny być dużo wyższe. Po roku czy dwóch jak się rozwiniesz, będziesz i tak zarabiać 2-3x więcej, a potem masz dalej otwartą ścieżkę do rozwoju. A z drugiej strony możesz za wyższą pensję utknąć gdzieś, gdzie się nie rozwijasz i długoterminowo wyjdziesz na tym dużo gorzej.

  6. Hmm, embedded to nie prawdziwe programowanie?
    Programiści backend’u w Python czy frontend’u w JS to są niby bardziej prawdziwi?

    Kiedyś było tylko takie programowanie- niskopoziomowe: Zilog, jednoukładowce i asembler, czasami C. Programista wiedział co to jest IRQ i DMA. Jak są wykonywane rozkazy w procesorze, w ilu cyklach itp.
    Kiedyś był też Borland, Watcom, Zortech.
    A dzisiaj co jest? Są frameworki i ich „operatorzy”. Come on….

  7. Cześć
    A jak jest z matematyką czy jest potrzebna na poziomie MIT czy procesy są zautomatyzowane w programowaniu ? Jestem bardzo ciekawy bo znam sporo osób które bawią się Arduino R.Pi ale nie są asami z matmy. I jak wyglądaja wymagania rekrutacyjne studia czy bez ???

  8. uint32_t *ptr1 = 0x4000;
    uint8_t *ptr2 = ptr1;
    ptr1++;
    ptr2++;
    Jakie adresy wskazują ptr1 i ptr2?
    Żadne, to się nie skompiluje.

Dodaj komentarz

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