Wątek przeniesiony 2018-08-27 16:07 z Newbie przez furious programming.

Droga nauki programowania

0

Witam. Rok temu poszedłem na studia informatyczne z zerową wiedzą, z myślą, że "na studiach się nauczę" - oczywiście szybko mnie to zweryfikowało, i teraz wiem, że liczy się tylko praca własna.
Ale do rzeczy - mam tam obecnie jakieś bardzo podstawowe pojęcie o programowaniu, programowaniu obiektowym, ale pisząc na studiach projekt z GUI w C++ i Javie zrozumiałem, że mam jednak wiele braków w podstawowej wiedzy, a także robię sporo błędów w budowie całego programu, podziale klas i tak dalej...
Chciałbym więc od nowa, tym razem na spokojnie przerobić podstawy, nim wezmę się za tworzenie jakichś bardziej zaawansowanych projektów.
Co polecacie do nauki? Mam książkę Opus Magnum C++11, co oprócz tego oraz pracy nad algorytmami? Dodam, że chciałbym zacząć od C++, a następnie Java.

0

zdrowsze przesłanie co do projektowania obiektowego przekazuje wspólnota (ekosystem) Javy. Wiele kodu C++ jest fatalne pod kątem OOP.

Jak to ilustruję w takich koncepcjach:
**pierwsza fala **programowania obiektowego uczy "obiekt to jest rzecz, metoda to czynności". Pierwsze (słusznie zapomniane) obiektowe frameworki GUI (np borlandy) tego stylu uczuły. Tę pierwszą falę nalezy uznać za niewystarczającą / nieprawidłową.
druga fala dopiero pokazuje, że funkcjonalność może być klasą (interfejsem), tu mieszczą się wzorce (21 wzorców GoF)

EDIT: co do książek, używam słowa "dobra druga książka" - po podstawowym otrzaskaniu się z językiem. Dobrymi "drugimi ksiązkami" do Javy są Bruce Eckel'a, Joshua Blosh'a, trudniejsze tytułu Cay S. Horstmann'a

1

Hej,
uczenie się z książek, to raczej średni pomysł (ale może się ktoś z tym nie zgadzać). Ponieważ jesteś na studiach, więc nie ma się co piertegoolić. Odpal może taką specjalizację (jest 7 dni free, postaraj się może o refundację, studentowi powinni dać, o ile finanse nie są Twoją najmocniejszą stroną): https://www.coursera.org/learn/cloud-computing

0
marko2255 napisał(a):

Witam. Rok temu poszedłem na studia informatyczne z zerową wiedzą, z myślą, że "na studiach się nauczę" - oczywiście szybko mnie to zweryfikowało, i teraz wiem, że liczy się tylko praca własna.

E tam. Na studiach możesz się nauczyć systematyczności i tego, jak się uczyć - o ile nie będziesz przez nie przechodzić "po łebkach". A jak już opanujesz te dwie sprawy to nauka programowania (lub mechaniki płynów, lub wytrzymki, czegokolwiek) powinna ruszyć z kopyta :) Ale fakt, jak chcesz się czegoś nauczyć, to musisz dołożyć do minimum programowego trochę własnej inicjatywy.

Ale do rzeczy - mam tam obecnie jakieś bardzo podstawowe pojęcie o programowaniu, programowaniu obiektowym, ale pisząc na studiach projekt z GUI w C++ i Javie zrozumiałem, że mam jednak wiele braków w podstawowej wiedzy, a także robię sporo błędów w budowie całego programu, podziale klas i tak dalej...
Chciałbym więc od nowa, tym razem na spokojnie przerobić podstawy, nim wezmę się za tworzenie jakichś bardziej zaawansowanych projektów.

Jakiej konkretnie podstawowej wiedzy Ci brakuje? Nie wiesz jak działa stos, na czym polega rekurencja, albo czym jest metoda statyczna? Przerasta Cię polimorfizm? Wkuwanie takich rzeczy na sucho to trochę droga donikąd, jeśli chcesz sobie trochę uporządkować wiedzę to przystępując do projektu (mniej czy bardziej zaawansowanego) na początku po prostu rozplanuj sobie, co chcesz napisać, co to ma robić, wtedy się zastanów czego będziesz potrzebował, jak to możesz podzielić żeby miało ręce i nogi i było w miarę czysto napisane - i dopiero przystąp do pisania. Przy okazji będziesz miał okazję poznać diagramy UML :)

Co polecacie do nauki? Mam książkę Opus Magnum C++11, co oprócz tego oraz pracy nad algorytmami? Dodam, że chciałbym zacząć od C++, a następnie Java.

Nie, proszę, nie rób sobie tej krzywdy i nie zaczynaj od C++. Nie popełniaj tego błędu co tysiące przed Tobą. Ja wiem, C++ to klasyka gatunku, coś czego uczą wszędzie i wszyscy i mało kto z nim nie miał do czynienia choćby przelotnie, a kto nie miał w ręku "Symfonii C++ Standard" niechaj pierwszy rzuci kamieniem, ale... po prostu nie. Jak chcesz się nauczyć jeździć na nartach, to zacznij na łagodnym pagórku, a nie od razu stromej góry zarośniętej chaszczami, najeżonej drzewami i z wystającymi głazami.

Wybierz sobie jakiś mniej kobylasty język - choćby i C, jeśli nie zależy Ci na obiektowości.

Albo Pythona.

Albo C#.

Nawet Java by uszła, choć i tak mam wątpliwości czy to dobry język na pierwszy ogień. Ale da się w tym pisać, a z JavaFX sklecenie aplikacji z GUI nie jest w sumie takie trudne.

A C++ potraktuj jako alternatywę dla podcinania żył czy BDSM.

0

W tych książkach uczą C++11 a już mamy C++20, który dużo ułatwia, lenistwo i stare nawyki autorów książek jest niesamowite.

0

Dziękuję bardzo za odpowiedzi.

Jakiej wiedzy mi brakuje? Przede wszystkim wszystko co związane z obiektowością rozumiem "po łebkach" - na studiach rzucono nam do zrobienia projekt z programowania obiektowego w dwóch językach, gdzie projekt w C++ do oddania był do 8 tygodnia semestru, a np. polimorfizm był tłumaczony na wykładzie w 12 tygodniu semestru :) Więc musiałem szybko ogarnąć o co chodzi, a przez to no nie w pełni to rozumiem jak powinienem. Wydaje mi się, że nauka tego jeszcze raz, wraz z przykładami pozwoliłaby mi to w pełni zrozumieć. Duży problem mam także w budowie i zaprojektowaniu aplikacji - jakie klasy utworzyć, kiedy stworzyć klasę abstrakcyjną, jak powinny wyglądać relacje między klasami i tak dalej...

Co do C++ - problem jest taki, że jest to język dość mocno ciśnięty u mnie na uczelni - projekty będę zmuszony robić właśnie w tym języku, więc chcąc nie chcąc - muszę od niego zacząć ;C

0
marko2255 napisał(a):

Dziękuję bardzo za odpowiedzi.

Jakiej wiedzy mi brakuje? Przede wszystkim wszystko co związane z obiektowością rozumiem "po łebkach" - na studiach rzucono nam do zrobienia projekt z programowania obiektowego w dwóch językach, gdzie projekt w C++ do oddania był do 8 tygodnia semestru, a np. polimorfizm był tłumaczony na wykładzie w 12 tygodniu semestru :)

Nie przejmuj się, na studiach to norma. Obejrzyj sobie parę dobrych kursów, zrób projekt w którym faktycznie OOP może się przydać - choćby grę, nawet tekstową, w której będzie kilka klas postaci itp - przy okazji nauczysz się paru podstawowych wzorców :) Na czymś takim łatwiej Ci będzie to zrozumieć niż realizując zadanie napisz program w którym dwie klasy podziedziczą hur dur wspólny interfejs hur dur z metodą helloWorld() i jedna wyprintuje "I have a pen" a druga "I have an apple"

Więc musiałem szybko ogarnąć o co chodzi, a przez to no nie w pełni to rozumiem jak powinienem. Wydaje mi się, że nauka tego jeszcze raz, wraz z przykładami pozwoliłaby mi to w pełni zrozumieć. Duży problem mam także w budowie i zaprojektowaniu aplikacji - jakie klasy utworzyć, kiedy stworzyć klasę abstrakcyjną, jak powinny wyglądać relacje między klasami i tak dalej...

Norma, witamy na uczelni. Na Javie miałem mieć kompletny harmonogram prac na cały semestr, gdzie o Javie mało kto wiedział cokolwiek więcej, że istnieje, w dodatku musiałem wymyślać na siłę zadania podczas gdy gdzie indziej sztucznie zbijałem dwa w jeden podpunkt żeby każda sekcja (sieci, bazy danych, gui, współbieżność etc) miały dokładnie po 4 podpunkty. Szczyt głupoty, poświęciłem chyba z 600h w 3 miesiące na ten jeden zasrany projekt, ma chyba 5,5kSLoC czy jakoś tak, a nawet nie mogę się nim za bardzo pochwalić bo pisałem go po nocach i jest napisany po prostu strasznie. Ale z drugiej strony po takim maratonie śmierci nauka czegokolwiek to już właściwie pestka.

Co do C++ - problem jest taki, że jest to język dość mocno ciśnięty u mnie na uczelni - projekty będę zmuszony robić właśnie w tym języku, więc chcąc nie chcąc - muszę od niego zacząć ;C

Co to za uczelnia i wydział? Ten kult C++ brzmi dziwnie znajomo

2

AnyKtokolwiek
druga fala dopiero pokazuje, że funkcjonalność może być klasą (interfejsem), tu mieszczą się wzorce (21 wzorców GoF)

Z jednej strony to dobrze, bo człowiek zaczyna myśleć bardziej abstrakcyjnie... z drugiej strony z abstrakcjami można łatwo przesadzić i tworzyć klasy, które nic nie robią od strony biznesowej a tylko zaspokajają pseudointelektualną potrzebę robienia abstrakcji czy chęć poczucia profesjonalistą, bo się użyło "wzorca".

Dlatego wydaje mi się, że:

pierwsza fala programowania obiektowego uczy "obiekt to jest rzecz, metoda to czynności".

mimo, że owszem, niewystarczające, to jednak jest bardziej KISS i nie powinno być zapomniane (i nie sądzę, żeby było, są podejścia takie jak DDD, które mocno podkreślają tworzenie obiektów dziedzinowych, takich, które reprezentują faktycznie istniejące "rzeczy" jak User czy Product.

Chociaż to nie muszą być koniecznie rzeczy, bo obiektem mógłby być np. MoneyTransfer czyli raczej pewien proces, ale dalej mimo wszystko będzie to coś, co będzie miało jakieś odzwierciedlenie w realnym świecie (a nie będzie to implementacja wzorca, która odniesienia do świata nie ma)

Generalnie uważam, że obie te rzeczy są potrzebne (zarówno abstrakcje jak i obiekty reprezentujące konkretne biznesowe "rzeczy" czy czynności).

0

Daruj sobie Grębosza i daruj sobie kursy[to nie jest Python, że na kursiku Ci pokażą fajną składnie i wszystko będzie cacy].
https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list

0
LukeJL napisał(a):

AnyKtokolwiek
druga fala dopiero pokazuje, że funkcjonalność może być klasą (interfejsem), tu mieszczą się wzorce (21 wzorców GoF)

Z jednej strony to dobrze, bo człowiek zaczyna myśleć bardziej abstrakcyjnie... z drugiej strony z abstrakcjami można łatwo przesadzić i tworzyć klasy, które nic nie robią od strony biznesowej a tylko zaspokajają pseudointelektualną potrzebę robienia abstrakcji czy chęć poczucia profesjonalistą, bo się użyło "wzorca".

...

mimo, że owszem, niewystarczające, to jednak jest bardziej KISS i nie powinno być zapomniane (i nie sądzę, żeby było, są podejścia takie jak DDD, które mocno podkreślają tworzenie >obiektów dziedzinowych, takich, które reprezentują faktycznie istniejące "rzeczy" jak User czy Product.

Chociaż to nie muszą być koniecznie rzeczy, bo obiektem mógłby być np. MoneyTransfer czyli raczej pewien proces, ale dalej mimo wszystko będzie to coś, co będzie miało jakieś >odzwierciedlenie w realnym świecie (a nie będzie to implementacja wzorca, która odniesienia do świata nie ma)

Right. Tak, "pierwsza fala"nie została nigdy przekreślona, tylko uzupełniona.

Zapomniałem napisać - nie jestem religijnym wyznawcą wzorców. BTW brakuje w edukacji IT stwierdzenia, że to nie jest obowiązek, religia, tylko prozaiczna obserwacja życia "o nas stolarzy w przeszłości / do tej pory często stosowano złącze na jaskółczy ogon" (cytat za książką poniżej - dwa słowa jaskółczy ogon już mają informację dla fachowca, nie tzreba tłumaczyć).

I nasza refleksja o wzorcach jest wtórna do dorobku p. Alexandra (architekta budowlanego), który dokonał właśnie werbalizacji wzorców w swojej branży

Książka już wyczerpana, polecam jak kogoś cieszy głębszy sens DLACZEGO WZORCE, albo ktos nie lubi wzorcowego wariactwa
Projektowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II, Alan Shalloway, James R. Trott

0

Masz dobrą książkę do podstaw to ją przestudiuj porządnie a potem bierz się za bardziej zaawansowane podręczniki.

0

Dobra książka to podstawa! Zastanawia mnie, czemu nie mogą ulepszyć C++ na bardziej przyjazny język programowania jak Rust czy Swift. I tak to nie jest kompatybilne wstecz ze starymi standardami. Po jakiego wacka tak im się męczyć, cofać do C i jakaś ubzdurana kompatybilność wsteczna. Java mogła całkowicie zmienić konstrukcję Switch w wersji 11 podobną do Kotlina? A w C++ jest podejście, nie ruszać bo to ze szkła... Ach czekam na kompilowany język bez nulla z automatycznym odśmiecaniem pamięci, prosty jak Kotlin i Swift, bezpieczny o ładnej składni. Przy dzisiejszej mocy obliczeniowej procesora Garbage Collection powinien być w standardzie każdego kompilowanego języka programowania.

0

Kiedy jedni zaczynają, ty już idziesz na emeryturę :>

Nie ważne jaki język weźmiesz, w każdym używa się takich samych logicznych praw.

1
Mały User napisał(a):

Ach czekam na kompilowany język bez nulla z automatycznym odśmiecaniem pamięci, prosty jak Kotlin i Swift, bezpieczny o ładnej składni.

Pisz w Golangu. Ma wprawdzie nil, ale nie ma null a jest prostszy w obsłudze od C/C++. No i jest chyba trochę mniej gimnastyki przy współbieżności.

Przy dzisiejszej mocy obliczeniowej procesora Garbage Collection powinien być w standardzie każdego kompilowanego języka programowania.

Ahem, obliczenia naukowo-techniczne

Ahem, FORTRAN wiecznie żywy, a mimo to liczymy tygodniami na wielkich klastrach.... ale spoko, przejdźmy ze wszystkim na języki mające GC, a najlepiej interpretowane z dynamicznym typowaniem :>

0

Chyba te systemy pisane w C++ to tylko HaikuOS. Systemy komputerowe pisze się w C i ASM, ewentualnie teraz takie wynalazki jak RedoxOS i FuchsiaOS w języku Rust.

0

No tak, bo słowo system to od razu == OS

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