Czy dogłębna znajomość C ++ pomoże Ci w szybszym / łatwiejszym nauce innych języków? [Zamknięte]

9

Czy istnieje możliwość, że ktoś, kto nauczył się wszystkich kluczowych aspektów C ++ i bardzo dobrze zna podstawy języka, nauczy się innych języków (takich jak Python, Perl, Java) szybciej i łatwiej?

ja ..
źródło
9
Twierdzę, że C ++ różni się na tyle od większości innych języków, że bardziej mylące jest wybieranie czegoś innego (jeśli jest to jedyny język, który znasz). Wiele języków ma wspólną składnię C ++, ale niewiele ewoluowało w tym samym kierunku. C ++ ma wiele historycznych cruft, które są specyficzne tylko dla C ++. Najlepszym sposobem na szybkie wybranie nowych języków jest skupienie się na nauce różnych języków z różnych paradygmatów. Im więcej paradygmatów się zapoznasz, tym szybciej będziesz mógł zbierać inne rzeczy z tych paradygmatów.
KChaloux
3
Nie sądzę, że znajomość C ++ daje przewagę w nauce innych języków w ogóle. To naprawdę zależy od tego, jakich innych języków będziesz się uczyć. Mój profesor języków programowania powiedział, że powinniśmy skoncentrować się na zrozumieniu ogólnych pojęć: zdecydowanie ułatwi to naukę poszczególnych języków.
Giorgio
9
Dogłębna nauka jednego języka jest dobrym początkiem do nauki programowania, z tym wyjątkiem, że możesz pomylić wiedzę specjalistyczną dotyczącą danego języka z wiedzą ogólną. Współczesne C ++ to świetny język, ale gdy przejdziesz do poziomu pośredniego, zyskasz masowo na poznawaniu innych perspektyw - być może rzucisz okiem na OCaml i Ruby, nawet jeśli nigdy nie użyjesz ich poważnie. Gdy jesteś stałym programistą i potrafisz rozróżniać rzeczy specyficzne dla języka i ogólne, uzyskanie produktywności w nowych językach jest dość łatwe, choć opanowanie zawsze wymaga czasu.
amon
1
W porównaniu do czego? Dobrze się uczysz innego języka, dobrze znasz C ++, ale nie do końca, w ogóle nic nie wiesz?
Telastyn
2
Tak, ale także na odwrót. Znajomość Ocaml lub Schematu ułatwia zrozumienie wielu nowych funkcji C ++ 11
Basile Starynkevitch

Odpowiedzi:

12

W ogólnych warunkach

Dogłębna znajomość dowolnego języka programowania może pomóc w szybszym wyborze innych języków. Dzieje się tak częściowo, ponieważ programowanie jest sposobem myślenia bardziej niż uczeniem się składni. Większość praktyk programistycznych byłaby prawdziwa w przypadku większości innych języków programowania. Dlatego ludzie mówią, że zawsze uczysz się drugiego języka programowania szybciej niż pierwszego.

W szczególnych warunkach

C ++ to język, który pozwala na znacznie większą „kontrolę” niż inne języki. Może to być zarówno dobre, jak i złe. Na przykład prawdziwa broń jest lepsza niż broń powietrzna, gdy idziesz do lasu (ponieważ możesz faktycznie zestrzelić coś z niej), ale jest też bardziej niebezpieczna dla ciebie i osób wokół ciebie. C ++ ma takie pojęcia, jak zarządzanie pamięcią, o które nie musisz się martwić w większości innych języków. Dokładne zrozumienie tych koncepcji nie jest jednak bezcelowe, nawet podczas pracy z językami automatycznego zarządzania pamięcią. Możesz także wykonywać operacje bitowe i zejść znacznie niżej do „metalu” za pomocą języka takiego jak C ++. Nawet podstawowa znajomość tych obszarów może bardzo pomóc jako programista w dowolnym języku.

Osobista opinia

Najpierw osobiście nauczyłem się języka Java przez prawie 3 lata, zanim zacząłem uczyć się C ++ i powinienem powiedzieć, że trochę tego żałuję (kurs uni ...). To sprawiło, że uczenie się C ++ (wciąż się uczę - dalekie od „głębokiej” wiedzy: D) nie jest tak proste, jak bym tego chciał. Gdybym zrobił to na odwrót, powiedziałbym, że byłoby to dla mnie o wiele łatwiejsze. Zwłaszcza, gdy wiesz, DLACZEGO coś zostało zrobione w określony sposób, a nie tylko pewny auto-magii języka. Gdybym mógł wyrazić opinię, zasugerowałbym: C (dla podstawowych i uniwersalnych paradygmatów programowania) -> C ++ (dla podstawowego zrozumienia OOP wraz z zarządzaniem pamięcią) -> Następnie możesz przejść do dowolnego „prawdziwego” języka OOP z dobry fundament lub możesz kontynuować z bardziej zaawansowanymi tematami w C ++, wszystko w zależności od tego, co „

G.Rassovsky
źródło
3
Cieszę się, że mój uniwersytet kazał nam zacząć od pascala. Następnie przeszliśmy do C (część zarządzania pamięcią i operacji bitowych) i wreszcie przeszliśmy do java for oop (chociaż mógł to oczywiście być każdy inny język oo). Szczerze mówiąc, dość niepokoi mnie to, ile uniwersytetów zaczyna od java. Będzie nieuchronnie nauczyć Java (i co ważniejsze, OOP) nieprawidłowe, ponieważ prawdziwy OOP jest zbyt skomplikowane dla początkujących, które wciąż borykają się z różnicy między ORiAND
Lovisa
2
@Doval: Odśmiecanie daje złudzenie, że nie musisz się martwić o zarządzanie pamięcią. Wystarczy spojrzeć na to, jak często programy z kodem zarządzanym dostają przecieki pamięci, ponieważ niektóre odniesienia pozostały ważne w nieoczekiwanym miejscu (zbiory są wiecznym przestępcą), aby zobaczyć, jak naprawdę jest to iluzoryczne.
Mason Wheeler
1
@Doval: Niewłaściwy rozmiar, miejsce, wyrównanie: jak dokładnie można wykonać jedną z tych rzeczy w języku obiektowym, gdy kompilator zna właściwy rozmiar, a alokator obsługuje umieszczanie i wyrównanie? Uwolnienie wcześnie: dokładnie temu ma zapobiec GC, więc powiedzenie, że nie ma znaczenia w tej dyskusji, jest po prostu nieprawdą. Ale robi to kosztem przekształcenia każdego przydziału w wyciek pamięci. Nie tupanie danymi innych obiektów to problem sprawdzania granic , a nie problem wyrzucania elementów bezużytecznych.
Mason Wheeler,
2
C ++ wymaga tak dużej wiedzy, która jest specyficzna dla implementacji C ++, ale nigdy nie będzie używana poza C ++ ze względu na niekończące się dziwactwa, biblioteki i różne systemy. Z mojego doświadczenia wynika, że ​​każdy, kto pisze w C ++, zasadniczo zgadza się, że wszystkie C ++ jest źle napisane i pełne dziwactw i osobliwości, które są głównie specyficzne dla C ++. Uczenie się na tym polu minowym nie przyniesie nic użytecznego w innych językach, gdy w większości języków brakuje większości problemów, jakie ma C ++.
Jimmy Hoffa
2
@Doval: Tak, o to mi chodzi: te rzeczy są nierozstrzygalne pod względem algorytmicznym w ogólnym przypadku , dlatego muszą być obsługiwane przez inteligentną osobę, a nie algorytm, aby mogły być obsługiwane poprawnie. A powiedzenie „to nie jest wyciek, to nieefektywny program” jest po prostu semantycznym rozszczepieniem włosów; dla zewnętrznego obserwatora zachowanie programu jest takie samo, jak programu, który przecieka pamięć, szczególnie w kontekście systemów wielozadaniowych, w których pamięć ściska się pod obciążeniem może powodować poważne problemy.
Mason Wheeler,
9

Niestety nie. Jest to w rzeczywistości duży problem podczas nauczania języka C ++ na lekcjach programowania, szczególnie na poziomie początkującym: możesz nauczyć się zasad programowania lub języka C ++, ale język C ++ ma zbyt wiele pułapek i głupie małe problemy, aby skutecznie uczyć się obu w ramach zakres zajęć semestralnych!

Jest wiele rzeczy, które zostały wypróbowane w C ++ i ostatecznie stały się idiomatyczne w tym języku dzięki czystej bezwładności, którą prawie każdy inny język od tej pory oglądał i odrzucał, ponieważ okazał się to wielkim błędem. Najważniejsze to szablony C ++ i model obiektowy C ++ (obiekty jako typy wartości nigdy nie są dobre, ponieważ psują podstawienie Liskowa i sam OOP tysięcy).

Więc jeśli najpierw pogłębisz znajomość C ++, a potem będziesz chciał nauczyć się innych języków programowania, będzie wiele szkodliwych i bezproduktywnych problemów, których będziesz musiał się nauczyć , aby być skutecznym w innych językach programowania.

Mason Wheeler
źródło
4
Istnieją powody, dla których Java i C # mają znacznie słabszy system szablonów, ale to dlatego, że potrzebują pełnych metadanych o wszystkim. Byłbym zainteresowany wyjaśnieniem, w jaki sposób przedmioty jako wartości niszczą rzeczy. Zwłaszcza, że ​​istnieją odniesienia ...
Deduplicator
3
@Deduplicator: Java i C # mają zupełnie inny system generyczny , ponieważ doświadczenie pokazuje, że szablony powodują różnego rodzaju poważne problemy, z których wiele powstaje, ponieważ system szablonów nie był dobrze zaplanowany. (Turing-complete przez przypadek , aby dać jeden oczywisty przykład!) I obiekty jako wartości przerywają podstawienie Liskova, ponieważ jeśli masz klasę pochodną, ​​której rodzicem jest Base, to zastępuje ona metodę wirtualną na Base, i domyślnie przekazujesz ją do funkcja, która pobiera bazę i wywołuje metodę wirtualną, nie wywoła wersji pochodnej.
Mason Wheeler
2
@MasonWheeler: Ach, masz na myśli krojenie .
Fred Larson
2
@FredLarson: Powinienem był się domyślić, że taki powszechny, zgubny problem miałby dla niego określoną nazwę. (A to, że to C ++, to głupie imię. Gdy programista spoza świata C ++ słyszy „krojenie”, prawdopodobnie pomyśli o krojeniu tablic !: P
Mason Wheeler
4
Chociaż zgadzam się z wieloma rzeczami, które napisałeś, myślę, że masz bardzo stronniczy punkt widzenia ;-) IMHO nauka języka C ++ nie czyni ludzi głupszymi.
Doc Brown
8

Nie. Znajomość C ++ ułatwi naukę innych języków, takich jak C ++. Ale to byłoby nudne. Dlaczego chcesz poznać dwa języki, które są takie same? To nic ci nie kupuje. (Pamiętaj, że nie dotyczy to języka C ++. Dotyczy dowolnego języka. Porównaj z językami naturalnymi: nauka języka włoskiego nie ułatwi nauki innych języków. Uczy języka hiszpańskiego, francuskiego lub portugalskiego i nauki trzech z tych ułatwi ci naukę czwartego, ale nawet nauka wszystkich języków romańskich nie pomoże ci w nauce fińskiego, chińskiego, hindi, hebrajskiego, arabskiego, paszttu, greckiego itp.)

Języki programowania implementują paradygmaty. Peter van Roy zebrał plakat 34 głównych paradygmatów programistycznych .

Z kolei paradygmaty składają się z pojęć. Ten plakat wymienia około 18 pojęć.

Wszystkie paradygmaty (a przynajmniej te na plakacie) składają się z tych pojęć. Wszystkie języki implementują jeden lub więcej paradygmatów złożonych z tych pojęć. Jeśli więc nauczysz się tych pojęć, nauczysz się (w pewnym sensie) każdego języka programowania na raz.

Oczywiście nadal istnieje wiele dziwactw specyficznych dla języka (wśród nich składnia). Ponadto plakat ten całkowicie ignoruje pisanie i istnieje oczywiście znacząca różnica między systemem typu System F <: ω, systemem typu Scala lub dynamicznym systemem typu kaczego, nie mówiąc już o zależnym systemie typów à la Idris, Agda, Coq, Guru lub ATS.

Jörg W Mittag
źródło
Hinduski , nie hinduskie . Nic nie pomoże ci w „nauce hinduizmu”, nie mówiąc już o języku włoskim lub C ++ ;-) +1.
PKG
W rzeczywistości uczenie się różnych języków, choć naprawdę bardzo podobne, wciąż poszerza twój umysł i tym samym pomaga ci nieco dalej.
dyesdyes,
Musiałbym się nie zgadzać z porównaniem do języków naturalnych, ponieważ C ++ jest językiem wieloparadygmatycznym w przeciwieństwie do języków naturalnych. Ponadto, ucząc się szczegółowo funkcji języka, poznasz decyzje projektowe dla tej funkcji i najprawdopodobniej zrozumiesz zalety i wady innych wdrożeń. Na przykład spróbuj nauczyć się szablonów c ++ niezależnie, bez poznawania ich zalet i wad w porównaniu z dynamicznymi rodzajami. Nawet jeśli nie natkniesz się na żadne wzmianki o C # (obecnie trudne), nadal będziesz wiedział, czym są dynamiczne generyczne i od razu poznasz ograniczenia generyczne C #, kiedy się o nich dowiesz
Rado
5

Powiedziałbym, że głęboka znajomość dowolnego języka programowania pomoże w nauce innych, przynajmniej innych języków w tej samej rodzinie. Na przykład znajomość języka C ++ niewiele pomoże w LISP lub Haskell, ale w przypadku obiektowych języków proceduralnych to pomoże. Moje podejście polegało na tym, aby dobrze nauczyć się języka z każdej z różnych rodzin (proceduralnych, funkcjonalnych, obiektowych itp.) Języków, aby wiedza ta mogła zostać przeniesiona na inne języki w tej rodzinie. Z drugiej strony dogłębna znajomość APL nie pomoże w niczym innym ...

Jim Nutt
źródło
3
Widziałem, jak wygląda kod Self lub Smalltalk lub Ruby napisany przez kogoś, kto nauczył się C ++ jako pierwszego języka. Powiedziałbym, że znajomość C ++ jest raczej szkodliwa dla nauki OO. Myślę, że Self lub Newspeak byłyby o wiele bardziej odpowiednie do tego. BTW, dogłębna znajomość APL pomoże przynajmniej w takich językach jak J i K. Pomoże również w myśleniu o abstrakcjach kolekcji i liftig wyższego poziomu, co prawdopodobnie pomoże w programowaniu w stylu MapReduce lub Hadoop, a także w myśleniu o Functors , Aplikacje, monady i kategorie.
Jörg W Mittag
1
@ JörgWMittag: Dobrze wiadomo, że można pisać COBOL w dowolnym języku ... o co chodzi?
Deduplicator
@Deduplicator Jeśli Twoim pierwszym językiem jest COBOL, istnieje większe prawdopodobieństwo, że napiszesz COBOL w innych językach.
Doval
Właściwie muszę się zgodzić z COBOL. Lata temu pracował dla mnie facet, który napisał COBOL w Pascalu ...
Jim Nutt
5

Przyjmę tutaj inną interpretację.

C ++ jest dobrym językiem do nauki o strukturach pamięci i danych, ponieważ zmusza do uważnego przemyślenia takich pojęć, jak własność obiektu i długość życia. Poznanie struktur pamięci i danych jest jedną z zasadniczych części każdego programu inżynierii oprogramowania.

Ale musisz uczyć się o strukturach danych. Jeśli po prostu „nauczysz się C ++”, tak naprawdę nie zyskasz zbyt wiele i może to spowolnić proces uczenia się innych języków w krótkim okresie.

Kiedy byłem na studiach, Data Structures była wymaganym kursem na poziomie dla początkujących, podjętym po CS1 (z którego przynajmniej połowa klasy postawiła). To było trudne. Format kursu był w zasadzie „Oto struktura danych, której nigdy wcześniej nie widziałeś [np. Lewicowa kupa ]. Zaimplementuj ją w C ++ w ciągu tygodnia i dopasuj dane wyjściowe do naszych oczekiwanych wyników, bajt po bajcie, więc może oceniać to automatycznie ”. W następnym tygodniu dostaniesz nową strukturę danych i nowe zadanie. Prawdopodobnie nauczyłem się więcej na tym kursie niż na wszystkich innych kursach łącznie.

Taki rodzaj nauki musisz robić, aby C ++ był cenny.

Kevin
źródło
2

Każdy język, którego się uczysz, ułatwia naukę następnego, szczególnie w ramach tego samego paradygmatu. Pożyczają się od siebie mocno, a po chwili dochodzisz do punktu, w którym nowy język wygląda jak tylko zbiór funkcji z innych języków, z kilkoma wyjątkowymi zwrotami.

Nie sądzę, aby C ++ był lepszy lub gorszy niż jakikolwiek inny język pod tym względem. Jest to jeden z bardziej szczegółowych języków, jakie znam, i sprawia, że ​​niektóre rzeczy są trudne, które są łatwe w większości innych języków, ale niekoniecznie przekłada się to na ułatwienie nauki następnego języka . To ma generalnie sprawiają, że obok języka lżej do użytku , choć. Jest różnica.

Karl Bielefeldt
źródło
0

Nie. Dogłębna znajomość C lub podzbioru C ++, czyli „zasadniczo C”, pomoże w nauce innych języków, przynajmniej w wyobrażeniu sobie, jakie muszą być ich implementacje. Z drugiej strony, dogłębna znajomość C ++ będzie głównie informacją mylącą lub nieistotną podczas nauki innych języków; jeśli nauczysz się orientacji obiektowej C ++ na więcej niż poziomie powierzchni, na przykład, przechodząc do Perla / Pythona / Ruby, poświęcisz więcej czasu na uczenie się tego, co wiesz, niż korzystania z niego, ponieważ obiekty w tych językach są implementowane w zupełnie inny sposóbniż w C ++. To samo odnosi się w większym lub mniejszym stopniu do większości innych języków oraz do innych funkcji językowych (na przykład szablony C ++ i polimorfizm Haskella są w zasadzie tą samą cechą, z znowu zupełnie innymi implementacjami). Tak więc dogłębna znajomość C ++ będzie głównie specyficzna dla C ++.

Jonathan Cast
źródło
ten post jest raczej trudny do odczytania (ściana tekstu). Czy mógłbyś edytować go w lepszym kształcie?
komar