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."
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()?
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.
All kidding aside, you should invest a good amount of time learning all three of the languages. In my high school we have an intensive technology program which teaches VB, C, C++, Java, Java Script, MIA and CAD. Not to long ago I asked my teacher why we needed to learn all these programs and languages. He responded by simply saying in his technology career, he's never had a job that used just one language. He also added that since the economy is shit employers will hire the people with the most experience and knowledge. Another instance would be an uncle of mine who works at Goldman Sachs. He had to master the Linux kernel as well as VB because these are the languages the servers run on. In the end, I think you should spend more time mastering what you know and then expanding your horizon.
"The difference between genius and stupidity is that genius has it's limits" - Albert Einstein
Java for internet code monkeys, C++ for anything to do with graphics, visualization, or that needs to be efficient. C# for windows GUI stuff, and the only good use of C I can think of is for writing drivers or firmware stuff. Java will probably have the most job opportunities, but thats just because most jobs are for internet code monkeys.
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.
If you're thinking of banking apps, think COBOL (at least here in Canada). Bunch of those programmers are near retirement too...
Do your best to forget everything you've learned in CS, and go to nursing school. You'd be happier and live longer. :-)
Fuck systemd. Fuck Redhat. Fuck Soylent, too. Wait, scratch the last one.
I would go for C++ because it is very rich and powerful. Once you got that in depth, manipulating languages such as Java or C# would be a breeze, because their object model is simplier than C++'s. C is nice but I feel it is part of history now.
Focus on learning how to program properly and efficiently. Learn correct resource-management and security practices and study algorithms. If you master programming in general, you can master any language withing a matter of weeks. Certainly too short a period to make your career based on that decision.
It's sad to see programs that purport to be about computer science cover only a few popular procedural languaages.
Warning: this article may contain humor, sarcasm, parody, and perhaps even irony. Read at your own risk.
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.
While it's good you've got solid grounding in C/C++/Java, there's quite a lot going on in the software world centered on the web. Taking your logic skills and applying them to the web arena may net you the "commercial ready" skillset you're thinking of much faster than just trying to hack away at Linux kernel code.
Most of these will make traditional CS people cringe a bit, but there's plenty to learn from and contribute to in the worlds of PHP, Perl, Python (Pylons, Django, etc), JavaScript, Ruby (Rails), Groovy (Grails), Flex/ActionScript, Silverlight, ASP.Net (new MVC framework out).
The tried and true recommendations of "pick an open source project and dive in" probably apply here as much as anywhere. The development cycles tend to be faster and more iterative using these technologies (broadly speaking) and you'll find plenty of people to learn from and, with your background, plenty of solid grounding in fundamentals to contribute.
As someone else already said, no one is going to expect a recent grad to be writing banking software (threaded or not). Few people actually *write* core banking software anyway. You'd more likely be writing web frontends for bank admin and report generation processes.
Remember that you can generally change direction later on as well. Just because you've studied Java for a few years doesn't mean your future is set in stone as a Java dev. Look at C# - there might be plenty there you'd like too.
Good luck in whatever you choose!
creation science book
You really have a number of paths to select, "computers", as you know, isn't exactly unified.
If you start your own company, or work for a small company, it doesn't matter what language you use because the client doesn't tend to care. What matters is that in your chosen language, you can do just about anything within the scope of small business. That tends to mean business logic and basic interface.
If you're working for a very large corporation, with a team of programmers, then you needn't have anything more than the basics. Large corporations will take you for your general breadth. On day one, you'll be shown what to do. On day two, you'll be altering small and isolated parts of very large projects. By the time you're the one maknig large changes, you'll realize that you don't need language-specific knowledge so much as you needed to study their particular implimentation of a project that is more structure than language.
Finally, if you're a consultant or programming contractor, it won't matter which language you select because there is always someone with eneds in any major language.
Fifteen years ago, I was in the second world. This large corporation was using embedded perl, and moving to JSP -- before there was documentation for it.
Ten years ago, I went the first way. I started working for small companies and then I openned my own. My clients have no technical knowledge. So I make sure that no matter what the request, I can do it when I control all of the technical aspects. I'm also in the web world and the custom business software world. I chose Perl, JScript, HTA's, and MySQL. I stop short of programming activex controls and device drivers -- which would have occasionally helped, but I farm those out as small C/C++ executables and tiny projects to someone like you for a few hundred or a few thousand dollars. The last one, for example, registered a protocol (like http:/// that decrypted resources on-the-fly so my crummy little HTA (think web-site in a file with no security restrictions) could have encrypted content on the CD.
In another twenty years from now, I'll move to the third world.
So, in summary, pick what you like, and then lower your head, bend your knees, and charge in that direction. Don't do what our parents said. Don't "keep your options open". Slam doors behind you. Holding all of those doors open stops you from actually going through any of them. And besides, most of those doors don't have locks; so let them close.
Teach Yourself Programming in Ten Years
Peter Norvig knows what he's talking about.
I think you are asking the wrong question. Your problem is to get a job from which you can become a fully experienced programmer. That possibly means getting a job working in support or relatively low level IT and progressing from there. So you need to put that several months of effort into job finding.
Unless you are a really gifted programmer - in which case, quite honestly, you would not need to be asking the question - your main problem is to learn enough about some business area so that you can actually contribute. If you get a job in a company that uses Delphi, or does everything with stored procedures in SQL, learn Delphi or SQL and be thankful.
Someone with a computer science degree should be able to pick up any technology to solve a problem in an appropriate way. You are supposed to understand the concepts behind problem solving, algorithms, data lifecycles and persistence, man/machine interaction, communications protocols, and other stuff like that at an abstract level. Then you look for a problem to solve where you can apply the concepts to design a solution. Your question - C++, Java or C - is like an engineer graduating from Purdue and asking "I want a job in engineering. Should I learn Bridgport, Haas or Hurco machining centers?" The answer of course is "Whatever your employer uses".
From scarped cliff or quarried stone she cries "A thousand types are gone, I care for nothing, no not one."
Since you're a final year student this advice is probably a bit late... but I've been programming for 20 years, and every few years a new language or API comes out that you must learn to stay competitive. It gets old, plus you're competing against decent developers in the East that are paid way less... In retrospect for my career it would've made sense to just be a doctor... you only learn the body once, it doesn't change and you can easily make $100k/yr till you're 70.
I would say OP should broaden his mind and learn a functionnal language such as caml. He will probably never use them professionally but they are so enlightening.
If you are going to work in the UK or in the US you need to look at the job offers. I would start with entry level contract positions since they will usually give you a chance faster than a full time position. In addition you will be able to work three or four contracts and get a feel for what you like.
.Net and Web Based programming jobs.
http://www.computingcareers.co.uk/jobs/programmer-developer/ are jobs in the UK.
http://www.careerbuilder.com/Jobseeker/Jobs/JobResults.aspx?SB%3Asbkw=computer+programming&SB%3As_freeloc=&SB%3Asbfr=30&sbsbmt=Find+Jobs+%C2%BB&cid=US&excrit=QID%3DA6656194759657%3Bst%3Da%3Buse%3DALL%3BrawWords%3Dprogramming%3BCID%3DUS%3BSID%3D%3F%3BTID%3D0%3BENR%3DNO%3BDTP%3DDRNS%3BYDI%3DYES%3BIND%3DALL%3BPDQ%3DAll%3BPDQ%3DAll%3BPAYL%3D0%3BPAYH%3Dgt120%3BPOY%3DNO%3BETD%3DALL%3BRE%3DALL%3BMGT%3DDC%3BSUP%3DDC%3BFRE%3D30%3BQS%3Dsid_unknown%3BSS%3DNO%3BTITL%3D0%3BJQT%3DRAD%3BJDV%3DFalse&IPath=QHKCV are jobs in the US.
You will notice that the UK has a lot more need to C++, JAVA and C and the US, no matter how much you hate Microsoft, has more SQL, Visual Studio, C# and other
I specialize in the n-tier web and windows application with Visual Studio, C#, Asp.net, and other Web Technologies and never want for work in the Orlando, FL area.
Good Luck and unless your married, program and read about programming every waking moment. If you are married unfortunately I can't help you. This is coming from someone married for twenty-three years. I got all my computer geek out of the way before I married her.
I work with many financial institutions, Not once have I ever heard Fortran Mentioned. Usually Java or COBOL, depending on when the app was written. Don't get me wrong, I love Fortran 95. Or at least I prefer it to COBOL.
Well.. maybe. Or Maybe not. But Definitely not sort of.
Seriously, I am getting really tired of reading incoherent code written by coders with post-grad degrees. This code is like:
"When the box disk smiles, go down to the
hairy river,
axe
the question, be not
sequitur music library))
Or like this: i ( a n 0 ][ ][H1 NK strat
Learn literate programming, world modeling using occam's razor, appropriate
factoring and abstraction, elegance and analogy, then really learn at least one language and its libraries like the back of your hand.
C++ = fast and ugly, and dangerous, unless you
really work against it to make it beautiful and safe.
Java = a beautiful baby that grew up into an old man before its time, burdened by layer upon heavy
layer of painful baggage from a failed enterprise.
Python or Ruby = really nimble and powerful if you are good enough to avoid making a godawful mess, because they won't protect you from yourself.
Where are we going and why are we in a handbasket?
Do not worry about language knowledge as much as domain knowledge. The thing that prevents you from writing an OS kernel is not that you do not know C well enough, it is that you do not know enough about what it is than an operating system must do.
Languages are easy to learn and they come and go with the times so there is no point in specializing in any particular one. Where you really want to specialize in is the domain you will program in.
If you will go into networking, then you need to know all about how protocols and networks work. If you go into the financial field, you will need to know the financial models. If you go into an embedded field, you will need to understand the OS kernel, and drivers, and power management.
Languages are the easy stuff; it is the domain knowledge that is difficult. It is also the domain knowledge that makes you really valuable to businesses.
The problem with this is that the other major programming paradigms work in ways that can be absolutely baffling if you don't work in them at all. Sure its great to be able to learn on your own, but I think that programs should at least try to give you at least a rudimentary base in all the major paradigms. This not only widens your skill set, but often can help you solve problems in ways that would not be apparent to people who have never worked outside one paradigm.
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.
What you need to do is really take a step back and ask yourself, "What sort of programming do I want to do ...what really excites me? Device driver development? Multimedia application development such as an MPEG encoder? Game Development? GUI Application Development? Web-based development? Firmware development? Engineering and scientific applications?"
The languages typically used are very different for each of the different programming focus areas listed above.
The most helpful thing to remember is that different programming languages are different tools that fit different types of jobs (especially when you're under time and other resource constraints in the real world), therefore you should be careful not to get too attached and/or biased towards a favorite language. However, it is okay to have a favorite, since being really good in one language makes it much easier to pick up other languages.
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.
It's sad to see programs that purport to be about computer science cover only a few popular procedural languaages.
"we covered 3 programming languages: C, C++ and Java"
Could you perhaps expand on how C++ and Java are "procedural" languages, rather than, say, object-oriented or generic programming languages?
The idea is that you can apply computer science to any language you want to learn.
Which is great, except that with such a narrow range of languages to start with, the OP won't have the kind of general background knowledge and breadth of experience to do that yet. The saying that a good programmer can learn a new language in a week is bull and always has been, and it seems that this particular CS course has not covered as wide a range of languages as we might hope for.
To the original poster, while you still have an opportunity to do it easily, I strongly recommend exploring a few other languages, even if only to the level of basic familiarity that you now have with C, C++ and Java. You may not realise it yet, but those three languages are all more similar than different in the grand scheme of things, and there are more ways to solve programming problems than fairly low-level, imperative, statically typed programming with C-like syntax. To expand your thinking a bit, I would recommend at least learning:
Most of these are immediately commercially relevant in large commercial fields anyway, and functional ideas (though perhaps not dedicated functional programming languages) are becoming more and more important. For bonus points, a bit of Lisp, Smalltalk and some sort of assembler wouldn't do you any harm either, but these are less directly applicable for most commercial roles. On the flip side, some exposure to .Net, probably via C#, is a valuable commercial asset even if it's rather similar to what you've already learned through C++ and Java: jobs working the typical Microsoft tool stack (C#/.Net libraries/ASP.Net/SQL Server...) are a big field.
The important thing is that you don't have to master each of these at this stage. Just play around enough, even with simple toy programs, to get the basic feel for the different approaches and understand that the C/C++/Java way is not the only one (and certainly not the best one for all jobs).
And all the while you're doing this, remember that a programming language is just a tool to express ideas. The more general CS knowledge — general data structures and algorithms, design skills, understanding specific fields such as database theory, graphics and operating systems, and so on — is every bit as important, whatever language you use.
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
Out of those that you've listed, you should definitely consider C++ a priority. Here's why.
First of all, it gives you C essentially for free. Yes, there are differences, but they are minor enough. The general philosophy is radically different, too, but it's much easier to adjust from C++ to C than vice versa (if you go C++ -> C, you will always remember what you missed, but you'll know how to work around it; if you go C -> C++, you'll just be annoyed by all the RAII stuff that gets in your way, and probably just end up writing C code with C++-style comments).
Java is on a slow decline. It's still the most popular language out there by and large, but it hasn't seen any significant advances in the last few years. With Sun not feeling well, it's quite likely that it will be taken over by IBM, and that will seal its fate as COBOL-2. It's not that you'll run out of Java job offers anytime soon - new stuff will keep being written, and there's always need of maintenance for existing code, but it's not going to be much fun, especially when you compare your toolset with other guys on the block ("what do you mean, no closures?..").
As for C++, it's still the language of choice for writing desktop software on any platform, and even in the "enterprisey" Java/.NET/whatever solutions there are often bits and pieces that are best left to C++ for performance reasons, or just because there's a C++ library available that does that thing. Picking up Java (or C#, or VB) after C++ is generally pretty easy (and there is plenty of literature catering precisely to such a transition - google "Java for C++ developers" etc). Furthermore, I've found that people who are looking for senior Java or .NET developers often want at least some C++ experience as well. I guess it shows that you're less inclined to treat things such as GC as "magical", which can matter.
By the way, while you're at it, have a look at C++0x. Draft standard is already there, and compiler providers are racing to get it implemented. I don't know about g++ release schedule with respect to that, but Visual C++ will have bits and pieces (such as e.g. lambdas) in the upcoming major release, and there are
new Microsoft libraries that rely on them heavily (e.g. google for "Parallel Patterns Library"). If you know that stuff when no-one else does, that's another one in your favor.
Of course, as others have suggested, learning just one or two languages is not good enough these days, anyway. Learn something functional. If you want to be pragmatic, go for F# on Windows, or OCaml on Unix. Haskell is worth studying just for the pure aesthetic beauty of the language, even if you'll probably never use it except as a glorified calculator. Same for Scheme.
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.
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.
It's sad to see programs that purport to be about computer science cover only a few popular procedural languaages.
I get your point, but I'd go one further. It's sad to see computer science being equated to programming.
If you want to do scientific/numerical programming, learn Matlab, Mathematica, Python + NumPy / Sage, IDL (for astro) and maybe even Perl (for biotech). If you want to do statistical reporting you need to learn R, SPSS, etc, and get a masters degree in Stat because no one will trust you otherwise.
If you want to stick to the "ordinary" corporate world (meaning, everything else), forget all that and focus on SQL, XML, web services and refine the skills in Java, C#, VB.net etc.
I would also check out a few projects on Slashdot, play around with a few and start contributing to them. Some project leaders are out to sea, so do one where you can contribute and the team leaders appreciate help. Put it on your resume. You'll learn a lot.
I'm a firm believer that the theory, science, and logic of programming is far more important than the language itself. Once you understand the important aspects of elegant design, the rules of most languages are the same. I graduated in 1996 - a while back now - but remember that the thing I thought most sorely lacking from my education was a firm understanding of database architecture and design. That is going to be just as important as understanding solid programming in any job. If a database is well designed, the code should almost write itself, once you understand end users requirements.
After that mouthful, Tiobe does a fairly good job at monitoring trends in programming language popularity. Java/C/C++ are 1/2/3 according to them. You can see their full list and trends here:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Regards,
-Flip
How much do you enjoy purely programming? Just cranking out code with nothing else to do?
If the answer is, "I live for it, bring it on" then either C# or Java will get you many opportunities. In my world, Education, the dominate language is Java. But really, studying for a few months won't get you up to speed at all. You just need to find a programming job that is willing to hire a newbie and let him learn on the job.
If the answer is, "Well I enjoy it, but I'm not sure I want to get locked in a code monkey cubicle just yet", then find a more generic programming/analyst job.
That is what I did fresh out of college some 11 years ago. Smaller IT shop, but for a big company who's business was not IT. It allowed me to learn multiple languages and systems, learn about the business world, learn what I liked and didn't like, but most importantly, the assignments were varied, so I never got bored.
One month, the project would be, make the VMS Lab system with database X, feed data to the Windows NT machine with database Y, based on some trigger event in database X, using any language you want. We don't care, just do it.
Next month, make a web site that allows managers to enter their budget information and save it as an excel spreadsheet, and also put it in our SQL server, and generate reports x y and z on spending for us. Oh, and we don't have any web servers yet, so you need to install us one.
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.
The next major release of Java (Java 7) is going to be 100% open source. Even if Sun (or IBM for that matter) drops the language, which is very unlikely, Java is going to persist as it has a strong community.
I don't think IBM would let Java drop and die. Nor would Google, for that matter. Both have invested too much into it. But neither seem to be particularly interested in evolving it further as a language or a platform. Today, Java is the conservative choice - that's part of its strength, but that's also what spells out its eventual demise. There's nothing wrong with that - there's always a need for a stable "legacy" platform, even if it's outdated, and Java is a good candidate for that role. But it's something worth keeping in mind when making career choice.
Note that it wasn't my argument, anyway. I foresee Java to be supported for decades to come. Just not in a dominant ("forall X. Must be written (X) => let's write X in Java!") role it used to be.
OSS - yes, that's a strong argument in favor of Java, but on its own it's not sufficient. If it's not good enough, who cares if it's OSS or not?
) It's true that the evolution of the Java language has been quite slow and conservative in the past. But I believe that the rise of new dynamic and hip languages with indeed cool features didn't pass Sun without notice. Java 7 is going to have closures, for example.
I'm sorry to tell you, but Java 7 won't have closures. It won't have a lot of other stuff that was hoped for, either - e.g. no RAII in form of "do" blocks (similar to C# "using"), no generics reification, no properties... basically it's going to be a very minor change as far as language is concerned. And there is no plan to have those in Java 8 either (indeed, there's no Java 8 schedule for now at all!). In fact, we don't even have a JSR for Java 7 yet, so God knows when that is going to be released, even...
It may come as a further blow that the guy who had the most deep and thought-out proposal for closures in Java - Neal Gafter - has joined Microsoft to work on .NET languages. Here's what he had to say about closures in Java, and Java in general, since then.
As for Groovy (and I think you should've mentioned Scala). It's all great, but the tooling is nowhere near as mature as that of Java - I mean IDE, debugging, and so on. Meanwhile, in .NET land, I have first-class lambdas complete with type inference in C#, so the question of support doesn't even enter into it - it just works.
Well said.
I would also suggest that any new graduate be prepared to do a lot of after hours studying to bone up on whatever frameworks, architectures, and tools your company is using. Your first couple of years of work in the corporate world should involve well over the 40 hours you're required to spend in the office (or whatever the norm is in the UK). Think of yourself as a sponge. I know this sucks because you might be a bit tired of all the studying from your college work but you'll be glad you did and so will your employer. You never stop learning in this profession but the initial load is usually pretty intense so brace for it.
One final bit of advice...
Do not worry about compensation at all. The best thing you can do is to find a place that has great mentors and a great environment. You want to come away from your interview with the impression that these people know what they are doing. Most developers are defined by their early experience and if it sucks then they tend to suck through their career (at least that's what I typically see in my many years in this business). Once you get good, the money will come later (trust me).
Good luck to you and welcome to the wonderful world of bit twiddling!
Are agnostics skeptical of unicorns too?
...as a former math student now back in the gentle arms of programming ;) I'd recommend learning math, or more specifically logic. Forget assembly, forget C, forget specific programming languages, making a computer do what you want isn't as important as knowing what you need done in the first place.
No, I won't suggest that picking up a new language is trivial, or even easy. They all have their own individual warts that are sometimes difficult to deal with, styles of programming they encourage and others they actively discourage. But a poorly-structured program is a poorly-structured program in any language, and learning to pre-visualize how it all comes together is a skill that transfers between all languages and programming styles, in my experience.
No problem is insoluble in all conceivable circumstances.
I've totally lost count of how many languages I know...but a quick count says it's at least 30.
(sarcasm)Did you applied for a position at my company last week? Expert in 30 languages, diverse technologies too...(/sarcasm)
I have used 30+ "languages" in my life, but there's a world of difference between using and knowing in depth. Anyone who presents themselves as "expert" in more than a half-dozen evolving technologies has revealed a great deal about what a low standard they hold for an "expert" ranking.
Most software is still embedded. Combine that with, any joker can become competent with Java or C#. There are a lot of low paying jobs dealing with Java or C# that you see advertised. Competent C and C++ developers are harder to find and consequently earn more money. I constantly am getting calls from recruiters looking to bring me in on C/C++ jobs, especially, for medical devices and military systems. This stimulus bill that Captain dumbshit just rammed through the legislative branch contains a lot of funding earmarks for medical and military. So I expect that this trend will only increase. Get familiar with the MISRA coding standard and understand how to design reliable systems in C and C++.
Sorry my bullshit sensor overloaded.
They're all the same. Okay, there are some minor differences, but they're all based on the same concepts and principles. There's one thing I've learned over the years- it's that if you understand the concepts of computer science and programming in general, you can use any programming language. When I interview candidates for a job, I don't focus too much on what languages they know... I want to know how they think. I want to hire the person who can grab a good reference book and know what to search for when they want to do something. Learning the syntax of a language is trivial, learning the concepts of computing is not. Some people have it, most don't. I hope that's what you got out of your education. The syntax, tips, tricks, and gotchas of any language can be picked up pretty quickly if so.
"False hope is why we'll never run out of natural resources!" - Lewis Black
A "Computer Science student" where? Joe's HyTech Typing Academy and Storm Door Company?
Seriously, a good school will give you exposure to the ideas in a variety of programming languages drawn from across the spectrum. Ideally you'd be have some sense of the best ideas in (and worst flaws of) a dozen or more languages drawn from
and yes, some C, C++, and Java. You may not ever use most of these languages, but it's quite likely you'll benefit from being able to see things from their perspective. University is a time to learn fundamental concepts--it's not a trade school.
"Not an actor, but he plays one on TV."
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.
Hell, if you are going to go as far as assembly, you also should go one step further: write an OS from scratch.
Well, I did that back in 1980, in C and Assembly, and it did teach me the fundamentals of how a computer really works, and it helped later with writing efficient C code, etc.
Alas, in today's world, that's not an approach I would recommend. But you should have an understanding about what's going on under the hood if you are writing good C++ code, especially when it comes to threading/multitasking on multicore computers (which are common as bread today!)
You want an edge up? Spend some time learning about threading on multicore systems, and understand how to write code to leverage that for performance.
On the Java front, don't fall into the trap of using Java Threads as a poor substitute for a sound queuing design. Threads are very expensive, yet Java almost encourages you to allocate and drop threads on the fly. Don't do this. Learn to use threads sparingly, yet effectively to leverage performance on multicore systems.
If you are writing GUI applications, the intelligent use of threading can greatly enhance the user experience. Users should never have to wait for an operation to complete that they will have no need to manipulate after the fact. Here's where using a batch queue and a background thread to process those batches would be a welcome win for the users of the application. In fact, even if the user will be manipulating it later, clever design to make it appear quick wins the day.
Well, now that I am on the GUI front, do spend some time learning about proper UI design if that is the area you wish to go. Go the extra mile to make things easy for the user and intuitive. Design in a fashion to annoy the user the least. They'll love you for it.
In today's web-driven Internet world, you don't need much C++, unless you are writing MMORPGs. Languages that will carry you far for Web development are PHP, Python, Perl and HTML. It is also essential to know something about interacting with databases, and that means SQL. MySQL is the most popular for web development, though some shops prefer Microsoft solutions and you'll see Sql Server in use.
So many languages, so many systems, so little time. Do your due diligence with your market and see what's in demand. Certain combinations can put you way ahead of the crowd, like knowing good software engineering approaches and also good database design techniques. This stuff takes years to acquire and unfortunately, they are rarely taught well in school.
Forget having a life for the first five years and get yourself good and grounded. Afterward, you can REALLY have a life when your career is going well and you'll look very attractive to the babes. :-)
Ruby Neural Evolution of Augmenting Topologies