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?

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ę...

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".

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ć).

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...

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

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).
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.

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.

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 :]

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