C++ - Przejście na poziom zaawansowan

C++ - Przejście na poziom zaawansowan
1

Cześć,
Od gimnazjum korzystałem z C++. Pisałem proste programy - głównie algorytmiczne rzeczy pod olimpiadę. Kiedyś w II gimnazjum (jakieś 5 lat temu) czytałem symfonię C++, a tam było sporo rzeczy z których nie korzystam na co dzień robiąc zadanka z topcodera, codechefa czy codeforces.

Mam pewną wiedzę, intuicję programistyczną, operuję w C++ z łatwością - takie zadanie jak TC DIV2 250, gdzie głównie chodzi o szybki i poprawny kod, przelanie pomysłu z głowy na komputer przychodzi mi bez problemu.
Chciałbym teraz przeskoczyć o poziom wyżej. Z klepacza algorytmów na zaawansowanego programistę C++.

Nie korzystam z wyjątków, dziedziczenia, polimorfizmu, klasy piszę sporadycznie, z STLa znam głównie vector, map, list, stack, algorithm. Czego powinienem się nauczyć by zabrać się na przykład za tworzenie i pomoc w open-source? Z czego na co dzień korzysta się w firmach programistycznych ?

Czego wg was powinienem się nauczyć? Skąd?

Zellus
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 4 lata
  • Lokalizacja:Wrocław
  • Postów:474
1

Nie korzystam z wyjątków, dziedziczenia, polimorfizmu, klasy piszę sporadycznie

Zacząłbym od tego, naucz się wyjątków, dziedziczenia, polimorfizmu i pisania klas :) nie napisałeś tez nic o template - ich też się dosyć często używa w C++.
Dobrze poznaj też jakieś IDE, osobiście jak kiedyś pisałem to wystarczał zwykły edytor tekstu. Ale jak zapoznasz się dobrze z jakimś dobrym edytorem to znacznie Ci to pomoże, w szczególności jak zaczniesz używać polimorfizmu.

Z czego na co dzień korzysta się w firmach programistycznych ?

Korci mnie aby napisać że z szybszych (pod względem developmentu) języków, ale tego nie zrobię...

spartanPAGE
Oj nie przesadzaj, C++ jest w top 10 używanych języków
Zellus
Wiem że trochę to wyolbrzymiłem, ale miałem na myśli fakt że ogólnie coraz mniej nowych projektów startuje w tym języku.
spartanPAGE
Też masz w tym swój udział :P spokojnie
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
10

Robienie zadań na olimpiadę ma się tak do programowania jak rozwiązywanie szarad do pisania książki.

Czego mi w tej historii zabrakło:

Tego raczej się nie doświadcza w jedno-stronicowych programach. Dlatego warto się tym zainteresować.

Edit: dodałem Andrei'a, polecam jego "Modern C++ Design".

edytowany 2x, ostatnio: vpiotr
Zobacz pozostały 1 komentarz
several
Zasejwowałemm sobie tą stronę w swoim TODO dla tego posta. Aczkolwiek niektóre punkty sobie odpuszczę, te które w moim konkretnym przypadku są nieaktualne lub byłyby typem pracy określanej "sztuką dla sztuki".
vpiotr
@several: Chyba zacznę robić jakiś blog technologiczny, mam kupę takich zestawień. C/C++/Java/Delphi/Python dla przedszkolaków i programistów z brodą.
spartanPAGE
Tak się teraz zastanawiam... Jak ktoś w xcode robi to źle rozumiem?
vpiotr
@spartanPAGE: źle rozumiesz. To są główne, a nie wszystkie kierunki.
vpiotr
trochę więcej tutaj: http://bit.ly/1p9ho4X
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:8 minut
1

IMO najlepiej zająć się długoterminowym projektem. Czemu? Bo w ten sposób będziesz musiał naprawiać swoje własne bugi i będziesz wtedy rozumiał co robiłeś wcześniej źle.
Jest to o wile lepsze niż, gdy ktoś na siłę próbuje ci wytłumaczyć, że masz źle, a ty mu odpowiesz: "przecież działa".
Poznanianie wszystkich technologi i nie ma sensu bez długoterminowej praktyki, bo efekt będzie taki jak studenckie 3*Z (zakuć, zdać, zapomnieć).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Lucas Darkstorm
Lucas Darkstorm
Raczej 4*Z - Zakuj, Zdaj, Zapomnij, Zapij xD.
MA
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 3 lata
  • Postów:166
0

Zdecydowanie polecam książkę Scotta Mayersa "Effective C++". Nie zapomnij też o praktyce czyli kodowaniu :)

0

Cześć,
Dzięki za odpowiedzi :) Polecicie od czego zacząć? Dużo tego i trochę mnie to przeraża...

gośćabc
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Szczecin
  • Postów:500
0

ja bym zaczął z grubej rury; mmo server; poznasz wszystko co potrzebne, aby być dobrym koderem; dużo literatury i googlowania, znajomość angielskiego to minimum

edit:

a tu opinia kogoś kto chciał tak zacząć, ale zaczął inaczej:

http://gamedev.stackexchange.com/questions/21596/how-do-i-start-writing-an-mmo-game-server

edytowany 1x, ostatnio: gośćabc
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
1

Zadałeś pytanie w taki sposób, że można na nie odpowiedzieć na tysiąc sposobów ;)
Co to znaczy znajomość C++ w stopniu zaawansowanym? Ano może to oznaczać, że w małym palcu masz takie zagadnienia jak np: perfect forwarding / znajomość wszystkich (6 sic!) reguł typowania = zawsze wiesz jaki typ otrzymasz (dla przykładu masz funkcję f: decltype(auto) f() { auto val = sth(); return val; } i wiesz czym to się różni od takiej funkcji g: decltype(auto) g() { auto val = sth(); return (val); }) / rozumiesz, że spora część idiomów C++ (< C++11) jest tylko po to, żeby chronić się przed samym językiem, np. safe bool / rozumiesz absolutnie wszystkiego kody dowolnego pana z listy Meyers/Alexandrescu/Sutter.
Pewnie nie istnieje osoba, która spełnia wszystkie te wymagania, a to przecież dopiero wierzchołek góry lodowej ;)
To co moim zdaniem warto by znać:

  • TMP, a co za tym idzie programowanie funkcyjne
  • STL i wszystko co jest w std::
  • idiomy (przede wszystkim RAII)
  • multithreading
  • wiedza nt CPU cache (cache line, cache coherency)
  • różne zagadnienia około językowe: exception safety, copy elision, sequence point, undefined behavior, argument-dependent name lookup, ...
    Czy ja to wszystko znam? Nie! Co nie oznacza, że nie staram się poznawać;)
    Jeśli idzie o sposoby nauki to w Twoim przypadku zacząłbym od tego co dotychczas pomijałeś (wyjątki, OOP, podstawy template).
edytowany 1x, ostatnio: satirev
Zobacz pozostałe 16 komentarzy
Azarien
@Satirev: twierdzisz że type traits i własny iterator to potrzebna wiedza?
vpiotr
@Azarien, wiedza o tym że np. iterator nie powinien nic dynamicznie tworzyć bo jest kopiowany na potęgę wewnątrz STL (w kolejnych krokach pętli algorytmu) bywa przydatna...
Azarien
ale jak często pisze się własny iterator?
vpiotr
za każdym razem jak tworzysz nowe kontenery pewnie...
satirev
@Azarien: własne iteratory mniej, ale type traits warto znać np. żeby nie forsować zawsze SFINAE i w zamian użyć tag dispatching.
SJ
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Bielsko-Biała
  • Postów:11
0

Ja bym proponował (nie wiem być może się mylę) zająć się czymś czysto numerycznym/obliczeniowym + optymalizacja. Tworzenie od podstaw czegoś takiego jak np. stronnicowanie w google (na razie tylko takie coś przychodzi mi do głowy) (rozwiązywanie takiego typu problemów)...tak żeby było dużo obliczeń numerycznych. Projektowania i pisania aplikacji (najlepiej zacząć od kartki) jakie mają być klasy, jak ma wszystko działać i jak zaprojektować aplikację tak, żeby kod potem się nie "rozjechał". To ja bym nazwał jako drugą część fachowości programisty - projektowanie, numeryka. Tylko nie wiem jak z tym, bo teraz prawie wszystko zastępuje się narzędziami (więc też tutaj radzę zapoznać się z tym), i takich rzeczy prawie już się nie pisze. Trzecią bym nazwał znajomość wszystkich magicznych sztuczek w językach programowania np. w C++. Powiem tak jak ciągnie Cię w stronę programowania to to wszystko ogarniesz.

edytowany 2x, ostatnio: shJeff
Zobacz pozostałe 5 komentarzy
vpiotr
C to nie język z deklaratywną poprawnością jak Ada czy inne jeszcze lepsze cudaki. W C/C++ const to taki "hint" dla kompilatora że jeśli by dał radę, to niech sprawdzi czy czasami czegoś nie nadpisujemy. Zresztą programy w Ada też się wykładają: http://en.wikipedia.org/wiki/Ariane_5_Flight_501#Arithmetic_overflow
vpiotr
Coś o poprawności kodów Ada vs C (nie chce mi się szukać czegoś bardziej rozbudowanego): http://sunnyday.mit.edu/16.355/c130j.pdf
Azarien
@pasasap: const volatile oznacza, że zmiennej nie wolno nam zmieniać, ale może zmienić wartość samoistnie - np jest to rejestr sprzętowy albo zmienna modyfikowana przez inny wątek (z tym ostatnim należy uważać: samo volatile często nie wystarcza do osiągnięcia thread-safety).
Azarien
@vpiotr: z tym Ariane to wyłożyła ich właśnie zbyt restrykcyjna kontrola runtime: gdyby komputer „wzruszył ramionami” na ten overflow i działał dalej, to nic by się nie stało (najwyżej jeden z kontrolerów zauważyłby „anomalię” na ekranie i również wzruszyłby ramionami). a tak, ten zupełnie zbędny wyjątek wyłożył cały program i pozostało tylko wcisnąć Duży Czerwony Przycisk.
vpiotr
Są systemy w których overflow związany jest nie tyle z dodatkowym pikselem na ekranie tylko np. z włączeniem dopalaczy lub nie. Dobrze że to był lot bezzałogowy.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1

@shJeff: programowanie stronicowania stron www to nie są problemy numeryczne (chyba że na poziomie podstawówki).
Ale jest to jakiś pomysł żeby zahaczyć o temat web.
Można zrobić w C/C++ program CGI i cieszyć się jego działaniem. Będzie to tak mało praktyczne że aż przyjemne :)

Dlaczego mało praktyczne? C/C++ są tak mało dynamiczne że robienie w nich stron jest bardzo pracochłonne.
Ale prosta strona w C jest ciekawą wprawką. Zwłaszcza jak ktoś się przymierza do Embedded C/C++ i programowania np. routerów lub dysków sieciowych.
Albo serwisów RPC (moi).

Polecam:
http://www.ritlabs.com/en/products/tinyweb/
http://itsecuritylab.eu/index.php/tag/tiny-web-server-cgi/

(GNU/komercja) https://code.google.com/p/mongoose/
(MIT) https://code.google.com/r/vpiotr-mongoose-cpp/

0

Nie czytaj nawet tytułów tych wszystkich głupot... magisterków z uniwerków.

Bierzesz porządny projekt - jakiś większy program na tapetę, no i robisz go.
I wtedy bardzo szybko się dowiesz czego potrzebujesz.

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 dni
3
fur napisał(a)

Nie czytaj nawet tytułów tych wszystkich głupot... magisterków z uniwerków.

To nie jest kopanie rowów, tutaj wiedza jest dość przydatna :]

edytowany 3x, ostatnio: spartanPAGE

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.