Подтвердить что ты не робот

Насколько сложно превратить программиста "Java School" в программиста на C или С++?

Моя компания, дом С++, всегда надеется нанять недавних выпускников. Однако из-за феномена Java Schools мы обычно заканчиваем интервью с сильными Java-программистами, возможно, с небольшим минусом С++. Часто классы С++ на самом деле не готовят студентов к работе на С++. Тем не менее, часто это яркие дети, желающие учиться и делать все возможное.

В каждом интервью я борюсь с этим фундаментальным вопросом:

Насколько сложно превратить программиста Java School в программиста на C или С++? У вашей компании был опыт превращения стереотипного программиста "Java Schools" в сильного программиста на С++? Это стоит усилий?

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

Часто, насколько я могу судить, студент будет обладать некоторыми из этих фундаментальных навыков (быть в состоянии ответить на несколько вопросов), но у меня все еще будет эта большая часть моего разума, которая крайне скептически относится к тому, насколько хорошо кто-то могут изучать эти навыки, не загрязняя свои руки на некоторых C или С++. Может быть, мне нужно избавиться от этого стереотипа. Я просто несправедлив?

В любом случае, каков ваш опыт превращения программиста "Java School" в программиста на C или С++?

4b9b3361

Ответ 1

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

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

Они не понимают ручное управление памятью, но это намного проще на С++, чем раньше. В современном С++ выполнение собственного управления памятью стало сложнее из-за возможности исключений, поэтому вы хотите практиковать RAII почти во всем (используя auto_ptr, boost:: shared_ptr, что угодно).

Если бы я работал, я бы нанял их, если они выглядели хорошо. Я бы знал, что могут быть проблемы (С++ - это более требовательный язык, чем Java, в конце концов), и есть какая-то идея, как с ними справиться.

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

Ответ 2

Говоря чисто с точки зрения программиста на С++, я бы подумал, что разработчик Java, желающий изучить С++, столкнется с довольно крутой кривой обучения. Да, на каком-то уровне код разработки похож на всех языках. Я был однажды призван написать код в макросе Excel (pre-VBA). Мне удалось, но это было похоже на попытку написать "Война и мир" словом пятого класса.

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

Ответ 3

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

Ответ 4

Я программировал на многих языках и нахожу, что С++ очень сложно понять и быть продуктивным, по сравнению с другими языками, которые я использовал, такими как Java, C, Python, Fortan, Javascript, ASP и Perl. Я бы почти сказал это в своей собственной категории. Я НЕ считаю, что компетенция на одном из языков, которые я только что перечислил (включая Java), является отличным предсказателем того, насколько хорошим программистом на С++ может быть человек. Я думаю, что на С++ почти требуется другой тип мышления и, конечно же, способность хранить огромное количество информации в одной голове во время кодирования и в основном сосредоточиться на бизнес-требованиях.

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

Итак, основываясь на моей маленькой и явно предвзятой выборке одного человека (меня!), я бы посоветовал склониться к разработчикам, которые продемонстрировали значительную часть опыта прошлого С++, если это то, что они собираются делать на работе, в день Cегодня. Думаю, вам придется потратить больше времени на поиск этих кандидатов, но у вас будет больше шансов на успех в долгосрочной перспективе.

Ответ 5

Мое правило состоит в том, что я бы скорее попросил программиста на C/С++ написать Java, чем программист на Java, чтобы писать C/С++. Я не могу сказать, какие Java-программисты могут справиться с управлением памятью и указателями, пока они не попробуют.

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

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

Я бы взял в прокат группу 3.

Ответ 6

"Вы не можете научить высоких". - известный тренер по баскетболу.

При найме вы ищете того, кто может быстро освоить новые концепции и быстро отучить привычки. Это последнее, которое может подкрасться к вам. В случае перехода Java- > С++ вы можете столкнуться с "отказом" от таких вещей, как тяжелая уверенность в IDE, "все является объектом", ментальная модель объектов и программ, которые слишком высокоуровневы и т.д.

Я бы посоветовал вам искать вещи, которые предлагают гибкость, - попросите их написать небольшую программу как в среде IDE, так и в текстовом редакторе, показать им простую функцию С++, которая передает указатель и изменяет базовое значение и видят если они спотыкаются и т.д.

Ответ 7

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

Однако, я действительно не хочу. Я могу говорить только для себя, но C может быть довольно уродливым языком, если вы выросли с Java. Я думаю, что мотивация станет большим препятствием. Мотивация и, возможно, некоторые скулящие о том, что "в Java это намного проще, почему не C Java?":)

Если вы можете найти кого-то с надлежащей мотивацией, все остальное будет хорошо.:)

Ответ 8

Сравнительно просто понять, имеет ли выпускник глубокое понимание основ, независимо от их "языковой" группы. Эти основные принципы включают 1) Структуры данных 2) Операционные системы и 3) Алгоритмы и их сложность. Это, по сути, концептуальные области, и обсуждение дизайна или подхода к конкретной проблеме в них может показать, насколько они сильны или слабы. Вам не нужно писать код.

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

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

Ответ 9

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

Ответ 10

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

Итак, что нужно делать менеджеру по найму, поскольку люди не ставят свои резюме: "Я не получаю указателей, и я никогда не буду".

Итак, если вы покупаете гипотезу Джоэля о том, что способность "получать" указатели и рекурсию - это врожденная личная черта, которую люди либо имеют, либо нет, я вижу следующие варианты:

  • Аренда только из школ C/С++, а не школ Java.
  • Если нет школ C/С++, то нанимайте опытных программистов на C/С++, а не из колледжа.
  • Если вы привержены найму в колледже, тогда примите, что у вас будет невыносимая частота отказа при конвертации.

Ответ 11

Я сам студент, и большая часть моей курсовой работы в первые годы была на Java, но я всегда старался делать что-то на С++ просто для удовольствия. В этом семестре начался новый курс, который требовал, чтобы все программировали на С++ + OpenGL + Qt, и многие другие ученики, которые никогда не использовали С++, очень быстро адаптируются и часто тратят буквально часы на борьбу с простыми ошибками во время компиляции. Это может иметь много причин (в том числе глупость), но я думаю, что это может быть довольно сложно для тех, кто использовал только Java (и много учеников, просто используя материал, о котором говорят), чтобы перейти на С++. К несчастью, я не могу придумать, как облегчить боль переходного периода, и может думать только о Дейкстре, говорящей:

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

Ответ 12

Я сам разработчик java, но у меня была база C/С++ в колледже. И я GLAD Я начал с управления памятью, списков, очередей, стеков и наиболее важных: указателей. Хотя я не использую указатели явно, я знаю, что происходит в задней части моего приложения, обнаруживает утечки памяти, проблемы с производительностью и т.д.

Я думаю, что лучшее решение не просит разработчиков Java/С# изучать C/С++ (и все вопросы, которые приходят с этими языками), когда они приходят на работу, НО учат их этим предметам в колледже. Это было бы лучшим решением.

Как и сейчас, это похоже на фиксацию эффектов/симптомов, а не фактическую причину.

Ответ 13

Я начал с C/С++ и перешел на Java.

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

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

Когда вы работаете с системой с GC, вам становится намного лучше думать о вашем дизайне на высоком уровне. Вы можете на самом деле закодировать таким образом, что это намного понятнее. Вы начинаете действительно иметь классы, которые сосредоточены на одной ответственности (большинство классов будут на нескольких экранах - большинство методов будут тривиальными).

Я никогда не видел хороший OO С++-код, что, вероятно, хорошо, потому что OO-код не будет таким исполнительным и просто имеет слишком много небольших распределений/деаллокаций, коротких вызовов методов и других небольших дорожных блоков производительности, чтобы сделать С++ программист счастлив.

Это похоже на то, чтобы взять гоночный автомобиль и поставить на него AC, усилитель руля и электрические стеклоподъемники. Гораздо удобнее, но побеждает причину, по которой она была выбрана в первую очередь.

Кстати, мне бы очень хотелось увидеть хороший код OO С++, если у кого есть ссылка...

Ответ 14

Я думаю, что эта идея "школы Java" в значительной степени производится. Университет, в котором я участвую, использует java для обучения основным курсам CS (Структуры данных, Алгоритмы и т.д.). Однако в них много других курсов, которые используют другие языки, такие как C/С++/Scheme, и на курсах более высокого уровня, эта работа может быть выполнена в любой язык.

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

Ответ 15

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

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

Ответ 16

Зависит от IQ программиста. Реальный вопрос: достаточно ли этот программист достаточно для того, чтобы мы инвестировали время обучения? Чем умнее, тем меньше времени ему нужно изучить.

Ответ 17

Java-программист поместился бы прямо в дом С#, а также разработчик С++.

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

Ответ 18

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

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

Ответ 19

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

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

Ответ 20

Если вы нанимаете молодых людей, просто не посещающих школу, вам следует нанимать IQ, а не какие-либо особые навыки. Вы хотите, чтобы люди, которые Smart и Get Things Done, не тот, кто знает, как frob указатели таким образом, который вам особенно нравится.

Ответ 21

Я не покупаю "У вас либо есть указатели/рекурсия, либо нет". Ум - чистый лист. Любой может узнать что-либо, учитывая достаточно времени и интереса. Вопрос в том, интересуются ли эти дети.

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

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

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

MIT, Stanford, UC Berkeley, Georgia Tech, Иллинойс Урбана Шампейн, CMU, Caltech, USC, Мичиган Энн Арбор, У. Техас Остин.

Я также не стал бы нанимать кого-либо, чтобы писать программное обеспечение, использующее Microsoft Windows. Будучи студентом в области информатики, вы просто не могли быть заинтересованы в программном обеспечении или как работать с компьютерами, не становясь пользователем Linux (даже лучше, если вы идете с FreeBSD или чем-то еще)

Ответ 22

Это просто другой язык.

И если вы придерживаетесь относительно небольшого подмножества чистых функций OOP, на самом деле не так много учиться с точки зрения разработчиков Java. Единственное, что вам нужно научить их, чтобы они были универсальными программистами ООП, состоит в том, что им приходится внедрять деструктор, чтобы заботиться о своей памяти.

Однако, если они должны использовать STL, шаблоны, исключения и подобные, им, вероятно, понадобится еще несколько рекомендаций.