Slashdot Mirror


Programming Language Specialization Dilemma

aremstar writes "I'm a final-year Computer Science student from the UK. During my studies, we covered 3 programming languages: C, C++ and Java. The issue is that we didn't cover any of these languages in sufficient depth for me to claim that I have commercial-ready experience. It's one thing being able to write simple programs for class assignments, but those are quite different from writing something as complex as the Linux kernel or a multi-threaded banking app. I'm thinking of spending a few weeks/months studying in order to specialize in one of those languages. Fortran also entered my consideration, as it is great for numerical computing and used by many financial institutions, banks, etc. In terms of skill requirements in job ads, my (brief) experience suggests that most programming jobs require C++, with Java a close second. C — unfortunately — doesn't appear as much. My question is: if you were in my shoes, which language would win your time investment? My heart suggests C, with a little bit of Fortran to complement it, but I'm a bit worried that there might not be enough demand in the job market."

26 of 569 comments (clear)

  1. Good News! by multipartmixed · · Score: 5, Insightful

    Nobody expects a recent graduate to write a kernel or a banking app!

    So, do whatever makes you happy until you get a job.

    --

    Do daemons dream of electric sleep()?
    1. Re:Good News! by Anonymous Coward · · Score: 5, Insightful

      Spend a couple of months learning C#. You can bash microsoft all you want, but most of the job postings (at least around here) are for .Net/C#. In todays economy, if you want a job, you need to know what employers want, not so much what you want.

    2. Re:Good News! by Anonymous Coward · · Score: 5, Insightful

      Learn three things and you'll be fine.

      1. Learn how to say "I'm not sure"
      2. Learn how to ask somebody for help.
      3. Learn how to ask "do you have anything I can help with".

      A smart graduate who wants to help the more senior people out, and understands that it's ok to let the senior people know that you need a bit of guidance/help, is worth more than a half-dozen wanna-be kernel driver gods.

    3. Re:Good News! by rossifer · · Score: 5, Interesting

      Nobody expects a recent graduate to write a kernel or a banking app!

      Even more precisely, nobody expects a recent graduate to really know how to write good enough code. That's something a new graduate should expect to learn in their first three to six months on the job.

      The expectation is that you already know how to learn languages. The issue with only learning C, C++, and Java is that they all use a related syntax and they are all statically typed. This is not enough variety. I would suggest that before you hit the real world you learn at least one language that isn't the same. Python, Ruby are excellent choices at this time. Lisp, Haskell, Erlang are also possibilities if you'd like to explore functional programming.

      Something else a good developer is usually expected to do is adapt to the coding conventions in the current project. I have found, however, that many if not most developers are completely and unable to adapt to team conventions. They have their "best way" and can't write code any other way.

      If I can provide one piece of advice to help you with your success in programming: remember that conventions are not for you. They're for the people who come after you. Having consistent and readable code is more important than whether or not you like indentation with tabs or spaces.

    4. Re:Good News! by interstellar_donkey · · Score: 5, Funny

      Specialize in LOGO. There are so few turtle masters out there that you're sure to get a job!

      --
      The Internet is generally stupid
    5. Re:Good News! by Shisha · · Score: 4, Insightful

      Think about what sort of programming you would like to do. Remember that writing software is only a way of solving some wider problem, so think what should that be? What would you love doing? To get anywhere as a programmer you have to undersand and enjoy working in the wider field. Very few people end up writing OS kernels or other "programming for the sake of computers". The rest of us make tools for other people (Word processors, painting programs, CAD, banking software, databases, you name it). Think which of these above would you enjoy working on.

      Once you've decided on that, choose any language you like, and start working on some small relevant project. Once you have something put the link on your CV. At our company, once we get someone's CV and it looks good, we go to google and find what the guy has done. Publications, software projects etc. Then we decide whether to interview. During the interview we'll talk about that. We don't care whether the person can do Java or C++ if they're graduates. (even though we prefer C++).

    6. Re:Good News! by dgatwood · · Score: 4, Interesting

      I would argue the exact opposite, actually. If a large percentage of jobs are in .Net/C#, there's a good chance that there are equally large numbers of candidates flocking to apply for those jobs, and that the number of applicants is likely to exceed the number of jobs by a significant margin. If you want a job that will be robust against economic problems, specialize in something that requires more unusual specialization. Learn Objective-C, for example. Either start your own company selling iPhone apps or hunt for jobs elsewhere doing Mac programming. Even though the number of jobs seems very limited, companies have a hard time finding qualified candidates in this area, so if you can fill the slot, you have a good chance at getting the job. The same isn't necessarily true for C# jobs.

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

    7. Re:Good News! by Anonymous Coward · · Score: 4, Insightful

      Learning a given language is stupid because it paints you into a corner.

      Learn to think.
      Learn the concepts.

      Take the comparative programming classes.

      Learn algorithms, data structures and so on, then the rest will just happen.

      Its like any other profession. Understand the theory and practice practice practice.

      Great golfers can use all the clubs.
      Great pilots can fly anything reasonably well.
      Great chefs can use everything in the kitchen.

      If you want to be great (which translates to being in demand in the market place) study your craft, not individual tools.

    8. Re:Good News! by Gorobei · · Score: 4, Insightful

      Hey, if you have good math and logic skills, I don't much care what languages you actually know, and I trust you'll be up to speed on what I use within a few weeks.

      If, on the other hand, you spent n years in school to learn a specific programming language, it doesn't really matter which one you learned, because I'm not going to hire you.

  2. Don;t worry `bout it.. by Anrego · · Score: 5, Interesting

    Honestly... a general knowledge of programming is the best you can hope for.

    Every shop has their own specific tool stack and custom libraries and documentation process. They are also going to need you to be very knowledgable in one or more very specific areas. There's no way you're going to be able to get yourself ready for any.. or even many jobs before hand. The important thing is that you can learn new stuff quickly.. digest existing code.. present your ideas in a digestible way to a diverse group of people (managers, other developers, testers, clients).. work in a team.. and not let your ego get in the way.

    First several months at any new shop are spent learning their way of doing things .. they expect that. It's why programming shops put such a heavy emphasis on the hiring process. The company will invest a lot of money on you before you make them any.

    C++, C, and Java are kinda the standard trifecta these days. I'd suggest doing a little assembler, and maybe a really messed up language like Perl just to see the "other side" (pre-emptive defense: I love Perl.. but common.. it is pretty messed up). One thing I would recommend though that I didn't see in your post is a good knowledge of technical writing. You can have the perfect answer.. but if you can put it on paper in a clear and understandable manner.. what's the point.

  3. Practice by adisakp · · Score: 4, Interesting

    The best way to get programming experience is thru practice. Either work on your own personal projects or contribute to a larger shared (OSS) project. That's the only way you're going to become a better programmer. Classes are merely an introduction to the ideas.

    Programming classes are like piano lessons. You're not going to become a concert pianist thru basic lessons without lots and lots of outside practice on your own.

    1. Re:Practice by adisakp · · Score: 4, Insightful

      Oh, and FWIW, it's best to learn several languages -- for example, Java / C# / C++ (and even C) are all fairly similar so they're easy to learn together. Once you learn one of them well, the others should come much more easily.

  4. COBOL by flyingsled · · Score: 5, Interesting

    If you're thinking of banking apps, think COBOL (at least here in Canada). Bunch of those programmers are near retirement too...

  5. skillsets by Phantom+of+the+Opera · · Score: 5, Insightful

    To succeed, you need a competency in far more than just a language. I'm sorry, its not that easy.

    Get at least a basic level of understanding in the following :

    * how to talk to and effectively use databases
    * how to talk to hardware
    * networking
    * sys admin work
    * presentation work
    * regular expressions
    * grep/find
    * create a simple web page
    * run a basic web server
    * file permissions and ACLs
    * build system
    * shell
    * source control systems
    * the relationship of assembly to C
    * that memory and processing power are limited resources

    Pick a scripting language to know at a reasonable level. It will come in use when you want to quickly transform data or even write some of your program that's in your favorite language. That is the equivalent of your swiss army knife and duct tape kit.

    As for a language, strongly know the basics for any OOP language, procedural language and functional language.

    Don't expect to be spoon fed details of what you have the program. Learn why this program is being written. If you are programming a spectral analysis program, learn about that subject enough to know how your program is going to be used.

    Learn to understand why the program is written, and what the audience will use it for.
    Learn to communicate clearly.
    Learn to ask questions when you are not sure.

  6. Listen to Norvig by Phs2501 · · Score: 5, Interesting
    Read this:

    Teach Yourself Programming in Ten Years

    Peter Norvig knows what he's talking about.

  7. Going against the grain... by BrokenHalo · · Score: 5, Interesting

    I know this will seem foreign to most of the current generation of graduates, but I would suggest a strong grounding in assembly coding for any processor. If the programmer really understands assembly, s/he should "intuitively" acquire a sound grasp of what makes a good program written in C, Fortran or whatever.

    Many of the current commercial languages belong in toyland. They are designed for programmers who really don't have any idea about managing resources efficiently.

    1. Re:Going against the grain... by HiThere · · Score: 4, Informative

      That was excellent advice for the earlier generations of processors. I'm not convinced that it's a good idea now. But something similar could be achieved:
      Learn to write programs in JVM machine code.

      Or Parrot. Or Python Virtual Machine. Or MIX, even.

      Actually, Mix might be the best, but it's a bit more limited. But modern processors are too complicated for this to be a useful learning tool, and you don't want to REALLY start assembly language programming. A new generation of processors will break everything you've ever written.

      For the purpose, Parrot machine code would probably be best. JVM the most useful.

      OTOH, you might also consider LUA. It's not a great language, per se, but it's an excellent adjunct to C or C++.

      Part of the problem is that there are a number of directions to go, and a limited amount of time. You really NEED to learn some sort of assembler, and for that I would recommend Parrot. It looked like a reasonably simple code, and reasonably well documented. But I'm not sure that this is the right time.

      An alternative is to pick a language and start learning to use it's standard libraries and how to manipulate files. (When I was in college, I never got taught how to use files, and I regretted this for years, until I had backfilled the knowledge on my on time.) If you pick C++ STAY AWAY FROM TEMPLATES!! That's advanced work. (Yeah, use them for simple generics, but don't do anything fancy. They only exist to make your life simpler. Once they stop doing that, avoid them.)
      I can't give any comparable advice for C. In C and C++ both you need to restrain your use of macros and pointers. Prefer arrays over pointers. Prefer references over pointers. (And acknowledge that sometimes they are necessary evils...but they remain evil.)

      My advice against pointers is symmetric to the standard advice against program jumps (AKA "Go to considered harmful") and in favor of structured programming (i.e., while loops, do loops, and function calls). I'm not sure that structured programming is even mentioned anymore as it's become so dominant. The same reasons it became dominant argue against the use of pointers. (You'll note that Java essentially eliminated the use of pointers. It's a [slightly] more recent design than C++, and not as close to the metal. But the efficiency cost of Java was more due to garbage collection and a virtual machine than it was to the elimination of pointers. [E.g., see Digital Mars D, which is about as efficient as C++, but severely limits the need for pointers.])

      P.S.: Re:

      Many of the current commercial languages belong in toyland. They are designed for programmers who really don't have any idea about managing resources efficiently.

      That's a really obnoxious attitude. Different languages are designed for different situations. If you're writing code in a hurry, you don't want to worry about lots of unnecessary fiddling details that would be very important if you had plenty of time and really needed to optimize execution. So you'd use different languages. If you use C where you should use Ruby, everyone will be very unhappy with you, and likewise for the converse. Actually, I think that C is almost always the wrong choice. Most work that's done in C should really have been done in Ada...but the people doing it already knew C, and it was "good enough", so that's what they used. Don't ever, however, make the mistake that this prove that it was optimal. (Except in the sense of the costs of causing the programmer to learn a new language.) Ada would even often be a better choice in places where C++ is chosen, though less frequently. With Java the division is less clear cut. Where Java is used because the programmer didn't know C or C++, then the same comments apply. In many other cases, however, Java is a better choice. (Java is less efficient, but it has dynamic capabilities that are very difficult to manage in Ada.

      Things get more complicated when you start to include complex libraries, such as Lua. In that case C + Lua is frequently a superior choice to Ada...because Lua interacts better with C and is only used when a bit of dynamic behavior is appropriate.

      --

      I think we've pushed this "anyone can grow up to be president" thing too far.
  8. Re:Learn Programming, not Language by Logos · · Score: 5, Insightful

    you can master any language withing a matter of weeks

    Not really, but you can be *proficient* and a *productive contributor* in a matter of weeks.

    Mastery of a language takes longer because it's more about mastering of all of the little quirks, warts, conventions and whatnot that only come with experience with a certain platform than it is about syntax and transliteration of general programming techniques to the new language.

    Still, I agree with the overall sentiment: Focus on being a good programmer and learning new languages (and being a valuable contributor) takes care of itself.

    --
    We are agents of the free
  9. Mod parent up by artor3 · · Score: 5, Insightful

    These are probably the most important "skills" any recent graduate can have. Companies expect new graduates to be a blank slate. College, especially a BS, is just to give you the background your going to need. After that, it's a question of acknowledging when you don't know something, finding someone who can help you, and, whenever you have down time, finding someone you can help.

    In fact, one of the best things you can do during an interview when asked a hard technical question is to admit you don't know, and say that if faced with that problem in real life, you'd ask a coworker for help.

  10. Re:You are done studying. Get a job. by RyuuzakiTetsuya · · Score: 4, Insightful

    I'm a CS student and I learned python well enough to migrate a mysql database in under week.

    CS shouldn't be about the programming but problem solving.

    --
    Non impediti ratione cogitationus.
  11. Forget C and Fortran by schamberlin · · Score: 4, Insightful

    If you're doing this to gain experience that will help you land a job, forget about C or Fortran.

    Otherwise, it depends on what kind of software job you're looking for. Games and application development tend to be C++. Web-related software is more likely to involve Java.

    1. Re:Forget C and Fortran by AmaDaden · · Score: 5, Insightful

      Parent is dead on. As for C#, it's a rival to both Java and C++ (mostly for non-games). The problem of course is it's a MS language. I would recommend that any SlashDot reader go with Java or C++ over C# because they are better documented, more standards compliant, cross platform (Mono is nice and all but it's no substitute for MS C# from what I hear) and Open Source(Java was closed for a long time but it is finally Open and GPLed).

      But honestly your language is the LEAST important thing you can try to learn now. Make sure you have a good grasp on SQL, UML, XML, design patterns and basic scripting. I just graduated college as well and these things were never really taught. They were all there but tend to get glossed over and taught only in small chunks as needed.

    2. Re:Forget C and Fortran by OeLeWaPpErKe · · Score: 4, Informative

      You forget to mention that there are basically 2 principles you need to know in order to learn both java and C# in a VERY fast way :
      1) memory allocation principles
      2) scripting languages
      (and if you want to really excell)
      3) generating code

      1 will be more (much more) than adequately covered in any C++ course. C++ is like a "galactic conquest kit (some assembly required)" of programming languages. It can do anything. Anything any other language can do, can be done in C++. Java is more an "IKEA" language, compared to C++'s "metal shop". Everything "typical" is done for you in Java, but you have to add a few screws here and there. But getting a chair that's really "your kind of chair" ... not going to happen. And a less-than-average C++ programmer is going to be a good C# and Java programmer. Generics are lacking in Java, and that's being polite.

      2 will be covered with something like perl or python. Especially if you cover list comprehensions (compare them to SQL for example)

      And if you are a good programmer, but you want to be the best one in the state, you'll need to add 3 to your repertoire. LISP is a good language to learn to see these principles in action. Imho linux shell is also a good language for this. Or using linux shell to generate configuration files. That sort of thing.

      The important thing is not to force each language and use the "lowest common denominator" but really learn a language in order to appreciate it's differences from the others. You can write procedural programs in each of these languages trivially. DON'T. If you learn C++, use template metaprogramming and multiple inheritance (of templated classes, passing through template parameters up the inheritance chain). Use operator overloading for everything from combining 2 lists, write the complex number class everyone writes. Write a sparse matrix class if you're up to it. Learn boost. Learn ANTLR ...

      I realise these are not many good problems for these solutions. The point is to learn to use them, get a feel for what they can do.

      Use C# for what it's good for : use all the features of C# 3.0. Use the UI designer, get to know it's advantages.

      With java you want to use it's libraries. Use a few contraint satisfaction libraries. Write a J2EE application, say the bookstore bullshit. Admire the endless exceptions of the typical server.

      And spend the rest of your education learning maths. Algebra, as much as possible. Theoretical logic. Only when those 2 subjects are sufficiently covered start with analysis. Don't forget to get at least an introductory class about numbers (e.g. when/why do multiplications fail on calculators and computers, what are fixed points of matrices ? What happens when floating point numbers differ too much in matisse from the solution of the calculation you're making, ...)

      The more algebra and logic you know, the easier algorithms will become.

    3. Re:Forget C and Fortran by Stiletto · · Score: 4, Insightful

      The important thing is not to force each language and use the "lowest common denominator" but really learn a language in order to appreciate it's differences from the others. You can write procedural programs in each of these languages trivially. DON'T. If you learn C++, use template metaprogramming and multiple inheritance (of templated classes, passing through template parameters up the inheritance chain). Use operator overloading for everything from combining 2 lists, write the complex number class everyone writes. Write a sparse matrix class if you're up to it. Learn boost. Learn ANTLR ...

      I'd like to recommend the exact opposite. Your co-workers will thank you.

      95% of what you are going to see in commercial software is "lowest common denominator" code. For a C++ project, for instance, that means, it will look like C with classes. You're not going to see any clever use of the language. You're not going to see templates (besides USE of template classes such as STL). You're not going to see very interesting uses of inheritance, function pointers, polymorphism, etc.

      And if you start barfing all those language acrobatics into the code base, your co-workers are going to hate your guts. By and large, your co-workers want to go to work, do their job, and go home to play with their kids. If they have to sit there and figure out that what they're looking at is your overloaded () operator because it's a neat way to implement the "Visitor" design pattern, or something, it makes their job harder, they're not going to like you, and the whole project is going to suffer because the code is no longer readable to the team.

      Learn the basics of the language REALLY WELL and be able to crank out functional, readable, SIMPLE code, quickly.

      Of course, this whole post applies only if you're going to write software for a living. If you're learning a language for the challenge and fun of programming for yourself, disregard.

    4. Re:Forget C and Fortran by DoofusOfDeath · · Score: 5, Insightful

      If you learn C++, use template metaprogramming and multiple inheritance (of templated classes, passing through template parameters up the inheritance chain). Use operator overloading for everything from combining 2 lists, write the complex number class everyone writes

      Do you realize how insanely bad of a C++ program would typically result from programming that way? I actually had to re-read that paragraph two times to realize that you weren't telling him about pitfalls common to many new C++ programmers.

      There are at least two kinds of idiomatic programming in C++: (1) using, as much as you can, every language feature that distinguishes C++ from C, or (2) using the language features that tend to lead to good, maintainable code and eschewing the rest. I think you're directing him towards (1).

  12. 3 Languages? by Beetle+B. · · Score: 4, Insightful

    I'm a final-year Computer Science student from the UK. During my studies, we covered 3 programming languages: C, C++ and Java.

    And the other two languages were...?

    --
    Beetle B.