Mechatronik/robotyk - ścieżka rozwoju kariery

1

Cześć,

Mam 21 lat, studiuję na Wydziale Mechatroniki PW (kierunek AiR, specjalność Robotyka), niedługo rozpoczynam 3 rok. Od marca tego roku pracuję w małym biurze konstrukcyjnym na pół etatu jako inżynier/programista systemów wbudowanych - zajmuję się projektem związanym z "visual servoing", wykorzystuję do tego C++, platformy sprzętowe to Raspberry Pi (OpenCV + Python) i Arduino, do pisania aplikacji na PC wykorzystuję Qt.
Od około 4 lat mam styczność z programowaniem (C++, SPOJ, systemy wbudowane w C, później Qt) - ogólnie rzecz ujmując moje zainteresowania obracają się wokół mechatroniki (zajmuję się też zagadnieniami "mechanicznymi" - modelarstwo RC, coptery, ostatni duży projekt to elektryczny mountainboard).

Z pracy jestem zadowolony, projekt jest dla mnie bardzo interesujący, ale jest pewien szkopuł - w firmie jedyną osobą, która zajmuje się tym projektem jestem ja. Szef nie jest związany z programowaniem/embedded i współpraca opiera się na pokazywaniu rezultatów i uzgadnianiu kolejnych kroków - gdy coś nie działa to sam muszę szukać rozwiązań. Czego się obawiam - że powstanie ze mnie programista "potworek" ze złymi praktykami.
Idealną sytuacją dla mnie byłoby gdyby w projekcie uczestniczył ktoś, kto skomentuje mój kod/rozwiązanie i powie np. "Tak tego się nie robi, zobacz tu...". Nie oczekuję na prowadzenie za rączkę, ale jednak fajnie byłoby jakby był ktoś z doświadczeniem od czasu do czasu nadzorujący co robię.

No i dochodzimy do mojego pytania: co robić w obecnej sytuacji? W przyszłości chciałbym się zajmować programowaniem.
Moje opcje to: zachować status quo i samodzielnie męczyć się z pojawiającymi problemami i po pracy uzupełniać "niedostatki" wynikające z jednoosobowego teamu książkami (jakość kodu?), tworzeniem własnych projektów. Druga opcja to poszukać innej pracy w większym projekcie- tylko pytanie jaka jest szansa znalezienia pracy z tak elastycznymi godzinami jak mam teraz...

Próbka mojego kodu z projektu (pisany około rok temu) do ewentualnej ewaluacji moich umiejętności: https://github.com/Lukaszm94/PomodoroII

Z góry dzięki za odpowiedzi/podpowiedzi i sugestie :)

4

Patrzą po kodzie mogę powiedzieć tylko jedno:

Otwieram pierwszy plik z brzegu a tam:

inline void update() volatile { //called every 5ms
		if(counterState == debouncing) {
			if(pressLengthMs >= debounceDelay) {
				counterState = counting;
				pressLengthMs = 0;
				return;
			}
			pressLengthMs += updateIntervalMs;
			return;
		}
		if(isButtonPressed()) {
			if(counterState == notCounting) {
				counterState = debouncing;
				return;
			}
			if(counterState == counting) {
				pressLengthMs += updateIntervalMs;
				return;
			}
		}
		else { //when button is released
			if(counterState == counting) {
				if(pressLengthMs <= shortPressMaxTime) {
					lastAction = shortPress;
					counterState = notCounting;
					pressLengthMs = 0;
				}
				else if(pressLengthMs > shortPressMaxTime) {
					lastAction = longPress;
					counterState = notCounting;
					pressLengthMs = 0;
				}
			}
			else {
				pressLengthMs = 0;
				counterState = notCounting;
			}
		}
	}

Nie dało sie tych rozgałęzień popakować w jakieś sensownie nazwane metody? Inaczej czyta sie kod

if(buttonPresssed()){
  pressedActions();  
}else{
  releasedActions();
}

A inaczej takiego potworka którego tam zrobiłeś.

Otwieram inny losowy plik a tam:

void uart_puts(char *s)		// wysyła łańcuch z pamięci RAM na UART

Skoro musiałeś napisać ten komentarz to dlaczego nie nazwałeś tej funkcji sendStringFromRAMToUART? o_O
Albo

 while ((c = *s++)) uart_putc(c);			// dopóki nie napotkasz 0 wysyłaj znak

Ja wiem ze pr0 hackerski zapis, ale skoro musisz postawić taki komentarz to czemu nie napisać czytelnego kodu?

while(character!=0){
    sendCharacter(character);
}

A tego to w ogóle nie rozumiem:

// sprawdzamy czy indeksy są równe
    if ( UART_RxHead == UART_RxTail ) return 0;

Co ten komentarz wnosi? o_O Aż kusi mnie przeglądnąć kod żeby sprawdzić czy gdzie nie masz klasycznego int x; //zadeklarowanie zmiennej int :D

0

Bardzo dziękuję za kopniaka ;)
Pierwsza uwaga jak najbardziej celna. Niestety z pozostałymi to tak nie do końca moja wina- biblioteka wzięta bezpośrednio z książki o programowaniu AVR-ów w C. Dobry dowód na to, że trzeba się pilnować co się czyta.

Edit: Dodam jeszcze, że takiej sytuacji się obawiałem. Tworzę sobie jakimś tam "shitty code", działa i robi co trzeba, to jak mi nikt nie powie, że jest słaby i tak się tego nie robi, to pewnie następnym razem zrobię tak samo. A w "normalnym" ( > 1 osoba) teamie jest feedback (lepszy lub gorszy) i jakoś wiedza i umiejętności się rozwijają.

2

@Lukaszmey nawyki z Kardasia?

@Shalom głupio to zabrzmi, ale dla AVRa opakowanie tych ifów w metody to już może być ładne przepakowanie RAMu przy wywołaniu. Oczywiście to strzał na ślepo i jeżeli się mylę, to warto byłoby napisać to tak jak Ty podałeś. Ale mogę się nie mylić i wtedy komentarz, że stosu brakuje powinien wystarczyć. A uwierz, potrafi braknąć.
Zwłaszcza, że Autor pisze w CPP, mam nadzieję że chociaż kompiluje to z no-rtti i no-exceptions.

Natomiast czego ja się przypnę: sterowanie pinami w oparciu o template jest słabe, bo nagenerujesz od cholery prawie zduplikowanego kodu. Przekaż lepiej wskaźnik/referencję do peryferiala i załatw to w run-timie. Opakuj jakoś ładnie makra dostarczone przez twórców biblioteki.

EDIT:

no i dlaczego nie opakujesz timera w klasę, IO tak, a UART to w ogóle metoda św. Copy'ego Paste'a? ;) Nie mam nic przeciwko korzystaniu z gotowców, ale ujednoliciłbym konwencję.

0

Ja tam sie za bardzo na embedded nie znam ale 4 bajty na stosie to chyba nie jest aż tak dużo, szczególnie że nie mówimy tu o żadnej długotrwałej alokacji tylko o odłożeniu adresu powrotu na czas kilku operacji.

0

@Lukaszmey pozwoliłem sobie pochodzić po reszcie Twojego githuba i jeszcze jedna rzecz mnie natchnęła: przy pisaniu na AVR unikaj floatów, albo inaczej: wiedz co robisz korzystając z floatów. Bo jeżeli piszesz drobiażdżek, który ma tylko coś wyświetlić - ok. Ale w momencie gdy zechcesz coś dopisać, nagle może się okazać, że czasu/miejsca we flashu brak.

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