Programowanie systemowe, embedded, gamedev, ogólnie niskopoziomowe

0

Cześć! Jestem jeszcze młody, dopiero w klasie maturalnej - od około dwóch lat siedzę w webdevie - Java, JS, React, Spring, Hibernate i tego typu sprawy. Zastanawiam się obecnie nad "przebranżowieniem" się na programistę niskopoziomowego - C, C++ - programowanie systemowe, linux kernel development, gamedev, embedded i te sprawy. Zastanawiam się nad tym, ponieważ wydaje mi się to trochę bardziej interesujące od webdevu, a poza tym widzę, że nie ma takiego "natłoku" ludzi w niskopoziomowym programowaniu. Co o tym myślicie? Dodatkowo jak wygląda rynek pracy dla takich osób np. w Warszawie?

Ogólnie chodzi mi o znalezienie jakiejś swojej niszy, ale może źle to nazywam :(

0

ja teraz jestem na niskim poziomie C/C++ jest spoko tyle że niższe zarobki i brak pracy zdalnej

0

Pracuję w automotive i jakoś nie widzę, żeby zarobki odbiegało bardzo od webówki. Ale z pracą zdalną rzeczywiście, zazwyczaj 1/2 dni. Problem w tym, że często do pracy potrzeba Lauterbach-a, CANoe, czasem nawet oscyloskopu (chociaż zauważyłem że w większości przypadków saleae logic by wystarczył).

9

Dobra, skoro już mnie wywołano to jedziemy z tym koksem.

Vaversky napisał(a):

Cześć! Jestem jeszcze młody, dopiero w klasie maturalnej - od około dwóch lat siedzę w webdevie - Java, JS, React, Spring, Hibernate i tego typu sprawy.

Czyli coś tam ogarniasz i nie robisz tego, bo masz hipotekę na spłatę. Czyli jakieś zadatki na programistę masz, a nie lecisz bo na wykopie piszo, że będzie 15k na start.

Zastanawiam się obecnie nad "przebranżowieniem" się na programistę niskopoziomowego - C, C++ - programowanie systemowe, linux kernel development, gamedev, embedded i te sprawy.

Osobiście nie mieszałbym gamedev do embedded, chyba, że to gamedev dla urządzeń wbudowanych. ;)

Zastanawiam się nad tym, ponieważ wydaje mi się to trochę bardziej interesujące od webdevu, a poza tym widzę, że nie ma takiego "natłoku" ludzi w niskopoziomowym programowaniu.

Jest interesujące głównie ze względu na złożoność systemów i ilość wiedzy, którą trzeba ogarnąć. I nie ukrywam, że wiedza akademicka, a przynajmniej zdolność rozumienia na tym poziomie algorytmiki, a niekiedy i matematyki:
przykłady

MATEMATYKA - gdy np. generatory pseudolosowe trzeba ogarniać np. przy portowaniu na nową architekturę, która czegoś nie wspiera i trzeba to walnąć z palca/wiki/innegoprojektu/jakiegośtekstunaukowego, albo wspiera i trzeba wiedzieć, którą część połączyć ze sprzętem by to było wydajne i bezpieczne i nie doprowadzić przy tym do sytuacji kiedy generator zwraca wysoce przewidywalne wyniki

ALGORYTMIKA - komunikacja między procesami, stos sieciowy, algorytmy routingu, bebechy typu schelduler i masa innych.

Co o tym myślicie? Dodatkowo jak wygląda rynek pracy dla takich osób np. w Warszawie?

Dla jaj często sobie przeglądam oferty pracy i widuję nawet dość prowincjonalne lokacje. Nie licząc Warszawy, to jest na pewno Kraków, Wrocław i inne wojewódzkie - nawet "z tego prowincjonalnego" Białegostoku widziałem niedawno. Z tym, że embedded to rozległa działka pod którą podpadają tak sterowniki klimatyzacji w magazynie u Janusza handlującego ekskluzywnymi drewnianymi wibratorami, które trzeba przechowywać w odpowiedniej wilgotności, systemy sterowania dla pieców centralnego ogrzewania, systemy alarmowe, systemy rozpoznawania obrazów, sprzęt sieciowy (routery, switche, punkty dostępowe), centrale dla operatorów telekomunikacyjnych, bilbordy do wyświetlania reklam, czy automotive, czyli grzebanie przy komputerze w samochodzie a potem tłumaczenie, że to nie ty odpowiadasz za c**** działanie systemu, przez które doszło do wypadku. Jakieś łaziki marsjańskie czy satelity, rakiety i samoloty też tu podpadają.

Ogólnie chodzi mi o znalezienie jakiejś swojej niszy, ale może źle to nazywam :(

Nisza to spoko droga przy obecnym zalewie małp do kodowania, bo kiedyś jakiś kraj może się okazać tańszy przy zbliżonej jakości niż Polska i janusze Crudów zostaną odcięci od kurka z bilonem, bo po X latach ich wiedza nie będzie wykraczać poza pisanie getterów, setterów i kilku wzorców na skrzyż aplikowanych w każdym projekcie, czy ma to sens czy nie. Nie wykraczali poza tą strefę komfortu, bo woleli poświęcić cały wolny czas na jazdę Ferrari na kredyt i kurtyzany (autentyczne przypadki). Nisza po prostu niejako wymusza ogarnianie tematu głębiej. Programistyczny "mainstream" niekoniecznie.

Teraz kwestia płacy. Khmm... delikatnie rzecz ujmując w webdev napocisz się dużo mniej (zmora embedded to niekiedy wróżenie dlaczego ta kupa złomu zwana szumnie platformą docelową nie działa tak jak powinna, bo ktoś kto to projektował po pijaku nie tak poprowadził ścieżkę na płycie i hokus pokus mamy hardware bug, lub brak istotnych dla projektu informacji w dokumentacji technicznej) za te same pieniądze, mniejsza będzie twoja odpowiedzialność i możliwe szkody fizyczne (w embeded enjoy niespokojny sen bo wypchnęliście g**no klientowi, na skutek czego cały pion kotłów ogrzewania poszedł uprawiać miłość fizyczną itp.). No i aby w ogóle wejść do tego świata trzeba niebotycznie większej wiedzy niż przy klepaniu serwisów www.

A teraz tzw. "piękno kodu". Widziałem kod tak embedded w praktyce (klienci kalibru Silicon Valley) jak i webdev od strony admina (czyli często widziałem więcej różnorodnego kodu niż ludzie którzy pisali rzeczone serwisy www). I delikatnie rzecz mówiąc kod webowy jaki piszą przynajmniej Polscy "regularzy" w porywach do "seniorów" jest często tak pełny niedorzeczności i kombinowania jak koń pod górkę, że głowa mała. Dodać do tego znane kijowości wielu popularnych "platform blogowych i e-commerce" które wychodzą bardzo łatwo przy większym ruchu ale nie jest nawet od ponad dekady modyfikowana ani ruszana przez developerów. Chociaż wystarczyłoby jak w przypadku Wordpressa zmienić domyślną konfigurację, czy randomizować pewne rzeczy. Kompletnie po tych doświadczeniach nie szanuję tej branży.

W embedded też nie jest pięknie, ale generalnie widać, że poziom IQ jest w tej dziedzinie wyższy. Tam łączenie na ślinę dwóch modułów wymaga jednak więcej wysiłku intelektualnego gdy jest to niskopoziomowy kod działający blisko sprzętu i mający obsługiwać spory ruch sieciowy, czy znaczny strumień danych czasu rzeczywistego z interfejsów czujników monitorujących jakiś spory złożony system przy kilkuset odczytach na sekundę.

Plusem embedded jest to, że jak ogarniesz wymaganą wiedzę i przetrwasz chociaż rok w branży, to programistycznego ćwieka ci po tym zagiąć może co najwyżej programowanie funkcyjne. :P

Podsumowując - webdev dobry na start w bardzo wczesnym etapie kariery i jest się w tym całym programowaniu od niedawna. Embedded może być spoko na jakimś późniejszym etapie kariery (przykładowo przy końcówce studiów, bez których może być średnio łatwo w ogóle wejść w temat).

Późniejszym zyskiem może być połączeniem tych dwóch ścieżek ny być np. administratorem systemów UNIX, albo developerem C w "zwykłym"/"serwerowym" środowisku UNIX (oprogramowanie typu Apache samo się nie pisze i bynajmniej nie powstaje za darmo), czy programistą Go aka. golang. W Go pokrewieństwo z C oraz stosowanie wielu praktyk "filozofii UNIX" - tak projektowych jak i programistycznych - w tym języku sprawia, że ich znajomość wysoko procentuje, do tego posiada wsparcie dla pisania aplikacji WWW będących od razu własnymi serwerami. Jeśli nienawidzisz programowania obiektowego, to te dwa języki sprawią, że poczujesz się jak w domu. Hejterów obiektówki w obu nie brakuje i jest wśród nich w raczej dobrym tonie.

Ogólnie nawet jakby ci się odechciało kroczyć jedną czy drugą ścieżką, to znajomość C uważam, za must have dla prezentującego coś sobą programisty, który ma aspiracje na bycie czymś więcej niż małpą kodującą w jednym języku za kilka ton bananów miesięcznie. Otwiera oczy na wiele zagadnień i wyjaśnia wiele "magicznych" kwestii dotyczących programowania i błędów w nim.

Jak masz jakieś pytania jeszcze to wal śmiało.

EDIT:

P.S.

Co do pracy zdalnej to w embeded są i tacy co pracują 100% zdalnie ale to raczej "zaufani wyjadacze" korporacji elektronicznych dla których pracują, względnie zatrudnieni przez fundacje rozwijające jakieś komponenty softwarowe typu Free Libre Open Source istotne w branży - jak kernel Linux, FreeBSD, FreeRTOS itp.

0

Podbije temat.
Mam troche lat doswiadczenia, mam troche zaciecia do infry, devops, SRE itp. nie do konca taki low level ale z perspektywy web devopmentu juz tak.

Czasem patrze na magikow low level i serio zastanawiam sie jak oni takie doswiadczenie zdobywaja i jak w ogole znajduja podobne posady kiedy wszedzie wokol tylko CRUD development.

dla przykladu:
https://boards.greenhouse.io/cloudflare/jobs/1441326?gh_jid=1441326
https://blog.cloudflare.com/author/marek-majkowski/
https://idea.popcount.org/

serio, jak sie w ogole rozwijac w takim kierunku? gdzie takie posady sie w ogole znajduje...

0

Jak zdobyć wiedzę na początek?

Podstawowa algorytmika + znajomość C (wymusza poznanie jak zbudowna i zarządzana jest pamięć) i assemblera (architektura i pamięć) + teoria (tak, nie regulujcie odbiorników, naprawdę padło słowo "teoria") z zakresu systemów operacyjnych + programowanie systemowe + poznanie podstawowych wpadek bezpieczeństwa (przepełnienia stosu, sterty, intów, wycieki pamięci itp.) i zapoznanie się z kodem kilku projektów typu kernele, coreutils itp. plus logiczne myślenie i trzymanie ręki na pulsie czytając listy dyskusyjne. Można dodać do listy lektur "hack ziny" typu phrack, chociaż ich kultura praktycznie już upadła lata temu wraz z zanikiem "grup hackerskich".

Sieciowość, czy elektronika nie jest na starcie aż tak istotna i można na początku sobie darować jakąś głębszą znajomość zagadnień, później jednak będzie się o nie zahaczać.

Wejście w temat to nie jest aż takie rocket science (chyba, że porównujesz z webdevem), jak się wydaje i opiera się na maks pierwszych 4 semestrach porządnego uniwerku + trochę własnego grzebania. Jak macie [CIACH!] na tym punkcie i nie wychodzicie z piwnicy codziennie do pracy to będziecie spokojnie gotowi na praktyki z tego zakresu przed 3cim rokiem studiów.

Praktyki to najczęściej głównie bug hunting/debugowanie i związana z tym nawigacja w cudzym kodzie. W sumie jedna z lepszych IMHO metod poważnego wejścia, w "ten biznes".

Jak znajduje się pracę? Tak jak w każdej innej branży. Karty graficzne, sieciowe same nie piszą sterowników, a kernele same się nie portują na nowe platformy, RTOSy same nie piszą programów. Apache czy Linux też ktoś musi rozwijać i utrzymywać. W samym Krakowie to kilka-kilkanaście firm. Jeśli w waszej okolicy jest od lat co najmniej jedna politechnika, to spore prawdopodobieństwo, że ktoś się zajmuje tymi klimatami w waszej okolicy. Może nie na jakimś światowym poziomie, ale do zdobycia pierwszych szlifów może wystarczyć.

0
karsa napisał(a):

serio, jak sie w ogole rozwijac w takim kierunku? gdzie takie posady sie w ogole znajduje...

Nie siedzę w embedded... więc się wypowiem ;-)
Polecam skupienie się na rozwiązaniach - robienie własnych projektów, najlepiej mocno związanych z niestandardowym sprzętem.
Dzięki temu wciągasz się mimo woli.
To nie jest wiedza którą możesz wyciągnąć z książek, musiałbyś być dzieckiem autystycznym żeby mieć frajdę z czytania np. specyfikacji x86 (liczba cykli, flagi i rozmiary instrukcji) - bez programowania.
Nie, takie rzeczy najlepiej uczy się przy okazji robienia czegoś ciekawego.
To samo z programowaniem systemowym - nie uczysz się API tylko robisz jakieś rozwiązanie o nie oparte.

Obecnie jest bardzo dużo możliwości robienia takich projektów, a najtańsze maszyny są dostępne w cenie cappuccino w Starbucks.
Kilka stron z projektami dającymi jakieś inspiracje:
https://hackaday.com/
https://www.makeuseof.com/
https://www.electromaker.io/
http://www.raspberry-pi-geek.com/
https://www.modmypi.com/blog
https://hackaday.io/list/3424-raspberry-pi-projects
https://circuitdigest.com/arduino-projects

Jedna z najłatwiejszych maszyn do oprogramowania to Raspberry Pi - za $35 sztuka. Jest to "prawie PC", może odpalić Linuxa i Windows. Przykładowy tutorial: https://www.studica.com/blog/program-embedded-systems-raspberry-pi

Trochę trudniej (ale i taniej) jest z Raspberry Pi Zero.

Platformy typowo embedded - np. Arduino czy STM32 zostawiłbym sobie na drugi rok ćwiczeń.

Hasło do googla: <nazwa-platformy> + "projects".

0

Raspi to na uruchomienie własnych modyfikowanych kerneli (o ile komuś nie wystarczy qemu do tego), czy FreeRTOS. Można też na nim ćwiczyć assembler ARMowy też.

Jak komuś w międzyczasie się znudzi tematyka, to będzie miał solidne podstawy żeby przeskoczyć po tym do działki administratorskiej jak dołączy znajomość zagadnień sieciowych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1