Est-il difficile de transformer un programmeur "Java School" en programmeur C ou C++? [fermé]


Mon entreprise, une maison C++, cherche toujours à embaucher des diplômés récents. Cependant, en raison du phénomène des écoles Java, nous finissons généralement par interviewer de puissants programmeurs Java avec peut-être une minute de C++. Souvent, les classes C++ ne préparent pas vraiment les étudiants à travailler en C++. Néanmoins, ce sont souvent des enfants lumineux, désireux d'apprendre et de faire de leur mieux.

A chaque interview, je me bats avec cette question fondamentale:

À quel point est-il difficile de transformer un programmeur "Java School" dans un programmeur C ou C++? Votre entreprise a-t-elle eu l'expérience de transformer le programmeur stéréotypé des "écoles Java" en un programmeur C++ puissant? Est-il encore la peine?

L'une des raisons pour lesquelles je lutte avec cela n'est pas seulement due à une différence de langage C ou C++ vs Java, ce sont les compétences fondamentales qui accompagnent l'apprentissage du C ou du C++ que je pense souvent perdre à l'école Java. Ceux-ci incluent les structures de données, la complexité de calcul, la gestion manuelle de la mémoire, vraiment tout Joel Spolsky, dit - ici.

Souvent, pour autant que je sache, un étudiant aura certaines de ces compétences fondamentales (être capable de répondre à quelques questions), mais j'aurai toujours cette grande partie de mon esprit qui est extrêmement sceptique quant à la façon dont quelqu'un peut apprendre ces compétences sans se salir les mains dans certains C ou C++. Peut-être que j'ai besoin d'être désarmé de ce stéréotype. Suis-je tout simplement injuste?

Quoi qu'il en soit quelle est votre expérience avec la transformation du programmeur" Java School " en C ou Programmeur C++?

Author: Joel Coehoorn, 2008-10-30

22 answers

Eh bien, s'ils ne comprennent pas les structures de données et la complexité algorithmique, ils ne seront pas très bons en programmation Java sérieuse, donc je ne vois pas que le langage est un problème ici.

Ils ne comprendront pas les pointeurs, mais une bonne programmation C++ n'utilise généralement pas les pointeurs de manière compliquée. (Il y a des exceptions, mais comme je ne sais pas ce que fait votre entreprise, je ne peux pas dire si elles s'appliqueraient.) Après tout, vous ne voulez probablement pas que vos développeurs écrivent leurs propres liens listes plutôt que d'utiliser std::list.

Ils ne comprendront pas la gestion manuelle de la mémoire, mais c'est beaucoup plus facile en C++ qu'avant. En C++ moderne, faire votre propre gestion de la mémoire est devenu plus difficile, en raison du potentiel des exceptions, donc vous voulez pratiquer RAII avec à peu près tout (en utilisant auto_ptr, boost::shared_ptr, peu importe).

Si je dirigeais des choses, je les embaucherais si elles avaient l'air bien. Je serais conscient qu'il pourrait y avoir des problèmes (C++ est un plus exigeants langue que Java, après tout), et avoir une sorte d'idée de la façon de les traiter.

Il n'y a aucune raison d'éviter d'embaucher des gens hors de l'université simplement parce qu'ils n'ont pas les compétences exactes que vous voulez. Les intelligents apprendront, et vous ne voulez probablement pas embaucher ceux qui ne sont pas intelligents.

 41
Author: David Thornley, 2008-10-30 17:33:43

Parlant purement du point de vue d'un programmeur C++, je pense qu'un développeur Java cherchant à apprendre le C++ serait confronté à une courbe d'apprentissage assez raide. Oui, à un certain niveau, le développement de code est similaire dans toutes les langues. J'ai été appelé une fois à écrire du code dans le langage macro d'Excel (pré-VBA). J'ai réussi mais c'était comme essayer d'écrire Guerre et paix avec un vocabulaire de cinquième année.

Il y a d'autres problèmes avec C++ (pointeurs, gestion de la mémoire, surcharge de l'opérateur) qui ne sont tout simplement pas présents en Java pour autant que je sache et ce ne sont pas de petits problèmes non plus. Surtout si vous cherchez quelqu'un pour aider avec le code C++ hérité, cela pourrait présenter de gros obstacles. Et je pense que je commencerais n'importe quelle nouvelle location avec au moins quelques travaux d'entretien au départ.

 19
Author: Onorio Catenacci, 2008-10-30 18:17:50

Programme de programmeurs. Quelqu'un qui sait réellement programmer peut apprendre n'importe quelle langue. Bien sûr, il y a une courbe d'apprentissage, mais un bon codeur peut se mettre à la vitesse relativement rapidement. Si vous attendez quelqu'un avec des connaissances avancées, vous ne chercheriez pas à embaucher de nouveaux diplômés de toute façon, non? Donc, il va y avoir une courbe d'apprentissage de toute façon.

 17
Author: coder1, 2008-10-30 17:21:49

J'ai programmé dans de nombreux langages et je trouve C++ très difficile à comprendre et à être productif, comparé à d'autres langages que j'ai utilisés tels que Java, C, Python, Fortan, Javascript, ASP et Perl. Je dirais presque que c'est dans une catégorie à part. Je ne crois PAS que la compétence dans l'un des langages que je viens de répertorier (y compris Java) soit un excellent prédicteur de la qualité d'un programmeur C++ qu'une personne pourrait être. Je pense que C++ nécessite presque un type de pensée différent, et certainement le capacité à contenir une énorme quantité d'informations dans sa tête tout en codant, plutôt que de se concentrer principalement sur les exigences de l'entreprise.

J'essaie de devenir compétent en C++ depuis des années, même si je n'ai jamais eu besoin de l'utiliser au travail (c'est-à-dire étudier à mon époque). C'est très difficile et après tout ce temps, je ne suis pas sûr que je réussirais et que je serais productif en tant que programmeur C++. Je pense que je suis raisonnablement compétent dans l'ensemble dans ces autres langues.

Donc, basé sur mon petit et échantillon clairement biaisé d'une personne (moi!) Je suggère de se pencher vers les développeurs qui ont démontré une quantité substantielle d'expérience passée en C++ si c'est ce qu'ils vont faire au travail, au jour le jour. Vous devrez passer plus de temps à trouver ces candidats, mais vous aurez de meilleures chances de succès à long terme, je pense.

 17
Author: unintentionally left blank, 2008-10-30 18:01:35

Ma règle de base est que je préfère obtenir un programmeur C/C++ pour écrire Java qu'un programmeur Java pour écrire C/C++. Je ne peux pas dire quels programmeurs Java peuvent gérer la gestion de la mémoire et les pointeurs jusqu'à ce qu'ils l'essaient.

Si tout ce que j'avais à choisir était des enfants de l'école Java, je leur raconterais quelques histoires d'horreur sur assembly et C, puis j'essaierais de les diviser en trois catégories.

  1. Intrépide. Ils n'étaient pas attention.
  2. Craintif et paniqué parce que ils savent qu'ils ne pouvaient pas gérer ce genre de complexité.
  3. Craintifs et impatients parce qu'ils comprennent que même les gens plus intelligents qu'eux peuvent se faire frapper dans l'intestin par des problèmes de mémoire et de matériel bizarres, mais l'enfer, cela ressemble à un bon défi.

J'embaucherais du groupe 3.

 10
Author: Nosredna, 2009-05-31 00:45:13

" Vous ne pouvez pas enseigner grand."-- une célèbre entraîneur de basket-ball.

Lors de l'embauche, vous cherchez quelqu'un qui peut à la fois apprendre rapidement de nouveaux concepts et désapprendre rapidement habitudes. C'est ce dernier qui peut se faufiler sur vous. Dans le cas d'une transition Java->C++, vous pouvez faire face à" désapprendre "des choses telles que la dépendance lourde à l'E, "tout est un objet", un modèle mental d'objets et de programmes de trop haut niveau, etc.

Je vous suggère de chercher des choses qui suggèrent flexibilité-demandez-leur d'écrire un petit programme à la fois dans unE et un éditeur de texte brut, montrez-leur une simple fonction C++ qui passe un pointeur et modifie la valeur sous-jacente et voyez s'ils trébuchent, etc.

 6
Author: Larry OBrien, 2008-10-30 18:08:25

En tant que quelqu'un qui est principalement un "Java schooler", et un diplômé assez récent à cela, je pense vraiment qu'il serait possible pour moi d'apprendre C ou C++ sans trop de douleur...

Cependant, je ne veux vraiment pas. Je ne peux parler que pour moi-même, mais C peut être un langage assez laid si vous avez grandi avec Java. Je pense que la motivation va être le plus grand obstacle. Motivation et peut-être certains pleurnicher sur que "dans Java c'est tellement plus facile, pourquoi ne pas C Java?" :)

Si vous pouvez trouver quelqu'un avec la bonne motivation, le reste fonctionnera bien. :)

 4
Author: Ace, 2008-11-04 07:42:10

Il est relativement simple de déterminer si un diplômé a une compréhension solide des bases, quel que soit son groupe linguistique. Ces principes fondamentaux comprennent 1) Les Structures de données 2) Les Systèmes d'exploitation et 3) Les algorithmes et leur complexité. Il s'agit essentiellement de domaines conceptuels et discuter de la conception ou de l'approche d'un problème particulier peut révéler à quel point ils sont forts ou faibles. Vous n'avez pas à leur faire écrire du code.

Je dirais que si quelqu'un a une base solide dans ces fondamentaux, et tout aussi important a une attitude positive, il peut apprendre n'importe quelle autre langue.

Je vais toujours pour ces fondamentaux et leur évaluation - fraîchement diplômé ou expérimenté. Ce sont les principaux critères pour obtenir quelqu'un embauché.

 3
Author: Ather, 2008-10-30 17:37:10

Quelqu'un d'une école Java devrait toujours avoir une bonne compréhension des structures de données et de la complexité informatique. Le seul domaine où ils devraient être déficients est dans la gestion manuelle de la mémoire. S'ils comprennent ce que le garbage collector fait pour eux et qu'ils semblent assez brillants pour que vous puissiez leur enseigner la gestion de la mémoire, alors je dirais de leur donner un coup de feu. Comme ils n'ont pas passé de temps à apprendre la gestion de la mémoire à Java school, essayez de savoir s'ils sont particulièrement forts dans un autre domaine que vous avez besoin.

 2
Author: Bill the Lizard, 2008-10-30 17:23:48

Je pense que le problème auquel Joel Spolsky faisait référence dans son article est que "l'obtention" de pointeurs et de récursivité nécessite une certaine aptitude mentale, et qu'un programme basé sur C éliminerait ceux qui ne l'avaient pas, et une école Java ne le ferait pas nécessairement.

Alors, qu'est-ce qu'un gestionnaire d'embauche doit faire, puisque les gens ne mettent pas leur curriculum vitae, "Je ne reçois pas de pointeurs, et je ne le ferai jamais."

Donc, si vous achetez l'hypothèse de Joel que la capacité à "obtenir" des pointeurs et la récursivité est un trait personnel inné que les gens ont ou non, je vois les options suivantes:

  1. Embaucher exclusivement des écoles C/C++ plutôt que des écoles Java.
  2. S'il n'y a pas d'écoles C/C++, engagez des programmeurs C/C++ expérimentés plutôt que de l'université.
  3. Si vous êtes engagé à embaucher du collège, alors acceptez que vous allez avoir un taux d'échec non négligeable dans leur conversion.
 2
Author: JohnMcG, 2008-10-30 20:27:00

Je suis moi-même étudiant et la plupart de mes cours dans les premières années étaient en Java mais j'ai toujours essayé de faire des choses en C++ juste pour le plaisir. Ce semestre a commencé un nouveau cours qui obligeait tout le monde à programmer en C++ + OpenGL + Qt et beaucoup d'autres étudiants, qui n'ont jamais utilisé C++, ont beaucoup de mal à s'adapter et passent souvent littéralement des heures à combattre de simples erreurs de compilation. Cela pourrait avoir de nombreuses raisons (y compris la stupidité) mais je pense que cela peut être assez difficile pour quelqu'un qui seul a utilisé Java (et beaucoup d'étudiants utilisent simplement les choses qu'on leur dit) pour passer en C++. Malheureusement, je ne peux penser à aucun moyen de soulager la douleur de la transition et je ne peux que penser à Dijkstra en disant:

Il est pratiquement impossible d'enseigner une bonne programmation à des étudiants qui ont déjà été exposés à BASIC: en tant que programmeurs potentiels, ils sont mentalement mutilés au-delà de l'espoir de régénération.

 2
Author: pmr, 2009-05-31 00:24:57

Je suis moi-même développeur java, mais j'avais une base C/C++ à l'université. Et je suis HEUREUX d'avoir commencé avec la gestion de la mémoire, les listes, les files d'attente, les piles et le plus important: les pointeurs. Bien que je n'utilise pas explicitement les pointeurs, je sais ce qui se passe à l'arrière de mon application, je trouve des fuites de mémoire, des problèmes de performances, etc.

Je pense que la meilleure solution n'est pas de demander aux développeurs Java/C # d'apprendre le C / C++ (et toutes les questions qui viennent avec ces langages) quand ils vont travailler, MAIS de leur enseigner ces sujets dans collège. Ce serait la meilleure solution.

Comme il est maintenant, c'est comme réparer les effets/symptômes, pas la cause réelle.

 1
Author: Alexandru Luchian, 2008-10-30 17:41:55

J'ai commencé avec C/C++ et je suis passé à Java.

Je ne suis pas sûr que les nouveaux diplômés sachent vraiment quoi que ce soit consider considérez-les comme de la table rase pour la formation. Vous pourriez même être mieux avec un hacker sans éducation.

Cela dit, il est assez facile pour un bon ingénieur de faire des allers-retours entre les pointeurs, l'allocation de mémoire et autres like mais je pense qu'il est incroyablement difficile de passer d'un OO collecté à un non-OO.

Lorsque vous travaillez avec un système avec GC, vous obtenez beaucoup mieux à penser à votre conception à un niveau élevé. Vous pouvez réellement coder d'une manière beaucoup plus compréhensible. Vous commencez vraiment à avoir des classes qui se concentrent sur une seule responsabilité (la plupart des classes seront quelques écrans-la plupart des méthodes seront triviales).

Je n'ai jamais vu de bon code OO C++, ce qui est probablement bon parce que le code OO ne va pas être aussi performant et a simplement trop de petites allocations/ désallocations, des appels de méthode courts et d'autres petits obstacles aux performances pour faire un Programmeur C++ heureux.

C'est un peu comme prendre votre voiture de course et y mettre du courant alternatif, de la direction assistée et des vitres électriques. Beaucoup plus utilisable, mais défait la raison pour laquelle il a été choisi en premier lieu.

Au fait, j'aimerais vraiment voir un bon code OO c++ si quelqu'un a une référence...

 1
Author: Bill K, 2008-10-30 19:53:24

Je pense que cette idée d'une "école Java" est largement fabriquée. L'université où je suis utilise java pour lui enseigner des cours CS de séquence principale (Structures de données, algorithmes, etc.) Cependant, ce sont de nombreux autres cours qui utilisent d'autres langages comme C/C++/Scheme et dans les cours de niveau supérieur, le travail peut être fait dans n'importe quelle langue.

Pensez-vous vraiment que le concept de programmation de base en langue est enseigné?

 1
Author: None, 2008-10-30 20:29:21

Un bon programme d'informatique devrait enseigner aux étudiants les principes fondamentaux, qui sont les mêmes quel que soit le langage de programmation que vous utilisez. Les choses que vous avez mentionnées, la gestion de la mémoire, les structures de données, etc. font partie de ces compétences fondamentales. D'après mon expérience, un programmeur familier avec ces concepts concevra des solutions plus efficaces (plus efficaces, plus rapides, plus faciles) que ceux qui ne comprennent pas ces concepts, en particulier pour les problèmes non standard.

Comme pour choix de la langue, un bon programmeur devrait être capable de choisir un nouveau langage de programmation en quelques semaines et de devenir compétent en 1-2 mois. Cela est particulièrement vrai pour C++ et Java, qui ont tant de fonctionnalités partagées.

 1
Author: slicezero, 2011-03-12 20:18:39

Java programmwer s'intégrerait directement dans une maison C#, ainsi qu'un développeur C++ le ferait.

Le passage en C/C++ dépendrait du programmeur mais je ne compterais pas leurs compétences Java pour autre chose que l'expérience générale en programmation. Je serais également surpris si vous attiriez beaucoup de ces candidats.

 0
Author: dove, 2008-10-30 17:21:47

Dépend du programmeur IQ. La vraie question est : Ce programmeur est-il assez intelligent pour que nous investissions le temps d'apprentissage? Plus il est intelligent, moins il a besoin de temps pour apprendre.

 0
Author: Ovidiu Pacurar, 2008-10-30 17:39:01

Mon post ici est presque la réponse à votre question. Comme Joel sad dans le lien que vous avez fourni, c'est vraiment mauvais qu'aujourd'hui ils n'apprennent pas les bases à l'école. Mais les bons apprennent encore, ils prennent des cours sur les systèmes d'exploitation et piratent le planificateur du noyau linux, ils font des projets en assemblage, etc...
La plupart des embauches dans mon entreprise viennent d'être diplômées, et il est impossible de passer nos examens sans comprendre les bases, alors encouragez-vous il y a toujours de bons candidats autour de vous besoin de savoir comment les trouver.

 0
Author: Ilya, 2017-05-23 12:33:40

C'est plus difficile que de transformer un bon programmeur C/C++ en un bon programmeur Java. L'accent est " bon " ici. Tout le monde peut programmer dans n'importe quelle langue mal. Les bons programmeurs C++ doivent bien comprendre les pointeurs. L'un des concepts les plus importants en C++ est itérateur qui est une généralisation du pointeur C via la surcharge de l'opérateur, ce qui rend de nombreux algorithmes vraiment génériques en C++.

Un excellent indicateur si NCGs obtenir, est leur performance dans les cours de système d'exploitation. Si ils ont passé une classe OS avec une lourde charge de travail de projet (comme l'implémentation de tous les composants OS dans toutes les langues) avec brio et qu'ils ont adoré, les chances sont qu'ils sont parmi les meilleurs étudiants que vous pouvez obtenir.

 0
Author: ididak, 2008-10-30 20:24:53

Si vous embauchez des jeunes tout juste sortis de l'école, vous devriez embaucher pour le QI, pas pour une compétence particulière. Vous voulez des gens qui sont Intelligents et faire avancer les choses , pas quelqu'un qui sait comment frob pointeurs d'une manière qui est particulièrement agréable pour vous.

 -1
Author: user128807, 2009-07-15 19:51:34

C'est juste une autre langue.

Et si vous vous en tenez au sous-ensemble relativement petit des fonctionnalités de POO pures, il n'y a vraiment pas grand-chose à apprendre du point de vue des développeurs Java. La seule chose que vous devriez avoir à leur apprendre pour qu'ils soient des programmeurs de POO génériques est le fait qu'ils doivent implémenter un destructeur pour prendre soin de leur mémoire.

Cependant, s'ils doivent utiliser le STL, les modèles, les exceptions et les goûts, ils en auront probablement besoin de plus orientation.

 -3
Author: Jasper Bekkers, 2008-10-30 17:33:24

Je n'achète pas le "Vous obtenez des pointeurs/récursivité ou vous ne le faites pas." L'esprit est une table rase. N'importe qui peut apprendre n'importe quoi avec suffisamment de temps et d'intérêt. La question est - ces enfants sont intéressés.

Nous recherchions un stagiaire à mon travail, et j'ai parcouru plus de 30 CV de la récolte de cette année. La principale chose qui me choque, c'est à quel point peu d'entre eux ont fait une putain de chose qui n'était pas exigée d'eux par l'une de leurs classes ou un travail. Trouvez quelqu'un qui a fait quelque chose sur leur propre et apprécié, et vous serez satisfait.

Cela dit, personnellement, je ne perdrais pas le temps avec quelqu'un qui ne comprenait pas C et assembly. Il y a une grande différence entre le débogage d'un vidage de mémoire avec gdb à partir d'un plantage C++ et la recherche d'une trace de pile Java. C++ est vraiment un horrible langue pour de nombreuses raisons, mais ce qui est bien c'est que qui il a en commun avec C. C'est un puissant moyen de dire à l'ordinateur de faire exactement ce que vous voulez faire, sans généralement, avoir à s'inquiéter de ce que d'autres bêtises sont faites par certains runtime.

Aussi, si vous voulez gagner du temps, ne vous embêtez pas avec quelqu'un qui ne fait pas partie des 10 meilleures écoles d'ingénieurs. Pour ne pas dire qu'il n'y a pas d'excellents étudiants des écoles de niveau 2, mais d'un point de vue pratique, vous n'avez pas besoin de votre embauche pour en faire partie.

MIT, Stanford, UC Berkeley, Georgia Tech, l'Illinois à Urbana Champaigne, CMU, Caltech, l'USC, Michigan, Ann Arbor, U. Texas d'Austin.

Je n'embaucherais pas non plus toute personne pour écrire un logiciel qui utilise Microsoft Windows. En tant qu'étudiant en informatique, vous ne pourriez tout simplement pas être intéressé par les logiciels ou le fonctionnement des ordinateurs sans devenir un utilisateur Linux (encore mieux si vous utilisez FreeBSD ou autre chose)

 -3
Author: nosatalian, 2009-05-31 01:00:17