Моя компания, специализирующаяся на C++, всегда ищет недавних выпускников. Однако из-за феномена школ Java мы, как правило, проводим собеседования с сильными Java-программистами, которые могут хоть немного разбираться в C++. Часто классы C++ не готовят студентов к работе на C++. Тем не менее, зачастую это умные дети, которые хотят учиться и стараться изо всех сил.
Каждое интервью я борюсь с этим фундаментальным вопросом:
Насколько сложно превратить программиста из "Школы Java" в программиста на C или C++? Была ли у вашей компании опыт превращения стереотипного программиста из «Школы Java» в сильного программиста на C++? Стоит ли прилагать усилия?
Одна из причин, по которой я борюсь с этим, не только из-за разницы языков C или C++ и Java, но и из-за фундаментальных навыков, которые приходят с изучением C или C++, которые, как мне кажется, часто теряются в Java School. К ним относятся структуры данных, вычислительная сложность, ручное управление памятью и все, что говорит Джоэл Спольски здесь.
Часто, насколько я могу судить, ученик будет обладать некоторыми из этих фундаментальных навыков (уметь ответить на несколько вопросов), но у меня все еще будет большая часть моего разума, которая крайне скептически относится к тому, насколько хорошо кто-то может их изучить. навыки, не запачкав руки в каком-нибудь C или C++. Может, мне нужно развеять этот стереотип. Я просто несправедлив?
В любом случае, каков ваш опыт превращения программиста из "Школы Java" в программиста на C или C++?
Я уверен, что все они этого не делают. На самом деле, возможно, большинство этого не делает, но достаточно экономить на них. К сожалению, это создает стереотип «школы Java», который применяется к некоторым выпускникам. Просто сложнее избегать этих тем в C или C++ для выполнения работы. Особенно когда на некоторых курсах говорят - ни STL, ни буста.
Может быть, стоит спросить, почему тогда ваш дом - C++. В наши дни даже встроенные программы могут запускать Java.
@ Пиролитический - рискуя показаться неприятным (и поверьте мне, я не пытаюсь показаться противным), не каждый может позволить себе роскошь переписать много унаследованного кода на языке повседневной жизни. Некоторые из нас застряли с большими инвестициями в старые кодовые базы.
это так же просто, как превратить генерала в солдата
@Pyrolistical, может бежать? Правда. Но следует ли бежать? У меня есть группа приятелей, программирующих консоли для видеоигр, которые в случае смерти перевернулись бы в могиле при мысли об использовании Java.




Зависит от IQ программиста. Настоящий вопрос: достаточно ли умен этот программист, чтобы мы вкладывали время в обучение? Чем умнее, тем меньше времени ему нужно на обучение.
Программист на Java вписался бы прямо в дом C#, как и разработчик на C++.
Переход на C / C++ будет зависеть от программиста, но я бы не стал считать их навыки Java ни для чего, кроме общего опыта программирования. Я также был бы удивлен, если бы вы привлекли много таких соискателей.
Программисты программы. Тот, кто действительно умеет программировать, может выучить любой язык. Конечно, есть кривая обучения, но хороший кодировщик может быстро освоиться. Если вы ждете кого-то с продвинутыми знаниями, вы все равно не станете нанимать новых выпускников, верно? Так что в любом случае придется учиться.
Я не уверен, что это касается C / C++. Если рассматриваемый программист работал только с «современными» языками и никогда не выполнял работу на языке ассемблера, то ему или ей, возможно, будет действительно сложно разобраться с управлением памятью, независимо от того, насколько они хороши в Java или C#.
Я также не уверен, что это справедливо для того, чтобы сказать, что вы делаете функциональный язык, когда все, что вы сделали, это Java или C#. Я считаю, что изучение нового языка тривиально, если вы познакомились с чем-то в том же классе языков, но я не считаю универсально тривиальным переход от одного к другому.
При этом упускается из виду фундаментальная разница в навыках между C * и Java. Очень легко преуспеть в Java, не изучая критически важных навыков программирования, которые необходимы для большинства типов коммерческого программирования. Подход «программистские программы» привел к массовому притоку программистов, которые даже не знают, как программировать.
И что еще хуже, Дэйв ... большинству все равно, что они не знают. Я получу более быстрый процессор .. Вы боретесь, как вы тренируетесь… вы никогда не думаете о мелочах, и вы будете платить за большие.
Ох .. Люблю "современные" кстати .. и как насчет "управляемых" .. Я много лет управляю своей памятью, большое вам спасибо.
Кто-то из школы Java должен все еще хорошо разбираться в структурах данных и вычислительной сложности. Единственная область, где их должно быть недостаточно, - это ручное управление памятью. Если они понимают, что для них делает сборщик мусора, и кажутся достаточно умными, чтобы вы могли научить их управлению памятью, я бы посоветовал им попробовать. Поскольку они не тратили время на изучение управления памятью в школе Java, постарайтесь выяснить, особенно ли они сильны в какой-то другой области, которая вам нужна.
Это просто другой язык.
И если вы будете придерживаться относительно небольшого подмножества чистых функций ООП, с точки зрения Java-разработчиков действительно не так уж и многому. Единственное, чему вы должны научить их, чтобы они могли быть обычными программистами ООП, - это тому, что они должны реализовать деструктор, заботящийся о своей памяти.
Однако, если им следует использовать STL, шаблоны, исключения и тому подобное, им, вероятно, потребуется дополнительное руководство.
Я видел, как разработчики Java пишут код на C++ с мышлением «это просто другой язык». Это как пытаться говорить по-испански с итальянцем, потому что это оба романтических языка, так что должно быть много общего.
Что ж, если они не понимают структуры данных и алгоритмическую сложность, они не будут очень хороши в серьезном программировании на Java, поэтому я не вижу, чтобы язык здесь был проблемой.
Они не понимают указатели, но хорошее программирование на C++ обычно не использует указатели сложным образом. (Есть исключения, но, поскольку я не знаю, чем занимается ваша компания, я не могу сказать, будут ли они применяться.) В конце концов, вы, вероятно, не хотите, чтобы ваши разработчики писали свои собственные связанные списки вместо использования std :: список.
Они не поймут ручное управление памятью, но в C++ это намного проще, чем раньше. В современном C++ делать собственное управление памятью стало сложнее из-за возможности исключений, поэтому вы хотите практиковать RAII практически со всем (используя auto_ptr, boost :: shared_ptr, что угодно).
Если бы у меня были какие-то вещи, я бы нанял их, если они хорошо выглядели. Я бы знал, что могут возникнуть проблемы (в конце концов, C++ - более требовательный язык, чем Java), и у меня было какое-то представление, как с ними бороться.
Нет причин избегать приема на работу людей из колледжа только потому, что у них нет именно тех навыков, которые вам нужны. Умные будут учиться, и вы, вероятно, не захотите нанимать неразумных.
Я не согласен, указатели имеют фундаментальное значение для структур данных, а ссылки необходимы для копирования ctors.
Для каких структур данных важны указатели? Большинство основ доступно в форме без указателя из стандартной библиотеки или Boost. Ссылки не должны быть слишком сложными для поиска. Начните с них, а затем расскажите о деталях более низкого уровня.
@Hooked: указатели необходимы только тогда, когда они эквивалентны ссылкам на Java, поэтому фона Java должно быть достаточно.
@ Дэвид Родригес: А как насчет указателей на переменные стека? Это часто бывает полезно, когда вам нужна семантика передачи по ссылке. Это невозможно сделать непосредственно в Java.
@ Jørgen Fogh: Если вам нужна семантика передачи по ссылке, вы должны использовать ссылки, а не указатели, и эту концепцию нетрудно понять: ссылка (C++, а не java) - это просто псевдоним другой переменной, будь то в стек или динамически распределенный не имеет значения.
Я работал со школьниками Java. У них действительно есть проблема с выделением и очисткой памяти. Но эта боль длится всего пару месяцев, и умные довольно быстро улавливают разницу ... Тем не менее ... они немного более ленивы. Хотя у Хайнлайна есть отличная цитата по этому поводу.
Относительно просто выяснить, хорошо ли понимает выпускник основы независимо от его «языковой» группы. Эти основы включают 1) структуры данных 2) операционные системы и 3) алгоритмы и их сложность. По сути, это концептуальные области, и обсуждение дизайна или подхода к конкретной проблеме в них может показать, насколько они сильны или слабы. Вам не нужно заставлять их писать код.
Я бы сказал, что если у кого-то есть прочная база в этих основах и, что не менее важно, позитивный настрой, он может выучить любой другой язык.
Я всегда обращаюсь к этим основам и их оценке - новичку или опытному. Это основные критерии для приема на работу.
Я сам являюсь java-разработчиком, но в колледже у меня была база C / C++. И я рад, что начал с управления памятью, списков, очередей, стеков и, самое главное: указателей. Хотя я не использую указатели явно, я знаю, что происходит в задней части моего приложения, нахожу утечки памяти, проблемы с производительностью и т. д.
Я думаю, что лучшее решение - не просить разработчиков Java / C# изучать C / C++ (и все, что связано с этими языками), когда они идут на работу, НО преподавать им эти предметы в колледже. Это было бы лучшим решением.
В настоящее время это похоже на устранение последствий / симптомов, а не фактической причины.
Я программировал на многих языках и считаю, что C++ очень труден для понимания и работы с ним по сравнению с другими языками, которые я использовал, такими как Java, C, Python, Fortan, Javascript, ASP и Perl. Я бы сказал, что это отдельная категория. Я НЕ верю, что владение одним из языков, которые я только что перечислил (включая Java), является отличным показателем того, насколько хорошим программистом на C++ может быть человек. Я думаю, что C++ требует почти другого типа мышления и, конечно же, способности удерживать в голове огромное количество информации во время кодирования, в отличие от сосредоточения внимания в основном на бизнес-требованиях.
Я много лет пытался овладеть C++, несмотря на то, что мне никогда не приходилось использовать его на работе (то есть учиться в свободное время). Это очень трудный процесс, и по прошествии всего этого времени я не уверен, что смогу быть успешным и продуктивным как программист на C++. Я думаю, что в целом я достаточно компетентен в этих других языках.
Итак, основываясь на моей небольшой и явно предвзятой выборке одного человека (меня!), Я бы посоветовал склоняться к разработчикам, которые продемонстрировали значительный прошлый опыт работы с C++, если это то, что они собираются делать на работе изо дня в день. Вам нужно будет потратить больше времени на поиск этих кандидатов, но я думаю, у вас будет больше шансов на успех в долгосрочной перспективе.
Отличный честный ответ. Не могли бы вы пояснить, что, по вашему мнению, является камнем преткновения? Синтаксис? Гибкость модели программирования?
Я думаю, это сводится к слишком большому количеству деталей, чтобы запомнить все сразу, и слишком большому количеству подводных камней. Как говорит Страуструп (я думаю), это слишком "дружелюбно к экспертам".
Не расстраивайся. Я не думаю, что гуру знают более 40% языка.
Я не чувствую себя плохо, но я устаю от большой стопки книг по C++ на прикроватной тумбочке, из-за которых нечего показать. Последней является "Accelerated C++" от Koenig / Moo, которая на самом деле довольно хороша (пока) с точки зрения предоставления практических примеров по сравнению с бесконечными языковыми мелочами.
@Doug: Может быть, но интересно, что это может быть потому, что C++ был разработан так, чтобы быть независимым от целей, люди изучают его подмножество, которое лучше всего подходит для их нужд и обычно не требует остального.
Кроме того, я сомневаюсь, что даже гуру знают более 10% Java: D
@tloach, это побочный эффект сборки мусора. И да, я публикую это несколько месяцев спустя, но, черт возьми, мне нужно пошутить.
«Вы не можете научить высоким». - какой-то известный тренер по баскетболу.
При приеме на работу вы ищете человека, который может быстро изучить новые концепции и быстро освоить разучиться привычки. Именно последний может подкрасться к вам. В случае перехода Java-> C++ вы можете столкнуться с «отучением» таких вещей, как сильная зависимость от IDE, «все является объектом», слишком высокоуровневая ментальная модель объектов и программ и т. д.
Я бы посоветовал вам поискать вещи, которые предполагают гибкость - пусть они напишут небольшую программу как в среде IDE, так и в текстовом редакторе, покажут им простую функцию C++, которая передает указатель и изменяет базовое значение, и посмотрите, не споткнутся ли они , так далее.
Я бы не стал уделять много внимания использованию IDE ... Недавно я перешел на eclipse для java (android), но я занимался разработкой в среде RIM (также java). 90% моей оплачиваемой жизни я провел в VS для C++ .. хотя я начал C++ в Borland. Идеи созданы, чтобы учиться. И вам не обязательно быть профессионалом в среде IDE, чтобы хорошо владеть языком.
Возможно, я не совсем понял: я думаю, вам следует подтвердить, что они не полагаются на IDE.
Говоря чисто с точки зрения программиста на C++, я думаю, что Java-разработчик, желающий изучить C++, столкнется с довольно крутой кривой обучения. Да, на каком-то уровне код разработки похож на всех языках. Однажды меня попросили написать код на макроязыке Excel (до VBA). Я справился, но это было похоже на попытку написать Война и мир с помощью словаря пятого класса.
Есть и другие проблемы с C++ (указатели, управление памятью, перегрузка операторов), которых, насколько мне известно, просто нет в Java, и это тоже немалые проблемы. Особенно, если вы ищете кого-то, кто поможет с устаревшим кодом C++, это может создать большие препятствия. И я думаю, что начну с любого нового найма, по крайней мере, с некоторого технического обслуживания на начальном этапе.
проголосовать за одну только метафору :)
Мой пост здесь - почти ответ на ваш вопрос.
Как Джоэл грустный в ссылке, которую вы предоставили, это действительно плохо, что сегодня они не изучают основы в школе. Но хорошие все еще учатся, они берут классы по операционным системам и взламывают планировщик ядра Linux, они делают проекты в сборке и т. д.
Большинство сотрудников в моей компании только что закончили обучение, и невозможно сдать наши экзамены, не понимая основ, так что подбадривайте себя, ведь вокруг все еще есть хорошие кандидаты, которые вам нужно знать как их найти.
Я начал с C / C++ и перешел на Java.
Я не уверен, что новые выпускники действительно что-то знают - считайте их чистым листом для тренировок. Возможно, вам даже будет лучше с необразованным хакером.
Тем не менее, для хорошего инженера довольно легко переключаться между указателями, распределением памяти и т. П. - но я думаю, что невероятно сложно перейти от объектно-ориентированного подхода со сборкой мусора к не-объектно-ориентированному программированию.
Когда вы работаете с системой с GC, вы намного лучше думаете о своем дизайне на высоком уровне. На самом деле вы можете кодировать более понятным способом. Вы действительно начинаете иметь классы, которые сосредоточены на единственной ответственности (большинство классов будет состоять из нескольких экранов - большинство методов будут тривиальными).
Я никогда не видел хорошего OO-кода C++, что, вероятно, хорошо, потому что OO-код не будет таким производительным и просто имеет слишком много небольших выделений / освобождений, коротких вызовов методов и других небольших препятствий для производительности, чтобы порадовать программиста C++ .
Это как если взять свой гоночный автомобиль и поставить на него кондиционер, гидроусилитель руля и электрические стеклоподъемники. Гораздо удобнее, но не по той причине, по которой он был выбран в первую очередь.
Кстати, мне бы очень хотелось увидеть хороший OO-код на C++, если у кого-то есть ссылка ...
Это сложнее, чем превратить хорошего программиста на C / C++ в хорошего программиста на Java. Здесь акцент сделан на «хорошо». Любой человек плохо умеет программировать на любом языке. Хорошие программисты на C++ должны хорошо разбираться в указателях. Одна из наиболее важных концепций C++ - итератор, который является обобщением указателя C посредством перегрузки оператора, что делает многие алгоритмы действительно универсальными для C++.
Одним из отличных индикаторов того, получают ли NCG это знания, является их результативность на курсах по операционной системе. Если они с честью прошли курс ОС с большой нагрузкой на проект (например, реализация любых компонентов ОС на любых языках) и им это понравилось, скорее всего, они будут одними из лучших студентов, которых вы можете получить.
Я думаю, что проблема, о которой говорил Джоэл Спольски в своей статье, заключается в том, что «получение» указателей и рекурсии требует определенных умственных способностей, и что учебный план, основанный на C, отсеял бы тех, у кого этого не было, а школа Java - не т обязательно сделаю это.
Так что же делать менеджеру по найму, если люди не пишут в своих резюме: «Я не получаю указателей и никогда не получу».
Итак, если вы согласитесь с гипотезой Джоэла о том, что способность «получать» указатели и рекурсию - это врожденная личная черта, которая есть у людей или их нет, я вижу следующие варианты:
Я думаю, что эта идея «школы Java» в значительной степени сфабрикована. Университет, в котором я нахожусь, использует java для преподавания основных курсов CS (структуры данных, алгоритмы и т. д.). Однако есть много других курсов, которые используют другие языки, такие как C / C++ / Scheme, и на курсах более высокого уровня работа может выполняться в любой язык.
Вы действительно думаете, что имеет значение, на каком языке преподаются основные концепции программирования?
Это имеет значение. Изучение языка, который заставляет вас понимать глубокие концепции, создает гораздо более глубокое понимание машины и того, что на самом деле представляет собой кодирование.
Поскольку позже в школе преподают другие языки, вопрос в значительной степени спорный. Тем не менее, имеет значение, на каком языке преподается базовое программирование. Если бы я поступил по-своему, вводные курсы были бы на Javascript. Отчасти потому, что для этого потребуются более поздние курсы по другим языкам.
Как человек, который в первую очередь "Java-школьник" и совсем недавно получил высшее образование, я определенно думаю, что смогу выучить C или C++ без особой боли ...
Однако очень не хочу. Я могу говорить только за себя, но C может быть довольно уродливым языком, если вы выросли на Java. Я думаю, что мотивация будет большим препятствием. Мотивация и, возможно, некоторое нытье по поводу того, что "в Ява это намного проще, почему не C Ява?" :)
Если вам удастся найти кого-то с должной мотивацией, все остальное у вас получится. :)
Мотивация определенно важна. Кроме того ... никто в команде не будет сочувствовать, когда новичок будет ныть обо всем, что C++ не делает, что их «старый» язык делал (и удобно игнорирует все, что C++ делает лучше, чем их старый язык).
Я сам учусь, и большая часть моей курсовой работы в ранние годы была на Java, но я всегда пытался делать что-то на C++ просто для удовольствия. В этом семестре начался новый курс, по которому каждый должен был программировать на C++ + OpenGL + Qt, а многим другим студентам, которые никогда не использовали C++, очень трудно адаптироваться и они часто проводят буквально часы, борясь с простыми ошибками времени компиляции. У этого может быть много причин (включая глупость), но я думаю, что для кого-то, кто Только использовал Java (а многие студенты просто используют то, что им говорят), может быть довольно сложно перейти на C++. К сожалению, я не могу придумать никакого способа облегчить боль переходного периода и могу думать только о словах Дейкстры:
It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.
Я думаю, что в этом Дейкстра ошибался. Мне кажется, у большинства программистов ушло около 15-20 лет, чтобы избавиться от извращений BASIC.
Мое эмпирическое правило: я бы предпочел, чтобы программист на C / C++ писал на Java, чем программист на Java писал на C / C++. Я не могу сказать, какие программисты Java могут справиться с управлением памятью и указателями, пока они не попробуют.
Если бы все, из чего мне приходилось выбирать, были школьники Java, я бы рассказал им несколько ужасных историй о сборке и C, а затем попытался бы разбить их на три категории.
Я бы нанял из группы 3.
Я не покупаю «Вы либо получаете указатели / рекурсию, либо нет». Ум - это чистый лист. Кто угодно может чему-нибудь научиться, имея достаточно времени и интереса. Вопрос в том, интересно ли этим детям.
Мы искали стажера для моей работы, и я просмотрел около 30+ резюме из урожая этого года. Главное, что меня шокирует, - это то, как немногие из них сделали черт побери, чего от них не требовал ни один из их классов или работа. Найдите того, кто сделал что-то самостоятельно и получил от этого удовольствие, и вы останетесь довольны.
Тем не менее, лично я бы не стал тратить время на кого-то, кто не понимает C и ассемблер. Существует большая разница между отладкой дампа ядра с помощью gdb из-за сбоя C++ и просмотром трассировки стека Java. C++ - действительно ужасный язык по многим причинам, но в нем хорошо то, что у него есть общего с C.Это мощный способ указать компьютеру делать именно то, что вы хотите, без необходимости беспокоиться. о том, какую еще чепуху творит какая-то среда выполнения.
Также, если вы хотите сэкономить время, не связывайтесь ни с кем не из 10 лучших инженерных школ. Нельзя сказать, что в школах второго уровня нет отличных учеников, но с практической точки зрения вам не нужно, чтобы ваш наниматель был одним из них.
Массачусетский технологический институт, Стэнфорд, Калифорнийский университет в Беркли, Технологический институт Джорджии, Иллинойс Урбана Шампейн, CMU, Калифорнийский технологический институт, Университет Южной Калифорнии, Мичиган-Анн-Арбор, США, Техас, Остин.
Я также не стал бы нанимать кого-либо для написания программного обеспечения, использующего Microsoft Windows. Будучи студентом информатики, вы просто не могли бы так интересоваться программным обеспечением или работой компьютеров, не став пользователем Linux (даже лучше, если вы используете FreeBSD или что-то еще)
«Ум - это чистый лист». Я думал так, пока у меня не родилось трое детей. Теперь я верю в способности.
лол .. несмотря на твоих тупых детей ...
У вас все было хорошо до последних трех абзацев.
Моя цель - не делать людей счастливыми. Это помочь плакату. Применяя несколько простых фильтров «хорошая школа» и «не-Windows-пользователь», вы можете значительно повысить вероятность того, что ваши кандидаты хороши. Конечно, поскольку большинство людей а) не ходили в одну из этих школ и б) пользуются окнами, правда непременно будет болезненной.
-1: Хороший программист мог писать код на пишущей машинке. Навыки находятся в голове, а не в операционной системе. Я использовал Linux, Windows и Mac, и я многому научился у каждого из них.
Если вы нанимаете молодых людей, которые только что окончили школу, вам следует нанимать их из-за IQ, а не из-за каких-то конкретных навыков. Вам нужны люди, которые являются Умный и добивайся успеха, а не кто-то, кто знает, как замораживать указатели таким образом, который вам особенно нравится.
Хорошая программа по информатике должна учить студентов основам, которые одинаковы независимо от того, какой язык программирования вы используете. То, что вы упомянули, управление памятью, структуры данных и т. д. - все это часть этих фундаментальных навыков. По моему опыту, программист, знакомый с этими концепциями, разработает более лучшие (более эффективные, быстрые, простые) решения, чем те, кто не понимает этих концепций, особенно для нестандартных задач.
Что касается выбора языка, хороший программист должен уметь освоить новый язык программирования за несколько недель, а овладеть им за 1-2 месяца. Это особенно верно для C++ и Java, у которых так много общих функций.
Вы должны прочитать «Научитесь программировать на C++ за 10 лет».
Я не знаю об университетах, в которых у вас был опыт использования Java ... но мой определенно не экономит на структурах данных или алгоритмической сложности.