Problem z nauką C++

0

Hej, piszę, bo już sama nie wiem, co mam myśleć. Od końca października zeszłego roku rozpoczęłam naukę C++ (wcześniej technologie webowe: html, css, odrobinę js i php z naciskiem na odrobinę). Poszłam na studia podyplomowe z C++ z nastawieniem, żeby nauczyć się programowania i zostać programistą zawodowo. Jestem w takim momencie mojego życia, że inna opcja nie wchodzi w grę (obecnie wykonuję pracę nauczyciela, której nie cierpię). Mam jednak wrażenie, że się do tego nie nadaję. Że chcieć to nie móc. Obecnie kończymy drugi semestr, gdzie przerabialiśmy algorytmikę, bibliotekę standardową, zaawansowane programowanie obiektowe (dziedziczenie i polimorfizm). Ale mam wrażenie, że dalej jestem trąba. Niby robiliśmy różne algorytmy, np. sortowanie bąbelkowe, rekurencyjne, ale jakbym miała teraz zadanie, by takowe napisać, to wątpię, że potrafiłbym bez ponownego przeanalizowania swojego kodu i dłuuugiej chwili na to. Tworzenie list mnie zabiło, a Tetris (chciałam taki wykonać na sfml'u) mnie pokonał. Wskaźniki w końcu zrozumiałam, choć mam wrażenie, że to jakiś łut szczęścia i że zaraz wyjdzie, że jednak tylko wydaje mi się, że rozumiem. Zresztą w projekcie zaliczeniowym i tak mam stosować inteligentne wskaźniki zamiast zwykłych, więc znowu pod górkę. Czy mam się martwić postępami? Czy zaczynając od "wtf, jak ludzie rozróżniają cin od cout" czy "do czego służy include", to te 7 miesięcy nauki to już postęp sam w sobie? Uczyłam się dużo, choć musiałam zrobić dłuższą przerwę między semestrami. Całkiem nieźle mi wychodzi programowanie funkcyjne, gorzej obiektowka, a jeszcze gorzej używanie biblioteki standardowej (iteratory, mapy). Co byście poradzili? Bardzo chciałabym załapać się na staż, choćby za psie pieniądze, żeby nie tracić kontaktu z programowaniem. Boję się, że jeśli będę tkwić w obecnej pracy, to będę skupiać się na niej, zamiast na nauce i zajmie mi lata, zanim w końcu ogarnę na sensownym poziomie, ale trochę wątpię, że się załapię przy obcnym poziomie wiedzy i umiejętności. A przede wszystkim boję się, że może jednak się nie nadaję :/ Wykładowcy wymagają od nas opanowania materiału, jakby ilość obecnego czasu była wystarczająca do tego, żeby sobie spokojnie poradzić. Sprawia mi przyjemność, gdy napiszę fajnie działający kod, ale zniechęca mnie to, z jakim trudem wszystko mi przychodzi. Co byście poradzili? Nie zniechęcać się? To normalne? Może po prostu więcej kodzić i będzie dobrze?

0

Niestety czy stety nie jest łatwo. Współczuję z powodu obecnej sytuacji. Co dalej - to już Twoja decyzja. Ale powinnaś mieć świadomość, że najprawdopodobniej trzeba będzie poświęcić na programowanie jeszcze wiele czasu. I to bez gwarancji sukcesu. Nie jestem pewny jak wygląda rynek IT w C++. Trzeba próbować do skutku. Wysyłać CV z myślą, że i tak mnie nie przyjmą. Dowiadywać się dlaczego nie i co muszę poprawić.

1

C/C++ jest na początku trudny. Radzę przerzucić się na coś przyjaźniejszego, i nowszego. Może nauka Kotlin'a na platformę Android.

0

Nie ma łatwej drogi, trzeba przesiedzieć kilkadziesiąt, kilkaset godzin przy kodzie i tyle. To co jest dzisiaj trudne jutro będzie łatwe bo się tego nauczysz. Mam wrażenie, że tobie coś nie wyjdzie w 10min i już się poddajesz zamiast analizować kawałek po kawałku dany problem. Na studiach uczą samych podstaw danych zagadnień natomiast książka jest tego rozszerzeniem. Trzeba po prostu siedzieć i być wytrwałym...... Jeżeli np nie potrafisz przesiedzieć nad czymś główkując się czemu to nie działa to niestety, ale tak właśnie wygląda programowanie. Trzeba umieć przesiedzieć nie odrywając się od monitora:D

0

#Johny123 Raczej to wygląda tak, że siedzę tydzień i stwierdzam, że nie jestem w stanie tego zrobić, bo a) b) c) d), a czas goni, więc zwyczajnie nie zdążę... Nie mam problemu z siedzeniem nad czymś dniami przy komputerze. Wręcz powiedziałabym, że powinnam ograniczyć ten czas, bo to już zaczyna być niezdrowe. Po prostu nie wiem, czy to ja słabo ogarniam czy po prostu to normalne, że te kilka miesięcy to za mało czasu.

2

Spokojnie, programowania człowiek uczy się długo. Oj długo. Patrz, programuję już 20 lat, a cały czas się uczę. Hehe :) Choć oczywiście to jak z nauką szachów, zawsze można wejść w problem jeszcze głębiej, niemniej jednak pierwsze owoce w programowaniu przychodzą po dłuższym czasie, tak więc nie ma co się załamywać. W dużym stopniu myślę, że wąskim gardłem może być sposób uczenia. Przede wszystkim C++ w dzisiejszych czasach dosyć średni pomysł. C++ jest mało strawny i obecnie już nie tak popularny. Już Java byłaby lepsza. Chociaż jeśli lubisz funkcyjne to może Scala — to jest bardzo fajny język. Rozważyłbym też javascript i uderzyć we frontend i od razu mieć dobre wyjście na node.js.
Poza tym, zmagając się ze wskaźnikami i tym podobnymi rzeczami to prędko czegoś użytecznego nie zrobisz, bo cały czas będziesz się martwić, że nie ogarniasz. Patrz, boisz się smart poiterów, choć z nimi przecież jest łatwiej programować, ale ty po prostu chyba nie nadążasz. I to jest normalne, taki jest wzorzec uczenia, choć moim zdaniem dosyć niezdrowy. Inny nauczyciel, bardziej nowoczesny język. To może pomóc. ;)
A najważniejsze pytanie jest czy lubisz programować. Bo jeśli nie sprawia ci to przyjemności to nie ma co. Ale jak mówisz, że siedzisz długo to chyba cię to jara, to dobry znak. :)

4

Czytam forum z doskoku, a jednak dość często trafiam na podobne listy.
Wg mnie robisz błąd polegający na tym, że dla Ciebie celem jest nauka C, a środkiem są ćwiczenia, zajęcia itp.
Odwróć sytuację. C ma być środkiem do czegoś, a nie celem samym w sobie.

Kiedyś podjąłem tu na forum próbę zaangażowania uczących się do wspólnej zabawy
(https://4programmers.net/Forum/1569600)
Założeniem było postawienie celu do zrealizowania. Wtedy postawiłem na grę zrobioną w JS, ale to nie wypaliło.

Teraz mam inną propozycję :-).
Założenia:

  1. Działamy w systemie Windows.
  2. Używamy dowolnego kompilatora zdolnego do wygenerowania kodu pracującego pod systemem Windows.
  3. Celem ogólnym jest napisanie kilku filtrów rastrowych (tzn. procedur manipulujących obrazem).
  4. Nie używamy gotowych bibliotek, które realizowałyby implementowane przez nas filtry.
  5. Pierwszym celem szczegółowym jest napisanie filtru konwertującego obraz kolorowy w monochromatyczny.

Ogólnie jak działają filtry w fotografii tradycyjnej (analogowej) można zobaczyć np. tu:
https://pl.wikipedia.org/wiki/Filtr_(fotografia)

Naszym celem będzie przeniesienie filtrów analogowych w świat cyfrowy. Kiedy będziemy już mieli jeden taki filtr, to potem od naszej inwencji będzie tylko zależało co i jak będziemy filtrować.

Na początek program nie musi mieć żadnego interfejsu.
Program musi mieć trzy procedury:

  1. Procedurę wczytująca zdjęcie.
  2. Procedurę filtrująca (to - o co nam chodzi).
  3. Procedurę zapisującą przetworzone zdjęcie.

Żeby maksymalnie uprościć sprawę przyjmiemy, że otwieramy pliki *.bmp zapisane w trybie trueColor (24 bity/piksel) i w takim samym trybie będziemy je zapisywać.

No to zaczynamy. Poniżej jest kod otwierający bitmapę i wyświetlający ją wprost na ekranie.
Kod jest napisany w VS 2017, ale powinien zadziałać w każdym kompilatorze generującym kod pod Windows.
Spróbuj to uruchomić i daj znać czy działa. Wtedy zrobimy procedurę zapisującą i przejdziemy do filtrowania.
Jak stworzysz jakiś super filtr - to kto wie - może kasa popłynie strumieniem :-).
(Oczywiście - jeśli coś jest nie jasne - to pytaj).

#include "stdafx.h"
//#include "windows.h" w innych kompilatorach być może trzeba zamiast stdafx.h dać windows.h

BYTE* LoadBmp(const char* filename, DWORD& offBits) {
	BITMAPFILEHEADER bfh; //nagłówek pliku
	HANDLE h = CreateFileA(filename, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
	DWORD cRead;
	ReadFile(h, &bfh, sizeof(bfh), &cRead, 0);
	offBits = bfh.bfOffBits;
	BYTE* data = new BYTE[bfh.bfSize];
	ReadFile(h, data, bfh.bfSize, &cRead, 0);
	CloseHandle(h);
	return data;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	DWORD offBits;
	BYTE* data=LoadBmp("NAZWA_ZDJECIA", offBits); //w data jest załadowana bitmapa, NAZWA_ZDJECIA musi być pełną ścieżką do pliku *.bmp

	//Teraz wyświetlę bitmapę wprost na ekranie, Wiem, ze to nieładnie :-), ale co tam :-)
	BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)data;	//zrzutowałem data na nagłówek BITMAPINFOHEADER
	BYTE* bits = (BYTE*)(data + offBits);	//w miejscu data + offBits zaczynają się dane bitmapy
	
	//funkcja poniżej wyświetla bitmapę wprost na kontekście urządzenia
	HDC hdc = GetDC(0);//pobieram kontekst urządzenia dla ekranu
	StretchDIBits(hdc, 0, 0, bih->biWidth, bih->biHeight, 0, 0, bih->biWidth, bih->biHeight, bits, (BITMAPINFO*)bih, DIB_RGB_COLORS, SRCCOPY);
	delete[] data;	//usuwam dane
	ReleaseDC(0, hdc);	//zwalniam DC
    return 0;
}

1

Nie wiem po co się teraz uczyć C++ skoro są łatwiejsze języki programowania takie jak Rust, Swift, a również szybkie. Do tego w Rust i Swift możesz pisać ciężki backend strony.

0

@light, @elwis: W moim mieście jest hub C/C++ Wszystkie poważne firmy robią właśnie w tym. Patrzyłam zapotrzebowanie na Javę czy web development, ale bieda. Co najwyżej jakieś małe firemki, które słabo płacą (słabo mam na myśli 3.5k nawet jeśli masz kilka lat stażu) i start-upy. W sumie tylko jedna duża firma robi web (PHP), ale warunki pracy są tam słabe. Podobnie jest z edukacją. Jedyne na co można liczyć to C++/Python, ewentualnie Java, ale koszt mnie zabił (10k). W sumie zależy mi, żeby jakoś zacząć i zdobyć doświadczenie, a co będzie potem, to będzie potem, język to tylko narzędzie. Nie wykluczam jednak, że będę ostatecznie zmuszona do emigracji do innego miasta, jeśli będę chciała się rozwijać w czymś innym :/

0

To taki w sumie normal stuff, że C++ ciężko wchodzi. Jakoś półtora roku temu zacząłem się uczyć Cpp na poważnie i dopiero teraz jestem na takim poziomie, że pisanie w nim jest dość komfortowe i mogę się zabierać za poważniejsze rzeczy (haha).

Na programowanie trzeba czasu, a śpieszenie się z nauką czy kucie na blachę mija się z celem - szczególnie w Cpp. Jeśli z resztą utkniesz na jakimś temacie, np. wskaźniki czy chociażby coś ze standardowej biblioteki, to nie próbuj się uczyć na siłę, tylko pomiń ten temat na razie i zajmij się czymś innym. Dużo pisz kodu, a po czasie jakoś sama przyjdzie Ci ta wiedza z którą miałeś problem wcześniej. A no i Tetris w zasadzie to trochę rzucanie się z motyką na słońce, jeśli nie jesteś pewien swoich umiejętności - dobierz sobie trochę mniejsze projekty i stopniowo zwiększaj poziom zaawansowania.

Powodzenia.

0
Midi napisał(a):

, ewentualnie Java, ale koszt mnie zabił (10k).

Biorąc pod uwagę to co piszesz o twoich próbach w uczeniu to myślę, że już prędzej nauczysz się Javy samemu niż programować cokolwiek użytecznego na takim kursie C++. xD Nie jestem jakimś szczególnym fanem Javy, ale jest o niebo przyjaźniejsza niż C++. Zawsze możesz doraźnie brać lekcje z tematów, przez które nie możesz przebrnąć i żeby poradzić się w sprawie kierunku (rzecz najistotniejsza). :)

1

Zastanów się czy problemem jest tutaj C++ czy samo programowanie. Nie wiem na jakim poziomie są studia podyplomowe, może zbyt dużo w zbyt krótkim czasie. Tak czy siak każdemu kto pyta mnie o to jak zacząć polecam kurs CS50's Introduction to Computer Science (szybko wygooglasz). Zrobiony jest bardzo fajnie, i nie jest to banał dla kogoś kto zaczyna. Kurs jest darmowy ale po angielsku. Pozdrawiam

0

Nie wiem, lubisz szukać rzeczy w internecie?

U mnie działa to tak: ja lubię. Nie wiem, czy jestem dobry w szukaniu, ale lubię to robić. Więc jeśli mnie ciekawi jakieś zagadnienie, którego nie rozumiem (z programowania lub nie), biorę Google pod pachę, siadam i szukam, i szukam, i szukam. Wybieram kilka najlepiej wyglądających/najsensowniejszych z pozoru materiałów (bo znajduję zwykle taką ilość, że ho-ho). Następnie uczę się tak długo tego jednego zagadnienia, aż je zrozumiem.

W sensie: mogę uczciwie sam sobie powiedzieć, że rozumiem. Nie: komuś innemu, nie: porównując z odpowiedziami w kursie. Sam sobie. Takie osobiste przekonanie.

Rozumiem, że w toku nauki może wkraść się do Ciebie zniechęcenie, toteż taka forma może Cię zachęcić do nauki. Może nie zastąpi przerobienia kursu, ale powinno być dobrą odskocznią, jeśli lubisz/polubisz.

Ja rzadko to praktykuję, bo zwykle nie mam czasu... Ale to inna kwestia niż nauka. Zajmuje mi to czas zależnie od zagadnienia; może być godzina... dzień... tydzień... No, albo dłużej. Nie, nie patrz na moją naukę Angulara, którą opisuję od zbyt długiego czasu tutaj na mikroblogu... ;) Sam już nie wiem, jak ja to wytrzymuję, tak mi się nie chce. Ale podjąłem się, to skończę.

Jeśli uznasz, że nie masz czasu na takie poznawanie zagadnienia, aż zrozumiesz, to oczywiście korzystaj z innych rad. Uważam, że ostatecznie można się zmusić do nauki – ale do skorzystania z jakiejś porady chyba lepiej się nie zmuszać.


Jeszcze w kwestii nauki programowania. Początki pewnie muszą być trudne, aczkolwiek... jak sobie przypominam... jak kląłem kiedyś na rzeczy proste, tak dziś klnę na rzeczy trudne... komputer jest cały czas głupszy ode mnie. :/ Kiedyś złościłem się:

Dlaczego kompilator nie może mi powiedzieć po prostu: brakuje Ci tego i tego tu i tu, tylko pisze unexpected token...

Dzisiaj rozumiem takie rzeczy, i tak jak nauczyłem się pisać kod na wyższym poziomie abstrakcji, tak złoszczę się na wyższym jej poziomie:

Dlaczego ja wciąż tego nie rozumiem...


UPDATE: Może być też tak, że jesteś takim typem człowieka – jak ja – że w trakcie nauki masz wiele, wiele pytań (najczęściej chyba "dlaczego tak, a nie inaczej"). Mnie te pytania dość skutecznie hamują podczas nauki. Kurs może niewiele wyjaśnić poza jego główną ścieżką, Google nie zawsze pomoże (rzadko w kwestii "dlaczego") – ale gdyby był jakiś mentor, który siedziałby obok i odpowiadał na wszystkie pytania...

Nie wiem, czy lubisz zadawać pytania na forach, ale jeśli tak, to w przypadku braku mentora to jedna z najlepszych metod odpowiedzi na pytania, jakie znam.


UPDATE2: Jeszcze w kwestii nauki C++. To są dwie świetne references do C++ (oraz C):


UPDATE3: Jeszcze mi się skojarzyło, co mnie bardzo złości w przypadku wielu źródeł dostępnych w internecie (blogów, for itp.), Pisze się na przykład: "X potrafi to czy tamto...", "Z X najlepiej używać Y...", "Należy się zdecydować – A czy B..." Ogólnie nie jestem przeciwnikiem skracania wypowiedzi, ale w tych wszystkich przykładach irytujące jest zakładanie domyślności czytelnika. Że będzie wiedzieć, co to jest X, Y, A oraz B. Długo mógłbym nad tym ubolewać, ale krótko: wolałbym, żeby autorzy zawsze pisali: "język X", a nie "X"; "kompilator Y", a nie "narzędzie Y", czy samo "Y"; "biblioteka A czy biblioteka B", a nie "A czy B". Z uwagi po prostu na moją własną, hm, niedomyślność. Nie łapię wszystkiego w lot i nie mam problemów z przyznaniem się do tego; nie chcę szukać jakiegoś pojęcia na Wikipedii, żeby dowiedzieć się tylko tego, czy to jest biblioteka, czy framework.

1

C/C++ jest tragiczny jako pierwszy język. Zamiast cieszyć się programowaniem to ciągle walczysz z narzędziem. Wskaźniki, zarządzanie pamięcia, niewygodne operacje na stringach. To wszystko za dużo na start.

0
Midi napisał(a):

Tworzenie list mnie zabiło, a Tetris (chciałam taki wykonać na sfml'u) mnie pokonał.

Miałem podobnie. I co? I nic. Koduję od 20 lat zawodowo.

Nie zniechęcać się? To normalne? Może po prostu więcej kodzić i będzie dobrze?

Kodzić to z czego czujesz się noga. Jak uraziły Cię listy to pójdź krok dalej i zrób:

  • listę dwukierunkową + kilka podstawowych operacji
  • listę jednokierunkową i np. w niej wyszukiwanie binarne
  • tablicę hashująca bazującą na liście
  • niemutowalną listę jednokierunkową
    itd...

Przestań jak Ci się znudzi.

0

C jest kilka razy trudniejszy do opanowania niż Pascal. Wszystko robię w Pascalu. Ja nie pracuję jako programista, bo mam też inne zainteresowania i nie narzekam. Na rynku zleceń oprócz tego są jeszcze bardzo trudne projekty i jeżeli masz się męczyć żeby to opanować to lepiej sobie darować.

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