Czy są szanse na zatruenienie?

0

Witam wszystkich,
piszę tego posta, ponieważ chciałbym usłyszeć (a właściwie przeczytać :) opinię na temat moich podstawowych umiejętności. Mianowicie czy z tym co umiem mam szansę na znalezienie pierwszej pracy / stażu (płatnego:) na stanowisku juniora developera C++, a jeśli nie to może dostanę jakieś wskazówki na czym powinienem się skupić aby zmaksymalizować swoje szanse? A może ktoś szuka juniora w swojej firmie ?
Ale do rzeczy, umiejętności, które uważam że mam na wystarczającym poziomie na stanowisko junior developera (problem w tym, że to moje własne odczucie i nie jestem w stanie tego obiektywnie ocenić, dlatego piszę tego posta :):
• C++
• STL
• makefile
• C
• git/github
• SQLite
• Linux/Unix konsola
• UML 2.0
• mikrokontrolery AVR ATMega
• Eagle, podstawy elektroniki, RS232, RS485
• doxygen
Wszystkich wymienionych technologii uczę się głównie z książek, internetowych tutoriali i dokumentacji języków i bibliotek takich jak wxWidgets, boost (chociaż tej biblioteki użyłem tylko pośrednio, używając innej) i innych . Próbki kodu są na githubie.
Programy na githubie:
TerSer – jest to program korzystający z bibliotek STL, wxWidgets i pośrednio z boost. Służy do komunikacji z urządzeniami korzystającymi z komunikacji szeregowej (coś jak putty, tylko biedniejsze :). Na jego podstawie chcę napisać program, który w oparciu o komendy AT kontrolował będzie pracę sterowników w sieci opartej o magistralę RS485, głównym jego celem będzie odczytywanie temperatur w instalacji centralnego ogrzewania, temperatur zasilenia i powrotu każdego grzejnika w instalacji (nie wspomniałem, ale jestem inżynierem instalacji sanitarnych, aktualnie studiuję zaocznie ostatni semestr studiów magisterskich).
SerialTerminal – miał robić to co powyżej, ale działając w konsoli z użyciem bibliotek pdCurses. Doszedłem jednak do wniosku, że za dużo musiałbym napisać samemu więc użyłem wxWidgets.
ThermodynamicProcesses – program do obliczania punktów charakterystycznych w centrali klimatyzacyjnej, jak nazwa wskazuje są to obliczenia termodynamiczne, związane z wykresem Molliera. Pisałem go na pierwszym roku studiów magisterskich w trakcie chodzenia na przedmiot o tej tematyce. służył jedynie jako praktyka, zdecydowanie nie skończony (liczy tylko niektóre przypadki).
Programików tutorialowych i zadań z książek nie wrzucałem, ale było ich sporo. Kod ogólnie staram się pisać możliwie czytelny i przejrzysty zgodnie z książką „Czysty kod”, bo w końcu więcej się kodu czyta niż pisze :).
Do tej pory (czyli do wakacji) pracowałem w UK w firmie budowlanej, język angielski znam na poziomie B2. Tutaj link do opisu kilku problemów z którymi sobie poradziłem korzystając z różnych źródeł internetowych. Jest on w formie bloga, ale piszę go jedynie, żeby mieć co podlinkować w CV oprócz githuba (nie jest to blog dla szerszej publiczności).
Podsumowując, czy mając te kilka małych prywatnych projektów (z których tylko jeden działa na tyle, że można go używać :) mam jakieś szanse na zatrudnienie? Nie mam studiów informatycznych, ale jestem inżynierem, matematyka i fizyka nie jest mi obca. Angielski znam wystarczająco, aby czytać, pisać i potrafić się dogadać, a programowanie bardzo mi się podoba i sprawia mi wiele przyjemności. Wiem, że poszukiwani są głównie seniorzy i mid developerzy, ale może junior z podstawami i chęcią nauki też by się komuś przydał?
Link do githuba

3

Za takie komentarze już odpadasz :P Usuń to na Boga.

    //! A constructor.
    /*!
      \param height, an unsigned integer argument.
      \param width, an unsigned integer argument.
      \param startx, an unsigned integer argument.
      \param starty, an unsigned integer argument.
    */
MenuEngine(unsigned int height, unsigned int width, unsigned int startx, unsigned int starty);
mainMenu.add_item( &terminal); // adds terminal menu to the main menu

Ogólnie wielu studentów nie napisało pewnie tyle kodu przez całe studia :)

Jakość jest marna. Wiele zagnieżdżonych ifów i catchy. Spora ilość duplikacji.

Przykładowo po co ten else if?

if(serialConnection.isOpen() == false)
	{
}else if(serialConnection.isOpen() == true)

isOpen to sprawdzasz w każdej metodzie. Lepiej jest przykładowo napisać klasę, która przyjmuje serialConnection sprawdza czy Open tylko raz.
CleanCode leży. Książkę może przeczytałeś, ale spróbuj sobie tak 2 - 3 iteracje upraszczania tego kodu zrobić.

Nie jest źle, ale więcej poczytaj o programowaniu obiektowym, wzorcach projektowych, SOLID i clean code.
Fajnie, że interesujesz się wiedzą niskopoziomową - jak tam te bajty latają.

0
nie100sowny napisał(a):

Za takie komentarze już odpadasz :P Usuń to na Boga.

    //! A constructor.
    /*!
      \param height, an unsigned integer argument.
      \param width, an unsigned integer argument.
      \param startx, an unsigned integer argument.
      \param starty, an unsigned integer argument.
    */
MenuEngine(unsigned int height, unsigned int width, unsigned int startx, unsigned int starty);
mainMenu.add_item( &terminal); // adds terminal menu to the main menu

Dzięki za komentarz, zrobię tak jak piszesz :) Chociaż tego kodu nie planuję już rozwijać, ale może chociaż będzie się prezentował troszkę lepiej ;p

0

Polecam utworzyć folder 'src' na pliki źródłowe i 'include" na nagłówki.

0
Złoty Terrorysta napisał(a):

Polecam utworzyć folder 'src' na pliki źródłowe i 'include" na nagłówki.
Dopiszę do listy poprawek :)

0

Polecam pomedytować co jest nie tak ze ścianą tekstu jak w tym przypadku z kalkulatora wilgotności:

void GeneralTab::initEvent()
{
    humidifyingWidget->setStartingHumidifyingType(processes.getHumidifyingType());

    processes.calculate();

    setProcessingModel(processes.getProcessingModel());
    processingModelWidget->setProcessingModel(processes.getProcessingModel());
    startingWidget->setPointData(processes.getStartingPoint());
    heatExchangingWidget->setPointData(processes.getHeatExchangingPoint());
    mixingWithWidget->setPointData(processes.getMixingWithPoint());
    mixingWidget->setPointData(processes.getMixingPoint());
    coolingWidget->setPointData(processes.getCoolingPoint());
    heatingWidget->setPointData(processes.getHeatingPoint());
    humidifyingWidget->setPointData(processes.getHumidifyingPoint());
    endingWidget->setPointData(processes.getEndingPoint());
    setLayoutRegardProcessingModel();
}

W ogóle czemu to repo ma tag C jeśli kod w nim jest w C++?

0

Z obecnym podażem juniorów / stażystów oraz Twoją jakością kodu - nie masz szans.
Informacje które tutaj przedstawiłeś pokazują poziom, który obecnie jest za niski na bezpłatny staż.

0
Krzychu94 napisał(a):

Z obecnym podażem juniorów / stażystów oraz Twoją jakością kodu - nie masz szans.
Informacje które tutaj przedstawiłeś pokazują poziom, który obecnie jest za niski na bezpłatny staż.

Czyli jeszcze dużo pracy przede mną.

0

Dobra pokrytykowałem, to teraz wskazówki:

  • nie twórz klasy tylko po to by zawierała jedną metodę
  • zainteresuj się temate refactoringu i tego kiedy go stosować
  • ogólnie jeśli już wybierasz podejście obiektowe, to zastanów się czy ma ono sens w danym przypadku (posiadanie w portfoli przejrzystego proceduralnie napisanego kodu w ANSI C też może zaprocentować)
  • jak dajesz jakieś kody to niech one ilustrują jakieś zagadnienia algorytmiczne pokazujące jak sklejasz ze sobą użycia list, zmiany rozmiarów struktur danych itp.

Co jest dobrze:

Tematyka jest w sumie dość oryginalna, o ile nie jest zerżnięta z jakiejś książki o programowaniu czy tutoriala który przedstawia kod, który byłby żywcem wciągnięty do projektu.

0

Rozumiem, że kod jest delikatnie mówiąc mało czytelny, ale to mój pierwszy projekt i już nad nim nie pracuję, i raczej już nie będę. Co do tagu C to gitHub sam go ustawił, prawdopodobnie przez to, że jest program jest napisany w taki właśnie dziwny (jak na C++) sposób :). - Karol-Szykula

Więc go wywal, jeśli to oficjalne portfolio, bo jak go komuś podasz i trafi na ten kod jako pierwszy, to może od razu zamknąć okno przeglądarki i zacząć przeglądać następne CV w kolejce.

0
Bogaty Kret napisał(a):

Rozumiem, że kod jest delikatnie mówiąc mało czytelny, ale to mój pierwszy projekt i już nad nim nie pracuję, i raczej już nie będę. Co do tagu C to gitHub sam go ustawił, prawdopodobnie przez to, że jest program jest napisany w taki właśnie dziwny (jak na C++) sposób :). - Karol-Szykula

Więc go wywal, jeśli to oficjalne portfolio, bo jak go komuś podasz i trafi na ten kod jako pierwszy, to może od razu zamknąć okno przeglądarki i zacząć przeglądać następne CV w kolejce.

Masz rację, nie myślałem w ten sposób, wrzuciłem żeby pusto nie było. Ale wydaje mi się, że trafiłeś w sedno i że Krzychu wyżej nie zajrzał do innych projektów :) Dzisiaj będzie delete. Dzięki za wskazówki, będę musiał się nad tymi rzeczami zastanowić. Co do tematyki, to jest to mój pomysł, przynajmniej z tym kalkulatorem :). Ogólnie dzięki za odpowiedzi.

0
Karol-Szykula napisał(a):
Bogaty Kret napisał(a):

Rozumiem, że kod jest delikatnie mówiąc mało czytelny, ale to mój pierwszy projekt i już nad nim nie pracuję, i raczej już nie będę. Co do tagu C to gitHub sam go ustawił, prawdopodobnie przez to, że jest program jest napisany w taki właśnie dziwny (jak na C++) sposób :). - Karol-Szykula

Więc go wywal, jeśli to oficjalne portfolio, bo jak go komuś podasz i trafi na ten kod jako pierwszy, to może od razu zamknąć okno przeglądarki i zacząć przeglądać następne CV w kolejce.

Masz rację, nie myślałem w ten sposób, wrzuciłem żeby pusto nie było. Ale wydaje mi się, że trafiłeś w sedno i że Krzychu wyżej nie zajrzał do innych projektów :) Dzisiaj będzie delete. Dzięki za wskazówki, będę musiał się nad tymi rzeczami zastanowić. Co do tematyki, to jest to mój pomysł, przynajmniej z tym kalkulatorem :). Ogólnie dzięki za odpowiedzi.

Reszta repo też ma swoje mankamenty, głównym będzie mieszanie logiki wyświetlania danych z logiką głównej treści prtzetwarzania/odczytu danych. Zastanów się jakie są najczęściej wykorzystywane konstrukty i opakuj je do postaci funkcji, żeby nie zaprzątały uwagi podczas czytania kodu kilometrami argumentów, które powtarzają się w identycznych formach w wielu miejscach. Jak analizuję kod czegoś co jest odpowiedzialne za odiór danych z portu szeregowego, to chcę móc się skupić na logice obsługi tego portu, a nie przebijać się przez surowe instrukcje ncurses, czy ustawianie szerokości okna widgetów przeplatane z surowymi instrukcjami odczytu/zapisu do portów. Nie mówię, że masz to akurat w takiej postaci jak to przedsatwiłem, ale jest blisko tego:

int main()
{
    // curses initialisation
	initscr();  // init curses
	cbreak();   // get raw input from keyboard
	noecho();   // turn off echo on the screen
	halfdelay(5);   // set short delay for user input

Już to jest sygnałem alarmowym, dalej mamy:

    //mvprintw(1, 1, "%s", "Press Q to quit, or to get back.");

nie dość, że wykomentowane (co to robi w kodzie wypchniętym na public rep, które chcesz komuś pokazać?) To jeszcze jest "surową"
postacią funkcji ncurses. Kod na tym etapie powinno się czytać jak dobrze napisaną powieść, a nie zastanawiać czy są dwie jedynki
i co to w ogóle jest mvprintw().

Dalej mamy przepiękny kwiatek:


    unsigned int menuHeight = LINES;    // save window height
    unsigned int width = 40;    // prepare variable for width with 40 columns

    unsigned int menuStartX = (COLS  - width )/ 2 ; // calculate starting position of the main menu x value
	unsigned int menuStartY = (LINES  - menuHeight )/ 2 ; // like above but y value

    unsigned int settingsHeight = LINES;    // save current window height for settings menu height
    unsigned int terminalHeight = LINES;    // like above

    unsigned int settingsStartX = (COLS  - width )/ 2 ;     //  calculate settings starting x value
    unsigned int settingsStartY = (LINES  - settingsHeight )/ 2 ;   // like above but y value

    unsigned int terminalStartX = (COLS  - width )/ 2 ;     // terminal x value
    unsigned int terminalStartY = (LINES  - terminalHeight )/ 2 ;   // terminal y value

To wygląda paskudnie. Już pomijam, że masz wymieszane deklaracje zmiennych funkcji w środku wywołań funkcji. Co też jet passe.

    ExitMenuItem exit(menuHeight,width,menuStartX,menuStartY);      // creates exit menu entry
    SettingsMenuItem settings(settingsHeight,width,settingsStartX,settingsStartY);  // creates settings menu
    TerminalMenuItem terminal(terminalHeight,width,terminalStartX,terminalStartY);  // terminal menu

    settings.setItems(settingsMenuItems);   // adds entries to the settings menu
    //terminal.setItems(terminalMenuItems);   // adds entries to the terminal menu

    MenuEngine mainMenu(menuHeight,width, menuStartX, menuStartY);  // creates main menu


    mainMenu.add_item( &terminal);  // adds terminal menu to the main menu
    mainMenu.add_item( &settings);  // adds settings menu to the main menu
    mainMenu.add_item( &exit);      // adds exit menu to the emain menu

Zzzzz... zasnąłem naprawdę to miejsce i czas no robienie tego typu obliczeń?


    mainMenu.event();       // start the main menu event

No w końcu jakaś istotna treść. Chyba.


    endwin();       // turns off curses library
    return 0;
}

patrz co pisałem przy mvprincośtam()

Na tym etapie to nie powinno tak wyglądać. Po kiego w ogóle tyle zmiennych do obliczeń wymiarów okna/kontrol,i/whatever? To naprawdę musi zajmować 95% kodu main? Jestem teraz po całym dniu pracy i jakbym przeglądał teraz CV i takie repo, to mój mózg odmawia prób domyślania się co autor miał na myśli, a wiedz, że main() to jedna z pierwszych funkcji do których się zagląda poznając cudze projekty.

0

Widzę, że następne repo do usunięcia :) ten programik jest tam z tego samego powodu co poprzedni - żeby nie było pusto;p (co nie zmienia faktu, że jest źle napisany). Jak tak dalej pójdzie to nic tam nie zostanie :) Aktualnie pracuję jedynie nad TerSer - jak już tak oglądasz to możesz i tam zajrzeć :) Możesz nawet pobrać binarkę do przetestowania, ale po tym co piszesz, to raczej nie będzie Ci się go za przyjemnie czytało (chociaż powinno być troszkę lepiej niż do tej pory). Eleganckiego pisania to się chyba raczej szybko nie nauczę :( Widzę, że "Czysty kod" jeszcze raz muszę przeczytać.

0
Karol-Szykula napisał(a):

Widzę, że następne repo do usunięcia :) ten programik jest tam z tego samego powodu co poprzedni - żeby nie było pusto;p (co nie zmienia faktu, że jest źle napisany).

Bardzo pozytywnie, że przyjmujesz uwagi do wiadomości. To jest potrzebna umiejętność u programisty.

Aktualnie pracuję jedynie nad TerSer - jak już tak oglądasz to możesz i tam zajrzeć :) Możesz nawet pobrać binarkę do przetestowania, ale po tym co piszesz, to raczej nie będzie Ci się go za przyjemnie czytało (chociaż powinno być troszkę lepiej niż do tej pory).

No niestety muszę stwierdzić, że on TerSer wygląda jak kompilacji błędów z dwóch poprzednich repo.

Eleganckiego pisania to się chyba raczej szybko nie nauczę :( Widzę, że "Czysty kod" jeszcze raz muszę przeczytać.

Trudno mi się odnieść do zasadności czytania po raz drugi. Ja bym się skupił na umiejętności dzielenia i wyodrębniania podstawowych cegiełek budulcowych i wczuwania się w rolę osoby, która widzi kod pierwszy raz w życiu na oczy. Na pewno łatwiej jej będzie przebrnąć przez coś takiego

main(int argc, char **argv)
{
   initiialize();
   start();
   cleanup();
}

niż zastanawianie się do czego służy w mainie las funkcji z kilometrami magicznych wartości w postaci

qwertysmmndmn(2137,1337,666,"Abrakadabra");
unsigned int salary = TAK_WYKOP_POWIEDZIAL * 15000;
abcdwdgtwndfprintf(0,0,34,salary,"Dzień dobry, w czym mogępomóc?");
start();
int param = STAWKASENIORA *2;
xyzafgprnt(stawka,3,14,"Do zobaczyska");
clean();
0

Czyli, jeśli dobrze zrozumiałem, to teraz powinienem się głównie skupić na refactoringu? Co do samego kodowania, to rozumiem, że Krzychu94 dobrze napisał i na stanowisko jakiegoś początkującego juniora to nie mam co liczyć bez poprawy czytelności kodu? A to że potrafię jakiś (brzydki i prosty, ale jednak działający zgodnie z założeniami) programik tak jak TerSer napisać to nie ma znaczenia bez wspomnianej już czytelności?

3

Wyślij CV, idź na rozmowy a dowiesz się czego CI brakuje podczas rozmów. Może to czytelność kodu, może jeszcze inne rzeczy, a może Cię gdzieś przygarną.

Widziałem seniorów piszących gorszy kod. Nie mówię że to dobrze i uważam że powinieneś się rozwijać, ale wysoka czytelność kodu u juniora (a raczej praktykanta)? To tak trochę na wyrost moim zdaniem. Gdzieś Cię może przygarną i nauczą, po pracy rozwijaj się sam do tego. Da Ci to więcej niż siedzenie na tyłku.

0

Kod sobie popraw, w miarę rozwoju zawsze się kod poprawia, na coraz lepszy :)
Nie rozumiem natomiast jednego, pytania czy masz gdzieś szansę? Czy tutejsi użytkownicy to jakaś zbiorowa świadomość agregująca wszystkie osoby decydujące w procesie rekrutacji we wszystkich firmach?
Takie pytanie jest trochę naiwne, a zauważyłem, że często się tutaj pojawia.

Pytaj, co możesz poprawić w swoim kodzie, i jak chcesz to aplikuj, bo nie znasz jakimi kryteriami kierują się poszczególne firmy.
Może np. jedna będzie mniej zwracała uwage na czytelnośc i jakość kodu, uważając że pracując u nich szybko się tego nauczysz, a zwróci uwagę przede wszystkim na logiczne myślenie, czy algorytmikę. Jest masa kryterów.

0

Rozumiem, czyli właściwie to muszę nadal się uczyć, pisać i próbować po prostu do skutku:). Dzięki za odpowiedzi :)

2
Karol-Szykula napisał(a):

Czyli, jeśli dobrze zrozumiałem, to teraz powinienem się głównie skupić na refactoringu? Co do samego kodowania, to rozumiem, że Krzychu94 dobrze napisał i na stanowisko jakiegoś początkującego juniora to nie mam co liczyć bez poprawy czytelności kodu? A to że potrafię jakiś (brzydki i prosty, ale jednak działający zgodnie z założeniami) programik tak jak TerSer napisać to nie ma znaczenia bez wspomnianej już czytelności?

Jeśli działa to oczywiście na plus (pozostaje jeszcze pytanie na ile poprawnie - tego nie wiem, nie testowałem), pamiętaj że w pracy zawodowej zagadnienia będą bardziej złożone, oraz że pracuje się zwykle w zespole. Bądź takim programistą, z którym sam byś chciał współpracować, i takim którgo kod byś chciał czytać.

Przynajmniej na etapie portfolio. Jak chcesz się wybić na tle innych, to czytelność to podstawa. "Makaroniarzy" na stanowiska aplikuje obecnia masa. Powiem tak - będąc studentem widywałem takiego kodu jak twój masa u kolegów, siłą rzeczy u wielu z nich jako tako te kody działałym bo studia ukończyli. I mowa tu o uczelni z TOP2 w Polsce.

Kody jak z twojego repo, to akurat takie programiki zaliczeniowe na semestr. Jak się trafiło na mniej wymagającego ćwiczeniowca. U bardziej wymagających było takich kilka do oddania. Co 2 tygodnie. Gdzieś na pierwszym, drugim roku. Na innych uczelniach też dyplomów mie dają za darmo, wbrew temu co niektórzy tu wypisują w tym dziale. Wiedz wiec z kim stajesz w szranki. Mało ludzi jest tego świadomych.

Tym bardziej, jeśli miasto, w którym rywalizujesz to coś pokroju Warszawy, Katowic, Krakowa, Wrocławia, pewnie i Trójmiasta. Jeśli twój kod niczym się na ich tle nie wyróżnia, to licz się z tym, że jeśli nie masz wykształcenia kierunkowego, to właśnie oni zajmą twoje miejsce. Jak masz, to jesteś na jednym poziomie z nimi. Albo ciebie i ich zakosi przy rekrutascji ktoś bardziej doświadczony, kto pisze właśnie czytelniejszy kod.

Czytelność kodu kogoś kto ma ambicje pisać w C++, języku bogatym w różnego rodzaj konstrukty programistyczne i przesłodzonym obecnie IMHO do przesady cukrem składniowym, brak umiejętności pisania czytelngo kodu boli. I to bardzo. Oczywiście, może gdzieś trafisz przy obecnym stanie "skilla" ale to będzie raczej coś, w co pakować się nie warto moim zdaniem. Podstawowy refactoring, to nie jest aż tak wielkie rocket science. A korzyści ogromne. Zapoznaj się przymajmniej bazowymi założeniami i metodami, które są niezalezne od paradygmatów. Eliminowanie duplikatów w kodzie to podstawa podstaw i niejako wymóg dla kogoś kto chce uniknąć pytań, o to czy ma rozum i godność człowieka.

Czytaj kod innych. Na githubie jest sporo w miarę sensownie napisanych projektów Wolengo Oprgramowania. Patrz, oceniaj czy są one dla ciebie czytelne. Jeśli nie są, to rób notatki co jest w nich kijowe. Przynajmniej jedenr az się zastanów, czy kod jest tak napisany celowo, czy to oznaka kijowego mózgu autora. Jeśli coś ci się podoba, to zapisuj sobie zakładki do stron z githuba z kodem w konkretnych plikach.

0
Karol-Szykula napisał(a):

Rozumiem, czyli właściwie to muszę nadal się uczyć, pisać i próbować po prostu do skutku:). Dzięki za odpowiedzi :)

Zgadza się. Rynek wiele rzeczy weryfikuje w praktyce. Może mamy rację w pewnych aspektach, może się mylimy. Życie i niewidzialna ręka wolnego rynku pokaże. Jak na razie zdajesz się mieć właściwe psychologiczne podejście. I tak, uczyć się trzeba cały czas, nawet jak się jest seniorem.

0

Dzięki za odpowiedzi.

0

Nie odbierzcie tego jako atak ale coś mi się wydaje że zaklinacie rzeczywistość. Spójrzcie chodziaz na ludzi po bootcampach, ile oni potrafią? A robote znajdują. Możemy dyskutować o umiejętnościach tych ludzi, może się to podobać bądź nie ale realnie wystarcza to do znalezienia pracy czy stażu bo takie mamy realia.

0

Trafiam czasami na jakieś mało znane stronki, np hobbystyczne, albo przez linki na fejsie. Patrzę w stopkę, jakaś "normalna" polska firma to zrobiła, wzięła hajs (pewnie nie zbyt spory), a stronka wygląda tak, że lepiej zrobiłby ją absolwent szajskursu "zrobimy z ciebie webmastera". A więc się kręci.

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