Czy nauka używania C (lub C ++) jest wymagana, aby być dobrym (doskonałym) programistą? [Zamknięte]

25

Kiedy zacząłem uczyć się programowania, prawdziwi programiści mogli pisać asemblery we śnie. Każde poważne nauczanie informatyki wymagałoby sporego szkolenia i praktyki programowania przy użyciu asemblera. Od tego czasu to się zmieniło, do tego stopnia, że ​​widzę, że stopnie informatyki z montażem, jeśli w ogóle są uwzględnione, są przenoszone do jednego zadania i jednego rozdziału, w sumie na dwa tygodnie pracy z 4 lat nauki.

Wygląda na to, że programowanie w C / C ++ poszło podobną ścieżką. Nie jestem już zaskoczony, kiedy przeprowadzam wywiady z absolwentami uniwersytetów, którzy nie spędzili więcej niż dwa tygodnie na programowaniu w C ++ i czytali tylko C w jakiejś książce. Podczas gdy najpoważniejsze stopnie CS nadal wydają się obejmować znaczną ilość czasu na naukę i używanie jednego lub obu języków, wyraźnie widać tendencję do mniej wymuszonego C / C ++ w szkole.

Jest oczywiste, że można zrobić karierę wykonując dobrą pracę bez czytania ani pisania ani jednego wiersza kodu C lub C ++.

Biorąc to wszystko pod uwagę, czy nauka dwóch języków jest tego warta? Czy w ogóle są zobowiązani do doskonałości? (poza oczywistymi poradami nieanglojęzycznymi, takimi jak „dobry wybór języków jest prawdopodobnie ważny dla wszechstronnej edukacji” oraz „prawdopodobnie dobrym pomysłem jest ciągłe wypróbowywanie nowych języków i uczenie się ich przez całą karierę programisty, po prostu rozciągnąć szare komórki ”)

jagodowe pola
źródło
8
C jest wszechobecny w dzisiejszej infrastrukturze oprogramowania. Nauczenie się tego na pewno pozwoli ci głębiej zrozumieć, co właściwie dzieje się w pisanym oprogramowaniu. (Zobacz programmers.stackexchange.com/questions/14744/… ).
Charles Salvia,
Znalazłem również odpowiedzi tutaj istotne: programmers.stackexchange.com/questions/29109/…
blueberryfields
Styczny: dobry programista jest wygodny w korzystaniu z różnych paradygmatów programowania, co oznacza, że ​​nauczył się (i używał) kilku języków.
Matthieu M.
Uczenie się więcej języków nie może zaszkodzić.
Maks.
4
Nie ma C / C ++. Są tylko C i C ++. Są to bardzo różne języki, a odpowiedź może być całkiem inna w zależności od tego, o czym mówisz.
Caleb

Odpowiedzi:

63

Joel Spolsky (tak, ten Joel) argumentował już dawno temu, że prawdziwi trudni programiści wiedzą, jak używać trudniejszych języków (takich jak C, C ++ i Lisp) i ich konstrukcji (takich jak wskaźniki i funkcje), i że języki wyższego poziomu zwykle nie były „wystarczająco”, aby wykazać swoje kompetencje.

Rozumiem jego punkt widzenia, że ​​ludzie znający C i C ++ i którzy są w tym naprawdę dobrzy, wiedzą znacznie więcej o tym, co dzieje się pod maską, niż ludzie, którzy, powiedzmy, programują w Rubim (i tylko w Rubim). Powiedziałbym, że wygląda to tak: jeśli znasz „trudny” język, to prawdopodobnie jest to dobry dowód na to, że jesteś w stanie programować z poszanowaniem poważnych ograniczeń lub opanowujesz złożone sposoby myślenia. Jeśli jesteś dobry w języku wysokiego poziomu, równie dobrze możesz programować, przestrzegając poważnych ograniczeń, ale nie ma na to dowodów.

Nie sądzę, że nauka C lub C ++ uszkodzi twój mózg (niektórzy wydają się w to wierzyć). Właściwie dobrym pomysłem może być nauczenie się, aby docenić lepsze języki wyższego poziomu.

2 obrotów
źródło
34

Tak, znajomość C (lub C ++) jest wymagana, aby być doskonałym programistą (w naszych obecnych czasach).

To nie jest sam język, to środowisko.

Programy nie działają w próżni. Doskonały programista zna swoje otoczenie, tak jak wielki rzeźbiarz zna swój materiał. Nasze obecne środowisko programistyczne (systemy operacyjne, kompilatory, sieci itp.) Jest oparte na C / C ++.

Doskonały programista pisze wydajne programy i debuguje je w rzeczywistych sytuacjach. Musi znać środowisko - a obecnie wymaga znajomości C / C ++.

Edycja: Nie można się oprzeć dodaniu odniesienia do macierzy. Morfeusz może zapytać: czy chcesz wziąć pigułkę Java i kontynuować życie w wygodnym świecie zapewnianym przez maszynę wirtualną? A może bierzesz pigułkę C i widzisz, jak głęboko schodzi królicza nora?

Maglob
źródło
9
+1 za odniesienie do Matrixa, zachowam go do ewentualnego wykorzystania w przyszłości :-)
Konamiman
20

Muszę odnieść się do innego artykułu Joela. W The Law of Leaky Abstractions nauka języków takich jak C, Lisp, C ++ oraz języków wymagających zarządzania pamięcią obejmuje także naukę sposobu myślenia, który określa nas na resztę naszej kariery.

Mój profesor w klasie Struktur i Algorytmów Danych, William Spears, powiedział wielu sceptycznym studentom informatyki, dlaczego nie uczymy się najnowszych narzędzi. Uczniowie narzekali, że czuli się, jakby nie byli przygotowani na „prawdziwy świat”, ponieważ nie uczyliśmy się Javy. Nie uczyliśmy się JavaScript. Nie było zajęć z HTML. Nie uczyliśmy się [[INSERT TECHNOLOGY HERE]].

Dlaczego nie uczymy się najnowszych narzędzi? Według naszego profesora technologia zmienia się tak szybko, że za 4 lata narzędzia, których się uczymy, mogą okazać się przestarzałe. Po kilku latach w branży muszę powiedzieć, że zgadzam się z jego oceną.

Celem edukacji informatycznej jest nauczenie się, jak się uczyć. Wypracowanie rozwiązań wielu problemów w rozwoju często wymaga umiejętności myślenia poza schematem, która może wynikać jedynie z nauki podstawowej, podstawowej, pod maską, surowej informatyki pochodzącej z pracy z C, C ++ i Lisp.

Kiedy te abstrakcje w prawdziwym świecie wyciekną i tak się stanie, zrozumienie podstaw jest tym, co oddziela średnią od najlepszych.

jmort253
źródło
3
Coś mi brakuje. Co Lisp ma wspólnego z podstawami uczenia się? To największa inwersja abstrakcyjna, jaką kiedykolwiek wymyślono. Jednym z jego pierwotnych, fundamentalnych celów projektowych było „udawajmy, że tak naprawdę nie jesteśmy na maszynie Turinga i zobaczmy, jak bardzo możemy to uprościć”.
Mason Wheeler
6
@Mason: Nauka Lisp nauczy Cię mniej więcej nic na temat komputerów w świecie rzeczywistym. Nauczy Cię wiele o teorii obliczeń. Surowa informatyka to coś więcej niż surowe komputery.
David Thornley,
2
@Mason Wheeler Learning lisp wprowadza kilka zaawansowanych koncepcji, w tym: dane / kod są wymienne, kod refleksyjny / samodmodyfikujący oraz znaczenie rozważenia, czy kompilator / vm jest częścią produktu końcowego
blueberryfields
@blueberryfields: ... wszystkie są uważane za szkodliwe i / lub podatne na zagrożenia w pewnym stopniu przez bardziej doświadczonych programistów. Bardzo złe rzeczy do nauczenia początkujących.
Mason Wheeler
2
@Mason Nie rozumiem kontekstu twojego komentarza - mówimy tu o doskonałych programistach, a nie początkujących. Nie uważam programisty, który nie ma dogłębnego zrozumienia tych pojęć i stosuje je odpowiednio (i regularnie) w swojej pracy, jako eksperta.
blueberryfields
18

Ujmę to tak. Powiedzmy, że musiałeś zatrudnić kogoś, aby zajął się pracą nad C ++, a ktoś aplikuje, który wykonał jeden projekt C ++ na studiach, ale programował w Javie dopiero po ukończeniu studiów. I odwrotnie, powiedz, że musiałeś zatrudnić kogoś do pracy nad Javą, a ktoś się zgłosił, kto zrobił projekt Java na studiach, ale programował tylko w C ++ od ukończenia studiów.

Kogo zamierzasz bardziej komfortowo zatrudniać? Kłóciłbym się z facetem z C ++, ponieważ przejście do używania języka do śmieci jest o wiele łatwiejsze niż odejście od jednego. Podobnie jest w przypadku innych pojęć i innych języków, takich jak przejście od kompilacji do interpretacji lub od pisania statycznego do dynamicznego. W prawie każdej funkcji poprzez porównanie funkcji między językami, C ++ wychodzi na trudny koniec, co sprawia, że ​​programowanie go jest trudne, ale jest także doskonałą podstawą do oceny programisty.

Czy możesz rozwijać się w karierze bez dotykania kodu C lub C ++? Jasne, ale nadal nie chciałbym zatrudnić kogoś, kto nie byłby w stanie tego zrobić lub się bał.

Karl Bielefeldt
źródło
3
Imponujący argument. Gdybym potrzebował pracy nad Javą, zatrudniłbym kogoś z doświadczeniem w Javie. Gdybym potrzebował pracy w C ++, zatrudniłbym kogoś z doświadczeniem w C ++. Gdybym musiał zatrudnić gościa z Javy na stanowisko C ++, mógłbym poświęcić trochę czasu na wywiad, wypytując go o wskazówki i zarządzanie pamięcią oraz RAII; podobnie, gdybym musiał zatrudnić faceta C ++ na stanowisko Java, spędziłbym więcej czasu w wywiadzie, pytając o drżenie, wzorce projektowe, refleksję itp. Żaden zestaw umiejętności nie wymaga więcej inteligencji, tylko doświadczenie. Zresztą większość krzywej uczenia się znajduje się w bibliotekach.
Aaronaught
13

Nie, nie jest wymagane, aby nauczyć się C lub C ++, aby być dobrym programistą, ale zrozumienie, że pomogłoby to wyczyścić niektóre podstawowe pojęcia, takie jak zarządzanie pamięcią.

Rachel
źródło
7

czy warto nauczyć się dwóch języków?

Jest oczywiste, że można zrobić karierę wykonując dobrą pracę bez czytania ani pisania ani jednego wiersza kodu C lub C ++.

S.Lott
źródło
6

Krótko mówiąc, nie, nie są. Są to przydatne języki do nauki, ale możesz łatwo być doskonałym programistą bez dotykania linii C lub C ++. Prawdopodobnie najbardziej znakomici programiści ich dotknęli, ale to nie ma znaczenia - w dzisiejszych czasach w wielu aplikacjach nie są one używane tak często jak .NET i Java i dlatego ich konieczność nieco spadła.

Pamiętaj, że nie mówię, że nie warto się uczyć. Myślę, że oba języki są ważne do nauki, zwłaszcza jeśli planujesz zrobić karierę programistyczną. Ale czy potrafisz być przyzwoitym programistą, nie dotykając żadnego z nich? Pewnie.

berry120
źródło
5

To zależy od twoich zainteresowań.
Jeśli chcesz być programistą systemu, tak, musisz nauczyć się C / C ++, ponieważ są one domyślnymi językami CS. Aby zapoznać się z koncepcjami systemu operacyjnego, kompilatorami, strukturami danych, zarządzaniem pamięcią itp., Musisz znać C / C ++. Dodatkowo w C / C ++ dostępnych jest mnóstwo dobrych tekstów, książek i artykułów, które zoptymalizują twoje umiejętności programistyczne. Kilka dni temu w / * Programistów * / przeczytałem doskonałą odpowiedź na pytanie: Dlaczego C - ponieważ jest blisko metalu .
Z drugiej strony, jeśli chcesz ograniczyć się do programowania aplikacji, nie musisz wybierać C / C ++, bezpośrednio zacznij od C # (.Net) / Java, a dostaniesz dobrą pracę programisty. Ale jeśli naprawdę lubisz hardcorowe programowanie, na pewno zaczniesz uczyć się C / C ++.

Leśniczy
źródło
Blisko do metalu! Uwielbiam ten komentarz.
Wajih
3

Zależy to całkowicie od domeny aplikacji, w której chcesz pracować. Jeśli chcesz grać we wbudowanym krajobrazie, musisz znać C lub C ++. C ++ jest również prawdopodobnie najczęściej używanym językiem w tworzeniu gier. Jeśli chcesz pracować na aplikacjach internetowych, C lub C ++ może nie być tak ważne. Nie ma takiego języka, który wymagałby znajomości jako pierwszeństwa w definiowaniu dobrego inżyniera oprogramowania.

Pemda
źródło
3

C nazwano „przenośnym zestawem”, co jest bardzo prawdziwe. Został zaprojektowany, aby Unix był przenośny między procesorami i opisywać kod bardzo blisko zestawu instrukcji procesora.

Jeśli okaże się, że chcesz pracować blisko rzeczywistego sprzętu, będąc w oprogramowaniu wbudowanym lub sterownikach urządzeń itp., Nie ma możliwości obejścia C. Jeśli chcesz pracować w bardziej powszechnym języku, języki wysokiego poziomu są lepszym pomysłem, ponieważ wiele funkcji, które sprawiają, że C jest potężny, sprawia, że ​​C jest niebezpieczny, więc zostały zmniejszone lub po prostu usunięte.

Osobiście uważam, że bardzo ważne jest zrozumienie, co ostatecznie będzie musiało uruchomić twoje programy, ponieważ wiele decyzji projektowych zależy od tego, więc powinieneś przynajmniej znać, jak mapować kod na zestaw instrukcji asemblera i jak działa w rzeczywistości sprzęt komputerowy. Rzeczy, które uważasz za oczywiste, wymagają czasu i dlaczego.

Dlatego proponuję przynajmniej rzucić okiem na C i trochę zaawansowanego kodu arytmetycznego wskaźnika, abyś wiedział, z czym nie musisz sobie radzić na co dzień.

użytkownik1249
źródło
1

C jest przydatny do nauki, ponieważ jest blisko krzemu. Język C lub asemblerowy da ci dobre wyobrażenie o tym, co potrafią komputery i jak to robią, i może to być przydatne w zrozumieniu, co jest możliwe i co jest praktyczne. Co więcej, istnieje wiele kodów C, które mogą Cię zainteresować, a wiele, wiele bardziej nowoczesnych języków używa dużej części składni i semantyki.

C ++ to język wyższego poziomu, który ma kilka bardzo interesujących funkcji. Ma wiele dobrych zastosowań i jest potężnym językiem. Z drugiej strony istnieje wiele innych potężnych i przydatnych języków.

Zdecydowanie więc zaleciłbym zapoznanie się z tym, co dzieje się na niższych poziomach, a C jest doskonałym sposobem na ich nauczenie, dlatego zdecydowanie zaleciłbym naukę C. C ++ jest opcjonalny; nauczenie się tego nauczy cię różnych rzeczy, ale są inne sposoby na nauczenie się większości z nich, a jeśli już pracujesz w głównym nurcie, są lepsze języki do nauczenia się wybierania nowych koncepcji.

David Thornley
źródło
0

To zależy od rodzaju oprogramowania, które według ciebie będziesz tworzyć. Gry są często pisane w C / C ++, ponieważ jest to klasycznie bardziej optymalny język, jeśli chodzi o kod wykonywalny. W pewnym sensie to, co kodujesz, dotyczy tylko tego, co dostajesz.

Biorąc to pod uwagę, C # został również wykorzystany do programowania gier. C # jest prawdopodobnie jednym z najlepszych języków programowania aplikacji na pulpicie, przynajmniej na platformie Windows.

Wraz z Visual Studio, C # stał się prawie jedynym językiem programowania, którego używam (usprawiedliwiając języki takie jak SQL i PHP itp.), Ponieważ jest przeznaczony do wszystkich celów i celów, moim zdaniem , cholernie fantastyczny .

Jeśli tworzysz w systemie Windows, zdecydowanie zaleciłbym naukę C # .NET obok wszystkiego innego.

Nie uważam jednak, że C ++ jest wymogiem per se, ale miło jest mieć niższą znajomość wskaźników, zarządzania pamięcią i innych pojęć.

Nick Bedford
źródło
1
@ Nick: Świat komputerów jest poza oknami i C #.
Strażnik
2
Dlatego powiedziałem: „Jeśli tworzysz w systemie Windows” .
Nick Bedford
0

@Nick Bedford ma rację co do domeny, w której pracujesz. Moje odpowiedniki oprogramowania piszą sterowniki urządzeń i oprogramowanie wbudowane. C jest tam drogą. I nie myśl o C ++ jako drugim języku, ponieważ nakładają się na siebie.

Brian Carlton
źródło
3
Jeśli nie myślisz o C ++ jako innym języku niż C, to naprawdę nie znasz dobrze C ++. Praca tylko w zakładce jest możliwa, ale nie zalecana.
David Thornley,
Być może zawyżam podobieństwo. Ale są bardziej takie same, jak na przykład C i Perl.
Brian Carlton
0

Wielu powiedziało, że C jest dobry do nauki zarządzania pamięcią i zgadzam się. Moim zdaniem na temat uczenia się C jest to, że bardzo dobrze jest uczyć się, aby nauczyć się debugowania programu. Wiele rzeczy może się nie powieść w pisaniu dla C, co wymaga myślenia o tym, jak powinieneś debugować swoje programy. Rzadko używam narzędzia do debugowania w żadnym z moich programów (w C lub innych językach) po prostu dlatego, że C nauczył mnie, jak dodawać wbudowane narzędzia do debugowania do programów.

Czy nauka kariery w C / C ++ jest wymagana? Nie, ale widziałem także wielu programistów Java, którzy nie znają wielu podstaw programowania, ponieważ tylko nauczyli się języka Java. To samo z programistami Perla. Uczenie się więcej niż jednego języka powinno być warunkiem kariery, niezależnie od tego, czy C / C ++ jest jednym z tych języków, czy nie.

Arcege
źródło
+1 - Zobaczenie podobnych pojęć przedstawionych w inny sposób w różnych językach pomogło mi lepiej zrozumieć te pojęcia i zobaczyć je w zupełnie nowym świetle.
jmort253
0

Na początku myślałem, że mój uniwersytet jest w pokoleniu Dennisa M. Ritchiego za włączenie C przez 2 semestry, gdy jest wiele stosunkowo nowych języków, takich jak Java, Visual Basic i tak dalej. Ale faktem jest, lub przynajmniej teraz wierzę, że C jest jednym z najlepszych języków, które pomagają zrozumieć podstawowe pojęcia programowania.

A o karierze bez nauki języka C (lub C ++) - Tak, jest to możliwe, ale nauka języka C pokaże twoją wiedzę w zakresie programowania.

Mr Programmer
źródło
0

Odpowiedź była dla mnie tak. Zarówno C, jak i C ++ były wymaganymi kursami w moim programie studiów CS, i uważam, że posiadanie dyplomu CS lub pokrewnego jest minimalnym wymogiem, aby być „dobrym programistą”. Co więcej, bycie „dobrym programistą” oznacza umiejętność racjonalizacji pojawiających się problemów i zrozumienia, dlaczego coś nie działa tak, jak można się spodziewać. Zbyt wiele razy w mojej karierze widziałem ludzi dotkniętych problemami i myślenie, że działają nad nimi siły nadprzyrodzone ... to niedorzeczne.

IMO, znając C, demonstruje umiejętność rozumienia jednego z imperatywnych języków i rozwiązywania problemów za pomocą jednego z najpotężniejszych narzędzi kiedykolwiek wymyślonych przez ludzkość.

sesteel
źródło
0

Dobrze zaokrąglony programista ma kilka torebek sztuczek w rękawie, a wśród nich:

1) Programowanie niskiego poziomu ... co najmniej C. Niektóre zgromadzenia nie zaszkodziłyby.

2) Programowanie funkcjonalne ... Czysty język funkcjonalny, a nie hybrydowy - działa tutaj Schemat.

3) OOP ... Normalnie powiedziałbym smalltalk, ale myślę, że moglibyśmy teraz korzystać z Javy.

czerwony brud
źródło
0

C jest matką wszystkich języków programowania ... specjalistyczna wiedza w C sprawia, że ​​w krótkim czasie poznajesz każdy inny język, taki jak Java.

C ++ to zupełnie inna gra w piłkę i jest najbardziej złożona ze wszystkich.

bhasinusc
źródło
0

Nie trzeba uczyć się C lub C ++, aby być dobrym (doskonałym) programistą, ale trzeba nauczyć się asemblera, aby być dobrym (doskonałym) programistą. Doskonałe programowanie oznacza optymalizację w zakresie pamięci, MHz, przepustowości, ograniczeń mocy, a następnie wybranie najlepszego projektu i / lub implementacji do wykonania danego zadania. Wśród informatyków podstawową słabością jest wciąż, po dziesięcioleciach rozwoju technologii, optymalne zarządzanie danymi. Jest to zestaw umiejętności nauczanych przez pisanie asemblera (dowolne asembler; może to być ARM, MIPS, x86, mikrokontroler lub DSP, a nawet niższy, poprzez verilog / VHDL).

Jonathan Cline IEEE
źródło
0

Po sprawnym użyciu c, c ++, asemblera i Lispa powiedziałbym, że nie ma sensu uczyć się żadnego konkretnego języka, aby być dobrym programistą. Moje doświadczenia z tym, co czyni dobrego programistę, są w stanie myśleć w sposób, który rozwiązuje problemy. Języki pozwalają tylko wyrazić umiejętności rozwiązywania problemów. Na przykład prostota C pozwala łatwo wyrażać algorytmy, a Lisp pozwala na rekurencyjne rozwiązywanie problemów. Więc język nie czyni cię programistą. Zanim zostaniesz dobrym programistą, musisz najpierw rozwiązać problem. Języki to tylko narzędzia, których używasz do rozwiązywania problemów.

irytująca kałamarnica
źródło
-1

Warto dobrze nauczyć się języka C, aby po prostu dobrze zrozumieć zarządzanie pamięcią. To samo dotyczy C ++, z wyjątkiem celu uczenia się struktur danych.

wodny
źródło
Nie ma znaczenia, jakiego języka używa się do nauki struktur danych.
kirk.burleson
Wierzę, że tak, ponieważ w wielu innych językach używa się struktur danych, nie wiedząc, jak są obsługiwane w pamięci. C ++ (bez użycia STL) zmusza programistę do nauczenia się, jak obsługiwane są struktury danych na niskim poziomie.
aqua
-1

Nie. Jest wielu kiepskich programistów, którzy piszą kod C / C ++. To, co sprawi, że będziesz dobrym programistą, to zrozumienie, kiedy i dlaczego musisz napisać coś w C / C ++

Don
źródło