How difficult is it to turn a "Java School" programmer into a C or C++ programmer? [closed]

My company, a C++ house, is always looking to hire recent grads. However due to the Java Schools phenomenon, we typically end up interviewing strong Java programmers with maybe a minute smattering of C++. Often the C++ classes don't really prepare students for working in C++. Nevertheless, often these are bright kids, eager to learn and do their best.

Every interview, I struggle with this fundamental question:

How hard is it to turn a "Java School" programmer into a C or C++ programmer? Has your company had experience turning the stereotypical "Java Schools" programmer into a strong C++ programmer? Is it worth the effort?

One of the reasons I struggle with this is not just due to a C or C++ vs Java language difference, it's the fundamental skills that come with learning C or C++ that I think often get lost at the Java School. These include data structures, computational complexity, manual memory management, really everything Joel Spolsky says here.

Often, as far as I can tell, a student will have some of those fundamental skills (be able to answer a few questions), but I'll still have this large part of my mind that's extremely skeptical with how well someone can learn these skills without getting their hands dirty in some C or C++. Maybe I need to be disabused of this stereotype. Am I just being unfair?

Anyway whats your experience with turning the "Java School" programmer into a C or C++ programmer?

Asked by: Joyce124 | Posted: 21-01-2022

Answer 1

Well, if they don't understand data structures and algorithmic complexity, they aren't going to be much good at serious Java programming, so I don't see that the language is an issue here.

They won't understand pointers, but good C++ programming typically doesn't use pointers in complicated ways. (There are exceptions, but since I don't know what your company does I can't tell whether they'd apply.) After all, you probably don't want your developers writing their own linked lists rather than using std::list.

They won't understand manual memory management, but that's a lot easier in C++ than it used to be. In modern C++, doing your own memory management has become harder, due to the potential of exceptions, so you want to practice RAII with pretty much everything (using auto_ptr, boost::shared_ptr, whatever).

If I were running things, I'd hire them if they looked good. I'd be aware that there might be problems (C++ is a more demanding language than Java, after all), and have some sort of idea how to deal with them.

There's no reason to avoid hiring people out of college just because they don't have the exact skills you want. The smart ones will learn, and you probably don't want to hire the ones who aren't smart.

Answered by: Lily616 | Posted: 22-02-2022

Answer 2

Programmers program. Someone who actually knows how to program can learn any language. Sure, there's a learning curve, but a good coder can get up to speed relatively quickly. If you're expecting someone with advanced knowledge, you wouldn't be looking to hire fresh grads anyway, right? So there's going to be a learning curve either way.

Answered by: Dainton600 | Posted: 22-02-2022

Answer 3

Speaking purely from the perspective of a C++ programmer, I would think that a Java developer looking to learn C++ would face a fairly steep learning curve. Yes, at some level developing code is similar in all languages. I was once called upon to write code in Excel's macro language (pre-VBA). I managed but it was like trying to write War and Peace with a fifth-grade vocabulary.

There are other issues with C++ (pointers, memory management, operator overloading) which are just not present in Java as far as I know and they're not small issues either. Especially if you're looking at someone to help with legacy C++ code these could present big obstacles. And I think I would start any new hire with at least some maintenance work initially.

Answered by: Richard631 | Posted: 22-02-2022

Answer 4

I have programmed in many languages and find C++ very difficult to figure out and be productive in, compared to other languages that I have used such as Java, C, Python, Fortan, Javascript, ASP and Perl. I would almost say it's in a category of its own. I do NOT believe that competence in one of the languages I just listed (including Java) is a great predictor of how good a C++ programmer a person might be. I think C++ almost requires a different type of thinking, and certainly the ability to hold a huge amount of information in one's head while coding, versus focusing mainly on the business requirements.

I have been trying to become proficient in C++ for years, despite never needing to use it at work (i.e. studying in my own time). It is very tough going and after all this time I am not sure that I would be successful and productive as a C++ programmer. I think I am reasonably competent overall in those other languages.

So, based on my small and clearly biased sample of one person (me!) I would suggest leaning towards developers who have demonstrated a substantial amount of past C++ experience if that is what they are going to be doing at work, day to day. You will need to spend more time finding those candidates but you will have a better chance of success in the long run, I think.

Answered by: Rafael288 | Posted: 22-02-2022

Answer 5

My rule of thumb is I'd much rather get a C/C++ programmer to write Java than a Java programmer to write C/C++. I can't tell which Java programmers can handle dealing with memory management and pointers until they try it.

If all I had to choose from were Java school kids, I'd tell them a few horror stories about assembly and C, then try to break them down into three categories.

  1. Fearless. They weren't paying attention.
  2. Fearful and panicked because they know they couldn't handle that kind of complexity.
  3. Fearful and eager because they understand that even people smarter than them can get punched in the gut by weird-ass memory and hardware issues, but hell, it does sound like a good challenge.

I'd hire from group 3.

Answered by: Walter741 | Posted: 22-02-2022

Answer 6

"You can't teach tall." -- some famous basketball coach.

When hiring, you're looking for someone who can both quickly learn new concepts and quickly unlearn habits. It's the latter that can sneak up on you. In the case of a Java->C++ transition, you may face "unlearning" such things as heavy IDE reliance, 'everything is an object,' a mental model of objects and programs that's too high-level, etc.

I would suggest that you look for things that suggest flexibility -- have them write a little program in both an IDE and a plain-text editor, show them a simple C++ function that passes a pointer and modifies the underlying value and see if they stumble, etc.

Answered by: Emma477 | Posted: 22-02-2022

Answer 7

As someone who's primarily a "Java schooler", and a pretty recent graduate at that, I definitely think it'd be possible for me to learn C or C++ without too much pain...

However, I really don't want to. I can only speak for myself, but C can be a pretty ugly language if you've grown up with Java. I think motivation is going to be the bigger obstacle. Motivation and maybe some whining about that "in Java this is soo much easier, why isn't C Java?" :)

If you can find someone with the proper motivation, the rest will work out okay. :)

Answered by: Eric187 | Posted: 22-02-2022

Answer 8

It is relatively simple to figure out if a graduate has solid understanding the basics irrespective of their 'language' group. These fundamentals include 1) Data Structures 2) Operating Systems and 3) Algorithms and their Complexity. These are essentially conceptual areas and discussing design or approach towards a particular problem in these can reveal how strong or weak they are. You dont have to make them write code.

I would say that if anyone has a strong base in these fundamentals, and equally importantly has a positive attitude, he can learn any other language.

I always go for these fundamentals and their evaluation - fresh grad or experienced. These are the primary criteria to get someone hired.

Answered by: Elian260 | Posted: 22-02-2022

Answer 9

Someone from a Java school should still have a strong grasp of data structures and computational complexity. The only area where they should be deficient is in manual memory management. If they understand what the garbage collector does for them and they seem bright enough that you could teach them memory management, then I'd say give them a shot. Since they didn't spend time learning memory management in Java school, try to find out if they're particularly strong in some other area that you need.

Answered by: Anna142 | Posted: 22-02-2022

Answer 10

I think the problem Joel Spolsky was referring to in his article is that "getting" pointers and recursion requires a certain mental aptitude, and that a curriculum based on C would weed those who didn't have it out, and a Java school wouldn't necessarily do it.

So what is a hiring manager to do, since people don't put on their resumes, "I don't get pointers, and I never will."

So if you buy Joel's hypothesis that the ability to "get" pointers and recursion is an innate personal trait that people either have or they don't, I see the following options:

  1. Hire exclusively from C/C++ schools rather than Java schools.
  2. If there aren't C/C++ schools, then hire experienced C/C++ programmers rather than from college.
  3. If you're committed to hiring from college, then accept than you are going to have a non-negligible failure rate in converting them.

Answered by: Abigail167 | Posted: 22-02-2022

Answer 11

I'm a student myself and most of my course work in the early years was in Java but I always tried to do things in C++ just for the fun of it. This semester started a new course that required everyone to program in C++ + OpenGL + Qt and many of the other students, who have never used C++, have a very hard time adapting and often spend literally hours fighting simple compile-time errors. This could have many reasons (including stupidity) but I think it can be quite hard for someone who only used Java (and a lot of students just use the stuff they are told) to change to C++. Unfortunatly I cannot think of any way to ease the pain of transition and can only think of Dijkstra saying:

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.

Answered by: Tara658 | Posted: 22-02-2022

Answer 12

I am a java developer myself, but had a C/C++ base in college. And I am GLAD I started with memory management, lists, queues, stacks and most important: pointers. Although I don't use pointers explicitly, I know what's going on in the back of my app, find memory leaks, performance issues, etc.

I think the best solution is not asking Java/C# developers to learn C/C++ (and all the matters that come with these languages) when they go to work, BUT teach them these subjects in college. This would be the best solution.

As it is now, it's like fixing the effects/symptoms, not the actual cause.

Answered by: Lana550 | Posted: 22-02-2022

Answer 13

I started with C/C++ and moved to Java.

I'm not sure new grads really know anything--consider them clean-slate for training. You might even be better off with an uneducated hacker.

That said, it's fairly easy for a good engineer to shift back and forth between pointers, memory allocation and the like--but I think it's amazingly difficult to shift from garbage-collected OO back to non-OO.

When you are working with a system with GC, you get much better at thinking about your design at a high level. You can actually code in a way that is much more understandable. You start really having classes that focus on a single responsibility (most classes will be a few screens--most methods will be trivial).

I've never seen good OO C++ code, which is probably good because OO code isn't going to be all that performant and simply has too many small allocations/deallocations, short method calls and other little performance roadblocks to make a C++ programmer happy.

It's kind of like taking your race-car and putting AC, power steering and Power windows on it. Much more usable, but defeats the reason it was chosen in the first place.

By the way, I'd love to actually see some good OO c++ code if anyone has a reference...

Answered by: Rubie545 | Posted: 22-02-2022

Answer 14

I think this idea of a "Java school" is largely manufactored. The university I am at uses java to teach it main sequence CS courses(Data Structures, Algorithms, etc) However, they are many other courses that use other languages like C/C++/Scheme and in higher level courses the work can be done in any language.

Do you really think it matters what language basic programming concept are taught in?

Answered by: Steven224 | Posted: 22-02-2022

Answer 15

A good computer science program should teach the students about the fundamentals, which are the same no matter which programming language you use. The things you mentioned, memory management, data structures, etc. are all part of these fundamental skills. In my experience, a programmer familiar with these concepts will engineer more better (more efficient, faster, easier) solutions than those that do not understand these concepts, especially for non-standard problems.

As for language choice, a good programmer should be able to pick up a new programming language in a matter of weeks, and become proficient in 1-2 months. This is especially true for C++ and Java, which have so many shared features.

Answered by: Grace618 | Posted: 22-02-2022

Answer 16

Java programmwer would fit right into a C# house, as well as a C++ developer would.

The cross over into C/C++ would depend on the programmer but I wouldn't count their Java skills for anything other than general programming experience. I would also be surprised if you attracted many such applicants.

Answered by: Emily488 | Posted: 22-02-2022

Answer 17

Depends on programmer IQ. The real question is : Is this programmer smart enough for us to invest the learning time? The smarter, the less time he needs to learn.

Answered by: Tara532 | Posted: 22-02-2022

Answer 18

My post here is almost answer to your question. Like Joel sad in the link your provided it's really bad that today they don't learn the basic in the school. But the good ones still learn, they take classes in Operating Systems and hack the linux kernel scheduler, they do projects in assembly etc ...
Most of hire in my company are just graduated, and it's impossible to pass our exams without understanding the basic, so cheer up there is still good candidates around you need to know how to find them.

Answered by: David992 | Posted: 22-02-2022

Answer 19

It's more difficult than turning a good C/C++ programmer into a good Java programmer. The emphasis is "good" here. Any people can program in any language poorly. Good C++ programmers must understand pointers well. One of the most important concepts in C++ is iterator which is a generalization of C pointer via operator overloading, which makes many algorithms truly generic in C++.

One great indicator whether NCGs get it, is their performance in operating system courses. If they passed an OS class with heavy project workload (like implementing any OS components in whatever languages) with flying colors and that they loved it, chances are they're among the best students you can get.

Answered by: Nicole142 | Posted: 22-02-2022

Answer 20

If you are hiring young people just out of school, you should hire for IQ, not for any particular skill. You want people who are Smart and Get Things Done, not someone who knows how to frob pointers in a way that is particularly pleasing to you.

Answered by: Aldus189 | Posted: 22-02-2022

Answer 21

It's just another language.

And if you stick with the relatively small subset of pure OOP features, there is really not that much to learn from a Java developers perspective. The only thing you should have to teach them in order for them to be generic OOP programmers is the fact that they have to implement a destructor to take care of their memory.

However, if they should be using the STL, templates, exceptions and the likes, they'll probably need some more guidance.

Answered by: Abigail289 | Posted: 22-02-2022

Answer 22

I don't buy the "You either get pointers/recursion or you don't." The mind is a clean slate. Anyone can learn anything given enough time and interest. The question is - are these kids interested.

We've been looking for an intern at my work, and I've gone through like 30+ resumes from this year's crop. The main thing that shocks me is how few of them have done a god damn thing that wasn't required from them by one of their classes or a job. Find someone who has done something on their own and enjoyed it, and you will be satisfied.

That said, personally I wouldn't waste the time with someone who didn't understand C and assembly. There is a big difference between debugging a core dump with gdb from a C++ crash, and looking at a Java stack trace. C++ is really a horrible language for many reasons, but that which is good about it is that which it has in common with C. It is a powerful way to tell the computer to do exactly what you want it do, without generally having to worry about what other nonsense is being done by some runtime.

Also if you want to save time, don't bother with anyone not from the top 10 engineer schools. Not to say that there aren't great students from tier 2 schools, but from a practical perspective you don't need your hire to be one of them.

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

I also wouldn't hire anyone to write software who uses Microsoft Windows. As a computer science student, you simply couldn't be that interested in software or how computers work without becoming a Linux user (even better if you go with FreeBSD or something else)

Answered by: Marcus820 | Posted: 22-02-2022

Similar questions

Does being a competent scala programmer require you to be a competent java programmer?

java - A programmer trying to understand CANopen

Will the CAN interface card likely be installed as a COM port? How do I break up a message to be sent as separate frames? What about assembling data from multiple frames received into one message? Is this a valid concern? What is the CANopen stack? If I already have an API for communicating with serial ports, can I have my program read/send CANopen messages without the CANopen stack...

java - How can I quickly improve my abilities as a programmer?

My question is broader than merely expanding language specific skills. I'm wondering what sort of advice anyone might offer to someone with a desire for knowledge, but a lack of direction. Feel free to skip down to the question. Background: I've taken a single computer science course in java at my University, but i'm planning on majoring in Computer Science and Electrical Computer Engineering (ECE)...

Sources for learning Java as a programmer

Closed. This question does not meet Stack Overflow guid...

java - Any good tips for a PHP programmer starting a GWT project?

Coming from PHP with some Java Struts 2.0 experience any tips/tricks on learning GWT? I have been looking at some tutorials but just wanted to know if anyone has some great gems to pass along?

java - asm / C / Python / Perl / Lisp / Scheme Programmer looking for something new to learn

Closed. This question does not meet Stack Overflow guid...

Sun training for Sun Certified Java Programmer (SCJP) - classroom or web-based?

Closed. This question does not meet Stack Overflow guid...

java - Exercise 26 of The Pragmatic Programmer

There is a code snippet presented in The Pragmatic Programmer on page 143 as: public class Colada { private Blender myBlender; private Vector myStuff; public Colada() { myBlender = new Blender(); myStuff = new Vector(); } private doSomething...

java - PHP Programmer wanting to learn Spring

Closed. This question does not meet Stack Overflow guid...

C++ Reference for Programmer Returning from Java

Here's my situation: I taught myself C++ (albeit rather badly), and was later taught how to use Java in college. Returning to C++, I find myself confused by several things that differ from C++ to Java, for example memory management and avoiding memory leaks. What would be the best mode of returning to programming in C++? Should I read a beginner's guide again, or are there some good references for my kind of situat...

c++ - C for Java Programmer?

This question already has answers here:

Still can't find your answer? Check out these amazing Java communities for help...

Java Reddit Community | Java Help Reddit Community | Java Community | Java Discord | Java Programmers (Facebook) | Java developers (Facebook)