Является ли изучение того, как использовать C (или C ++), для того, чтобы стать хорошим (превосходным) программистом? [закрыто]


25

Когда я впервые начал учиться программировать, настоящие программисты могли писать ассемблер во сне. Любое серьезное обучение информатике будет включать в себя немало тренировок и практики программирования с использованием ассемблера. С тех пор ситуация изменилась, и я вижу, что степени по информатике со сборкой, если они вообще включены, переводятся в одно задание и одну главу, что составляет в общей сложности две недели работы из четырехлетнего обучения.

Программирование на C / C ++, похоже, пошло по тому же пути. Я больше не удивляюсь, когда беру интервью у выпускников университетов, которые не потратили больше двух недель на программирование на C ++ и где-то читали только о C в книге. В то время как наиболее серьезные степени CS все еще включают в себя значительное время на изучение и использование одного или обоих языков, явно наблюдается тенденция к менее строгому применению C / C ++ в школе.

Совершенно очевидно, что можно сделать карьеру, выполняя хорошую работу, даже не читая и не написав ни одной строки кода на C или C ++.

Учитывая все это, стоит ли изучение двух языков? Они вообще необходимы, чтобы преуспеть? (помимо очевидного, не зависящего от языка совета, такого как «хороший выбор языков, вероятно, важен для всестороннего образования», и «это, вероятно, хорошая идея, чтобы продолжать пробовать и изучать новые языки на протяжении всей карьеры программиста, просто растянуть серые клетки »)


8
C вездесущ в современной программной инфраструктуре. Изучение его определенно даст вам более глубокое понимание того, что на самом деле происходит в программном обеспечении, которое вы пишете. (См. Programmers.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 ++.

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


9
+1 для ссылки на Матрицу, я сохраню ее для возможного использования в будущем :-)
Konamiman

20

Я должен обратиться к другой статье Джоэла. В Законе о слабых абстракциях изучение языков, таких как C, Lisp, C ++, и языков, которые включают управление памятью, также включает в себя изучение образа мышления, который определяет нас для остальной части нашей карьеры.

Мой профессор в моем классе Data Structures and Algorithms Уильям Спирс рассказал группе скептически настроенных студентов по информатике, почему мы не изучаем новейшие инструменты. Студенты жаловались, что чувствуют, что их не готовят к «реальному миру», потому что мы не изучаем Java. Мы не изучали JavaScript. Там не было никаких классов по HTML. Мы не учились [[ВСТАВИТЬ ТЕХНОЛОГИИ ЗДЕСЬ]].

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

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

Когда эти абстракции в реальном мире просачиваются, и они будут, понимание основ - это то, что отличает среднее от лучшего.


3
Я должен что-то упустить. Какое отношение имеет Lisp к основам обучения? Это самая большая инверсия абстракций из когда-либо изобретенных. Одной из его первоначальных, фундаментальных целей разработки было «давайте представим, что мы на самом деле не на машине Тьюринга, и посмотрим, насколько мы можем упростить вещи, делая это».
Мейсон Уилер

6
@Mason: Изучение Lisp почти ничего не научит компьютерам реального мира. Он многому научит вас в теории вычислений. Необработанная информатика - это больше, чем необработанные компьютеры.
Дэвид Торнли

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

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

2
@ Мейсон, я не понимаю контекст твоего комментария - мы говорим здесь об отличных программистах, а не о новичках. Я бы не считал программиста, который не имеет полного понимания этих концепций и применяет их надлежащим образом (и регулярно) в своей работе, экспертом.
черничные

18

Позвольте мне сказать это так. Допустим, вам нужно было нанять кого-то, кто бы поработал на С ++, и кто-то подает заявку, кто делал один проект на С ++ в колледже, но программировал только на Java с момента выпуска. И наоборот, скажем, вам нужно было нанять кого-то для какой-нибудь работы на Java, и кто-то подает заявку, кто делал Java-проект в колледже, но программировал только на C ++ с момента выпуска.

С кем вам будет удобнее наниматься? Я бы поспорил с парнем C ++, поскольку перейти на использование языка сборки мусора намного проще, чем отойти от него. Аналогично для других концепций и других языков, таких как переход от скомпилированного к интерпретируемому или от статического к динамическому типированию. Практически во всех сравнениях между языками, которые вы можете проводить между языками, C ++ сталкивается с трудностями, что затрудняет программирование, а также является отличной основой для оценки программиста.

Можете ли вы преуспеть в карьере, даже не касаясь кода C или C ++? Конечно, но я все еще не хотел бы нанимать кого-то, кто не мог или боялся сделать это.


3
Невыразительный аргумент. Если бы мне нужно было поработать на Java, я бы нанял кого-нибудь с опытом работы с Java. Если бы мне нужна была работа на C ++, я бы нанял кого-нибудь с опытом работы с C ++. Если бы мне пришлось нанимать парня из Java на должность в C ++, я мог бы потратить дополнительное время на собеседования с ним по вопросам указателей и управления памятью и RAII; Точно так же, если бы мне пришлось нанимать парня из C ++ для работы на Java, я бы больше времени проводил на собеседовании, спрашивая о дрожаниях, шаблонах проектирования, рефлексии и т. д. Кажется, что ни один набор навыков не требует большего интеллекта, просто опыта. В любом случае, большая часть кривой обучения находится в библиотеках.
Аарона

13

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


7

стоит ли учить два языка?

Совершенно очевидно, что можно сделать карьеру, выполняя хорошую работу, даже не читая и не написав ни одной строки кода на C или C ++.


6

Короче говоря, нет, это не так. Это полезные языки для изучения, но вы легко можете стать отличным программистом, не касаясь строки C или C ++. Вероятно, к ним прикоснулись бы самые замечательные программисты, но это не главное: во многих приложениях в наши дни они используются не так часто, как .NET и Java, и поэтому их потребность несколько снизилась.

Обратите внимание, что я не говорю, что их не стоит изучать, я думаю, что они оба важные языки для изучения, особенно если вы планируете сделать карьеру на программировании. Но можете ли вы быть достойным программистом, даже не прикасаясь к нему? Конечно.


5

Это зависит от ваших интересов.
Если вы хотите заниматься системным программированием, то вам придется изучать C / C ++, так как они являются языками CS по умолчанию . Чтобы ознакомиться с концепциями ОС, компиляторами, структурами данных, управлением памятью и т. Д., Вы должны знать C / C ++. Кроме того, на C / C ++ доступно множество хороших текстов, книг и статей, которые оптимизируют ваши навыки программирования. Несколько дней назад в / * Программисты * / я прочитал отличный ответ для Почему C - потому что он близок к металлу .
С другой стороны, если вы хотите ограничиться прикладным программированием, нет необходимости переходить на C / C ++. Начните прямо с C # (.Net) / Java, и вы получите хорошую работу разработчика. Но если вы действительно любите хардкорное программирование, я уверен, что однажды вы начнете изучать C / C ++.


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

3

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


3

C был назван «портативной сборки», что очень верно. Он был разработан для того, чтобы сделать Unix переносимым между процессорами и описывать код очень близко к набору команд базового процессора.

Если вы обнаружите, что хотели бы работать близко к реальному аппаратному обеспечению, находящемуся во встроенном программном обеспечении, драйверах устройств и т. Д., Вам не обойтись. Если вы хотите работать на более массовом уровне, лучше использовать высокоуровневые языки, поскольку многие функции, которые делают C мощным, также делают C опасным, поэтому они были уменьшены или просто удалены.

Лично я считаю очень важным понять, что в конечном итоге понадобится для запуска ваших программ, так как от этого зависит множество проектных решений, поэтому вы должны хотя бы знать, как отобразить код на набор инструкций по сборке и как он работает в реальных условиях. аппаратное обеспечение. То, что вы принимаете как должное, на самом деле требует времени и почему.

Поэтому я бы, по крайней мере, посоветовал вам взглянуть на C и некоторый расширенный арифметический код указателя, чтобы вы знали, с чем вам не приходится сталкиваться ежедневно.


1

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

C ++ - это язык более высокого уровня, в котором есть некоторые очень интересные особенности. Он имеет много полезных применений и является мощным языком. С другой стороны, есть много других мощных и полезных языков.

Итак, я настоятельно рекомендую узнать о том, что происходит на более низких уровнях, и C - отличный способ изучить их, поэтому я настоятельно рекомендую изучать C. C ++ не является обязательным; изучение этого научит вас чему-то, но есть и другие способы выучить большинство из них, и если вы уже работаете с основным языком, есть лучшие языки, которые нужно учить, чтобы подбирать новые концепции.


0

Это зависит от типа программного обеспечения, которое вы думаете, вы будете делать. Игры часто пишутся на C / C ++, поскольку это классически более оптимизируемый язык, когда дело доходит до исполняемого кода. То, что вы кодируете, - это то, что вы получаете, в некотором роде.

При этом C # также используется для программирования игр. C #, вероятно , один из самых лучших языков для разработки настольных приложений, по крайней мере на платформе Windows.

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

Если вы разрабатываете на Windows, я настоятельно рекомендую изучать C # .NET наряду с чем-либо еще.

Я не верю, что C ++ является требованием само по себе, но приятно иметь знания более низкого уровня об указателях, управлении памятью и других понятиях.


1
@ Ник: Компьютерный мир за окнами и C #.
Рейнджер

2
Поэтому я и сказал: «Если вы разрабатываете на Windows» .
Ник Бедфорд

0

@ Ник Бедфорд прав насчет домена, в котором вы работаете. Мои коллеги по программному обеспечению пишут драйверы устройств и встроенное программное обеспечение. С это путь туда. И не думайте о 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 и так далее. Но дело в том, или, по крайней мере, теперь я считаю, C - один из лучших языков, которые помогают вам понять фундаментальные концепции программирования.

А про карьеру без изучения C (или C ++) - да, это возможно, но изучение C продемонстрирует ваши знания в программировании.


0

Ответ для меня был да. И C, и C ++ были обязательными курсами в моей программе получения степени CS, и я считаю, что наличие степени CS или связанной степени является минимальным требованием для того, чтобы быть «хорошим программистом». Более того, быть «хорошим программистом» означает уметь рационализировать возникающие проблемы и понять, почему что-то не работает так, как можно было бы ожидать. Слишком много раз в моей карьере я был свидетелем того, как люди были озадачены проблемами и думали, что против них действуют сверхъестественные силы ... это смешно.

ИМО, зная C, демонстрирует способность понимать любой из императивных языков и решать проблемы, используя один из самых мощных инструментов, когда-либо изобретенных человечеством.


0

У хорошо округленного программиста в рукаве есть несколько мешков с трюками, в число которых входят:

1) Низкоуровневое программирование ... C как минимум. Некоторое собрание не повредит.

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

3) ООП ... Обычно я бы сказал smalltalk, но я думаю, что мы могли бы перейти с Java сейчас.


0

C является матерью всего языка программирования .... Знания эксперта в C помогут вам за короткое время освоить любой другой язык, такой как Java.

C ++ - это совершенно другая игра с мячом, и она самая сложная среди всех.


0

Нет необходимости изучать C или C ++, чтобы быть хорошим (отличным) программистом, однако для того, чтобы быть хорошим (отличным) программистом, необходимо изучать ассемблер. Отличное программирование означает оптимизацию по всей памяти, МГц, полосе пропускания, ограничениям мощности, а затем выбор наилучшего дизайна и / или реализации для выполнения поставленной задачи. Среди ученых-компьютерщиков основным недостатком по-прежнему, после десятилетий развивающихся технологий, является оптимальное управление данными. Это набор навыков, которым обучается при написании ассемблера (любая сборка; это может быть ARM, или MIPS, или x86, или микроконтроллер, или DSP, или даже ниже, чем через verilog / VHDL).


0

Опытное использование c, c ++, ассемблера и Lisp, я бы сказал, не имеет смысла вообще изучать какой-либо конкретный язык, чтобы быть хорошим программистом. Мой опыт в том, что делает хорошего программиста способным думать так, чтобы решать проблемы. Языки просто позволяют выразить свои навыки решения проблем. Например, простота C позволяет вам легко выражать алгоритмы, а Lisp позволяет рекурсивно решать проблемы. Таким образом, язык не делает вас программистом. Прежде чем стать хорошим программистом, вы должны решить проблемы. Языки - это просто инструменты, которые вы используете для решения проблем.


-1

Стоит хорошо изучить C, чтобы получить четкое представление об управлении памятью. То же самое для C ++, кроме как с целью изучения структур данных.


Неважно, какой язык используется для изучения структур данных.
kirk.burleson

Я верю, что это так, потому что во многих других языках структуры данных используются, не зная, как они обрабатываются в памяти. C ++ (без использования STL) заставляет программиста учиться тому, как обрабатываются структуры данных на низком уровне.
Aqua

-1

Нет. Есть много паршивых программистов, которые пишут код на C / C ++. Что сделает вас хорошим программистом, так это понимание того, когда и зачем вам нужно что-то писать на C / C ++

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.