Java или C ++ для университетских курсов CS?

11

Я нахожусь в муках зачисления себя в школу, чтобы получить степень CS. Школа, на которую я смотрю, на самом деле предлагает как Java, так и C ++ - на основе вводных курсов по разработке программного обеспечения (объектно-ориентированное программирование, шаблоны проектирования и тому подобное). Выбор ученика - какой путь выбрать, но есть только один.

Зная, что вы знаете сейчас, если бы у вас был выбор, вы бы заложили основы учебной программы по CS на Java или C ++?

Мои текущие дебаты в настоящее время выглядят так:

Хороший друг (у которого есть докторская степень в области искусственного интеллекта) рекламирует Java как лучший выбор, независимо от того, что я делаю, хотя бы для того, чтобы открыть больше возможностей для работы позже, хотя он может быть предвзятым, поскольку вся его работа была на Java (он люблю это). Я живу в Бостоне, штат Массачусетс, США, и вижу одинаковое количество работ на Java и C.

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

Я, наверное, должен отметить, что я взрослый человек, возвращающийся в школу через 20 лет (в настоящее время у меня нет никакой степени), поэтому я стараюсь максимально использовать возможности и время, потраченное как можно лучше. Я склоняюсь к C ++, но я все еще амбивалентен, и некоторые объективные советы помогут мне в этом.

Или я просто слишком много думал об этом.

ОБНОВЛЕНИЕ: Оказывается, выбор языка был не таким четким, как я предполагал изначально. В то время как несколько основных курсов были сосредоточены на Java, некоторые другие основные курсы работают в основном на C и Java, но также некоторые другие были добавлены для хорошей меры. Фактически, мой остаток семестра будет в Objective-C после того, как я провожу время на Java и Javascript. В прошлом семестре были написаны C, Javascript и PHP, а также несколько других, добавленных по мере необходимости. Так как в целом все было разбито по середине, и я до сих пор получаю ответы на эти вопросы, я сейчас пытаюсь составить свою учебную программу так, чтобы я соответствовал всем требованиям для получения степени, но впитывал столько языков, сколько смогу , До сих пор мои оценки не пострадали при попытке сделать это.

Филип Реган
источник
1
Все в академической исследовательской среде прямо сейчас рекламируют Java. Кроме того, независимо от языка, вы должны учиться в университете, как изучать новые языки. C ++ существует, как и Java, но нет никаких утверждений, что они будут через 5 лет. Новые языки / технологии всегда появляются, поэтому вам нужно быть готовыми их освоить и быстро освоить.
Крис
1
@Chris: Вот почему я рекомендую изучать то, что облегчает дальнейшее обучение, а не то, что сейчас популярно. Я бы порекомендовал либо C ++, либо Python, чем Java (очевидно, по разным причинам).
Дэвид Торнли
Это не тот язык, который имеет значение. Это абстрактное понятие. Правильно сформулируйте концепцию, чтобы ученики могли легко узнать что-нибудь позднее в своей жизни.
J-16 SDiZ
1
Я в (жутко) похожей ситуации: возвращаюсь в школу для CS после 20 лет отсутствия в школе. В моей школе также есть трек Java / C ++. Прочитав все здесь и даже дав +1 к верхнему ответу, я все еще собираюсь перейти на Java, и вот почему, в случае, если это полезно для вас: я прихожу из веб-разработки (Javascript, PHP, Python) Таким образом, поддержка библиотек Java является плюсом. Предполагая, что я также потрачу время на то, чтобы по-настоящему охватить принципы ООП, я не думаю, что переход на C ++ (при необходимости) будет таким сложным. Java является средним звеном между сценариями и компиляцией.
быть Hollenbeck
2
Я думаю, что я не согласен с каждым ответом. Это действительно не имеет значения . Вы изучите сходные понятия на обоих языках, и вы будете изучать другой язык, который вы не выбрали, а также другие, в процессе обучения и карьеры.
Мацеманн

Ответы:

51

Лично я бы пошел с C ++, поскольку он даст вам понимание того, как части Java работают под капотом (указатели, например). Переход на Java из C ++ довольно тривиален, тогда как переход на другую сторону, возможно, более труден.

Действительно сложная вещь в экосистеме Java - это огромное количество фреймворков, библиотек и т. Д. - они, во всяком случае, вряд ли охватят все это в университете.

В конце концов, это не будет иметь большого значения , какой язык вы выберете, пока вы изучаете принципы.

Мой кувшин убьет меня за поддержку C ++ ;-)

Мартейн Вербург
источник
1
+1 за отличное замечание о размере экосистемы Java и объяснении перехода.
Jas
1
Проблема изучения большой экосистемы в университете заключается в том, что она не будет полезна на протяжении всей вашей профессиональной карьеры. Вам лучше изучать меньше библиотек и концепций, либо знакомиться с реальными возможностями языка.
Дэвид Торнли
2
Еще одним дополнительным стимулом для C ++ является то, что вы можете создать управляемый C ++ на .NET Framework, что даст вам возможность изучить C #, F # и любой другой язык в этой среде выполнения. Java также имеет большое преимущество в JVM и в таких языках, как Scala, но я не знаю JVM C ++.
CodexArcanum
Как человек, который любит думать, что он довольно приличен в C ++ (и Java), я не думаю, что какой-либо современный вводный курс программирования должен быть на C ++. Это просто слишком сложно. Если в университете вообще не преподают С ++, двигайтесь дальше, конечно, но для введения я бы выбрал что-то более простое и красивее, например, Java. Возможно, если бы я не думал, что они все злые, я бы даже порекомендовал динамически типизированный язык.
Dukeling
В некоторые из наших дней до Java у нас не было такого выбора, и мы все изучали C ++, поэтому я не вижу никаких проблем с людьми, которые все еще сначала изучают C ++. Я думаю, что введение в Java лучше, чем введение в Turbo Pascal.
Bratch
18

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

Замечание, я НЕ рекомендую вам не изучать Java (еще лучше, C #), потому что это современные быстрые языки разработки приложений, и вокруг них построены огромные фреймворки, предоставляющие вам доступ ко многим «свободным» функциям, таким как абстрактный доступ к файлам и тому подобное, однако настоящий инженер-программист должен знать хотя бы немного C ++, C или хотя бы ассемблер, потому что именно это отличает вас от типов script-kiddie.

Если вы достаточно опытны в C ++, уверены в управлении памятью и STL, освоение Java / C # должно быть легким делом.

Jas
источник
Согласен, я уверен, что изучение Java, если вы уже владеете C ++, будет намного, намного проще, чем изучение C ++, если вы уже владеете Java.
Carson63000
Проблема с тем, чтобы стать «достаточно опытным с C ++», состоит в том, что на это уйдут годы, и вы все равно будете изучать лишь небольшую часть ООП.
Генри
Java не является языком быстрой разработки приложений. Это может быть немного более высокий уровень, чем C ++, но он нигде не близок к уровню абстракции Python, Ruby, Perl или Visual Basic.
Эван Кроске
@Evan - Да, Java является «быстрым» языком разработки, если не считать ничего для его обширных библиотек (обычно говорят, что любой Java-разработчик имеет открытые документы Java API во время работы), а также не требует ручного управления памятью. И человек, который разработал Java, разработал его, потому что он нигде не использовал C ++. Плюс огромное количество развернутых Java-приложений сегодня (более низкий барьер входа) - еще один аргумент в пользу его «быстроты».
Jas
9

Школы и ученые, которые отстаивают Java в качестве первого выбора, должны быть изучены (или просто получить реальную работу там). Я говорю это как человек, который занимался разработкой приложений и систем на Java в течение последних 12 лет. Ява является жестоким языком для обучения.

Причина в следующем: за исключением одаренных, большинство учеников могут (и, скорее всего, никогда) не поймут ориентацию объекта без понимания модульного программирования. И они не могут понять модульное программирование без предварительного понимания структурированного программирования на процедурном языке. Легко и просто. Свидетельством этого (среди прочего) является то, что, хотя мы знаем ОО уже 3-4 десятилетия, на практике люди все еще пишут гиперспагетти.

Более того, человек, который полагается исключительно на язык gc (будь то Java или .NET), никогда не сможет приблизиться к аппаратному обеспечению. Если только вы не хотите создавать динамические веб-страницы, угадайте, что? Вы должны чувствовать себя ближе к языку.

Вы идете в школу CS, чтобы стать всесторонним специалистом по информатике и программисту (мы надеемся, что потратили немало часов на практические занятия программированием на многих языках программирования). Если вы знаете только Java (или .NET или C или Python, что угодно), тогда вы «программист на Java» (не программист, который может работать на Java, а «программист на Java»). И это имеет такой же смысл, как если бы вы говорили, что вы «плотник-молот» или «механик-отвертка Филиппа», не так ли?

Хорошая школа познакомит вас с C (или с некоторыми другими процедурными языками, такими как Pascal или Ada), затем с C ++ и сборкой, что позволит вам изучать Java самостоятельно, когда вы будете проходить курсы проекта capstone в течение своего младшего / старшего года. Кроме того, он должен предоставить вам доступ к функциональным языкам, чтобы вы понимали концепцию передачи вычислительных блоков в качестве аргументов, вычислений без побочных эффектов, прозрачности местоположения и т. П. (Которые реально применяются даже в Интернете).

Вам нужно знать, что такое сегфо. Вам нужно знать, что означает пейджинг, виртуальная память и всякая ерунда. Вы должны знать, как разбивать проблемы на модули (будь то процедурные и основанные на OO). Вам необходимо знать, как ОО-системы действительно реализуются изнутри (чтобы вы знали стоимость.) Вы должны знать, где ломается абстракция ОО (и это происходит потому, что мир и сложные проблемы не обязательно объектно-ориентированы).

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

Академики, которые настаивают на том, чтобы Java был единственным в своем роде языком, чтобы управлять ими всеми, совершенно не понимают, что на самом деле нужно индустрии. Бестолковые. Непростительный невежественный. Вот что происходит, когда они работают над башнями из слоновой кости, глядя на индустрию на расстоянии.

Они превратили факультеты компьютерных наук в дорогие 4-летние профессиональные училища, где выпускают пони с одним языком программирования. И это можно было бы простить, если бы они могли хотя бы научить студентов базовым навыкам ведения бизнеса / предприятия / организации (то есть отказаться от фасада CS и принять учебную программу MIS.) Но они даже этого не делают, что, я думаю, является большой медвежьей услугой. для промышленности, экономики и в конечном итоге студентов.

Я бы посоветовал вам прочитать статью Джоэла Спольски "Java Schools".

http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html

Таким образом, если они не учат вас процедурному языку программирования (будь то промышленный язык, такой как C или Ada, или достаточно хорош для преподавания, например, Pascal), они дают вам C ++ (если вам повезет) или Java / C # (если вам не повезло), я бы искал другую школу. Проще говоря, от парня, который уже давно использует Java для жизни в реальном мире.

luis.espinal
источник
С кем-то, кто хорошо знает Java, C и C ++ и кто не закончил слишком давно, я собираюсь не согласиться. C (или C ++) VS Java - Java «проще». Может быть, если бы я начал с C ++ (что, на мой взгляд, довольно круто (но не просто), кстати) (вместо (Delphi (eww) +) Java) вполне возможно, что я был бы демотивирован, разочарован и не стал бы программистом (хотя, возможно, у нас просто был плохой учитель C ++). Но да, изучение C ++ для понимания внутренних элементов Java было абсолютно бесценным. И я предполагаю, что около 95% программистов в наши дни "никогда не приближаются к оборудованию".
Dukeling
« C (или C ++) VS Java - Java« проще » » - ну, это хорошо известная информация. Я не уверен, что это имеет отношение к моему сообщению, хотя (?????)
luis.espinal
Легче понять, легче учить, легче учить, поэтому я не согласен с тем, что «Java - это ужасный язык для преподавания» и что вам следует сначала выучить C (возможно, более простой процедурный язык - это хорошо). Я также говорю, что C или C ++ полезно знать, но не для начала, потому что в этом случае вы, вероятно, отпугнете всех, кроме самых хардкорных программистов, потому что я уверен, что это все, кто переживет введение в программирование через C ++. Не то чтобы я возражал против мира хардкорных программистов, но другие люди могут. Да, вы которые говорят хорошо округлены, но я говорю , свинец с Java или аналогичный.
Dukeling
Проще понять и преподавать не обязательно означает, что язык является адекватным для педагогических целей. После 12 лет работы с Java я в этом убежден. Гораздо лучшим педагогическим языком, который проще, чем C или C ++, был бы, например, Python ... или любой язык, который не заставляет каждый метод находиться в классе, то есть язык, который является действительно мультипарадигмальным, в отличие от Java, где все «предположительно» является объектом, где нет хороших альтернатив области видимости, кроме классов и пакетов, и так далее, и так далее. Это ограничивает способность обучать правильному моделированию.
luis.espinal
Java, вынуждая вас изучать программирование в существительном, все-как-объектном режиме, предоставляет плохие метафоры моделирования для других парадигм, которые больше подходят для реального моделирования мира. Профессиональный разработчик из окопов может обойти это ограничение. Студенты не делают, и простите меня, но очень немногие преподаватели колледжей имеют опыт из окопов, чтобы узнать разницу. Я бы выбрал Python или Ruby (или фактически Lisp или BASIC) вместо Java, если C / C ++ слишком хардкорный.
luis.espinal
4

Я думаю, что многое зависит от вашей личности. По крайней мере, с моей точки зрения, Java и C ++ имеют радикально разные ориентации, которые обращаются к существенно разным людям.

Когда вы приступаете к этому, Java на самом деле представляет собой большую библиотеку классов с достаточным количеством языков, чтобы иметь возможность создавать экземпляры объектов и вызывать методы из этой библиотеки. «Изучение Java» состоит, в основном, из запоминания (или, по крайней мере, ознакомления) с тем, что находится в библиотеке и как она организована, так что вы можете найти то, что хотите, когда захотите.

C ++ уделяет гораздо меньше внимания предоставлению предварительно написанного кода. Хотя она включает в себя библиотеку (STL 1 ), эта библиотека не столько о коде, который включен, сколько о стиле и наборе принципов. Вполне возможно написать код, который можно легко и легко распознать как код "STL", даже при том, что он практически не использует или вообще не использует заранее написанный код.

Есть также довольно существенная разница в том, как используются языки. Java уделяет большое внимание простоте языка. Это облегчает создание инструментов, которые манипулируют кодом Java различными способами (например, для рефакторинга). Это также означает, что вам, как правило, нужны инструменты, которые могут это сделать, потому что рефакторинг часто включает в себя довольно существенные изменения в больших объемах кода.

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

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

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

1 Да, я знаю, что это не совсем точно, но я стараюсь не превращать это в книгу ...

Джерри Гроб
источник
3

Я не могу поверить, что люди защищают C ++ как первый язык! Вы будете тратить большую часть своего времени на написание котельной пластины и пытаться обойти ограничения и рыболовные крючки в языке, чем на самом деле научиться программировать.

Java - намного более простой язык, и он не помешает вашему обучению.

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

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

Генри
источник
Это не будет моим первым языком. Я теперь программист, возвращаюсь в школу, чтобы получить степень. Мой опыт работы с C ++ и Java ограничен, но у меня есть опыт работы с C и Objective-C. Но спасибо, что нашли время ответить.
Филипп Реган
3
Java будет мешать вашему обучению. Он научит вас полному неправде о независимых от языка понятиях.
DeadMG
2

Я бы порекомендовал C ++. У меня было несколько классов по Java, а некоторые по C ++ в колледже, и специфические для языка навыки, которые я выучил из C ++, помогли мне больше при изучении дополнительных языков позже. Кроме того, хотя я вижу гораздо больше вакансий в Java, чем в C ++, большинство из них ищут полный стек Java, например:

  • EJB 1.x / 2.0, JNDI, JMS, JTA / JTS, RMI, JDBC, сервлеты, JSP, SAX / DOM, веб-сервисы, SOAP, WSDL, UDDI, JAXB, JavaMail, WAP, WML, HTML
  • Tomcat, Apache Xalan, Apache Xerces, Jserv, JRun, JBuilder, TogetherJ, Web Logic 5.x / 6.x, Websphere 3.5 / 4

И, скорее всего, учебная программа на основе Java не подготовит вас намного лучше, чем учебная программа на C ++ против такого списка.

Крис
источник
1
Я бы добавил, что (по крайней мере, в моей области) задания C ++ также оплачиваются немного лучше, чем задания Java (цель) и, как правило, более интересны (субъективно).
Cercerilla
2

Это сложно, потому что Java, несомненно, легче выучить. Вы будете делать больше раньше с Java.

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

В долгосрочной перспективе было бы полезно понять все, чему вас учит C ++. Также переход с C ++ на Java намного проще, чем в другом направлении.

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

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

glenatron
источник
2

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

Тем не менее, задания C ++ встречаются не так часто, как задания Java.

Java и ее потомок, C #, являются стандартными решениями для корпоративного / корпоративного пространства кодирования большого железа. Я настоятельно рекомендую изучать один из двух предметов на втором курсе и хорошо освоить его к моменту окончания учебы. Это позволит вам получить работу намного проще. Это не значит, что я думаю, что эти работы в среднем имеют значительный интеллектуальный интерес. Недавно я прошел работу по программному обеспечению Craigslist в Скалистых горах, и большинство работ были на C # / Java и были связаны с тем, что называется « CRUD »; ИМО, это очень скучно.

Пол Натан
источник
1

Преподав C ++ и Java на уровне колледжа, я настоятельно рекомендую Java .

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

IDE для Java предоставляют поддержку как начинающим, так и начинающим студентам. Внедрение в разговор мощных инструментов рефакторинга (например, при обсуждении ООП) поможет студентам научиться писать поддерживаемый код.

Хотя C ++ является полезным языком для изучения, дополнительные понятия, изученные в C ++, на самом деле не стоят дополнительных усилий языка в целом. Существует большой дополнительный набор «уловок», которые необходимо изучить, которые могут быть введены позже (проблемы управления памятью и переполнения буфера, чтобы назвать пару). Требование, чтобы студенты поняли это, прежде чем переходить к таким понятиям, как сложность алгоритмов и наследование, замедляет вас, в то время как требование, чтобы водитель понимал давление в шинах перед вождением, замедляло бы его. Конечно, вы должны это знать. Но вам нужно знать это только как нечто, что вы когда-нибудь ошибетесь , а не как строительный блок более широкой концепции.

Алекс Фейнман
источник
2
Если у вас возникнут серьезные проблемы с переполнением буфера и управлением памятью, вы неправильно учите C ++. Какой из стандартных контейнеров может переполниться как буфер?
Дэвид Торнли
Массивы? На самом деле, я мог неправильно учить С ++; это было более десяти лет назад.
Алекс Фейнман
0

Я думаю, что самый большой вопрос, который нужно задать себе: хотите ли вы быть хорошим программистом или сосредоточиться на информатике. Если CS - ваша цель, и вы хотите быть на маршруте PHD, тогда, возможно, Java - путь. Java предоставляет классы коллекций Java, которые имеют множество готовых структур данных и алгоритмов. Преимущество этого двоякое: во-первых, вы можете поиграться со структурами данных и алгоритмами, чтобы увидеть, что они делают, прежде чем беспокоиться о том, как они были построены. Во-вторых, это дает профессорам больше возможностей для обучения принципам CS, которые используют структуры данных, не беспокоясь о мелочах. Позже они могут вернуться и попросить своих учеников создать структуры с нуля.

С ++, с другой стороны, является языком более низкого уровня. Это заставляет вас учитывать указатели и сборку мусора. Кривая обучения немного круче, но, в конце концов, когда вы попадаете на путь программирования с внешними фреймворками, вы будете меньше чувствовать, что просто полагаетесь на скрытую магию. Кроме того, многие крупные компании все еще используют C ++. С Java на C ++ труднее перейти, чем с C ++ на Java.

Кавет Керек
источник
Сейчас моя цель - просто заняться разработкой программного обеспечения, чтобы стать лучшим программистом. На данный момент у меня мало интереса к далеко идущим академическим занятиям.
Филипп Реган