Чи навчитися використовувати C (або C ++) вимогою, щоб бути хорошим (відмінним) програмістом? [зачинено]


25

Коли я вперше почав вчитися програмувати, справжні програмісти могли писати складання уві сні. Будь-яке серйозне навчання в галузі інформатики буде включати здоровенну підготовку та практику програмування, використовуючи складання. Це з тих пір змінилося, і до того, як я бачу ступінь інформатики зі складанням, якщо вони взагалі включені, відведено до одного завдання та однієї глави, протягом загальної роботи за два тижні поза 4-річного навчання.

Програмування на C / C ++, схоже, пішов аналогічним шляхом. Мене більше не дивує інтерв'ю з випускниками університетів, які не витрачали більше двох тижнів на програмування на C ++ і десь читали лише C у книзі. Незважаючи на те, що найбільш серйозні навчальні курси все ще включають значне вивчення часу та використання однієї або обох мов, очевидно, що тенденція до менш примусового C / C ++ у школі.

Очевидно, що можна зробити кар’єру, яка дає добру роботу, не читаючи і не записуючи жодного рядка коду С або С ++

Враховуючи все це, чи варто вивчати дві мови? Чи взагалі від них вимагається успіх? (крім очевидних, немовних конкретних порад, таких як "хороший вибір мов, мабуть, важливий для всебічної освіти", "і, мабуть, хороша ідея продовжувати пробувати та вивчати нові мови протягом усієї кар'єри програміста, просто розтягнути сірі клітини ")


8
C є всюдисущим у сучасній інфраструктурі програмного забезпечення. Вивчення цього, безумовно, дасть глибше розуміння того, що насправді відбувається в написаному вами програмному забезпеченні. (Див. Програмісти.stackexchange.com/ questions/ 14744/… ).
Чарльз Сальвія

Я також знайшов відповіді тут відповідні: programmers.stackexchange.com/questions/29109/…
blueberryfields

Тангенціальний: хороший програміст комфортний з різними парадигмами програмування, це означає вивчити (і використовувати) кілька мов.
Маттьє М.

Вивчення більше мов не зашкодить.
Maxpm

4
Немає C / C ++. Є лише C і C ++. Вони дуже різні мови, і відповідь, ймовірно, буде зовсім іншим, залежно від того, про що ви говорите.
Калеб

Відповіді:


63

Джоел Спольський (так, що Джоел) заперечував, що справді жорсткі програмісти знають, як використовувати більш жорсткі мови (наприклад, C, C ++ та Lisp) та їх конструкції (як вказівники та функціональні функції), і що мови вищого рівня зазвичай не були "досить важко", щоб продемонструвати свою компетентність.

Я можу зрозуміти його думку про те, що люди, які знають C і C ++ і які насправді хороші в цьому, знають набагато більше про те, що відбувається під кришкою, ніж люди, які, скажімо, програмують у Ruby (і тільки в Ruby). Я б сказав, що так: якщо ви знаєте "важку" мову, це, мабуть, хороший доказ того, що ви вмієте програмувати, дотримуючись суворих обмежень або що ви опановуєте складні способи мислення. Якщо ви добре володієте мовою на високому рівні, ви, можливо, зможете програмувати, дотримуючись суворих обмежень, але доказів цьому не існує.

Я не думаю, що навчання C або C ++ зашкодить вашому мозку (хоча, здається, деякі люди вірять у це). Насправді, навчити його просто цінувати кращі мови вищого рівня може бути хорошою ідеєю.


34

Так, знання C (або C ++) потрібно для того, щоб бути відмінним програмістом (у наш час).

Це не сама мова, це оточення.

Програми не працюють у вакуумі. Прекрасний програміст знає своє оточення, як і великий скульптор знає свій матеріал. Наше поточне середовище програмування (операційні системи, компілятори, мережа тощо) побудовано на C / C ++.

Прекрасний програміст пише ефективні програми та налагоджує їх у реальних життєвих ситуаціях. Він повинен знати навколишнє середовище - і сьогодні це вимагає знання C / C ++.

Редагувати: Не можна протистояти доданню посилання на матрицю. Morpheus може запитати: ви хочете взяти таблетку Java і продовжувати жити в комфортному світі, забезпеченому віртуальною машиною? Або ви берете таблетку С і бачите, наскільки глибоко йде кроляча нора?


9
+1 для посилання на Matrix, я зберігатиму його для можливого подальшого використання :-)
Konamiman

20

Я повинен посилатися на ще одну статтю Джоеля. У Законі про непрохідні абстракції , вивчення таких мов, як C, Lisp, C ++ та мови, що передбачають управління пам'яттю, також передбачає вивчення способу мислення, який визначає нас для решти нашої кар'єри.

Мій професор мого класу "Структури даних та алгоритмів" Вільям Спірс сказав скептично скептичним студентам з інформатики, чому ми не вивчали новітні інструменти. Студенти скаржилися, що відчували, що не готуються до "реального світу", тому що ми не вивчали Java. Ми не вивчали JavaScript. Заняття з HTML не було. Ми не навчалися [[ВСТУПИТИ ТЕХНОЛОГІЇ ТУТ]].

Чому ми не вивчали новітні інструменти? За словами нашого професора, технологія змінюється настільки швидко, що через 4 роки інструменти, які ми вивчаємо, цілком можуть застаріти. Ну, через кілька років роботи в галузі, я б сказав, що я згоден з його оцінкою.

Мета освіти з інформатики - навчитися вчитися. Виявлення вирішення багатьох проблем розвитку часто вимагає вміння мислити поза межами сфери, що може виходити лише від вивчення базового, фундаментального, під кришкою, сирого інформатики, що виходить від роботи з C, C ++ та Lisp.

Коли ці абстракції в реальному світі просочуються, і вони стануть, розуміння основ - це те, що відокремлює середнє від найкращого.


3
Мені, мабуть, чогось не вистачає. Що стосується Ліспа з навчанням основ? Це найбільша інверсія абстракції, коли-небудь винайдена. Однією з його первісних, фундаментальних цілей дизайну було "давайте робити вигляд, що насправді не на машині Тьюрінга, і подивимося, наскільки ми можемо спростити речі, зробивши це".
Мейсон Уілер

6
@Mason: Навчання Lisp навчить вас майже нічого про комп'ютери реального світу. Це навчить вас багато чого з теорії обчислень. Сира інформатика - це більше, ніж сирі комп'ютери.
Девід Торнлі

2
@Mason Wheeler Learning lisp представляє кілька сучасних концепцій, серед яких: дані / код взаємозамінні, код відображення / самозмінювання та важливість врахування вашого компілятора / vm частиною вашого кінцевого продукту
blueberryfields

@blueberryfields: ... усі вони вважають шкідливими та / або вразливими місцями безпеки більш досвідчені кодери. Дуже погані речі, щоб навчити новачків.
Мейсон Уілер

2
@Mason Я не розумію контексту вашого коментаря - ми говоримо тут про відмінних програмістів, а не про новачків. Я б не вважав програміста, який не має глибокого розуміння цих понять, і застосовує їх належним чином (і регулярно) у своїй роботі, як експерта.
blueberryfields

18

Дозвольте сказати так. Скажімо, вам потрібно було найняти когось, щоб виконати якусь роботу на C ++, а хтось застосовує, хто робив один проект C ++ в коледжі, але програмував на Java лише з моменту його закінчення. І навпаки, скажіть, що вам потрібно було найняти когось для роботи на Java, а хтось застосовує, хто робив проект Java в коледжі, але програмував лише на C ++ з моменту закінчення навчання.

З ким ти будеш комфортніше наймати? Я б заперечив хлопця C ++, оскільки перейти до використання мови для збирання сміття набагато простіше, ніж відходити від мови. Так само і для інших понять та інших мов, наприклад, перехід від компільованого до інтерпретованого або від статичного до динамічного набору тексту. Майже в кожній функції за допомогою порівняння функцій між мовами C ++ виходить важко, що програмує біль, але також є чудовою базовою лінією для оцінювання програміста.

Чи можете ви процвітати в кар’єрі, не торкаючись коду C або C ++? Звичайно, але я все одно не хотів би наймати того, хто цього не зміг чи не побоявся.


3
Невражаючий аргумент. Якщо мені потрібна робота над Java, я б найняв когось із досвідом Java. Якщо мені потрібна робота на C ++, я б найняв когось із досвідом C ++. Якби мені довелося найняти хлопця Java на посаду C ++, я можу витратити додатковий час інтерв'ю, перевіряючи його на покажчики та управління пам’яттю та RAII; аналогічно, якби мені довелося найняти хлопця C ++ на посаду Java, я б більше часу проводив на інтерв'ю, розпитуючи про тремтіння, шаблони дизайну, роздуми тощо. Жоден набір навичок не вимагає більше інтелекту, просто досвіду. Більшість кривих навчання є в бібліотеках.
Aaronaught

13

Ні, не потрібно вивчати C або C ++, щоб бути хорошим програмістом, але розуміння цього допоможе очистити деякі основні поняття, такі як управління пам'яттю.


7

чи варто вивчати дві мови?

Очевидно, що можна зробити кар’єру, яка дає добру роботу, не читаючи і не записуючи жодного рядка коду С або С ++


6

Коротше кажучи, ні вони не є. Вони корисні мови для вивчення, але ви можете легко стати відмінним програмістом, не торкаючись рядків C або C ++. Більшість відмінних програмістів, напевно, торкнулися їх, але це крім того, що у багатьох програмах сьогодні вони використовуються не так багато, як .NET та Java, і їхня необхідність дещо знизилася.

Зауважте, що я не кажу, що вони не варто вивчати, я думаю, що вони обидві важливі мови для вивчення, особливо якщо ви плануєте зробити кар'єру з програмування. Але чи можете ви бути порядником програміста, не торкнувшись жодного з них? Звичайно.


5

Це залежить від ваших інтересів.
Якщо ви хочете взяти участь у системному програмуванні, так вам доведеться вивчати C / C ++, оскільки вони є типовими мовами CS. Для ознайомлення з концепціями ОС, компіляторами, структурами даних, управлінням пам’яттю тощо ви повинні знати C / C ++. Крім того, на C / C ++ доступні багато хороших текстів, книг та статей, що оптимізує ваші навички програмування. Кілька днів тому в / * Програмістах * / я прочитав чудову відповідь на те, чому «С - тому що це близько до металу» .
З іншого боку, якщо ви хочете обмежитися програмуванням прикладних програм, не потрібно їхати на C / C ++, безпосередньо почніть з C # (.Net) / Java, і ви отримаєте хорошу роботу розробника. Але якщо ви дуже любите хардкор-програмування, я впевнений, що одного разу ви почнете вивчати C / C ++.


Близько до металу! Люблю цей коментар.
Wajih

3

Це повністю залежить від того, в якому домені додатка ви хочете працювати. Якщо ви хочете грати у вбудованому ландшафті, то вам дуже потрібно знати C або C ++. C ++ також, мабуть, є найбільш часто використовуваною мовою в розробці ігор. Якщо ви хочете працювати над веб-додатками, то C або C ++ може бути не так важливим. Немає мови, яка б мала престиж того, що потрібно знати, як пріоритет у визначенні хорошого інженера-програміста.


3

C було названо "портативно зібраним", що дуже вірно. Він був розроблений для того, щоб зробити Unix портативним через процесори та описати код дуже близький до набору інструкцій базового процесора.

Якщо ви виявите, що вам хотілося б працювати поруч із фактичним обладнанням, перебуваючи у вбудованому програмному забезпеченні чи драйверах пристроїв тощо, немає способу обійтись C. Якщо ви хочете працювати в більш основних темах, мови високого рівня - це краща ідея, оскільки багато функцій, які роблять C потужним, також роблять C небезпечним, тому їх зменшили або просто видалили.

Особисто я вважаю дуже важливим зрозуміти, що в кінцевому підсумку знадобиться для запуску ваших програм, оскільки багато дизайнерських рішень залежать від цього, тому вам слід принаймні ознайомитись з тим, як відобразити код на набір інструкцій для складання та як він працює в реальному обладнання. На те, що ти сприймаєш як належне, насправді потрібен час і чому.

Тому я хоч би запропонував вам ознайомитись із C та деяким вдосконаленим арифметичним кодом вказівника, тож ви знаєте, з чим вам не доводиться стикатися щодня.


1

C корисно вчитися, оскільки він близький до кремнію. C або мова збірки дасть вам гарне уявлення про те, що можуть робити комп’ютери та як вони це роблять, і це, ймовірно, буде корисним для розуміння того, що можливо, а що практично. Більше того, існує цілий ряд C коду, який може вас зацікавити, і багато інших сучасних мов використовують більшу частину його синтаксису та семантики.

C ++ - мова вищого рівня, яка має в ній дуже цікаві особливості. Він має багато корисних застосувань і є потужною мовою. З іншого боку, там багато інших потужних і корисних мов.

Отже, я настійно рекомендую дізнатися про те, що відбувається на нижчих рівнях, а C - чудовий спосіб їх вивчити, тому я настійно рекомендую вивчати C. C ++ необов’язково; навчившись, це навчить вас речам, але є й інші способи навчитися більшості з них, і якщо ви вже працюєте мовою основної мови, кращі мови мають навчитися підбирати нові поняття.


0

Це залежить від типу програмного забезпечення, яке ви думаєте. Ігри часто пишуть на C / C ++, оскільки це класично більш оптимізована мова, що стосується виконуваного коду. Те, що ви кодуєте, певним чином - це лише те, що ви отримуєте.

Незважаючи на те, C # також використовувався для програмування ігор. C #, ймовірно , один з самих кращих мов для розробки настільних додатків, принаймні на платформі Windows.

Поряд з Visual Studio, C # став чи не єдиною мовою розробки програмного забезпечення, яку я використовую (вибачаючи такі мови, як SQL та PHP тощо), оскільки це для всіх намірів і цілей, кривавий фантастичний на мій погляд.

Якщо ви розвиваєтеся в Windows, я настійно рекомендую вивчати C # .NET поряд із чим-небудь іншим.

Я не вірю, що C ++ сама по собі є вимогою, але приємно мати знання нижчого рівня щодо покажчиків, управління пам’яттю та інших концепцій.


1
@ Nick: Комп'ютерний світ знаходиться поза вікнами та C #.
Рейнджер

2
Тому я сказав: "Якщо ви розвиваєтеся в Windows" .
Нік Бедфорд

0

@Nick Bedford правий щодо домену, в якому ви працюєте. Мої програмні колеги пишуть драйвери пристроїв та вбудоване програмне забезпечення. С - це шлях туди. І не думайте про C ++ як другу мову, вони мають величезне перекриття.


3
Якщо ви не вважаєте C ++ як іншою мовою від C, ви дійсно не знаєте C ++. Працювати лише в перекритті можливо, але не доцільно.
Девід Торнлі

Можливо, я перебільшую схожість. Але вони більш ті самі, що, наприклад, C і Perl.
Брайан Карлтон

0

Багато хто сказав, що C добре вчитися керуванню пам’яттю, і я згоден. На мою думку щодо вивчення C - це те, що дуже добре вчитися заради того, як навчитися налагоджувати програму. Багато чого може піти не так у написанні для C, що вимагає думати про те, як слід налагоджувати свої програми. Я рідко використовую інструмент налагодження в будь-якому моєму програмуванні (на C чи інших мовах) просто тому, що C навчив мене додавати вбудовані утиліти налагодження до програм.

Чи потрібно навчання C / C ++ для кар’єри? Ні, але я також бачив багато розробників Java, які не знають багато основ програмування, тому що вони вивчали лише Java. Те саме з програмістами Perl. Вивчення більше однієї мови має бути вимогою до кар’єри, незалежно від того, є C / C ++ однією з цих мов чи ні.


+1 - Бачення подібних понять, представлених по-різному на різних мовах, допомогло мені краще зрозуміти ці поняття та побачити їх у абсолютно новому світлі.
jmort253

0

На початку я вважав, що мій університет є поколінням Денніса М. Річі за включення C на 2 семестри, коли є багато відносно нових мов, таких як Java, Visual Basic et cetera. Але факт є, або принаймні зараз я вважаю, C - одна з найкращих мов, яка допомагає зрозуміти основні поняття програмування.

А щодо кар’єри без вивчення C (або C ++) - Так, можливо, але навчання C покаже ваші знання з програмування.


0

Відповідь для мене було так. І C, і C ++ були обов'язковими курсами в моїй програмі CS ступеня, і я вважаю, що наявність CS або суміжного ступеня є мінімальною вимогою бути "хорошим програмістом". Крім того, бути «хорошим програмістом» означає вміти раціоналізувати проблеми, що виникають, і зрозуміти, чому щось не працює, як можна було очікувати. Занадто багато разів у своїй кар’єрі я був свідком того, як люди заважали проблемами і думали, що проти них працюють надприродні сили ... це смішно.

ІМО, знаючи С, демонструє здатність розуміти будь-яку з імперативних мов та вирішувати проблеми, використовуючи один з найпотужніших інструментів, коли-небудь винайдене людством.


0

Добре закруглений програміст має кілька мішків з трюками в рукаві, і до них належать:

1) програмування низького рівня ... як мінімум. Якась збірка не зашкодила б.

2) Функціональне програмування ... Чиста функціональна мова, а не гібридна - тут працює схема.

3) OOP ... Зазвичай я б сказав невеликий розмову, але я думаю, що ми могли б піти з Java вже зараз.


0

C є матір'ю всіх мов програмування .... експерт Knowlesdge в C змушує вас задовго пізнати будь-яку іншу мову, як Java, за короткий час.

C ++ - це зовсім інша гра з м'ячем і є найскладнішою серед усіх.


0

Не варто навчатись C або C ++, щоб бути хорошим (відмінним) програмістом, але потрібно навчитися складанню, щоб бути хорошим (відмінним) програмістом. Відмінне програмування означає оптимізацію пам’яті, МГц, пропускної здатності, обмеження потужності, а потім вибір найкращого дизайну та / або реалізації для виконання поставленого завдання. Серед вчених-комп'ютерів первинною слабкістю все ще залишається, через десятиліття розвиваються технологій, оптимальне управління даними. Це набір навичок, які навчаються написанню Асамблеї (будь-яка збірка; це може бути ARM, або MIPS, або x86, або мікроконтролер, або DSP, або навіть нижче, ніж через verilog / VHDL).


0

Професійно використовуючи c, c ++, Assembly та Lisp, я б сказав, що не має сенсу взагалі вивчати якусь конкретну мову, щоб бути хорошим програмістом. Мій досвід того, що робить хорошого програміста, здатний мислити таким чином, щоб вирішити проблеми. Мови просто дозволяють висловити свої навички вирішення проблем. Наприклад, простота C дозволяє легко виражати алгоритми, тоді як Lisp дозволяє вирішувати проблеми рекурсивно. Отже, мова не робить вас програмістом. Перш ніж стати хорошим програмістом, ви повинні вирішити проблему. Мови - це лише інструменти, які ви використовуєте для вирішення проблем.


-1

Варто добре вивчити С просто, щоб отримати чітке розуміння управління пам’яттю. Діто для C ++ за винятком цілей вивчення структур даних.


Не має значення, якою мовою ви користуєтесь для вивчення структур даних.
kirk.burleson

Я вважаю, що це відбувається тому, що в багатьох інших мовах структури даних використовуються, не знаючи, як вони обробляються в пам'яті. C ++ (без використання STL) змушує програміста навчитися керувати структурами даних на низькому рівні.
аква

-1

Ні. Є багато паршивих програмістів, які пишуть код C / C ++. Що зробить вас хорошим програмістом - це розуміння, коли і чому вам потрібно буде щось написати на C / C ++

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.