Dlaczego nie proponujecie aby zaczynać od języka C++

1

Dla tych u których wiedza o C++ zatrzymała się na studiach przy nieradzeniu sobie ze wskaźnikami i się wypowiadają na temat C++.

TAK RESTful server w C++!!! i to jeszcze na unikernelu!

W ogóle to polecam całą listę z CppCon2016:
PS. Dopiero jestem na pozycji 24...

4
Niebieski Orzeł napisał(a):

TAK RESTful server w C++!!! i to jeszcze na unikernelu!

http://adrianzandberg.pl/cobol-on-wheelchair/

3
somekind napisał(a):
Niebieski Orzeł napisał(a):

TAK RESTful server w C++!!! i to jeszcze na unikernelu!

http://adrianzandberg.pl/cobol-on-wheelchair/

Pomijając Cobola który jest nieczytelny i pomijając to że nie obejrzałeś filmu...
Co jest złego w kawałku kodu poniżej? (C++ jakby ktoś nie rozpoznał, a pewnie będą tacy bo nie ma wskaźników)

  // Serve index.html on GET /
  router.on_get("/",
  [disk] (auto, auto res)
  {
    disk->fs().cstat("/index.html",
    [res] (auto err, const auto& entry)
    {
      if(err)
        res->send_code(http::Not_Found);
      else
        res->send_file({disk, entry});
    });
  });

Czy to wygląda gorzej niż w node.js?

var http = require('http'),
    fs = require('fs');


fs.readFile('./index.html', function (err, html) {
    if (err) {
        throw err; 
    }       
    http.createServer(function(request, response) {  
        response.writeHeader(200, {"Content-Type": "text/html"});  
        response.write(html);  
        response.end();  
    }).listen(8000);
});

Powiem tak, nie będę oceniał czy C++ jest dobrym językiem na początek. Kieruję się innymi kryteriami niż inni - po prostu lubię C++, lubię programować, to że mogę na tym zarabiać ma dla mnie drugorzędne znaczenie. Inaczej, wybierając C++ nie kierowałem się, czy to przyszłościowy język, czy będzie dużo ofert pracy, czy będzie można na tym łatwo zarobić. Ja to lubię.
Nie mam też doświadczenia pedagogicznego żeby oceniać czy C++ jest dobry do nauki programowania.
Co więcej, moja pierwsza praca to był webdev, głównie JavaScript i C#. I po całych dwóch latach zostałem programistą C++, gdyż wiedziałem że będę lepiej się czuł. I tak jest, chociaż do utrzymania jest projekt na cztery miliony linii kodu.

Mogę też zgodzić się z wymienianymi przez innych wadami C++, chociaż mógłbym polemizować.

Ale gdy na temat C++ wypowiadają się osoby które C++ widzą jako C z klasami, gdzie są wskaźniki (brrrrr!), czyli ludzie u których wiedza na temat C++ zatrzymała się na studiach i przedstawiają C++ jako język poprzedniej epoki, to będę protestował.

Postaram się być obiektywnym.
C++ opiera się na innych założeniach niż Java, C# czy inne języki. Polecam obejrzeć (jak ktoś będzie zainteresowany)
To że założenia są inne nie oznacza od razu, że język jest zły (w drugą stronę tak samo: inne założenia nie sprawiają, że język jest dobry).
C++ cały czas się rozwija (chociaż nie tak szybko jak C#, ale szybciej niż Java). Mamy C++11, C++14, w przyszłym roku jest planowany C++17 oraz są plany na C++20. Język rozwija się wolno,
ale każdy element języka jest przemyślany i sprawdzony przed wdrożeniem do języka (chociaż są wyjątki: std::memory_order_consume). W skład komitetu C++ wchodzą reprezentanci wielu firm, zatem dojście do porozumienia zajmuje dużo czasu. Ale tragedii nie ma. Np. w C++17 będziemy mieli Structured Bindings, podobny feature jest planowany w C# 7.

C++ wymaga dużej wiedzy, także entry level jest dużo wyższy niż w innych językach. Mogę się zgodzić, że to działa na niekorzyść C++, jeżeli ktoś chce uczyć się programowania w celu zarobkowym. Ale niektórzy mówią o Haskellu czy Scali, myślę, że są to języki jeszcze bardziej trudne.

C++ nadal żyje, chociaż przez to że większość rynku jest zalewana przez webdev i drugie z kolei mobile nie widać tego. C++ to nie tylko aplikacje desktopowe, nie tylko programowanie systemowe,
ale także obliczenia naukowe, automotive, embedded, automatyka przemysłowa.

Wystarczy spojrzeć na ilość filmów z CppCon 2016 (123 filmy), czy też spojrzeć na konferencję Code::Dive która ostatnio była we Wrocławiu, gdzie wystąpiło kilka bardzo znanych osób ze środowiska C++.

Nadal nie rozumiem dlaczego C++ jest szkalowany, a ktoś wkleja mi tu linka to rest servera w cobolu...

0

No dobrze C++ jest cool bo go Microsoft kazał stworzyć jako lepsze C. Podaj mi jakieś książki, ebooki do nauki C++14. Poza grami, czy kompilatorami języków większego zastosowania nie ma. Nawet pan Jerzy Grębosz już nie pisze nowych książek o nowszych standardach C++17+.

2

Niektórzy tutaj zdają sobie sprawę z tego, że w C++ pisze się obecnie zupełnie inaczej niż kiedyś. Ja to nawet napisałem w poprzednim poście.

Ale jest jeden duży problem - przed niskim poziomem i tymi wrednymi wskaźnikami wcale nie ma ucieczki. One są tylko ukryte i czekają na okazję by odgryźć Ci nogę. Można pisać kod w stylu Modern C++, a i tak łatwo wpakować się w bagno undefined behaviour na 100 różnych sposobów bez ani jednego użycia new czy *.

Podsumowując:
Przez lata zastąpiono deski wężami gumowymi owinietymi folią bąbelkową i teraz pies bardziej przypomina osmiornicę. Ale nadal jest to tylko pies z doczepionymi nogami.

0
Niebieski Orzeł napisał(a):
  // Serve index.html on GET /
  router.on_get("/",
  [disk] (auto, auto res)
  {
    disk->fs().cstat("/index.html",
    [res] (auto err, const auto& entry)
    {
      if(err)
        res->send_code(http::Not_Found);
      else
        res->send_file({disk, entry});
    });
  });

Czy to wygląda gorzej niż w node.js?

Tak, bo nikt nie pisze w gołym Node (tak jak i Ty nie nie jedziesz bez frameworka):

const express = require('express');

express()
  .get('/', (req, res) =>
    res.sendFile(__dirname + '/index.html', err => res.sendStatus(404))
  )
  .listen(2000);

W zasadzie to to odpala całą apkę, odpowiednikiem tego co napisałeś jest raczej:

router
  .get('/', (req, res) =>
    res.sendFile(__dirname + '/index.html', err => res.sendStatus(404))
  );
0
Pijany Kot napisał(a):

No dobrze C++ jest cool bo go Microsoft kazał stworzyć jako lepsze C.

WRONG https://media.giphy.com/media/3oz8xLd9DJq2l2VFtu/giphy.gif

Krolik napisał(a):

Ale jest jeden duży problem - przed niskim poziomem i tymi wrednymi wskaźnikami wcale nie ma ucieczki. One są tylko ukryte i czekają na okazję by odgryźć Ci nogę. Można pisać kod w stylu Modern C++, a i tak łatwo wpakować się w bagno undefined behaviour na 100 różnych sposobów bez ani jednego użycia new czy *.

WRONG https://media.giphy.com/media/3oz8xLd9DJq2l2VFtu/giphy.gif

Jak z wami rozmawiać gdy podajecie informacje które nie są prawdziwe? Programowaliście kiedyś w C++ czy tylko wspomnienia z wykładów o ósmej rano w poniedziałek?
Czuję się jakby ktoś mi ubliżał. To tak jakby powiedzieć że C# to taka java od microsoftu. A o UB nie wspomnę, problemy z pisaniem w C++ nie wynikają z UB...

PS. Bez urazy, doceniam C#.

0

@Maciej Cąderek Racja, w node.js można krócej. Dzięki za poprawienie mnie.

1

http://flyingfrogblog.blogspot.com/2013/10/herb-sutters-favorite-c-10-liner.html?m=1

https://news.ycombinator.com/item?id=7587978

http://pcwalton.github.io/blog/2013/04/12/a-hard-case-for-memory-safety/

I jeszcze na deser :
http://www.joelonsoftware.com/articles/LeakyAbstractions.html

Ten ostatni nie dotyczy tylko C++ ale do C++ świetnie pasuje, bo w C++ jest mnóstwo takich cieknących abstrakcji. Np. weź referencję do elementu wektora i zrób na wektorze push_back. Pozornie nie powinno być problemu. W Javie, Pythonie i innych będzie działać zgodnie z oczekiwaniem. W C++ nieskopoziomowe szczegóły implementacyjne wektora wyskoczą z ukrycia i ugryzą Cię wtedy, kiedy najmniej się tego spodziewasz.

0

Lepiej zacząć C -> Assembler -> Język skryptowy -> C++

C nauczymy się bez mózgowo, bo tak to wygląda, ale są to początki.

Potem Assembler i budujemy te poznane funkcje w C. Znamy lepiej C i wiemy jak to działa.

Dochodząc do skryptowych języków mózg pęka od abstrakcji i wyobrażeń, można dostrzec w wyobraźni jak byśmy to
samo zaimplementowali w c i nawet assemblerze nie sięgając do tego języka, ale jakby się chciało to szybko możemy to zaimplementować.

C++ rozjaśnia resztę niejasności, i uzupełnia o masę logicznych abstrakcji, które pomagają w rozumieniu i pamiętaniu.

Ucząc się algorytmów w między czasie, nie czytamy opisu, ale patrzymy na obrazki tego co się z danymi dzieje + dodajemy logiczną abstrakcję czyli nazwę tej czynności.

Algorytm jest zapamiętany mnemonicznie, odwołanie jest połączone 3 skojarzeniami, rodzaj algorytmu(logicznie) -> typ algorytmu(logicznie + eng. nazwa) -> implementacja w wyobraźni. Taki zapis zostaje z nami do końca życia.

Wówczas jak dany problem wystąpi podświadomość automatycznie znajdzie podobieństwo, w wyidealizowanym przez nas w wyobraźni algorytmie i od razu wiemy, że to to.

Realna implementacja wygląda inaczej, ale później ta w wyobraźni po prawdziwym zaimplementowaniu jest sama ulepszana przy ponownej próbie wizualizacji i automatycznie ze względu na wzbogaconą wiedzę praktyczną.

2
Niebieski Orzeł napisał(a):

Pomijając Cobola który jest nieczytelny i pomijając to że nie obejrzałeś filmu...

Nie obejrzałem, bo jest to dla mnie umiarkowanie ciekawe, a na takie rzeczy nie mam obecnie czasu. Ale przewinąłem i naszło mnie oczywiste skojarzenie. Ktoś zrobił coś, bo się da. Wiele rzeczy się da, nie wszystko ma sens.

Nie mam też doświadczenia pedagogicznego żeby oceniać czy C++ jest dobry do nauki programowania.

Nie chcę się czepiać, ale to jakby główny temat tego wątku. :-)

Co więcej, moja pierwsza praca to był webdev, głównie JavaScript i C#. I po całych dwóch latach zostałem programistą C++, gdyż wiedziałem że będę lepiej się czuł. I tak jest, chociaż do utrzymania jest projekt na cztery miliony linii kodu.

Widzisz - wybrałeś świadomie, mając już jakieś doświadczenie. To zupełnie inna sytuacja niż zaczynanie od tego języka.

C++ nadal żyje, chociaż przez to że większość rynku jest zalewana przez webdev i drugie z kolei mobile nie widać tego. C++ to nie tylko aplikacje desktopowe, nie tylko programowanie systemowe, ale także obliczenia naukowe, automotive, embedded, automatyka przemysłowa.

No właśnie, C++ ma swoje nisze. Te nisze są coraz bardziej specjalistyczne i coraz bardziej niszowe. Czy warto zaczynać od języka o niszowym przeznaczeniu? Biorąc pod uwagę jego trudność i specyfikę, prędzej można się zniechęcić niż nauczyć się programować. Bo programowanie w C++ to walka z problemami języka, a nie rozwiązywanie problemów, które aplikacja ma rozwiązać.

Nadal nie rozumiem dlaczego C++ jest szkalowany, a ktoś wkleja mi tu linka to rest servera w cobolu...

Cobol też się rozwija, też są konferencje, i nawet serwery restowe. To taka sama argumentacja, jakiej Ty używasz.

1

Niezłe rozprawy wszyscy popisali a problem jest taki że musisz najpierw nauczyć się programować i myśleć tak żeby umieć przerzucić pomysł na algorytm etc. Najlepiej wybrać któryś z języków który jest używany, ma wzięcie i istnieje jak najwięcej języków do niego podobnych by przerzucanie się między nimi w późniejszym etapie nie stanowiło problemu, czyli np C#, C++, Java, Python (niektórzy piszą zacznij od C zamiast od C++ ale na początkowym etapie nauki to jaka jest różnica między C a C++? w cpp też możesz pisać funkcyjnie itp itd). Co prawda wydaje mi się że przerzucenie z pythona na C++ będzie trudniejsze niż na odwrót, ale to tylko moja sugestywna opinia, jak będzie w twoim przypadku to nie wiem.

3

Dlatego.

2

@Krolik Zgadza się, próg wejścia w C++ jest o wiele większy, ale nie sądzisz, że w zamian dostajemy możliwości których w wielu językach właściwie nie ma? Mogę podać setki przykładów, ale jestem pewien że wiesz o czym mówię. Problemem jest jednak to, że ludzie w C++ próbują pisac rzeczy, do których stworzone są inne języki. Aplikacje biznesowe w C++ to przeważnie strzał w kolano, ale jakbyś musiał napisać VM do javy to co byś wybrał? Jakbyś musiał się zlinkowac z dziwną libka napisana w niewiadomoczym, której kod źródłowy zaginął 10 lat temu, to w czym byś to napisał?
Nie wspominając już o banałach typu RTC.
Mam wrażenie że próbujcie przekonać świat że odkrecanie śruby torx kluczem oczkowym jest do bani. No fajnie. Język programowania to narzędzie, więc wykorzystamy je tam gdzie najlepiej się nadaje a nie pchajmy wszędzie, bo później jest płacz i lament.

4

@Krolik Zgadza się, próg wejścia w C++ jest o wiele większy, ale nie sądzisz, że w zamian dostajemy możliwości których w wielu językach właściwie nie ma?

Dostajemy w większości możliwości, których początkujący nie będzie w stanie wykorzystać. Pisanie super-szybkiego kodu i pełna kontrola nad pamięcią? Początkujący raczej nie wie, jak działa procesor i pamięć, więc jego kod i tak nie będzie szybki. Pisanie kodu wymagającego dostępu do egzotycznych API systemu operacyjnego? Początkujący raczej nie będzie zaczynał przygody od pisania sterowników.

Zresztą, żadna z tych wyżej wymienionych cech nie jest specyficzna dla C++. Jest bardzo mało rzeczy, które da się zrobić w C++, a nie da się w co najmniej pół tuzinie innych języków.

W zamian C++ odbiera możliwości dostępne w innych językach, ważne dla początkującego:

  • czytelne komunikaty o błędach kompilacji / wykonania
  • prostota w konfiguracji i budowaniu projektu (w wielu językach nie trzeba nawet wiedzieć, że jest coś takiego jak kompilator)
  • konsola interaktywna (REPL)
  • łatwiejsze zarządzanie pamięcią, lepsza przewidywalność wykonania kodu
  • rozbudowana biblioteka standardowa ("batteries included")
0

No i trochę minęło czasu, zanim założyłem ten post z tym pytaniem i chyba dosyć trafionym, dlaczego nie C++. W tym czasie zacząłem od Pythona, ale jeden z programistów mi go odradził na początek. Wskazał ścieżkę aby zacząć od pytania 'czym to się je' czyli od języków takich jak Java czy C# w nich poczuć smak programowania.
Wybrałem C#, bo ten programista zaoferował mi bezinteresownie pomoc, trochę mnie to mile zaskoczyło.
Tak więc plan mam taki aby poczuć programowanie na podstawie C#, a celem moim by było Ruby on Rails, gdzie dzisiaj jest w miarę niski poziom wejścia na rynek.
PS. Jeśli chodzi o samą naukę programowania, to zauważyłem, że ciekawym sposobem jest pisanie swoich programów na podstawie schematów blokowych, których jest sporo np na YT przykładów, na pewno ciekawszym niż tylko tutoriale.

0

A ja znowu żałuję że zacząłem od Pythona tak późno. Kiedyś był wywiad z najlepszymi hakerami i programistami. Twierdzili oni że języki przyszłości to takie w stylu Python, Ruby, sami się na nie przenieśli. Choćby świadczy o tym co zrobił Polski haker na Chomikuj, dodając do plików Chomikuj infekujące oprogramowanie skryptowe napisane w Pythonie. jak bym teraz zaczynał naukę to C++17 i QT 5.8, oraz Python 3.5 i Django. I mam praktycznie języki do wszystkiego od desktopowych szybkich programów po web.

3
Krolik napisał(a):

W zamian C++ odbiera możliwości dostępne w innych językach, ważne dla początkującego:

  • prostota w konfiguracji i budowaniu projektu (w wielu językach nie trzeba nawet wiedzieć, że jest coś takiego jak kompilator)

Hm. To w którym momencie początkującemu wolno się dowiedzieć o istnieniu kompilatora ? Zwłaszcza, że mówimy o dorosłym człowieku, a nie sześciolatku ? Naprawdę zatrudniłbyś do naprawy samochodu kogoś kto nie wie co to gaźnik, bo teraz większość samochodów na wtryskiwaczach jeździ ? To jakie szanse na zatrudnienie ma programista, którego wiedza nie obejmuje pojęcia kompilatora ?
I nie są to pytanie teoretyczne, parę miesięcy temu widziałem młodego człowieka który po licencjacie z jakiejś politologii i trzymiesięcznym kursie RoR aplikował na juniora. Deczko się podłamał i on i rekrutujący. Przy założeniu, że jednak programista to ktoś, kto jakąś inteligencję posiada, to wydaje mi się że słusznym jest zmuszenie go na starcie do wysiłku intelektualnego, a nie upupianie na wstępie.

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