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.
I think you're right in thinking C++ or Java. I don't think you could go wrong with either of those. But if you think you may go down the game development route then naturally go with C++.
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.
I see more and more of this in the bank where I work. Microsoft seem to have slowly but surely dominated this area by virtue of the ease-of-use of their development toolkits.
C++ tends to be restricted to the very old (1990s) applications that were developed when C++ was 'trendy' and before people realised what an unmaintainable nightmare of complexity it represented.
C is good for low-level kernel/embedded/high-performance stuff. If that's what you're into, head in that direction and learn C 'til you know it backward.
It sounds like you're going for general "employability", though, in which case either C++ or Java is good (I like C++, but I've never really done anything in Java). Regarding Fortran, for some reason I'm under the impression that it's mainly job security for the old-timers nowadays?
However, I really think you should pick what you want to do and then learn the skills necessary, rather than going the other direction.
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.
Good old C. Nothing beats C. Also C++. The important thing to remember is once you develop your skills in one language, it's easy to reapply those skills when learning the next. So really, once you master a programming language you will find you can do just about anything in any other language just by learning the syntax and keyword structure. My point is, your design skills should come first. And C or C++ are good places to develop those skills.
Yeah, that just happened.
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.
n/t
you had me at #!
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.
For a job it is best to learn some more java and perhaps dotnet (c#).
If you have had some more practice (in a team of 5: 1 project manager, 2 other programmers, 1 dba), you will learn, that design is more important than programming.
In the future WxPython will probably be almost as popular as java. It is easier to learn than java. Start with Python and later add wxwindows components to make GUI programs.
Fortran indeed is a nice language. But I do not see it very often anymore.
Regards,
Sjaak Wijnen.
P.S.: You will see the word coward above the message, because I was to lazy to create an account.
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.
It won't be worthwhile to specialize in any language. It's time to get a job and some real-world experience.
As a CS grad, you should be able to pick up any language within a few weeks. This is your main selling point versus those that have already specialized within a certain area. A few extra months of specialization won't help; if you do you'll likely restrict yourself to only those jobs and have to compete against those with years of experience.
Instead, make good use of your current flexibility (and relative cheapness) and land yourself an entry-level programming position in an area that sparks your general interest. If after a few years on the job you'd like to apply for a job that requires experience, you now are able to.
This sig is intentionally left blank
The idea is that you can apply computer science to any language you want to learn.
Those are going to open the most doors for you. As a developer fresh out of school, you're unlikely to get a job that would require C (mostly for low-level work, as you pointed out in your summary).
It's important to realize, though, that knowing a language only takes you so far. It's the libraries and other things built on top of the language that really give you some tools to build on. If you go the Java route, it's worthwhile to look at the enterprise side of things, learn some swing, beans, etc. If you go the C++ route, definitely spend some time on boost.
Regardless of what choice you make, it's almost always worthwhile to learn SQL and a thing or two about how databases work.
I've got news for you. Very few people in the software industry can make that claim. Spend more time on thedailywtf if you need illustration ;-)
A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
First thing to remember is that if you are coming out of school, employers will assume you do not have much experience with any single language unless you've had some sort of internship. They may hire you to work on completely different languages. What really helped me was Eric Raymond's Hacker HowTo, although if you are thinking you'd like to do web work, I'd really consider adding some JavaScript experience.
A knowledge of programming in general, an understanding of algorithms, of complexity and basic security issues, will put you ahead of a lot of "consultant programmers" I have met.
Recruiters generally think C and C++ are the same thing, and so do HR departments.
If you enjoy what you do, and are good at it, you'll get better and be an asset to any slave-farm^H^H^H^H^Hcorporation.
Contribute to an open source project or two, perhaps.
Having said that, what university is teaching computer science students only three languages, and all procedural? You should know at least one fuctional, non-procedural language, e.g. pure scheme, ocaml, xslt or xquery, prolog, would all be candidates, even if your university forgot to teach lambda calculus :D
The value of a declarative language isn't that you will get a job programming in LISP (although you might) but rathar that it gives you a different toolset, a different way to think about problems that turns out to be useful in a lot of other places.
Live barefoot!
free engravings/woodcuts
If you like programming (otherwise I got bad news for you), learn all three. With preference to C/C++. But the fact that you're asking the question, kind of reveal that you've not much passion for CS, and that you'll likely be just another 9-5, into software development just to get a job, average programmer.
In which case I'd rather focus more on Java, and whatever language-of-the-day is now current at Microsoft.
I work in an IT consulting company, and I'm seeing a strong move away from C/C++, to Java, among our customers.
Let me qualify that a bit: very technical developments (games, drivers, graphics stuff...) seem set to remain C/C++. The rest (all business apps) are moving over to Java and C#.
There still is some market for pure Web development (php, AJAX...), but not as much as Jav, and more in IT companies than at end-users'. Mobile phone development is still very much in flux, a bunch of proprietary platforms.
Furthermore, when I'm renting out devs/consultants, my customers look not only at the bare language experience, but also at experience with the platforms including libraries/tools...: not Java but J2EE+Jboss... It may serve you well, instead of listing C++ and Java on your resume, to have Java + J2EE +... other enterprise Java tools. You're not hedging your bets, but you look like you provide more immediate value.
Marylin Monroe seems to be advocating RoR, though:
"Salome did it with veils. ...
Abe Lincoln did it with rails.
Toledo did it with scales
The Chinese built that Wall.
They'll give you medals if,
They'll love your high notes if,
You'll meet the Colonel if,
You'll rule the barnyard if,
If you specialize!
I specialize."
The Cloud - because you don't care if your apps and data are up in the air.
It is hard to give you an advice here. However, I would go with C, because C allows you to program in imperative and functional. You may also use structs to simulate object oriented features.
But honestly that will not help you writing better Java programs. You just understand better how such things like Java could be made. Also you will see the C++ is a rather ugly language.
The real thing with programming experience is, that you can transform an algorithm of some sort into an elegant expression in the target language.
I can tell you that. I learned programming with Basic. And after Basic, I perfected my abilities to divide and encapsulate problems with Pascal. Then I learned C, which allowed me to incorporate ways to think from assembler with those from Pascal. At the same time I learned Scheme, which taught me to use recursion more often. and that function can be a powerful tool. Also I had to learn Modula-2 which is just a Pascal remake.
I also learned Objective-C (O-C) which borrowed its object behavior from smalltalk. And I must say O-C is much more elegant than C++ which I learned afterwards. With these languages I learned to program with objects (in combination with Object Pascal). At last I learned Java. And Java has many properties of O-C.
I also used Fortran 77 which has a nice feature called common blocks. And Prolog which could be a mess.
I can say normally you can transfer your programming skills between languages so it is wise to use a simple one first. What you have to relearn all the time, is the set of libraries, frameworks, components used together with these languages. They change and they have different concepts.
For example: You have Swing, AWT, and SWT as Widget-Toolkits for Java. They support different ways of solving UI problems. Swing supports MVC, but this is not always a good idea to use the Swing way to do it. SWT is only a widget set and you have to do the data modeling, but this can make things easier in other situations.
For such things: Learn the stuff on the job.
The more you learned the more you see that these frameworks are very similar. You find structures in their concepts which you have learned studying CS.
I think intermediary languages are overated, the languages that matter the most are SQL, and HTML, Javascript. CSS can be an afterthought once you have working navigation.
If you create a web service based framework the intermediary language will get underused (asp.net, php, perl)
but it is good to know advanced concepts that you can transpose on to other languages.
this is one thing HR do not understand, is that once you know how to do it RIGHT with one language you will look for the equivalent technique in the new language. They just want X years experience in such a language.
i've had asp.net for 2 years and sql for 4 years. and there are still bloated job descriptions that cause my cv to get blocked in the HR machine.
Thinking you can program commercially from just learning a programming language is like thinking you can repair a german car because you take a class in speaking german. The language is less than ten percent of the knowledge you need to program successfully. You have to learn the laws, regulations, business processes, and information flows within a business before your can develop useful software. The language is just the screwdriver you use to assemble the machinery.
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.
was to build a program that reflected an idea I had in my head. Sometimes the ideas weren't that great and the program fizzled out but other times I had a good enough idea that kept my attention and I was able to hone my programming skills at the same time. Of course this is not as good as contributing to a larger project or having some kind of formal experience but it was something. Granted, my career isn't actually as a developer but a systems engineer but I like programming on the side and in the process my skills did get better than they were while I was in college. YMMV.
this nation, under God, shall have a new birth of freedom. -- Lincoln, Gettysburg Address
I think C is the right way to go: it's a small, clean kernel of truth in this crazy programming language world, and you can tackle pretty much the whole language without being some amazing guru. And as an added bonus, its syntax is what C++, Java, C#, etc are based on.
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.
Go write an app for the itunes store. Keep your day job.
If your heart says C, do it. Work with C and C++, and study the assembler output generated by the compiler (gcc -S). Once you understand C you can do anything else. I interview people for embedded and Linux positions, and it's too damned hard to find people who really know what's going on. Yeah I don't expect a new grad to know how to optimize cache accesses in a trie search program, but... surprise me. You'll get hired anywhere doing work you don't hate. My guess is, if you like C, you'd probably rather be doing embedded or system/app programming than business IT, Windoz certified .NET, Java, and website maintenance. So go for it!
Also do some object oriented C, like device rivers or programs with function pointers, so you know how C++ OO works.
So true. So enlightening.
If possible, you really want a job you love, motivation is everything. So concentrate on what you'd like to do, investigate some companies, maybe even ask them for advice.
"Backwards Induction" is a fancy name of reasoning from your goal to your means-to-get-there.
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?
Most companies understand the level of experience someone coming right out of college has. You don't need to be an expert as long as you're willing and able to learn. Being a good programmer is far more helpful than being an expert in any particular language (presuming you can get past the HR-department to a technical interview. College job fairs can be really helpful for this).
If you want to be a better programmer, learn to program in a functional language like Lisp, Scheme, Ocaml, Eiffel or F#. It'll be tough since you're used to imperative languages, but in the end, it'll warp your mind in a good way.
If you're not willing to do that and just want to feel up-to-speed and ready to work, the best thing to do would be to learn your programming tools. Get familiar with a source control package such as Subversion or Visual Source Safe and an IDE like Eclipse, NetBeans, or Visual Studio. These are fundamental tools which almost every programmer uses almost every day, but which are seldom covered by universities (don't ask me why).
If I were interviewing you for a job, knowing that you are a soon to be new graduate, I would ask you questions like:
Why is Fortran better for numerical calculations? (follow up: is it still true?)
How do you perform compiler enforced encapsulation in C?
How do you decouple interface and implementation of classes in C++?
How does "everything on the heap" effect runtime performance of Java?
Now, in all honesty, I don't care about the actual answers too much, but your answers provide insight into the level of understanding of the core concepts rather than superficial syntax. If you understand the concepts at their core, then as far as I'm concerned, you go in the "yes" pile instead of the "no" pile (the "yes" pile would be further trimmed base on other criteria).
Anything that helps you understand core concepts, skewing toward industry standard langauges (C++/C#/Java) is a good thing to learn. Others have mentioned functional programming languages (APL, Fourth, Haskell, etc...). If this helps you learn the core concepts, then by all means learn them. I think people who learn functional languages are better off in the long run (you can learn them later though, while you are working), but I tend to shy away from people who are rabid functional guys (I once had an interview candidate who insisted that we were stupid for not writing our entire environment in Haskell).
As others have said, as a new college hire, you wouldn't be responsible for a kernel or a banking app. More than likely you'll be thrown in a corner, given bugs to fix, documentation to write, or other, non-romantic coding tasks until a level of trust is established with the team.
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.
This is why software companies have to resort to trivia games, quizzes on software minutiae, fizzbuzz and goddamn *riddles* to find out if someone is actually capable of doing the job.
Computer science is not a code writin' certificate, it's a degree in the science of studying computation. If you want to be successful in writing software and getting paid for it, you have to take responsibility for your own success. It's vital to study independently: teach *yourself* how to use the theoretical concepts you learn in class. Track down summer internships, so you have a chance to prove that you have these abilities later on.
If you plan to work in the "heavy" industries: Java. If you plan to work in the gaming industry: C++. If you plan to do Web development or system administration: Python, Perl, PHP, .Net, Java, Javascript.
If you plan to be an independent/freelance desktop/database software developer: Delphi.
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.
This is the BEST advice. To the commentator that said "it's sad..." - no - what's sad is when I get a recent grad that "knows" 15 different languages but can't code moderately complex algorithms. There's dozens of people that "know" how to code in different languages, but fail beyond moderately complex algorithms (most recent grads fall into this category...from surprisingly "reputable" institutions).
Databases are often places that could be beneficial in huge ways where technical expertise is lacking. Unfortunately, if you failed or chose not to get an internship or three prior to graduating, plan on spending your first 2 years learning how to navigate at the ground level and getting a general idea of what it is that you don't want to do, then move on.
Based on what I've seen in contracting, communication is the key to everything. If you can communicate, can identify when you don't know the answer (eh, get over the ego) and are willing to work at it with someone, everything else will come in time.
The job will dictate the specific needs. Defense industries don't expect much from a new hire for the first year, most (non web related) private companies will give you between 3 and 6 months to fully grasp the situation. If you can't figure it out from there, head back to grad school and choose a management degree.
Seriously, "Compile once, run everywhere."... WTF?
Make me laugh by modding me a troll...
I was in your shoes not so long ago (8 months).
Fresh with a CS degree, I had been programming for the best part of the past 10 years (call me a nerd) and had a clear advantage over the other students. Hell, I even taught classes.
Anyway, I was more focused on C++ rather than Java. I much prefer OOP anyway so even though C is a language I quite like, I discarded it. I spent the past 3 years coding only in C++. Every assignment I had, I did in C++, and then I did it in the requested language (or the other way around). No matter if it was a web app or whatever, I always made sure I managed to write the equivalent in C++. This allowed me to learn the advantages but also the shortcomings of the language. Yes, no matter what people say, every language also has shortcomings.
This was in Southern France. I moved to London in August, and started working on getting a job. Long story short, in the end there were two opportunities, I had both job offers on my desk, and I could choose whichever I wanted. One needed me to move to Peterborough, but gave me a nice relocation package (quite amazing for a first job), the second one was in Central London. The main difference between the two jobs was I what was going to be doing. The one in Peterborough was as junior C++ developer. I'd be porting apps to Linux/Mac. The one in London was as a Technical Consultant, for a company that deals with credential management, PKI, all that stuff. I'd be writing docs, giving advice, deploying products, no programming, or very little, and most of that very little would be Java.
I chose the Technical Consultant position, and I don't regret it one bit. The thing is that if, as I, you *enjoy* programming, I suggest you don't become a professional programmer. Keep it your hobby. Sure, if your job requires you to do a little bit of it (I've spent about 3 weeks coding for the company since October), well your knowledge won't be lost.
If you want to take a coding position, then I would suggest Java. We deal with a lot of banks, and I do see a whole lot of Java going round. More than C++. Why? I don't really know.
I think you could also simply call and ask. Just go hunt for names on LinkedIn and ring them up. Find companies that you like, or that do stuff that you feel could motivate you sufficiently and ask them. Plus, if later you're prospecting for a job, you can always cite the name, you never know.
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.
University is to teach you to think, and learn how to analyze, approach and solve problems in a general manner. This is especially so for undergraduates. Since computer science is such a HUGE field, there's no way for a 4 year program to make anyone an expert. But hopefully through your experience there you can think, think clearly, and apply that thinking and rationality to problem solving.
However, what you need now is EXPERIENCE. That just takes time, and it takes practice. (Think of the "Karate Kid," with the mantra "wax on, wax off". My martial arts instructor also used to tell a story of his teacher who had asked his teacher, the grandmaster, how he learned to strike so effectively. The answer was he did it 1,000 times, which gave him a good idea how to improve during the next 1,000, which helped improve the next 1,000. And so on.)
Get out. Do. Gain experience. Experience is the ultimate teacher. :-)
C.
if you really don't feel comfortable in any of those languages, C is the only real choice. both C++ and Java, but especially C++, are absolutely horrid languages to start with. C++ will positively rot your brain. C is still very widely used, although it doesn't get the hype and isn't growing very fast (comparatively), and perhaps more importantly is a great basis for learning - and later, actually programming in - other languages. it much more clearly illustrates the important concepts common to a very wide set of languages, without obscuring things in a ton of junk.
i've done hiring for a handful of projects now, mostly C, Perl, and Limbo (one C++ project, but that was only because i knew the developer was smart enough to ignore most of C++ which isn't C). finding Limbo programmers is, well, very hard, but that's not really all that important if you're hiring real engineers or computer scientists. i've never been on a project where we needed a bunch of code monkeys; that sort of thing has a different set of constraints. even for the perl stuff, i hired real CS people who didn't know perl before hiring code monkeys who did. cognitive ability, mental agility, and real CS skill all trump knowing a particular language. if you know C well, you're in a much better position to learn whatever's needed for the job at hand than if you learn C++ or Java.
note that i'm assuming here that you want to be a Computer Scientist or an Engineer, not just a code monkey. if that's a bad assumption, learn C# and VB and we probably shouldn't talk to each other about technology very much.
also, complain to your CS department. you got screwed.
i speak for myself and those who like what i say.
I don't know how it generally is in other countries (than Denmark, where I am from), and I don't mean to sound arrogant or anything, but the CS education here aims to teach people to be able to use whatever language someone throws at them with a minimal effort.
The taught ML and Java when I got my degree, but these only served to exemplify functional and object oriented languages respectively. I code in C# in the job I have now, and knowing C, C++, a little Java and others, it was a no-brainer to adapt.
Learning any language in particular isn't very helpful in and of itself. To do anything useful, you will need to interface with and use libraries, databases, hardware components, toolchains, source control systems, widget toolkits, etc. You're not going to pick up all of these things right off the bat, so you're going to need to figure out what specifically interests you and then work in that area. Do you like developing user interfaces? Making hardware come alive? Seeing your stuff running on the web?
C is going to be primarily useful for OS and driver development, and other low-level coding or embedded applications. But for you to be really useful in those arenas, you're going to need to understand a lot more about hardware, hardware interfaces, etc.
C#/Java is for the web. You'll want to complement with other web technologies, scripting, etc. When people say "C#", often they really mean ".Net" even though those are really two separate things. Becoming familiar with .Net frameworks (or the analogous Java libraries) would be a valuable use of time.
C++ is a general middleware language. From here, you could eventually move down into hardware land (actually C++ has been gaining popularity in this arena), or develop user interfaces, or slide over into managed languages like C#. If you don't know where you want to go yet, I'd probably suggest spending your time on C++.
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?
Disclaimer: I've worked at the two biggest banks in the world; I'm currently employed at one of the largest, if not the largest bank in the world.
Java dominates the banking environment because banks have a policy of hiring cheap, incompetent idiots off of the street.
Paradoxical?
Remember that bank management is trying to make the IT experts expendable -- they really dislike the fact that an expert will say "stick it where the Sun don't shine" and up and leave when the management tries to pull their usual bullshit. Hence they hire cheap idiots.
And cheap idiots use Java, because that's all they really know. Unfortunately, what they don't know is how to develop fast applications that make efficient use of Oracle databases, which happens to be exactly what most banking applications require!
From my experience in working in Oracle support and engineering, most of these incompetent Java idiots have never even seen a SQL*Plus prompt, let alone written SQL or even *GASP!* PL/SQL code. (The guy cranking all the PL/SQL code is driving an expensive sports car, which should tell you something.)
Those Java idiots which have figured out how to connect to an Oracle database (using JDBC thin, what else?), use GUI tools to *generate* SQL code; unfortunately for them, the generated SQL code is total garbage, resulting in major DB performance issues.
Which then a guy like me must fix, usually by finding perverse ways of Oracle running their garbage code faster.
The reality is disgusting, really.
Don't get too caught up with the latest buzzwords. Do read a lot of books, and a lot of code, and do write small projects.
Pick one language, I'd suggest C++ or C#, to get very good at. As time passes buy every good book on that subject area, and really master the language and common idioms. Alternate time learning about that language with learning about more general things (operating systems, Win32 internals, Linux kernel, whatever you're interested in).
Consider the fact that you'll potentially be doing this for a very long time, and don't expect that you'll be an expert in anything in a year or two. It will take time. Hard work does pay off though.
My other suggestion is to read at least one soft-skill book for every two hard-skill books you learn, even if the soft-skill book is somewhat related to programming (e.g. a book on productivity for programmers). Examples would include books on time management, influencing others, communication skills, etc. Over time these skills pay off at least as much as the core programming skills, if not more.
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.
In school, your teachers focus on higher level languages like Java that are easier to teach with because they ignore lower level programming issues. However, in the real world, people still need to deal with all of these problems.
Higher level languages sweep low level problems under the rug, but they don't make them go away. You may be surprised someday to find that your Java programs can and DO leak memory if you aren't careful. To be a top notch developer you really do need to understand how higher level tools are built from lower level components.
In industry, not being able to find developers who understand C and low level programming issues is a common complaint.
Also, C is probably one of the easier languages to pick up. Learn C well, and complement it with a higher level language like Python or, if you must, Java.
C++ is also valuable if you need to write lots of high performance code, but being truly competent at C++ is a fairly large endeavor compared to learning C. Being good at real C++ means understanding templates, the stl, and also knowing the nooks and cranny's of the language, which there are a lot of. Look up the "most vexing parse" to get an idea of what I'm talking about.
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.
You should choose C++ and C#, with preference probably slightly weighted to C# unless you think you may end up working on Linux, in which case choose C.
C++ is usable on all major platforms. By learning C++, you effectively learn C.
Learning just C leaves you without the major benefits of C++. I have not worked anywhere since 1994 that uses C in preference to C++ (despite the fact that lots of open source projects prefer C, but that is mainly due to wanting to target the widest possible target platforms).
I recommend C#, because in a Microsoft dominated world, sooner or later you may want a job in a Microsoft shop. Like it or many places are moving from C++ to C#.
Benefits of C# - you can use C# (or related languages and technologies) to create WinForm apps, services, ASP.Net and WPF apps. If you can do a WPF app, porting it to Silverlight is not too hard (google is your friend).
C# is available on Mono, so you can take your C# skills to Linux if you wish.
I've used Java, on and off, since 1996 (which is not too long after it was released). CAn't say I ever liked it. Always felt like trying to write software in a straight jacket. Lots of restrictions, no benefits. Ignore Java, C# is better.
While you are at, take some time to look at Ruby and Lua, don't bother with Python, the whitespace formatting issues make refactoring too hard to be worth the bother.
What do I use most of the time? C++ and some assembler. Why - because the things I need to do cannot be easily done from C# and using C to do them would only make my job very much harder.
Applications and games software (the typical uses for C and C++) will be increasingly outsourced to cheaper labour markets and these cheaper labour markets are catching up in their skillsets and experience. You'll be increasingly unable to point to these programmers and class them as incompetent or unable to communicate with Westerners.
Open source software development is increasingly wiping bare the number of market segments available for commercial software development. Yes, more free software for all, but, fewer employment opportunities in software development except in increasingly tighter market niches which will by definition sustain fewer jobs. FOSS activists will typically point to app support as the employment generator, which makes little sense as: (1) what leads people into software development is completely different to what makes people survive and succeed as phone jockeys, and, (2) if the software is any good, you'll be putting your support dept out of business.
The market for Java programmers is woefully overstated. Scratch many job ads and you'll find Java is a "shovelware" skillset that managers include as a requirement for web software developers whether or not they actually use it. Some other scripting language (Perl, PHP, etc) is the usual tool of choice by a large multiple.
Unfortunately, you'll be graduating into a truly awful economic environment without the prior experience you'll need to secure job interviews. If you're not extremely lucky, the gap between your graduation and your first job will grow and begin to stick out like a sore thumb. Take anything you're offered in a computing field right now before this 'Great Recession' really takes hold to keep your toe in the door. Best of luck.
Figure out which of the three you enjoy using the most and then specialize on that one. This is something you are going to be doing day in and day out, so do the one you'd most like to spend your time doing. There are jobs for all of them out there. As long as you like what you do, and that comes across, you'll be fine with any of them.
If brevity is the soul of wit, then how does one explain Twitter?
Unfortunately, universities and other education institutions are for mediocre people, they supposedy turn anybody into an engineer. Obviously, that's impossible, you can't just be anything you want just by memorizing crap. You won't learn big deal, so yeah, they don't expect a recent grad to know anything really useful, they'll babysit you. Leaving that aside, study what you like most, think of a cool app you'd like to make and code it, learn what you need to achieve what you want and so on. Enjoy your time.
What they said of C# is more or less true, demand is high, i don't know if higher than other languages but certainly there aren't many ppl proficient in C# so you'll get a good job easily if you master C#/.net.
About C and fortran, well... fortran is almost dead except for porting old stuff from the 70s and 80s. And C is practically a subset of C++ although it also implies a different approach to modularity and so on, so you'll have to learn C anyway to know C++.
Bear in mind there's no such thing as THE programming language. The commonly used ones are all the same and you can learn a new one in a couple of afternoons if you already know any one of them in depth.
And finally, remember that it's not only about programming languages. Knowing certain architectures a company works with, certain APIs, certain kinds of apps, protocols, whatever, will make the difference between a good candidate and the candidate they're looking for. Everybody more or less knows several programming languages anyway.
I'd go for C++ rather than C, you can still write straight C functions in C++ but knowing about object orientation is an advantage.
As a C programmer who has also hired other C programmers, I can tell you, there are not as many jobs for C, but there is also a shortage of good C programmers. If that is the language you want to learn, go for it! You will have no problem finding a job.
The important thing I would say is to get really good at one language. Work on a large project so you can get over the wall of confusion that comes with looking at a 20,000 line program for the first time. Figure out how to understand complex code that isn't exactly the cleanest. Figure out how to code without writing memory leaks. This is the most important thing, I would say.
Incidentally, since you are reading, I will give you two tips for avoiding memory leaks (these are more important than avoiding segmentation faults, because they are harder to detect and debug). The first is to use automatic variables as much as possible. Linux gives you a 4 megabyte stack by default, might as well use it. A lot of programs can be written entirely with automatic variables.
The second is, if you do need to 'malloc()' or 'new' memory, write the 'free()' or 'delete' first, and only allocate the memory after you have clearly written where things are going to be freed. These two techniques would have saved me some angry customers if I had followed them originally.
Qxe4
There's a huge difference between writing a kernel of programing for the web, for example. Some people work in AI (artificial intelligence) where lisp is very common. If you work for a bank, Fortran and even Cobol should be in your toolset in addition to Java or C#.
For web development, javascript is a must, and probably some more scripting languages (php, python, ruby). If you want to create the next operative system, or device drivers, you'd better know C. And so on...
So, to answer your question, you should first ask yourself what would you like to do. What do you like most? What are your interests? Do you imagine yourself developing games? If so, C++ is a must.
For anything that requires high performance and speed, the c languages are needed. If you want maximum productivity, scripting languages are the best.
If don't know what you really want, and you are just concerned with getting a job, go with Java or C#.
Some of the most important companies, such as Google, use Python intensively, along with c++ and java. Startups in general use open source tools and scripting languages for almost everything, except those little parts of code that are highly CPU intensive, because speed of development is paramount for being succesful and being first to market.
Hope this helps...
Seriously - if you've studied C/C++/Java to a reasonable level, picking up other procedural/OOP languages like Pascal, C# should be a no-brainer.
These days, though, you rarely get paid to write stand-alone code from the ground up - you'll have to deal with complex APIs, application frameworks, communication protocols, database servers etc. If all your Java work was done using AWT or Swing and you get a job using SWT then you'll be on a learning curve (and that's just the GUI/forms end - let alone the rest of the Java acronym thicket). If someone still wants FORTRAN then what it probably means is they rely on something like the NAG library for numerical analysis.
Learning (say) Javascript is trivial compared to getting up to speed on the object model used to interact with HTML/XML models, and if you use AJAX you'll probably start with an existing framework.
In some fields, the Big Thing will be databases - SQL and all that (plus the APIs for accessing them).
So when you're looking at job ads, pay less attention to the languages and more to the other technologies they ask. You ain't gonna learn them all, but it will pay to have some knowledge of what does what.
In a survey of 100 programmers, 111111 thought that duck-typing was a good idea.
I'm a little surprised that you weren't taught any functional languages, like Lisp, Scheme, or ML. It seems like a tragic hole in your college education. From a practical standpoint, it won't necessarily effect your ability to get hired at a bank, but it is surprising. Practically, unless you are working on low-level hardware or kernel code, I would focus on a high-level language like C++, Java, or C#. For C# you can download the free version of Visual Studio; for Java download Eclipse or NetBeans; for C++ learn to love emacs.
More importantly, join a mid-size to large open source project and contribute code. This will teach you important skills that you can only get by programming with other people: the need to use revision control, how to code to different coding standards, and the necessity of coding reviews.
A thorough understanding of revision control is a fundamental part of any professional programmer's skill set. If you have a chance, learn more than one revision control system.
You might want to spend some time learning about relational databases. You should have a good understanding of SQL and concepts like normalization and joins. On the open source side, you can learn about concepts using PostgreSQL or MySQL with InnoDB. On the closed source side, you can download Microsoft's SQL Server Express or Oracle. Both are free for personal development purposes.
Again, a good way to learn professional software development is to work in an public open source project. You'll work with people of different backgrounds and different skill levels. As an added bonus, it's an easy way to show your work (and code) to a prospective employer.
--Sam
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.
First, what language you focus on depends on what language you will use most in your work. Which depends on what field of programming you focus on. If you work for Microsoft, expect Visual C++ or C#. If you work in an IT department expect PL/SQL or Java. If you work as a Sys Admin expect C, Shell and Perl. And so on...
Second, you really shouldn't learn focus on one language and expect to get by with that because languages come and go. If you work on a team and your boss says you're working in Python, then you will have to learn Python. The next time it could be Java Script or something else. Thus it is much better to get good at learning new languages quickly. That way it doesn't matter what language your boss throws at you.
To develop this still you need three things:
To give you a sense of perspective there are probably about a dozen languages that I know cold (I use these on a day to day basis) and another few dozen that I know well enough to read but might need a refresher in order to write. For most languages that I don't know, it may take between 2 hours and 2 days to get good at them, but I would still consider taking between 2 days and 2 weeks reasonable.
Once you get pegged as a "web developer" it can be hard to get a traditional programming job.
I've heard much the same, if you get branded as a web developer you're pretty much stuck there. But if you work on more general programming paradigms then you can go into a number of different fields. At the same tyme I've also heard basically the opposite. For instance a programmer or CS major may take classes in finance, then they will be more likely to be hired by someone in finance.
Falcon
Should there be a Law?
However Java by itself is generally useless. Most Java apps these days make use of a plethora of tools, specifications and libraries - Ant, Maven, Java Server Pages, JDBC, Struts, Spring, Hibernate, Tiles, iBatis, log4j etc. etc. Just knowing the language is nice and all but it probably won't mean you're ready for real world development. C++ is even worse since every OS does things completely differently and even the compiler and C++ standard libraries might have their own quirks.
My own view is that most programming languages are just so much stuff. It's not the language that matters as much as how suitable it is to a task and what tools / libraries exist to achieve that task. Suitability is a nebulous term but it really depends on requirements. If speed is critical or its a low level thing then C++ might make a good fit. If the stability is critical or database / network latency is a speed limiter use something more high level. In all cases I would argue that maintainability is paramount - most commercial code WILL have to be bug fixed or updated at some point and its easy to write code in any language which is unreadable shit.
Maybe the answer is to augment what the class teaches you with your own programming. Think of a useful app that you can write to exercise your knowledge of the language, then go grab the tools and write it. Free toolchains exist for C++, C, Java, .NET, Python and most other languages. And buy the book Code Complete and take heed of what it says of writing good quality code.
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.
Developing in-depth expertise in a language is a great idea, definitely you should follow through on that. However you can ratchet down your anxiety level a bit. Your first job will not be to write the Linux kernel or a multi-threaded banking app from scratch. If you are lucky and talented your first job will be to add some feature to the Linux kernel or an existing multi-threaded banking up. You'll be able to study other people's code, see how they did things, and follow their example. If you find sections of code you don't understand, you pull out the language and API references, or if you are really luck, go down the hall and get tutored by the person who originally wrote it. I mean even Linus didn't write the Linux kernel as it exists now from scratch. If you are not so lucky or talented you'll be writing a CRUD application that won't tax even your existing language skills, though it may tax your organizational skills.
There is a trade-off in picking which language to specialize in. The majority of jobs are probably in Java and .Net, but those languages also have the largest supply of programmers. There are fewer jobs for FORTRAN and C, but there are also fewer programmers qualified for those jobs. To some extent it will balance out, so you can suit yourself. One genuine limitation is that you may be limited to working in one of the major tech centers if you go with one of the non-commodity languages.
wrong and wrong
the Linux's kernel is mostly written in (plain) C, and most of multi-threaded banking apps are written in Visual Basic (I'm serious, I receive dozens of offers a day...)
sadly enough, C# is ever changing (some would say "evolving", but I doubt there is much evolution in things that break backwards compatability)
as others have said in their replies, learn to learn and wherever you end-up working (nobody will consider graduate self-training as serious, so save your time and take a deserved holiday instead) just do your assigned tasks and ask around when you want to know or do more
if you graduated with top marks you should be able to find something rather soon, otherwise count at least 6 months in the current turmoil (and I wouldn't go in a financial institution for now, or you might find the grocery store refusing to sell food to you or calling you names...) &smiley;
Can I put a spell on those who can't spell?
Your wheels are loose and they're losing their grip, good you're there.
Learn C++.
C++ is an awesome language. It is basically better C. It has all the stuff that C has (C++ is technically a superset of C) plus the Object Orientated side to it and STL.
Very OO written code in C++ will be as clean and nice as C# or Java code. The only difference is that C++ does not force you to write your code that way - it is up to you. Where C# and Java enforce a certain set of rules, C++ lets you do whatever hell you want. This is a really really powerful feature of this language. Sometimes certain paradigms are the cleanest way to solve problems, even though they are not normally OK (think goto in C for example). If you write stuff in C# or Java, they just plain say "NO" to features like this, even though they may be the best/most efficient solution for certain problems. I find this deeply limiting.
You can make very efficient high performance programs that are as fast as C code. You can take straight C code (except small differences: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++) and compile it with C++ compiler, and at the assembly code level it will be exactly the same as code compiled with C compiler. Its a same damn thing.
The fastest desktop operating system in the world was written in C++ (http://en.wikipedia.org/wiki/BeOS). It all depends how the code is written - you can write stuff very very fast if you use a subset of C++ (see this for example: http://en.wikipedia.org/wiki/Embedded_C++)
Basically what it comes down to is this: C++ is the most powerful language. You can write very small and efficient embedded applications for example using a subset of the language or you can use the full blown features like RAII and templates and write really clean and efficient desktop applications for example. You can make very fast code or you can make it very very easy. It is up to you. It gives you all the power.
Of course, with flexibility and power comes complexity too. To trully master C++, you have to know both C and the C++ portion of it. And the STL library.
All the issues that you hear about C++ basically come down to self discipline. If the programmer is an idiot, he will write bad code in any language.
In my experience I find that most of the complexity in C++ code comes from people that a) do not know how to program or b) know how to write C yet they end up writing "C++" code.
Also in my experience, I find that most of the bugs (such are buffer overflows) and long development times are caused by C programmers writing C++ programs.
For example, most of the electrical engineers that I work week keep using character pointers (C strings) for everything, and they keep screwing them up and it takes them forever to figure it out, yet they can just use C++ strings and be done with it. There is absolutely no reason to use C strings in their applications. No performance reasons or anything of the sort.
Its just that they are lazy and old and they do not want to learn anything new, so they keep writing these so called "C++" programs that are nothing of the sort. Its basically just a C program compiled in C++ compiler.
Other than the bugs like buffer overflows, it also takes them forever to write stuff because they do not take advantage of OO portion of the language because they do not know how that works. Also, they keep re-inventing the wheel. For example, every time they do searching withing strings, they write pages worth of code. Yet, C++ already has this code written and its built into standard C++ strings. Re-coding that in C is dumb and it just wastes time.
So here is what you should do: Learn C++. Really learn it. And do not write straight C code in it. Use OO and especially use STL, like strings, vectors, maps, all the algorithms, etc. It really makes you very very productive - as productive as people writing stuff in Java for example. It also makes your code much more robust.
Also,
First learn a tool (like C# or Java), then learn the process for using the tool to produce quality products. What good is having a tool if you don't know how to use it? This is the best book on the OOAD process I've read: http://www.amazon.com/Driven-Object-Modeling-UMLTheory-Practice/dp/1590597745/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1237660723&sr=8-1
Really, if you know C++ well you've learned enough to understand the whole family of C, Java, C# etc. So spend a few weeks with a good book, understand the core concepts and you're good to go with OO procedural C derived languages.
Then, learn some web stuff to be marketable - just some basic HTML/CSS + learning JavaScript's crazy scoping and memory issues and your good
Finally, familiarize yourself with some basic SQL so you're ready for web backend stuff and now your good to go!
Just make sure you pick up good, secure techniques - understand and know the STL and secure C functions (_s). Understand what XSS, SQL injection etc are and how and when to safeify input.
Any shop worth its salt (at least who have an engineer doing the hiring) knows that you look for good people who can learn the environment. This doesn't mean someone who has their particular set of languages and APIs as a bullet point on their resumes, it's someone who comes in and understands their problems quickly during the interview.
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.
But C, C++, Java and C# are the most commonly used and once one has good command over them one is that much more hireable. As you pointed out these languages are all related and IMHO the best way to solve the depth-of-knowledge problem he mentioned is not to specialise. Go out and get a couple of books on general OOP and Software design that doesn't tie you to a specific language but that teaches you OOP and general Software design principles on a higher, language independent level, this is one of my favorites. Once you have that kind of understanding you can switch between the above mentioned languages relatively easily. After that is done the most important thing is to get experience. This is IMHO best done (and I'm sure other people's milage varies) by getting an entry level job and either joining a FOSS project for additional experience or write a few small commercial apps of some sort. If you take the latter route the important thing isn't so much, say, writing a killer app for the iPhone or Android that will make you a millionaire over night as much as it is simply to establish a track record you can point at when applying for a job. If you make a few bucks along the way that doesn't hurt either. The beauty of joining FOSS projects or setting up your own is that even if all you can get in this economy is a job flipping burgers at McDonald's you can still build credible experience in your spare time.
Only to idiots, are orders laws.
-- Henning von Tresckow
The professional thing to do, is just to wait until you have a job and know what you will need to study. Oh and on interviews never say that you don't know "language" very well, just say how much or little you did in it. For some reason or another saying I did a very small project in it sounds so much better than saying I don't know it very well because I only did ten small projects using that language.
Getting a job is not about lying. But it is about avoiding to spell the truth out.
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've done some C/C++ programming on Windows PCs, but not in years. Now I use Macs mostly though I also have a Linux PC and may install Ubuntu on my Mac. Objective-C is the mainstay language on Macs but I don't know if it can be programmed on Linux or Windows PCs. Anyway I want to start programming again but I want to be able to program cross platform so I'm wondering if I should stick with C/C++ or try Objective-C. Currently I'm trying to learn Java.
Falcon
Should there be a Law?
Let me preface this post with: what I'm saying will only be relevant for a few more years and then things will be dramatically different.
I used to be a C/C++ programmer. I wrote OS code and then middleware. Then came the internet and Java EE. My expertise became irrelevant because no one wrote their own middleware layer anymore; especially in C++. With Java EE and all the Java based layers out there, there was no point in rolling your own. From what I can see is that Java is the language for business and that's where you going to get the work. Also, learn SQL and as someone mentioned above, VB and C# - Microsoft has a huge business base.
If it's not too late in your program, I would add some Accounting classes too. Minor in it, if you can or better yet change majors get your degree in Accounting.
As time goes on, the way we develop software is becoming more and more obsolete. As an example, BPEL. The business person, with a GUI, "draws" how the computer will handle any business process. No programmer needed.
Sure, there will be a need for programmers at some level, but a team of programmers for every large business? That's going the way of having a blacksmith in every town.
Who knows what the future will hold.
I am Java developer with about 3 years experience. Previously I worked with PHP for couple of years. I have also worked a lot with SQL (Oracle and MySQL), and sometimes with Perl and bash.
Now from all of that I can say that Java seems to be the "simplest" to use. All the tools like profilers, unit testing frameworks, great IDE (eclipse) with plug-ins for everything possible ... but I am getting fed up with learning new framework every 6-12 months that changes nothing but XML configuration format (yes, I am exaggerating).
I want to start fooling around with C++. I know that I should start with STL/Boost combo, but how about other tools? Some helper tools to detect critical errors (error prone parts of code)? Some unit testing libraries? Is there good IDE (Visual Studio Express seems awfully .NET oriented), or can I buy something reasonable? All tips will be welcomed.
"commercial-ready experience"?
Go back to school. You missed something.
Maybe it's not your fault.
Maybe try a different school.
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
Only 3?
Hell here in most courses we cover at least those(c,c++,java) plus assembly(depending on the university x86 or risc), prolog and some functional(usually scheme or haskell)not counting scripts (php, javascript, xml, html, sql are the bare minimum) in three years.
I agree.
I would also add that the Human Resources droid, or agency lackey that often writes the job advertisements does not necessarily understand what a house computing environment is like. They tend to focus on the languages and packages, and ask for experience in exactly that. The people who actually are going to employ you ought to be more flexible. If they ask for a language you have never used, then it would make sense to read up about it, but you can then say 'hey - I have only learned about this since I read your advert'. You can learn languages, but you never really know them until you have used them for a serious job, and trying to blag it would probably be fatal..
You might get unlucky. I was once given a 'C' grammar test as part of an interview. The company had had a lot of people who claimed godlike computing powers, and this was their way of sorting out the more obvious chaff. Again, you can be flexible in your answers. I remember my test having a long statement with no brackets and all kinds of precedence. I gave three replies... (1) I know where to find the precedence rules (page 53 of Kernigan & Ritchie, the page that is all yellow on my copy) and I would look it up rather than trust to my memory (2) Nobody ought to be writing code like that anyway - brackets don't cost, and (3) my guess at a solution.
Good luck anyhow.
Being a Java enthusiast, I must reply to your arguments regarding Java:
1) 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.
2) 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. If you want closures and other syntactic sugar right now, have a look at Groovy, which is a scripting language based on the JDK. You can even compile Groovy code to 100% pure Java classes!
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 happen to develop software for living and recently I am also teaching at an University at both undergrad and graduate levels. The students often ask which tools are we going to use and which ones should they learn. And I am always telling them - "the right tool for the job". If you want to learn tools, do not go to school, get a training course. The school is there to teach you the concepts behind and how to think. Focusing on the tools is like a carpenter learning only to use a hammer and screwdriver but not how to actually build anything. Also, the carpenters have more tools than just a hammer and screwdrivers - so do expect to have to learn more than the standard C/C++/Java/C#, they are not one-size-fits-all tools. I have honestly stopped counting the languages I had to learn - they are only tools to get the job done, and you learn a new one when it does the job better than something you knew already.
In the programming case - learn your theory - principles of computation, logic, data structures. Programming languages are not important, if you are any good, you will be able to pick a new one up in a few days/weeks at most. However, that assumes that you know how to learn and how they work. Not to mention that a particular tool or software may be obsolete in a few years, then what? If you have learned only how to "push buttons", you are screwed, your skills are now worthless. Nobody may hear about C++/Java/C# in 10 years, but you do plan to be working in the field for longer than that, don't you? So you need to be able to adapt and keep learning - the principles will be similar, only the tools may be different.
Also, as many pointed out, do not expect to be able to write an enterprise application right out of school. Nobody does that. The school gives you the foundations, but you need practical experience. And that comes only with time, there is no school that can give you that. Take on internships, part-time jobs, work on OSS projects, volunteer - all that helps to build up your skills. I was lucky to have a part time job at a small software company during my studies (I needed the money to support myself). That company did things "by the book" - proper analysis, everything documented, proper design. At the same time that I was learning software engineering in school, I had a hands-on tour de force in a real enterprise solving real problems using the methods I had just heard about, under supervision of really good engineers. That has helped me immensely - you cannot pick up all that knowledge from the courses alone.
The saying that a good programmer can learn a new language in a week is bull and always has been...
Really? I've learned about 20 different languages at one time or another, and in every case, I was up and running in a couple of days. Am I proficient at them all right now? Hell no. I currently work in C, Python, and Cython, and I'm decent with them all. Put me back onto a project using PHP, Perl, etc., and I'm confident that I'd be back up to speed in under a day.
Fluency, of course, takes years of experience. But knowing the language enough to fix bugs, implement algorithms, etc., should come to a good programmer in the matter of a week or two. Management of large projects requires fluency, but not every coder needs to be an architect.
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.
Modded insightful, the advice to do whatever you like is surprisingly close, IMHO,
See, college really exists to get you familiar with the basics. It then takes EXPERIENCE to advance to coding kernels and the like. How much of that you do is determined by what you LIKE to do. So, you go to school, then you bang around for a while on small jobs and hobby programming 'till you find your groove. Then, you go into whatever field you like.
make a very comfortable living as a programmer, and I'm damned good at it. But kernels and drivers? Not my gig. But I'm mean when you need a perl/php script with javascript and ANSI SQL. I literally dream in code.
So bang around, find out what your favorite cup of tea is, and then pick your industry based on that experience. Programmers are in a unique position: you basically never have to choose between love and money, because you are so much better at what you love that you'll generally make more money there, anyway!
What did you Linus was doing when
I have no problem with your religion until you decide it's reason to deprive others of the truth.
It depends very heavily on what you want to do. Even what operating system you intend to work with makes a tremendous impact on what the skillset should be. For instance, I'm a Unix programmer, and any experienced Unix programmer really should know C--even if it's not the actual language you'll spend most of your time with, C knowledge goes a long way on Unix. I personally find plenty of work in C, but then I believe that the fact that I'm rounded out with knowledge of several other useful languages does a lot for my chances in comparison with other candidates.
I've avoided Windows work where I can (it's just not my thing), so take my advice about it with a pound of salt, but my impression is that C# is a very good language to know right now. C# is really quite similar to Java, and so a lot of knowledge from one will transfer to the other (the chief differences may not be in the languages themselves, but between .NET and the Java Class Library). Knowing a little C++ and a solid understanding of using it in a Microsoft environment (which is perhaps more important than knowing C++ solidly for many jobs), will go a long way toward bringing you ahead of other C# candidates that don't have much C++; there are many limits to what you can accomplish in the real world with .NET alone.
I don't really enjoy working with Java, but I think it'll be a long time before Java programmers start running out of work. Writing phone apps seems like a pretty easy job to get with Java.
My personal creed is to learn the languages and technologies I want to know; I usually give little thought to how useful it will actually be for my career. That philosophy is admittedly somewhat naïve, and would absolutely need to be adjusted in a truly awful job climate; but it has worked well for me so far. I think I tend to snag jobs in which I'm happier, since I'm working with technologies I like (note, though, that in the larger picture, comfort with the technology really plays a very minor role in total job satisfaction).
There's a limit, though, to how well this can work for you. Several languages I've got good understanding of, such as PostScript or Haskell, I have no illusions of applying any time soon in a job. Similarly, I expect that knowing Fortran these days may have limited practical usefulness, especially when those jobs that do require Fortran can probably find much more experienced folks than a college grad. (However, you may find that familiarity with m4 is at least occasionally useful, and more so if you work in a Unix environment that depends on autoconf and the like).
This is the single best advice I've ever seen on /.
Don't claim to be an expert if you aren't. Chances are, if you THINK you are an expert, then you only know 10% of the subject.
Perhaps a more accurate term he could have used is imperative (of which procedural languages are a subset), as opposed to functional.
HR people can't really tell the difference between C and C++. The evidence is all the "C/C++" job listings, treating the languages as one and the same. There is the very wrong assumption that a C++ programmer is any good at C.
Also, lots of "C++" places are using only the C-like part of the language. They may use a C++ compiler, but they mostly aren't touching classes. This is especially true of Visual Studio users, because Microsoft still doesn't support C99 features like variable declarations in the middle of a function.
Simple programs teach how to work logically, and locally. The big picture or the big wtf will come later.
If you learned your CS material, someone out there can make money by having you do what they tell you to.
That said, I would recommend adding a scripting language to your skillset.
From your post it seems like you want to become a software engineer (not a computer scientist). That's cool. I agree with all the people saying you could usefully learn at least one very different language, but it won't help you land jobs (only do them :-)
I would consider getting a certification in Java or C#. Both are widely used, and will be for some time, and you can leverage the knowledge you do have. Certifications are not as important as some would have you believe, but to anyone hiring a graduate for production work it will provide some safety, and you will become more secure in your chosen language.
But more importanly that that: read up on software engineering! Read some of the modern classics, and follow the writings of the gurus of modern imperative programming.
sudo ergo sum
Let's be clear here: Python and Perl are not programming languages. They may be useful in certain situations, but should not be mistaken for actual programming languages used to construct robust applications in the real world.
Haskell is a programming language, but is about as useful in commercial development as Prolog.
And Fortran? Not really forward-looking.
I've done a little bit of hiring at my small company (we have five programmers; I was an interviewer for two of them). You do need to be highly competent in our language of choice (C++), but I expect to spend a lot of time training a fresh-out-of-college hire.
If there are C++ fundamentals (virtual functions, pass-by-reference, use of the STL and standard libraries, polymorphism) with which you are not familiar, then you have language learning to do. But given that you have the fundamentals, the biggest question is whether you can work on a team.
Do you know how to say "I don't know" when you don't? Do you document your work clearly and effectively so that other programmers will find it usable? Are you passionately interested in naming constructions in a way that clarifies their purpose? Do you think about corner cases when you code, so that your methods can be used without fear or knowledge of their internals? Are you the kind of person who's going to get into holy wars about programming style, making the codebase into a mishmash of competing formatting styles? Or even worse, do you not care about programming style at all? Do you know how to read someone else's code and then follow their way of doing things, rather than just rolling your own every time?
The question I am asking with every new hire is "will hiring this person make my life easier?" That covers a lot more than programming knowledge.
Acius the unfamous
Hey there,
I can tell you're going to be very successful with the positive attitude you're showing. Your "I want to learn to make myself more valuable to the organization." attitude is fantastic. Don't worry about knowing what you need to know before you get on the job, but just make sure that positive attitude shows when you're interviewing.
I studied Ada and c in college. Like you, I liked c very much. And it turns out I didn't use either of those in the work place, and have spent the last 15 years doing Java, C#, perl, PL/SQL. I learned all those languages on the job without prior exposure. You have the background you need to do the same because you've already learned three languages.
Also, don't believe all you hear in your classes. I worked in the financial industry for a good part of my career, and I have not seen any multithreaded or fortran banking applications. Sometimes professors think they know what's going on out there when they really don't. Maybe some software package vendors in those industries do a lot of multithreaded development, but the bank IT departments will do a lot more basic high level stuff. In interviews, ask first what kind of development goes on at the companies where you interview before assuming you know.
In addition, since you're thinking in terms of value to the enterprise and you seem to have excellent written communications skills, you may be very well suited to be a development manager in the future. If that is something that appeals to you, observe your manager's job duties and see if you would like to do that in the future.
To echo what some others have said: offer to help the more senior staff to begin with, and don't be afraid to say "sure I can do that... it's my first time so I'll first have to spend a little time figuring it out." If you look at this thread, you'll see how you can get good results by asking for help.
In all the companies I have worked for, they were either getting away from C or never had gotten near it. So unless you want to be stuck in some real time systems world--I would recommend Java. I have a free website to help you learn: Free Java Lectures
Three almost identical languages after toiling away for computer science degree? It sounds more like a computer programming degree.
Go with Java and learn the JVM and the standard libraries the best you can. Then you'll be better poised to learn some Scala, Clojure, and Groovy, whose principles you'll really need to round out your education.
Being able to write good code has very little to do with knowledge of a programming language. A computer scientist specializes in algorithmic design, abstraction, interfaces, etc. Programming languages are actually just very simple tools at a computer scientist's disposal, and one should be able to discern the linguistic features of any language and choose the correct language for the tasks at hand. Learning a language really well isn't going to help you write a Linux kernel or a multi-threaded banking app. The former needs hardware and compiler level knowledge, the latter needs comparative knowledge of functional vs. imperative languages and their implications on parallelism. In both cases a programming language is just a tool one picks to accomplish the task, the real challenge lies in knowing enough about other aspects of computer science to accomplish it.
The good thing is, that no-one will expect you to be know the exact combinations of all of these, that their particular company uses. You'll spend the first 6 months getting the hang of it all, until you become more that dead-weight to your employer.
Your best bet is to make sure you know the principles behind each of these toolsets, so you won't have a dumb expression when they come up at interview. Your biggest asset at interview, will be to have shown initiative (and not have a criminal record) and willingness to learn - rather than know all the intracacies of a particular language. That's what the "2 years experience" job ads. are for
politicians are like babies' nappies: they should both be changed regularly and for the same reasons
Learn a language that will challenge the way you think about programming. A language that uses functions as first-order objects like Haskell will give you more perspective on programming. Erlang, Scheme, or Lisp would all be good as well.
These types of languages will impress employers, because you've gone the extra mile in learning them. Plus, for certain problems, you can more easily implement a recursive solution using them.
I dont' get kids these days. The reason I (and a lot of people of my generation) learned to program was to code/hack cool shit!
Nowadays it seems very rare to find a 13 year old hacking games or teaching himself assembler just for the fun of it. People just seem to want to learn stuff to finish school courses & land decent jobs.
Where is the fun element? I get that some people just like solving problems and see computers as just another tool to do it. But what about the hacker breed? People learning stuff just for the fun of it, not for profit?
While these people are still bred into existance I fear the point & click generation of operating systems and the "commercialization" (take that to mean what you will) of computers & the internet has taken the fun out of it.
A computer is now just a tool, not some cool strict machine that does just what you tell it and punishes you if you make mistakes & act stupid. Sometimes I truly do wish it was the late 80s/early 90s when it was so easy to write something cool and people who wanted to program didn't ask these sorts of questions.
Please forgive my rant, you may now go on with your lives fellow Slashdot readers.
I tried that to learn Russian, and all I got was a lousy T-shirt that says "In Soviet Russia language learns YOU!"
I would concentrate more on language breadth (learn a lot of them).
If you already have a grasp on C languages, try some non-C languages that do things very differently.
Namely, functional and dynamic languages. You've already covered procedural and OO (Java).
Lisp, Perl, Ruby, Python, F#, Scala, OCaml, JavaScript (JavaScript looks like a C language, but really isn't).
Outside of languages, more than likely you haven't learned OO concepts very well yet. Not your fault, colleges are notorious for teaching bad OO practices (I've only been proven wrong on this once). Design Patterns are another good topic to investigate.
Bad User. No biscuit!
Other posts have already said as much, but with different language choices...
On top of all the good CS stuff you should have from your CS classes, if I had to completely boil it down to three languages, I'd do these three, and in this order:
Java - it's imperative and object oriented. Being confident in this paradigm makes it easy to slide into similar languages that are in use today and will continue to be in use for some time to come. Also, you'll be able to pick up C# without much trouble.
Assembly - the architecture matters not, but I'd suggest MIPS, because the point is more about learning how things work at that level, not about learning an assembly language you expect to be working in professionally. But if you learn one assembly language, you can pretty much pick up any other assembly language. Probably more importantly, it sets you up to be able to really know what you're doing in C, and knowing C and Java sets you up to ease into C++. IMO, most CS schools should already be teaching some assembly as part of a required architecture course.
Scheme - well, any LISP would do, but I feel Scheme really boils it down to essentials. Again, you're not learning Scheme specifically to be a Scheme coder, you're doing it to master recursion, to be used to writing functions that take functions as arguments and functions that return functions, and functions that are applied to a data set. Familiarity with lists and the higher level Scheme functions map, filter, and fold will be of immense help when learning Python, Ruby, Haskell, etc.
After that it's up to you. If you plan on going corporate, picking up some SQL can only be a good thing. A little perl wouldn't hurt either. IMO, if you're already strong with Java, that's already your foot in the door to a whole lot of places.
..particular language. Operating Systems, languages, APIs, these are tools in your toolbox.
What you need is the ability to identify potential problems early, to be able to work in a team, to think ahead and not 'design at the keyboard', to avoid taking shortcuts and avoid being 'clever' at the expense of clarity: basically - to be a software 'engineer' instead of a 'programmer.'
Which language to learn? All of the ones that are common in the fields/areas you're most interested in working in. :) You probably don't want to hear that, but it's important.
I've spent the majority of my career writing C++ code and doing things as twilight-zone as implementing DCOM on Irix, to my current product which is writing a very comprehensive software renderer that'll run under Java 1.1 (even though it's 2009 - LOL.) I've even found myself writing HTTP Tunneling code in ActionScript in the past year. I have several years Java EJB experience as well (back in the bad old days when it first came out - though some would argue the bad old days of EJB are still here ;).) I've written several very powerful tools entirely in C#.
None of this is an impressive accomplishment, it will all happen (in some form) to you as well if you work in the industry, so be prepared to be a Software Engineer instead of a "'insert language here' programmer".
Good luck, and I hope you like problem solving :).
Loading...
Whether you like it or not java is the most requested programming language by far. If possible go after JEE, that will keep you busy for while, again JEE/J2EE one of the most used platforms in business whether you like it or not.
is of course, COBOL! Cant go wrong with a good dose of COBOL under your belt- excuse me my card sorter just scattered over the floor.
In the last 20 years, I have worked with far too many engineers that could not write a decent document to save their ass. You should be able to read, write and speak English well, including standing in front of a room full of people to give a presentation. At most organizations, the first step for any software development or IT project is a requirements document - written in English (or the appropriate local language.) If you are a great communicator, you will stand above your peers and advance in your career to work on interesting projects, lead teams and make more money.
While in college earning a degree in Computer Engineering, I was only required to take one semester of English. At the end of college my writing skills were appalling. I was forced to improve my writing on the job including writing product reviews for a magazine, requirements documents and documentation. I learned public speaking the hard way - standing in front of 20 people for two weeks training them on our company's product.
So, before you graduate, take technical writing and public speaking classes.
Through my 5 years of studying computer science I was exposed to: SML, Java, C, some variant of assembly, prolog, C# and smalltalk. Might have missed one or two there. Now of course none of these were taught in any kind of depth. Actually the only two that were really taught was SML and Java, the rest was more or less a question of self-study.
To answer the OPs question: Don't specialise in a language, specialise in getting things done. As an employer I couldn't care less if you know every last detail about C++ if you can't get the work done. Keep the real goal in mind.
Also, don't think that being a super programmer is something you'll learn sitting at home with your nose in a book. Get out into real life, get a job. Building software is so much more than just programming and the only way to really learn that is doing it in a real environment.
I had the same issue in college. Ive learned several more languages. and they where all easier by knowing c++ , I work for the US Government and the main languages we use are C++, ADA (Old Right? LOL), C#, Java LOTS of Java, and VB.net
It really depends on what part of the industry you want to get into.
C++ and Java are the two safe choices. They are needed almost everywhere, and they are here to stay. From games to desktop apps to web apps either of those two will get you quite some way. Pro: You can do almost anything with those languages. Con: Most other programmers can, too.
However if you are leaning towards a specialised niche you obviously have to learn whatever is most common there. From Fortran to Ada there are virtually unlimited choices. Pro: You will be one in a rather limited (and potentially highly paid) crowd of people who speak that language. Con: No-one else needs you. And if your language of choice becomes obsolete, you essentially are too.
What I would do: Learn Perl (to serve you personally as the programmer's swiss army chainsaw that it is) and one of C++, Ruby or Ada. Each of these three will take you onto a different path in the industry, but I'd say none of them is a completely wrong choice.
Of course, if you are really masochistic, there's always assembler languages. They are still around, and they still provide for good job opportunities, but you're in for a world of hurt, writing really ugly stuff with a tremendously low margin for errors.
Rudolf Hess edited Mein Kampf. He was the very first grammar nazi.
This web site basically gives an indication of the most popular langauges.
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
As you can see, C comes very high on the list.
"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."
You are comparing writing a operating system (Linux is monolith kernel, what is same as operating system) and multi-threaded banking app?
Coding a own operating system is not easy task. There is only a few people who have managed to do that. One of those are Linus Torvalds. And when comparing for GNU's own operating system, the Hurd microkernel is not even working well enough so it could be used in widely. Dont know does GNU have problems on the Hurd itself, or other OS components (OS modules) but Hurd is just a proof that GPL is not that what saves the operating system existing. Linus got something right on the Linux because it is now one of the most used operating system on the world. It powers different machines from cellphones to mainframes and usually people knows it from software systems like Ubuntu or Mandriva kinds because it is used as operating system on those.
Even that you have taken basic classes, you can help a lot on different projects. You do not need to write so much in first place a new code, more like a check the code and fix it.
what the fuck, were you high while writing this?
In the case that you wish to learn the family of C, Java, C# and C++, I suggest you to start with C and get acquainted with pointers. Try your best to understand dangling pointers and memory leak problems. Do dynamic memory allocation and try to avoid stated problems. Later, you'll see that Java and C# use dynamic memory allocation (implicitly) a lot. In this way, it may be useful to do a bit of Assembly to understand memory and addresses and how the memory works. I think, after that kinda training in C, you can understand references (in Java/C#) and garbage collection (which is done by JVM/CLR) better and write a better cost-effective program in Java/C# due to understanding GC an references. The above may apply to C++ as well, however, there is no (default) garbage collection in C++.
You can learn the syntax of a language that is similar to other languages you already know in a few days, sure. But understanding a new approach to programming (dynamic vs. static, procedural vs. OO vs. functional vs. whatever), understanding the idioms and subtleties of a language, and learning the details of the available libraries, takes months.
But knowing the language enough to fix bugs, implement algorithms, etc., should come to a good programmer in the matter of a week or two.
I've spent a substantial proportion of my career fixing the mess made by people who thought average programmers could be up to speed for that kind of work within a week or two, and another substantial proportion training those programmers afterwards until they were fit to operate autonomously, so I'm going to have to respectfully disagree with you on that one.
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
I feel what you're saying here... I was born in the very early 80s and wanted to go into IT... pretty much my entire life. Back then, if you could program and do some basic maintenance, you were essentially regarded as a computer guru in many places. That was great since I've enjoyed programming since about grade 5 on.
I self-taught QBasic and went back to understand GW-Basic well enough. In high school I took Prograph CPX (meh. visual flowchart language we had on the Macs there - only option for programming 20) and then the next year I got my first taste of C++ and was always enjoying it, getting high marks, and completing assignments before the next ones were even available.
I got into college, learned a bit of Java, C++, VB.NET, JavaScript, and Perl. ...but ultimately no one cares about any of that. I haven't been a professional programmer for 4+ years, so no one wants to hire me for it - they'll just outsource the low-level stuff. So now, I'm a technical support analyst - installing disk images on PCs, doing misc repairs and troubleshooting, phone support, etc. It's not the worst thing in the world, but it's certainly not the part of IT I've always been passionate about, and I have no intention of doing this forever. But... the world has changed a lot since I started my pursuit of the industry, and now I guess my skills are a dime a dozen.
I'm also trained at a basic level for things like database design and administration, network planning and configuration using various technologies and topologies, systems analysis and design, and project management - but realistically no one's going to hire someone straight into that with just a college diploma. The thing is I can't see any promotion paths leading up to that anymore either since you can't just be "the IT guy" and move up from there anymore. My coworkers in tech support variously have MCSEs, electrical engineering degrees, or even a decade or more of experience and they're not going anywhere either.
(I am now planning to self train and specialize on a growing niche field though to see if I can hop over to it. If not... it should be fun learning anyway! The problem is that everyone is a specialist now, and no one hires newbies in anything!)
I've *never* seen any decent Computer Science degree program allow someone to graduate with just three languages. Hell, I graduated from a College in Computer Programming and I learned a dozen or more (depending on your definition of programming language). Hell, I learned several on my own, some in industry. So, if you don't have the motivation to learn on your own and only do what is required by your program/job/etc, then you should just stop now and find a different discipline. Playing catch up only when you realise just what you've done wrong is the exact wrong approach. This isn't about learning to get a job and then stopping. It's about constantly learning regardless if your employer is funding it or not. Because, they *will* expect you to stay current. If you don't you'll /really/ be screwed when you have to find that next job.
As for what to learn, you can't really look at the current job openings and infer what the industry wants. That's just what it wants /now/ and even then, just who is posting job advertisements to where you are looking. It will look different by the time you learn what the industry wanted back then. It really is a moving target. Just don't try.
What you really want to do is show them that you are knowledgeable relative to your experience, a willingness to learn, capability and interest to do (at least) some independent learning, ability to work in a team or solo environment, etc, etc, etc. Since you are just a graduate, when hiring for an /entry level/ position, they're hardly going to expect you to know everything, or everything in depth. That's what training is for and the reason why it's called an *entry level position*.
I'd suggest starting an open-source project in something that interests you or contributing to one that is already established. Bugger language. Do it in a language that makes sense for the project. Languages are tools after all. One doesn't fit everything. A common mistake.
Now stop asking /. what you should learn and start doing it.
You want to learn all you can about programming in general and not get caught up in what lang you are learning. I have always thought of programming languages as tools for your tool box and each one can be used for what it is good for. Perl for text processing and gluing code together, ansi c for pure horse power (or assembly), etc. I would actually recommend you spend a good bit more time learning about how to collect requirements (use cases) and manage projects (mythical man month, etc) and write efficient algorithms (software patterns). You only really spend about 30% of your time writing code, if that, and most of your time collecting requirement or doing maintenance and bug fixes. People who can collect requirements, build a project that makes their Customers happy, and keep it running with minimal effort get paid the most in my experience.
Really. Focus on tuning your database knowledge a bit. Adding SQL and PL/SQL to your resume will certainly help. You likely won't find a job that doesn't expect some database proficiency. I don't disagree that having C#/.Net may be helpful. Of course that depends on the market in your area. But you should be able to find a job with the languages you already know. Finally, figure out a way to grow some experience. That's not easy, but doable with a little effort. Show that you are trying to utilize your newly learned skills. No employer is going to expect a new grad to be able to be fully productive. However we* do like to see grads that have tried to apply their skills in the real world, no matter how small an example.
*Since everyone adds a reason why you should listen to them, guess I will too. I'm the managing director over a software development group of about 120 people. Oh yeah, with about 15 years of industry experience.
- If we aren't supposed to eat animals, then why are they made out of meat? - Steven Wright
you'll be labeled as a fag by professional developers and you'll never land a good job. rightfully so too.
You can learn the syntax of a language that is similar to other languages you already know in a few days, sure. But understanding a new approach to programming (dynamic vs. static, procedural vs. OO vs. functional vs. whatever), understanding the idioms and subtleties of a language, and learning the details of the available libraries, takes months.
Agreed. I think I said so in my post.
I've spent a substantial proportion of my career fixing the mess made by people who thought average programmers could be up to speed for that kind of work within a week or two, and another substantial proportion training those programmers afterwards until they were fit to operate autonomously, so I'm going to have to respectfully disagree with you on that one.
Huh. So, how do you expect programmers to learn? Do they get experience by sitting near an old guy with a big beard? Not really. People learn by making mistakes. The take-home lesson is, don't assign a new programmer to a new project. Assign a senior programmer to a new project, and assign a couple of lackeys to the senior programmer. Ideally, the new programmers will be up and running in a couple of days, able to hack the basics, fix bugs, etc. With a senior programmer checking their work, the damage they can do is pretty limited. Of course, if the senior programmer is a jackass who just wants the code written, then the damage the team will do is unlimited.
I don't claim that average programmers can be fit to operate autonomously in a couple of weeks, but I do think that they can be fit to operate in a couple of days. Also... you never let a new hire thrash around, unchecked, on your codebase -- I don't care how many of decades of experience (s)he has in whatever. Or better yet, implement a peer review system -- every line is double-checked, or the code doesn't go in. This is how Sage has been operating for quite a while now, and we've probably stopped dozens of bugs in their tracks.
Specializing in a language is not the right way in my opinion. The real skill that is needed in the software industry is problem solving. After some years of experience and learning a different programming language on a monthly basis I found out that what really makes a good programmer is his or her ability to ABSTRACT from a programming language.
If I get a new task assigned, I don't think about which language I will use to code the solution. I just take in the problem, form a model in my mind (this is the most difficult part), create a solution and "output" the solution in the language desired by the one who assigned the task to me.
So focus on learning how to solve complicated programming problems in your mind, not so much on "outputting" the solution in a certain language.
Computers are good at solving problems, so learn how to solve problems and encode that methodology into computer languages. The language doesn't matter -- in fact you may find some problems are better suited to certain languages/concepts. I tell people that I program in JAFPL (Just Another [] Programming Language).
I'm actually a mining engineer who can do some programming. I regularly use mashups of MySQL, PHP, Java and web coding. I dismissed C and C++ as 'too tough' for the problems I wanted to solve, so found these easier languages that accomplished what I need.
When I hire programmers, new as older, I don't particular look after whether they know the language we're using. I try to find out whether they know how to PROGRAM, and even more importantly, whether they know how to test what they code!
A lot of people who 'know' a language still doesn't know how to program, meaning that while they may write a lot of code, it'll be difficult to transfer to others and hard to maintain. Even more people don't know how to test what they write, meaning what they deliver is prone to break when in a live situation.
As other people have said, don't be afraid to admit you don't know something, and use your first months in the job to learn how to program and test in a real-life environment. If you have a good boss, he'll recognise and value that.
I'll paraphrase what I said upthread:
Languages are easy. Once you understand what they do and have used a couple, writing programs in a new one should be a snap.
Libraries and codebases? Learning those is hard. That's where the work is, and knowing a major library that's applicable to your current problem is very often more helpful than knowing any language.
C, C++, and Java, for all their differences, are related languages.
Learn something entirely different.
Assembler is good. You don't need to know enough to actually be able to use it on the job as a primary language, but you should learn enough to give yourself a practical understanding of how data is manipulated by the computer. Just because modern programming tools hide this stuff, doesn't mean it isn't useful to understand it.
As far as high level languages go, you already know a procedural language(C), an Object Oriented language(Java), and a hybrid Proc./OO language(C++). Learn a functional language next. You may not ever use it in the real world, but exposing yourself to a new way of looking at problems can only help.
And learn SQL. Download Postgre or MySQL or some other free RDBMS and play around with it. Even if you never use it specifically, it gets you thinking about how to organize data effectively to solve a given problem.
If you are a real programmer, you will adapt.
But If you really need to fill that CV, do some SQL (PHP/MySQL is great for playing), some XML and some JavaScript.
I say take a different angle. You know at least three languages and that's good for entry level. To develop more commercial skills, learn to develop database applications (in whatever language you want). Databases are key in most commercial development.
Democracy Now! - your daily, uncensored, corporate-free
I ask that question because you will probably feel some pressure from them to write code they can understand. This might become an issue especially with C++ where templates can add a level of complexity they might not be willing to take on.
I mainly program embedded C so this is not an issue for me, but heard of projects where people were reluctant to use more arcane features of C++.
So if you want to go deep you can go really deep with C++. People have written Lisp interpreters on top of the template system, so go and knock yourselfs out.
However, you will not only have to provide lessons and tutorials to your colleagues but you will also have the problem of missing portability between compilers. You can even have this problem with C if you use the GNU extensions of gcc and have to port your code to some other compiler.
It seems that your programming language portfolio
is C heavy. I have often found it useful to combine my C code with some other language, i.e. write the signal processing part in C/Assembly and the GUI for the demo in TCL/TK, Matlab or Scilab.
This combination of fast C code and easy to use interpreter might be something you want to play with occasionally. My current combination is C and Guile. I hope I can stick to Scheme/Lisp somehow because there are a lot of options for scheme interpreters around. I remember compiling tinyscheme for a TigerSHARC, so it definitely is portable.
To sum it up, go as deep as you want but keep in mind that other people/compilers have to translate your code. Also find out whether there are languages that can make a part of your job much easier than the ones you already know.
Je me souviens.
It depends on what sector you want your career as a programmer to be in.
For engineering tasks, generally C/C++ are the languages to focus on. Java is a good all-around programming language which is heavily used in embedded systems as well as large scale clustered and mainframe systems.
For "business solutions" Java tends to lag behind VisualBASIC and C#, you will almost never see C/C++ being used in small to medium sized applications.
However if I may suggest; Not all computer programming University degrees include a solid education in processor and system programming fundamentals. It would be wise to grasp an understanding of instructions and registers as well as the stack in RAM if you are going to get into "involved" systems development.
That being said I must give you a warning; IT professionals have been abused at a much higher rate than average professions (not the most abused out there mind you). With the number of graduates in CS having tumbled, my prediction is that it will get better in the near future, but watch your backs, brothers and sisters.
Love, :P
AS A(n) anonymous coward
My advice, build a time machine, go back about 10 years and tell yourself to seriously hunker down and spend 2-3 hours every day learning how to program/actually programming. It won't really matter which one you use, as after having that much experience you'll pretty much understand how to apply your skills across to a new language with a much smaller learning curve.
Otherwise, if you have your heart set on banking, learn whatever they use on those systems. It's way too costly to switch to a new system for the financial industry as a whole, they can't afford the down time.
Getting trapped is a position people put themselves in. They get comfortable and then convince themselves that they can't move. It's all about risk and reward. If you want to do something else bad enough you'll do it. I've changed jobs several times and am currently doing java web dev. I've been there for several years and wouldn't say I'm trapped. It's up to the individual to keep training themselves in new things so that they aren't ever left feeling trapped. And then utilizing their new skills doing new things so they aren't trapped.
College text book training is nothing compared to real world experience.
Learn what you need to know to ultimately go our on your own and do your own thing.
A programming job will ease you into the commercial field if that is your desire. Best part, you will get paid to polish your skills.
I learned C & C++ many years ago. Don't use C at all, but C++ is good to know if App development in QT rings your bell.
I run my own business, not in programming. But I have the ability to build my own management apps in QT which gives me the geek jollies and custom apps for my use to boot.
Good luck
"Suppose you were an idiot...and suppose you were a member of Congress...but I repeat myself." Mark Twain
It's been trendy in the last 20 years to do C++.
I don't want to get into a language flame war here, but I would like to make a few points.
C is still very important in OS kernels and embedded systems. It is the Lingua Franca of such things and will probably be so for another 30 years.
There are those who know C++ to an intermediate level who think that as a consequence they also know C. Nothing could be further from the truth. They are completely different languages, but they share a common heritage.
C++ is object orientation, applied to C, done wrong.
That's not to say that C++ isn't important. It is, because of its widespread adoption. It is baroque, however.
Java takes a lot from Objective-C, although it has more of a C++ style syntax.
Learn C well. It is a small language, portable, ubiquitous and in demand. If you know C well, it will be easier to learn C++, Objective-C and Java.
FORTRAN is a bit different. If you learned BASIC on an early 80's 8-bit micro, FORTRAN will make sense, otherwise be prepared for a nervous breakdown.
You really should look at some of the Pascal family of languages (MODULA-2 for instance) to see some good ideas from the past and then Scheme to program in colour.
While you are expanding your mind you might also like to listen to musing on the Bohlen-Pierce scale. See my sig for details.
Stick Men
You need to learn some basic assembler - if only to become familiar with registers, integer, floating and mmu units, etc...
That's where we begin to understand hard limits like throughput, algorithm efficiency, and i/o.
I said no... but I missed and it came out yes.
Object oriented languages are also procedural languages, they're just an extension that organizes functions alongside objects and allows virtual dispatch. Just like object-oriented and generic are not mutually exclusive; they just describe different aspects of the language.
Don't pick programming languages based solely on what is popular or in-demand. That way lies complacency, boredom and stagnation.
C, C++ and Java are all pretty similar languages. Try a functional language like Lisp: it will stretch your mind and make you a better programmer. You should also try one of the modern scripting languages like Ruby or Python: they're fun on their own, and increasingly useful in the "real world".
Join an open-source project! That's the best way to get practical experience and show prospective employers that you've got both skills and motivation.
Finally, if you are not already intimately familiar with UNIX and the command line, learn it. Live it. Love it. Seriously, it's one of the most valuable skills a programmer can have outside of programming itself.
As an IT (and possible geek) you should look into the international language known as Love. ;P
Carbon based humanoid in training.
Depending on how low level you wish you go .. I would recommend getting atleast a fair grasp on assembly as well. you may NEVER commercially use it unless you're writing bootloaders, or just the bootstrap code for the kernel .. but it will help you greatly when you debug.
The best skill really to have is a deep knowledge of data structures and debugging for any given language. C is easier to debug (to some extent) than a C++ framework like MFC , etc. ..
In todays software world, you dont really need to write FANCY code as much as good robust and comatible code at the same time thats easy to maintain. What will get you further is if you are able to understand previously written fancy code and further improve it
all the very best
And do it. There's plenty of FOSS projects who could do with some help. When you've got a job to do, you'll get the idea of what tools to use.
Maybe it's kernel, maybe it's AJAX. Find the job and then find the tools. If you're any good, a new language will give you a week of pure panic followed by....oh, I get this....
My nightmare has been people who had deep, even obsessive, knowledge of X, X++ and Z-- and little ability to analyse the problem in the first place.
From PDP assembler to Javascript and Java, it's how to find the appropriate 'ammer, not being a pin-hammer specialist.
Except Cobol, of course. You're safe there.
Down with categorical imperatives
I'm a mid level developer and I can tell you honestly that throughout your career you will be required to learn more computer languages than you will know what to do with. This will be a necessary skill that you will need to be able to take on, and this wont stop.
What I do recommend is that you have a Good understanding of each language and Specialize in a chosen language/platform. But you will have to be willing and open to learn new languages otherwise you will only become stifled, pigeonholed and you will not be able to progress to a senior level.
In a job interview you will be looked at for your specialization but hired for your ability to learn other languages to a professional level.
I'll give a real world example.
At University I learnt: C++, Java.
In my 1st Job: C++, Perl, BASH scripting
In my 2nd Job: ASP 3.0, C#, .NET 2.0, ASP.NET, VB6, Javascript
In my 3rd Job: C#, .NET 3, F#, Ruby, Ruby On Rails, Java (inc Spring, Cocoon, Flowscript), AJAX ,Design Patterns (MVC, Strategy, Repository, Flyweight, Service Provider, Abstract Factory, Factory), Mocking Frameworks, Test Driven Design or Behavior Driven Development.
Each of these languages all have their pros and cons. They're all tools, a means to an end. A professional can learn a language in a matter of hours, mastery of course takes years.
The reason that you will NEED to be able to be adaptable to learn a new language is that everywhere you go you will need to deal with Legacy Software which will be written in a language you don't know.
The counterpoint to this is that Software Engineering is a long and difficult path, it is very much like studying to become a Doctor, only we don't have a governing body like the AMA.
As a graduate you will be equivalent to an Intern. You won't be picking up a scalpel until you get a few more years of assisting a Surgeon. Once you've completed your "Apprenticeship" you will be qualified to make architectural decisions.
This is a fundamental problem with our industry, however it can be extremely rewarding & fun if you can work with these issues. Never stop learning & never stop having fun.
Developing something high performance or low level is fun.
The rest is essentially COBOL. You may be using C#, Java, Visual Basic, PHP, Python... but you know it's just a fresh coat of paint on COBOL.
As alluded to in the OP, it really depends on where in industry you want to work. Just like in college where you had different classes for different CS topics, real-life does sort of match up to it.
What do you want to excel in and be able to call yourself an expert at?
- Databases?
- Operating Systems?
- Front-end UIs/Web?
- Back-end (data-processing?)?
- Gaming?
- Scientific simulation?
- System Automation?
- Robotics/Control systems?
- Finance?
- Hardware support?
- Programming Languages/Compilers?
Depending on which field you choose to follow, there will a different set of requirements for you to learn, languages included. Switching between any two fields above has only minimal transferable knowledge -- common languages being the sole exception.
Diamonds on Maglev, way beyond Ruby on Rails. Project schedules are no longer than 15 seconds; there are only three instructions to learn; and you never have to support your code because it gets refactored every 15 seconds. DoM uses Olympic gymnastic development, which is very agile, and drive-byes instead of scrums. Everybody carries heat, and no one speaks the same human language. There are always positions open because the average life of a team member is three drive-byes.
I think the fact that you've asked this question tells me a lot about how you see yourself and your job. As a developer you should be flexible enough to pick up *any* language and to choose the right tool for the right job. The principles of all of these languages are by and large the same. The syntax and libraries differ however (obviously), but to "specialise" would be to box yourself into a corner career-wise. Over the last 8 years I've worked with Visual Basic 6, VB.NET, C#, C++, Flash, Java, SQL and Perl. I've used ATL, MFC, .NET, ASP and a whole host of other libraries in order to get the job done. Specialisation = extinction in software development. Technology changes too fast so don't bet a life-time of earning on any single technology.
;).
The best advice I can give you is to concentrate on writing quality code - irrespective of the language you use. That means being clear and concise and using lots of whitespace and writing lots of comments
C++ (and C is a subset of C++ for practical purposes) vs Java choice amounts to the type of software you want to write.
C++ is used in the industry that has a box with a program as a final product e.g. companies like Adobe, Microsoft or EA are in this business. Vast majority of positions in there are for C++ programmers.
Java and similar systems (C#,VB) are for custom software industry. Employers there range from IT departments developing their in-house software to large consulting shops like Infosys, Satyam or Tata.
...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.
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.
No way. Really hard-core optimization, counting the pipeline stalls and functional unit slots, is certainly as you say. (but fun!) Regular assembly programming is not.
8088 assembly was good for 15 years, not counting the specialist role it holds today. i386 assembly looks like it will be good for a couple more years, giving it a full 2 decades of useful life. x86-64 will likely live on much longer because we got an extra 32 address lines (beyond what i386 had) rather than just an additional 16.
The transitions have been easy for assembly programmers. Somebody who started in the beginning with the original IBM PC could still have a career doing assembly for x86 hardware.
VM "assembly" has much more limited job potential and much more limited educational potential. You won't get a feel for the hardware by playing with VM assembly.
Nuff said.
Check the job listings around you or where you want to work. What skills are required for the jobs that sound the most enjoyable and/or pay the most? That should tell you.
I swear to God...I swear to God! That is NOT how you treat your human!
If you want to learn something that banks use, that would be COBOL, not FORTRAN. FORTRAN is used primarily in scientific applications while COBOL is used for business related apps.
the good ground has been paved over by suicidal maniacs
The question seems odd -- it's as if a carpenter asked whether she should specialize in the hammer, the saw, or the square.
Personally, I'd recommend learning to program in C, Lisp, and Smalltalk -- three different ways of thinking about programming -- Too bad SNOBOL seems to have disappeared -- it was even more different.
Of course, those will probably be dismissed as antiques, but they are widely available and have many modern derivatives.
If you learn C++ with a modern style, you're using things like auto_ptr, shared_ptr, and string.
You simply don't get comfortable dealing with plain char* strings, memory freeing, macros, function pointers, and thread synchronization. You fail to mark function prototypes as "static" because you assume the compiler will do this by default, so your functions leak into cross-file global scope and are less optimized. You fail to mark functions without parameters with "void", causing a C compiler to assume "..." (anything goes!) instead. You use stuff like strcpy instead of properly-computed memcpy, leading to buffer overflows.
I'm a CS student and I've been told going in to the industry you need to know the programming concepts very well. The language itself isn't that important.
I have heard there are people surviving with C.
C is a mere subset of C++. So you might as well cross C off the list.
Fortran is hopelessly obsolete - although it's certainly still used in a few niches.
You'd be certifiably crazy not to pick either C++ or Java.
Frankly - if you can get your head around C++, Java is a snap because it's little more than a C++ subset too.
The other thing you perhaps don't realise is that a halfway decent programmer can pick up a new language in a weekend - and be 100% comfortable in it in a month. I've totally lost count of how many languages I know...but a quick count says it's at least 30.
C++ or Java - you choose...but forget C and Fortran.
www.sjbaker.org
Let me start by saying that I think it's best to learn some fundamental concepts of programming that are mostly language independent. You should get comfortable with object oriented design and the design patters associated with it. You should get comfortable with relational databases (M$ SQL Server, Postgresql, mysql, Oracle, etc.). You should learn about threading so when you have to develop multi-threaded software you don't make a mess of things.
.net developer. I started out in a .net web development position using asp.net with C# as the server side language. C# is a lot like C, C++, and Java (more like Java than C++, but still). I definitely recommend learning C# as it is a very easy language to learn, and you'll be able to use some of the more complex features of it and the .net framework fairly easily. I also have 2 years of experience with Win32 C++ development and I can honestly say (IMHO) that Win32 C++ development shouldn't be something that you strive to learn as a new developer in the field. Other people may disagree with me intensely on this, but I think your time would be much better spent learning a higher-level language and the framework (if there is one) that it is part of (whether that is Java, C#, VB.net (*shudders*) ... pick your poison).
I have been programming for almost 4 years; primarily as a
Some advice:
An Oracle DB guy I worked with stressed the importance of knowing the size of the software project that you're working on. If you go into a project not really having a good grasp on the size of it and all the different systems that are working together, you're pretty much setting yourself up for failure (of some sort, to some degree). Basically you'll probably end up re-writing code because you didn't think of certain things before you starting coding. Related to his point and more important is ALWAYS take the time to come up with a plan, or a software design before you start actually working on and coding for a project.
Have fun!
For what it's worth:
I graduated in 1990 and immediately found work in C programming, which evolved into a C++ job around 1996. When I have looked around for work, Java seems to be much more "rapidly employable" than C++, but the few C++ jobs that are available tend to pay better.
Learning programming in the 80's, of course I started with BASIC, and Fortran was just a slight twist of phrase away... I still encounter Fortran occasionally, but it's pretty widely acknowledged (even by the people who still use it) as dinosaur speak. Any serious new development around me tries to get out of Fortran as quickly as possible.
Java was "the way of the future" in 2003, I'm not sure the future is here yet, and I'm not sure Java will ever "perform" on-par with C++. I program in Qt these days, and it is delivering the cross platform promise, in C++, as well as Java ever has.
If I were 20 again, I'd probably focus on Java, but, being where I am, I certainly have no regrets and don't think I'll give up my C++ unless I have to.
There is a bit of truth in the idea that premature optimization is bad, but only a bit.
In the beginning, you should stay away from hacks like duff's device. You shouldn't be manually optimizing the common integer operations. You probably shouldn't be averaging more than 1 goto per function. You shouldn't be using inline assembly.
None of this should be taken to mean that early design decisions can ignore performance. You're screwed if your early design is something like Python, one thread per object, short-lived objects being created and destroyed like crazy, and pretty much every function call involving SOAP/D-COM/CORBA/XML-RPC/whatever. When your design is fundamentally slow-ass shit, you'll spend the rest of your time desperately trying foul speed hacks to save yourself from the inevitable rewrite.
My most favorite programming language is Pascal.
Have any of the "Financial Institutions", now in "hot water", for "derivatives", Bonuses, and otherwise "money laundering", ever do their dB and arithmatic in reverse polish notation?
A sad, sad day, it is, for an arithmatican.
As a new grad you are not expected to know everything. You are, however, expected to learn as necessary to do the job.
...laura
Learning C thoroughly is like learning your scales in music--you can't create the most complex without knowing the simplest (I started with Pascal and have never regretted its influence on my C).
A good grounding in Standard C will help you spot errors and sketchy constructions more quickly, even as you come into contact with the object-oriented languages.
As you're getting familiar with the basics, make sure you also observe best practices regarding structuring, unit testing, commenting, and style.
If you're taken on as a new programmer in an organization of any size, you'll probably be assigned maintenance tasks fixing bugs. That means you'll also have the whole code base to study, if you need it. And don't think that you have to re-invent the wheel. You can find the algorithm for a bubble sort just by Googling. Look for programs that have solved a problem you face already. That's not cheating; that's programming.
Good luck and HTH.
In an interview here, that'd be an instant fail.
There is no magic pixie dust that will make your code secure. I can write secure code with strcpy, and insecure code with all those Microsoft-specific "secure" functions. You will be writing insecure code if you actually believe that those "secure" functions are good for anything.
Better: learn how to shut up Visual Studio's anti-competitive warnings. (hint: compiler option or pragma) Warning about "insecure" functions in order to market unportable interfaces is a new low.
Lots of C++ programmers use Eclipse as their IDE. If you like that, use it.
I suggest getting away from the IDE though. Real projects tend to be done from the command line with simple tools: make, vi or emacs, gcc, etc.
This is even somewhat true for Windows, possibly substituting cl (the cl.exe compiler that comes with Visual Studio) in place of gcc.
Projects are especially likely to be done this way if they involve numerous people, multiple platforms, developers in far-away locations, version control, or any other complicating factor. IDE project stuff can be nice for a personal project with a few files, but it just doesn't scale or handle the weird cases.
In any case, if this is about learning, you'll want to use the tools that the serious projects use.
Well, this is posted as "Anonymous Coward" just because I have no time now to create an account.
Many previous comments have the answer you need. At the end, you are the one are making your future, not me or any other person here.
In my more or less 15 years experience I can tell you that the language is not as important as the platform where you like to run your programs.
Do you like to make embedded systems to control machines? Maybe Assembly, C or C++ could be a good idea.
Do you like to be productive quickly on Microsoft's based platforms? Maybe C# is a good idea.
Your mind is around the goal of making once and using everywhere? Give an opportunity to Java.
In general I prefer C++ because I know what I'm doing exactly and the language provides me with Object Oriented characteristics, that in fact you also can have with C with some imagination. I dislike C# because I need to use a Tank to kill an ant and these types or platforms (yes, C# on .Net and Java are platforms) try to push you so hard in their direction, that they don't let you be creative enough.
To be honest. Give me a clean piece of hardware with an assembler and "enough time", to be happy. But in real life, we need to have food and to pay our accounts, so learn what you need to have a good job where you live and learn what you like to improve yourself in the computing knowledge, that will be useful for you in the future.
And, never, never, never, try to take as yours others work. All we were beginners sometime in the past, and learned constantly until now. Your employer understand this and you also need to have it clear in your mind. Don't try to force yourself to be an expert in one night, this is useless.
Good Luck :-)
Spend a few weeks or months travelling- see a different country, go to the beach, meet some nice girls who dont speak English.
Then come back and get some boring office job. Spend the next 5-10 years learning one or more programming languages- its not going to happen in a few weeks.
The specialisation that you seek will only come from gaining years of actual work experience. Any smart employee should see that you're smart enough to learn any language that they throw at you. After all, apart from the various strengths and weaknesses of different languages/platforms its just syntax. The real smarts is in solving business problems and identifying the assumptions that you make in your implementation rather than learning syntax.
I am acquainted with a large number of tech recruiters, and they are always yelling about how they can't find anyone who's versed in .NET. Disclaimer: I'm from the US, but I imagine the IT job market isn't drastically different on your side of the pond. Like it or lump it, Java coders are a dime a dozen, but you can find a niche doing .NET development (ASP, C#, &c.). Silverlight wouldn't be a bad thing to pick up. I'll probably get lots of flames from the anti-MS coterie, but that's the way things are.
As far as C and C++, plenty of FOSS projects use them, but most new business app dev is done in Java and .NET.
'He who has to break a thing to find out what it is, has left the path of wisdom.' -- Gandalf to Saruman
trying to specialise in C is actually specialising in nothing.
I would say do a couple of home projects or open source tools or games or something, in each,
and decide which you are more comfortable with.
The other thing to look at is with java experience you are more likely to use it in a range of web based technologies, and GUI applications.
Projects using C++ are more likely to be back-end stuff or low level stuff rather than front-end fluff (unless you're doing GUIs for winblows in visual studio). Which type of work are you more likely to be comfortable with.
If you want to be a good C++ developer you've got to learn to follow the rules and not do "bad things". Reading Scott Meyers effective C++ is a must.
In the longer term you should aim to have a good understanding of both - then you will appreciate java for the things it does for you and C++ for what it lets you do yourself.
Some time back Dough Bagley did an interesting project to compare the performance of all programming languages. You will learn a great deal if you try to refine and rewrite this project.
Credible
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.
What could be better?
You don't have to deal with some artsy "designer" who randomly decides to freshen up a GUI with random superficial changes. You don't have to spend your time converting messy financial law into messy computer code.
You probably get to control cool hardware, and might even get some in your office to play with. Your work might involve lasers, welding robots, elevator equipment, jet turbines, surgery robots, multi-ton telescopes, spacecraft, camera lenses, nuclear reactor cores, mesh networked landmines that can hop, implanted medical devices, traction control brake systems, UAVs...
If you actually want to be writing business craplets for some MBA who hates nerds and their technology, you can of course go that route. It probably isn't good for your sanity though.
I make heavy use of both C++ and C in my current job. If you're thinking of entering the linux market - I suggest you learn both user- and kernel-space which means C at the very least and C++ to compliment (for user-space).
The truth is, I knew both languages before getting the job - but not in depth and certainly knew nothing about Linux programming. Whatever job you get - you'll probably learn on the job. All you need to show is an aptitude for coding in the interview.
By the way, if you're interested in embedded work, linux kernel-space knowledge and C is the way forward these days.
If you're interested in Windows programming - stick with C# and .NET. I'm not sure c/C++ will get you anywhere these days unless you're looking for linux/embedded.
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 have studied in a UK university as well...I graduated with a CS degree from Birmingham University in 2008...I have learned several programming languages, and you are right, c++ and java were my favorite...I decided to make myself better in java, but guess what, i have found a job now, and its no where near programming...I work in a well known international IT firm in the consultancy department, and i decided to leave programming as a hobby...I am not great in programming, but learning new things everyday, even the smallest of things make me feel good...
Nobody expects a recent graduate to write a kernel or a banking app!
Very true. In addition, no one expects a recent graduate to produce highly professional work either.
I think you're asking the wrong question. The kinds of skills you need in the work place just aren't taught in school. It's a hands on sort of thing and you will be most successful if you are language agnostic. You should be comfortable with the idea of getting handed a program in such-and-such language and expected to do something useful with it, regardless of whether you have had much (if any) experience with such-and-such language before. Knuth's Art of Programming books are useful in this regard.
Make sure you know the fundamentals. Having a good ground in data structures and algorithms is vital. Logical thinking about how you go about attacking problems is another.
And a secret: If I was interviewing you for a position and you were to quote something from The Elements of Programming Style at me (and could demonstrate that you knew what you were talking about), I'd likely halt the interview and attempt to hire you on the spot.
I totally disagree with your other statements about C though. I'm sorry, it's not a dying language. There are lots and lots and lots of new, active C projects in FOSS and in business.
I think you're correct in a theoretical sort of way. C has succeeded in becoming The portable assembly language. It has succeeded in the world of ideas (OS implementation languages) as Microsoft has done in the market place - driven out all competition.
4GLs and things like Prolog never took off and it's sad that C++ and Java have so much current mindshare, but they are fads too.
Language-wise, only one, Dr. John McCarthy's LISP has withstood the test of time. For excellent reason. Syntactically, you can understand the rules in a matter of minutes. Practically, you can do complex things in a very small amount of code *and* it scales up.
I like to think of OO as the financial derivatives of the computer science world. Complex, sexy and dangerous as hell. When you get burned, you get really burned. But you sound like a genius when you're talking about it even when you're spewing nonsense[1].
For the long-term, I think we (on the functional programming side) will maintain our niche until everyone else sees how right we are. We're patient.
[1] See the Perl man pages perltoot(1), perltooc(1).
After responding to some postings in this thread I think I'm better of to answer directly ;D
A lot of people on /. repeat themselves in suggesting C. I really don't understand why. Sure, since we have ANSI C, we can consider C a programming language. However keep in mind: C is nothing more than a portable macro assembler!!! That is not my opinion, but this was the design goal of Dennise Richy and Brian Kernighan.
If your goal is to make low level system programming like kernels or device drivers, then C is surely right to learn. If you are interested in embedded systems, then again C is the right thing.
However: C is not a beginners programming language. If you don't have fun to work / participate in existing FOSS projects, it makes no sense at all to continue learning C on your own. It is very time consuming, you will have a hard time to learn from your mistakes. And you will have to do lots of work to understand how to make it portable, how to make the build (makefiles etc.) portable, how to test your code etc.
If you write software in C you are using 50% of your brain power and your time with making the problem fit into the C world and with avoiding to shoot your self into the foot. So you only have 50% left to actually work on the problem!!
Making a flyby at your FORTRAN suggestion: nope, don't do that. See below why!
C++: if C++ had a standard UI library and similar standards in its API/library/frameworks like C# and Java I would strongly recommend C++ as language of choice. In the beginning it might feel complex, e.g. because of templates. However it is a difference if you just use the templates one has written for you (like using the boost numeric library instead of FORTRAN, or lie using the stl) or wether you want to write your own templates.
In fact templates are not really hard and nothing magically, they become a bit hard to maintain if you use lots of specializations and try your first steps in meta programming. Bottom line, if C++ had an API / library background like Java, and probably would compile to JBC and would run on a VM, I would say: it is the best and most interesting language we have.
However C++ has lots of drawbacks: You need to read "The Design and Evolution of C++", and you have to understand really everything in that book. As long as you don't do that you will write absolutely obscure bugs that often only are found by code reviews. Also you have all drawbacks you have with C. Writing an application in C++ on a Linux machine, and then only trying to compile it under Windows or on a Mac is hard work in itself. But: instead of learning FORTRAN rather dig into C++ and learn to use the boost library.
If you are programming in C++ the first years you are again wasting about 50% of your time and brain power, just as I mentioned for C above. But you will be able to reduce this to probably 10% over a 10 years period.
Finally: if you want to continue working in one of the languages you already have mentioned: take Java. The number of libraries and the number of other languages like Python, Groovy, Scala that run on the JVM is incredible. To round your computer and programming experience you should work with unit testing (JUnit or what I prefer: TestNG) if you you really dig into .Net (what I not recommend) you have similar frameworks there (NUnit e.g.) Also you should probably consider learning about the Spring Framework or OSGI or consider to write an Eclipse PlugIn.
In contrast to C/C++ the build (compiling, testing, bundeling and deployment) of Java is on all platforms basically the same.
So said this, partly as response to other posts, partly addressing your words, I would suggest you focus on that what you like more!! If you really want to dig deep into C ... why not! Just do it.
OTOH if you like to broaden your skills, then learn languages like Lisp, Prolog, SmallTalk and ML. For all exist implementations that run on
Cost free eBook I read (by iBook/Kobo/Amazon/ObookO/Gutenberg etc.): "The Green Odyssey" by Philip Jose Farmer.
http://www.catb.org/~esr/faqs/hacker-howto.html
For lifetime job security, in a large, conservative organization
one word
COBOL
C and C++ are great languages, but 90% of programming positions need you to write can be done much faster and cleaner in C# or Java. C and C++ for grabbing stuff from databases is like using a bazooka to kill a roach.
Learn assembly to understand what is going on on the chip when code is being processed. Learn C++ to understand how the OS fits together. Learn VB because dumb ass 'programmers' who don't have comp sci degrees will write reams of code in this language, and you will end up having to fix them when they don't work properly.
(Yeah, I'm bitter. But I have yet to meet a programmer who works in VB willingly who doesn't suck...)
HA! I just wasted some of your bandwidth with a frivolous sig!
If you are thinking of a computer science degree as a job/language training programme, you've missed the whole point entirely.
Any real computer science graduate should have learned the basics of all computer programming theory, and thus be able to pick up the basics of any language within a couple weeks. If you only focus on the language you happen to use at work all day, you're missing out on a world of understanding.
To that end I recommend the following language that won't necessarily get you a job, but will make you better at your job:
* lisp
* haskell
* python
* C++
* C
When what you'll likely be using is
* C++ (C with classes subset) / Java / C# (they're basically the same language under different names)
Computer science is not about programming. If your CS education taught you mostly programming, then it's a failure. Programming languages change all the time, but the underlying concepts do not. You should know how to design algorithms and prove them correct; create robust, scalable systems; know algorithmic approaches to many common problems; design and implement programming languages; etc. If you want a software engineering job, you should be able to learn whatever language you need there.
During my CS studies at a UK university, we covered:
year 1: Pascal, Perl, Assembly language (MC68008 and NS32016)
year 2: C, an ML-family functional language, Prolog, LISP (very briefly), SQL, FLEX, Bison
year 3: C++, MATLAB, and an obscure language designed specifically for concurrent programming tasks with language-level support for semaphores, monitors, critical sections, synchronous message passing and asynchronous message passing
Most of us also learned Java, although this was not part of the official curriculum.
Are you really saying that the curriculum has been so condensed that you didn't touch any of this stuff?
Depends on *what* you want to program.
I do embedded electronics, and C is by far *the* need to master language.
What, no Lisp? Just kidding. But seriously, Java has an interesting advantage: it's starting to benefit a lot from being open. On the same platform you can already program in Javascript, Ruby, Python, plus Scala and (my favorite) Clojure. And more to come.
And btw, you want to move away from older languages. What this whole generation of script-like languages has in common is that all of them are better then c/c++/java/c#.
As a recent grad, most companies will have some system for getting you "commercialised" and, so long as you are reasonably comfortable with their language, then you will be ok. Frankly as long as you know an OO language and some PHP, you could just pick up a book on any langauge, do some "Hello World" type programs and be ready.
The things you should really learn though are the tools. Especially if you're going into a Microsoft shop. Visual Studio is a massive IDE and it will do much of your work for you, but only if you know how to ask it.
The other thing you must know is some database. It could be any DB, from MySQL to Oracle, but again, know those tools.
Finally, and this is just an interview point. Get certified! As most companies will ask you to do some sort of programming test, you'll need to prep, and getting certified is a good way to do it. Equally though, don't boast about it on your Resume / CV, because it will make you look like your trying to cover up some other shortcoming.
Today's top software is not that much about perfect implementation. It's about software design. The big popular programs (actually even the text editors) are complex and the good software design is way more important that the implementation according the established design. So, you better specialize programming in certain scope, rather than certain language. The language is a derivative to the design. For an example - if you like low level programming (drivers, kernels, embedded systems), then you should learn C and some assembler very well. If you like programming desktop apps - C and C++ (maybe also Python). If administration is your passion, then specialize in Bash, Perl and C. To be a successful web developer you need to master HTML, Java Script, PHP... You got what I'm trying to say.
Knowing how to cobble together an efficient toolchain from shellscripting, Makefiles, aap/scons, cgi-scripts, doxygen, some Python will make you a much more productive programmer than the typical Eclipse expert user that is unable to do anything when there's no Eclipse plugin for a certain task.
The command line rules for pretty much any kind of automatic testing, building and deployment, but the large majority of IT professionals these days seem to be unaware of this.
Bart
The market being the way it is today, learning PHP well and doing some work in Drupal and another framework like CakePHP or Symfony will count for a lot. It will show knowledge in relational database modeling as well as programming in PHP, which is not as unsexy as hardcore programmers will tell you. Add some experience of Linux and Apache administration, and you've got yourself the silver-est bullet in the market. You'll be able to deploy networked database applications rapidly given nothing else but a computer and an internet connection.
Of course, learning something that compiles better like C#,C,C++ and Java is not a bad idea, either. The only problem is that you would end up spending more time learning at home, the same time that could've been spent working in a real shop solving real problems. In the end, a good carpenter is not the one who can use the best tool or a variety of tools, but one who can build you a strong and good looking table using as little materials and time, and asking as few questions as possible (I recommend reading A Message to Garcia). I think the carpenter rule applies to programming as well. Most people don't care what language you make software in, as long as it is stable, functional, usable and does its job effectively. PHP allows you to hit these targets relatively quickly, so, I recommend it.
If you'd like to learn a language that has high unmet demand for programmers and lands you in a relatively secure job doing cool stuff, I suggest you learn Lisp. If you 'master' Lisp, you can learn Scheme, Lua, Haskell, OCaml, or almost any other language with relative ease. But, note that the Lisp track is lengthier and will keep you at home jobless longer than Linux, Apache, MySQL and PHP.
Another useful idea is to start your own Open Source project or work with an ongoing one. Employers look at it favorably, the chicks dig it, and you contribute directly to the sum total of human intelligence. You also get to keep your hair long, your armpits smelly, and can get away with keeping non-keyboard human interaction to a minimum.
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
PHP sucks for real object-oriented programming, I would agree. OOP was bolted on to that language as an afterthought and it is a sad compromise between its legacy heritage and the modern world. But I have seen too much horribly written PHP code, written by lazy programmers who couldn't spell OOP if it were printed out for them in front of their eyes! Yet it's great for rapid turnaround, something essential in today's "here today, gone the next" World-Wide-Web.
Not everything merits being compiled. Today's computers are so fast that it can run many of these scripting languages faster than older processors could run compiled C code. Overhead of memory and CPU cycles are the cost for fast turnaround. But today, it doesn't matter unless you are writing something truly compute intensive.
Having said that, I will state that web programming today is a complete mess of things. You need to know too much to do it effectively. You need to know CSS, HTML, PHP/Python/Ruby, and SQL, of course. There are many frameworks to ease some of this, but then frameworks comes with its own baggage, and you get locked in big time, and can be a pain if the framework does not do what you want.
Then there's the consummate hell of making sure your results looks good on not only all the browsers in use, but all the major versions of each browser, all of which treats CSS and HTML in subtly different ways.
OH, and then there's Javascript. Don't even get me started there. And to be truly "Web 2.0", you need AJAX...
Then there's scability issues that your chosen framework may make easy or make a pain in the butt.
But you'd rather go tech support than web developer? Think carefully now. Do you REALLY want to deal with idiot users who can't figure out out to turn on their computers all day long? You must have a VERY strong constitution...
Ruby Neural Evolution of Augmenting Topologies
is right.
By the way, I work in a mayor Swiss private bank. There's a lot of Java and Perl code to write. But if you can do C well, you can do whatever.
Oracle PL/SQL is very used also, and it's developers are very well paid.
dear aremstar,
As some others have said, it is important to have a general knowledge of programming. The best thing you can do for yourself is learn languages whose syntax is foreign to you. Since you know C++ already, you could look at a piece of C# code and have a rough idea of what it does. Can you say the same of a functional programming language like lisp? Not so much.
Spend a little time with languages like lisp, ruby, gnu make, objective-c, and maybe a little assembly. Explore some newer areas like NVIDIA's CUDA and Cg languages.
Don't worry about being a jedi knight at a single language. There is an old saying about this: "Don't put all your eggs in one basket." :) Good luck.
Some programming language can be popular, because it's useful; that is not necessarily always the case, though. Java may be popular because of its portability, for example. Java as a language may or may not be as good as its popularity could indicate - although you certainly can do plenty of stuff with it. Not write a gadget driver, though.
One can compare programming languages with human languages. If you learn one Indo-European language, it's easier to learn another, and the learning curve is less steep with each new language. The same seems to be true with programming languages. On a side note vis-Ã-vis human language, remember that for certain NATO-affiliated services, Arabic speakers are in huge demand. True, they don't get rich and work in an awful environment, but employment prospects are good.
I bring up the human language comparison, because it seems people become emotionally attached to their "own" languages in programming, too. But after all, what is important, is that you can perform tasks that need to be done, while keeping costs manageable. Your boss won't necessarily care which tool you use, as long as it isn't too expensive in licensing cost or labor.
It could be helpful to consider the implications of the economy. Organizations may not be able to upgrade hardware and proprietary licenses as frequently as they're used to, so in the near future demand for people, who can do more with existing resources, will probably increase. I could see FOSS becoming stronger in this environment.
Every problem has a solution that is simple, easy and wrong. Selling our Liberty for a little Security is a much too de
Hi, the language doesn't matter very much. If I was you I'd try to take a look at cwjobs or jobserve. You'll notice that 90% of jobs are:
- ASP.NET with C# development
- JSP (with a good amount of hibernate, struts or JSF).
- C# and winforms stock exchange application development (if you're in london).
Now I tell you, if you know Java and C++ it will take you 10 days to learn C#, but that would be nothing. This is because it's all about frameworks, libraries. Decide, carefully, which sector you'd like to work in, then take a peek at the Graduate job postings. Remember that lot's of companies are offering for graduates with no experience and they mean to invest time on them. Maybe it could be a good choice to pick up one that does MORE than one thing, so you'll have a chance to see what the work of a professional programmer is like. I tell you this because I was very confused moving from University to actual work and things like kernel implementation, mpeg video encoders and other fancy stuff are really NICHE jobs, like 0.5% of all offers. They are fun indeed, but they will force you to be less free, I mean you'll have to move to catch good ones, while other stuff like asp or jsp are the most common and you'll find them whenever you are. I'm not saying what you should pick, I'm just saying inform yourself very well, because real-world is veeeeery different from university and slashdot.
bye, man.
Interesting reply. That actually sounds cool. However, not every job is in Finance. I myself have worked in: a variety of businesses that had hard-core computing needs. It has all been Java. I have never worked in finance, a fact I'm so glad of now as that industry tanks. Though some of the applications you described sounded cool, you're not addressing the agony that goes with things like tracking down memory leaks and playing with pointers and all the other fun stuff you get to do with C. Sure, it's fun writing stuff that runs fast and does an esoteric job. However, I believe I am a more efficient programmer in Java and that I am able to tell those MBAs "Yes, it's done" much easier with less fighting with stupid crap like I described above that happens when programming in C. I feel like a more effective developer in Java because a minimum of time is spent language-hogwash.
I'm currently trying to find a job as well. What I've found out is that more important than actual knowledge is the ability to learn a language on the fly as well as being able to effectively Google your problems. C is a great background and is the basis for many languages. Now market yourself as being able to learn whatever the employer needs you to know quickly. That is a better skill.
Depends on what you want:
- Games: learn C++
- Webapps/inhouse apps: learn Java or C# (easier for webapps)
- Science: Matlab or maybe Fortran (and get a related degree)
But mostly you just need practice.. start your carreer.. do some projects.. soon you'll know what to brush up on and if necessary what to study when /if you get back to school.
Don't get overly invested in just one or two languages. You don't want to just be "another journeyman C++ programmer" in 5 years but you want to be someone who can solve problems and get results with a computer in any language.
In other words need to know the basic concepts of scripting, procedural programming, object oriented programming and functional programming and be able to learn the new models for the 21st century. You need to know about data structures, interface design, etc. But the tools you use can, and should, change over time.
When I started programming over 40 years ago Pascal, Assembler (on mainframes), CLISTS, jCL and modular programming were the newest things. I was constantly learning new languages over the years. Often they were very specific to a given device or environment and unlike anything I had studied before. You need to think about what it is you want to get by studying a language.
If you just want to learn new skills, now I would recommend a functional language like OCAML. On the other hand, if your objective is just to make money and have job security learn ABAP/4 for SAP.
But in either case, expect to learn something new tomorrow. If you have the fundamental concepts down you'll easily adapt and find each successive language comes easier; if not you'll get dead ended and have a career writing the same program over and over.
If you learn the fundamental skills and concepts then you should be able to pick up any language in a short time. The more flexibility you have the better.
"Intelligence is like four wheel drive, it gets you stuck in more remote places" --Garrison Kiellor
Choosing a path is tough. If you're going to be a PROGRAMMER, not someone who does it until they can move into management, you can go with "high professional" and "low professional". A high pro is one that learns a difficult skill very well and gets paid high wages. It's very difficult to find those jobs though. A low pro is one that knows the language dujour and can get a job anyplace. The salaries aren't high though. A high pro knows something really esoteric, assembler, C, or C++. A low pro knows Java or Microsoft managed languages. In assembler you can do what ever you like but you must do it right or you fail. Managed languages garbage collect so you don't have to, etc. To some extent you may change over your lifetime or your understanding of life may change. You may find once you have what you desired it's not really what you thought it would be. Good luck
-- Programming with boost is like building a house with lego. It's a cool but I wouldn't want to live in it
I'm a final-year Computer Science student from the UK. During my studies, we covered 3 programming languages: C, C++ and Java.
seriously? those were the only 3 languages you studied? i'm a third year and we've already studied java, c++, lisp, ml, prolog, erlang, perl, ruby, verilog, mips.
Absolutely correct. You should know the language well enough to maintain code written by hotdogs, but don't get carried away with all the weird features. You just don't need all that fluff to get code that is usable, accurate, fast, and maintainable. Leave your ego at the door.
No sig? Sigh...
If I had a chance to turn the clock backwards when I left grad school to look for a job, I would have accepted a job as a C++ instead of chasing the Java dream during the dot-com era. I've been unemployed for 3 months, and if I had at least a year of working experience in C or C++, I would be employed and making much more money now.
But that was then, this is the now, so I'll keep my suggestions generic:
In addition to learning C, C++ and Java (but learning their fundamentals really well), learn C# and get proficient with Unix tools (vi, awk, sed, perl, make). If you don't have access to a Linux/Unix box, install the cygwin stuff on your PC.
On the four languages mentioned above, get really good at (or at least acquainted with) multithreading, resource allocation and de-allocation, error logging, sockets. It is horrendously surprising how bad Java programmers tend to be. I've made a living rewriting f-horrible Java code that tanks because the retards that wrote them don't know they need to close connection pools or avoid creating a kazillion objects that bring the gc to its knees under heavy load.
Never assume you have infinite memory, CPU or shit like that. This applies to any platform you wish to pursue.
Since my experience is with Java, if you were to go that way, I'd suggest you immediately train for the Sun Certified Java Programmer (SCJP) exam.
People are going to say that certs don't mean anything, and they are usually right. But you need to stand out as a green horn, plus the certs help you verify if you really know what you think you know.
Then pursue the SCJWCD (Web Components) and SCJBCD (Business Components) certs - leave the certs for web services and enterprise architecture for later. These three certs will truly prepare you to talk intelligently about the J2EE stack - obviously this will only work if you are a decent programmer. You might have only the basics of programming, but there are principles by which you can abide and be a good programmer.
Then learn the basics of the Spring Framework, Hibernate and iBatis. This is pretty much the training path I would suggest for anyone trying to get into the Java market with some solid footing. Webucator.com has e-learning classes that you can take at your leasure in basic web services, ejb components and J2EE architecture, for $100 each course. Now with the new EJB 3.x being available, now it's a good time to really learn J2EE (which wasn't the case with the monstrosities that were EJB 1.x and EJB 2.x.) There are different vendors that provide professional training in 5-day long seminars that cost between $2 and $4 (training ain't cheap, but it's a good way to go.)
If you don't feel like working towards those certs (which I think it will be a shame), then get 'EJB 3 In Action', 'Head First Servlets & JSP' and 'Spring Recipes'. Take 3 months to learn that stuff inside out, download WebLogic and JBoss and learn how to configure those containers, and how to deploy stuff. Learn how to use log4j (this is very important!), Maven and Ant.
You could also go the C# way - there are more jobs in C# than Java, but they pay less. And also, don't ever be dogmatic or fall for religious wars. A tool is a tool, and to be honest, C# and .NET are not bad technically speaking. I prefer to work on non-MS platforms, but I'm not a dogmatic idiot - don't be one of those.
For the C# platform, Microsoft has a series of free training lessons available, all laid out according to the specialization path you wish to follow:
http://msdn.microsoft.com/en-us/beginner/bb308760.aspx
Then aim to get a MSCT or two from them.
For C or C++ I can't say anything. I had my chance when fresh out of college. If you get a chance to get a junior position, get it, even if you don't have a clue. Just do it and go the extra mil
Start with C or C++. K&R is always a handy starting reference. Learning a typed language I believe is harder than something like C#, VB or Java but that is just me. You will never become an expert at any language and you really should not try to. If you are really good you actually learn how to learn languages rather well. If you want to do kernel and driver work like you hinted at then you will need C. Most kernels do not support OO so C++ and managed languages are out for the most part. You can still use C++ for then in some cases you just can't use certain parts of the language like OO.
FORTRAN( C =0; C++; Java(Cobol)) GoTo Reboot;
You won't get language proficiency by studying, you'll get it from working. You're not going to be expected to be best-in-class in an entry-level position; what's more important is your general problem solving ability and your ability to find answers to questions on your own.
In most parts of the software industry, it's actually more important that you be able to rapidly acquire new competencies (new APIs, architectures, languages) and be able to use them effectively than that you be super-proficient in a single competency.
I agree with previous posts with its not what you know, but how to do it.
If you know how to program WELL, it's easy to pick up difference languages as you need them. That's why I always suggest C++ as a first language because once you can code well in it, its easy to pick other languages.
You want your code to be:
a) easily updateable and organized
b) usefully commented
c) have error checks (you have no idea how often I've come across code that never checks what the user is doing)
d) use KISS (keep it simple stupid) - if you use a rare command because it works beautifully, comment the stupid thing!
If your looking for good languages to have, these are my suggestions. (no particular order)
1) C++/C
Good solid language, especially if your writing something for Windows
2) Python
I use this for writing daemons in Linux
3) Bash/Batch
Good for creating patch scripts if you a SysAdmin
4) Perl/CGI
Not as popular but good to have, more secure than PHP
5) PHP/MySQL/HTML/Javascript
I loath Javascript with a passion but it's very popular with employers right now.
6) Java/C#
I'm not currently on the C# bandwagon, but it does seem popular with employers. Java is, while bloated, it quick to write in and multiplatform.
I tend to not mention it, but yeah I use joe now. I switched from emacs because my Turbo Pascal origins were calling to me. We're not alone. Alan Cox (the UK Linux hacker) uses joe.
Recent versions of joe will do syntax coloring. Most Linux distributions enable it by default. The backtick problem is fixed too, so you can now paste a shell script into joe and not have it mangled.
For avoiding bugs, I suggest using valgrind (excellent, though C++ names get crazy complicated when printed out in full) and lots of compiler warning options. Most beginners use neither, and suffer horribly as a result. Be sure to compile with either -O2 or -Os (letter "O") because many warnings depend on analysis done by the optimizer.
For C you might use:
-Wall -W -Wshadow -Wstrict-prototypes -Wmissing-prototypes -O2
Don't forget to run valgrind **every** time you suspect a problem or want to ship something. The tool is amazing.
actually there is an objective-c compiler in the gnu compiler collection (gcc). And the openstep project uses objc for its applications and libraries. Openstep applications run on any Unix and in most cases these applications also compile on Mac OS X, because the API is compatible.
Okay, Objective-C does work with Linux as well as OS X. Can it be used for Windows though?
Falcon
Should there be a Law?
No one hiring someone right out of school expects an "expert" in a language. Back in the mid-nineties, I was working for Ameritech (a Baby Bell), and did the technical part of the interview for programmers for all five teams under my director. One of my std. questions for right-out-of-school was to ask them what the largest program they'd worked on was. My range was 500, 1000, 5000 lines.... Consider that my manager there asked me how many lines our systems were, and a dumb linecount - wc -l - told us a quarter *million* lines.
If your manager's any good, you'll be doing maintenance and then enhancement of existing code.
On the other hand... I love the folks saying that C's good. I have over 10 years of it, and have been looking since last Sept (I'm currently on a three-month contract as an admin), and have seen almost *zero* C (unless you're either a kernel hacker or write embedded) (and I've been looking in Chicago, DC, Philly, the Bay Area, Portland, and Seattle). I'm wondering where all the maintenance and enhancement on all the code we wrote in the nineties is....
mark
Learn how to:
1) Be a Quality Assurance Engineer - ie: Bug Squasher
2) Be a whiz at using a variety of source control systems (CVS, SVN, SourceSafe, BitKeeper)
3) Learn how to write great documentation
These 3 skills will make you stand out amongst the crowd of new graduates.
You won't get to be a lead developer you're first time out (rarely) so plan on being a support developer (#1), the kind who cleans up and tests the code the more senior people write. To do this you'll need to know (#2) and to stand out within that group of employees you can use (#3).
Then when it's time for a review you will have proven that you are a good team member, you can write good clean code and that you fully understand the code that you've written.
An employer can't ask for anything more and you should get promoted to a junior developer position.
A fool throws a stone into a well and a thousand sages can not remove it.
"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."
Why is that a problem? If you're working for an MS shop as most businesses are then that's actually an advantage, MS technology bonds with other MS technology much better and much more cleanly for the most part.
"I would recommend that any SlashDot reader go with Java or C++ over C# because they are better documented"
News to me, got an evidence of this? I suppose there could be more documentation out there simply because they've been around longer, but better? in what way?
"more standards compliant"
Okay now you've really lost me, what standards are we talking about exactly? C# is a standard in itself, separate from the .NET framework and CLR. It also has better support for different character sets than most other languages too so it's hard to understand where you're coming from if that's what you're referring to.
"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)."
C# and the .NET framework wasn't designed with the goal of being cross platform, it was designed to make building quality Windows platform based apps quickly and securely and it achieves that very well.
In fact, comparing languages like C#, Java and C++ directly like that is not something a good programmer would do. You use the best tool for the job, if you're using Java to write a Windows only app where potability isn't a requirement then you're wasting your time when you could get it done more quickly and easily in C# and .NET. If you're writing an app. that should run across many different platforms that wont be inconvenienced by the JVM (i.e. does it need direct hardware access?) then Java is the best choice. If you need direct hardware access and the maximum possible performance you can squeeze out the system in question then use C++.
But anyway, the original suggest here for C# was a good one. It's a language that's easy to use (and much harder to break things with than C++), it's still powerful, and it seems to get more job ad listings than any other language in the UK. So for a first time graduate, it's probably the best choice out there. The only C++ jobs I see start around £40k a year and are not jobs the guy asking the question has a chance in hell of getting. Java has some junior developer roles but much fewer than C#, there's also often higher wages to be found for C# developers at entry level too for some reason - possibly because they're so in demand right now.
One final point of course is that C#, using Visual Studio, is simply a pleasure to develop for more so than say Java with Eclipse or Netbeans, although the latter two are improving rapidly nowadays at least and really aren't far behind!
As long as you actually enjoy programming and want to do it long term you'll explore other languages yourself, whilst gaining experience on OOD/OOP quickly and easily using C# as well as learning the other issues that developers face. Developing is about more than just a language as you state and there's no reason all of that can't be learnt well in C#. A good programmer will be able to move language with ease eventually when they feel they're read anyway, but you're just shooting yourself in the foot to focus on anything other than the language which has the best starting wages and is easiest to start out in without harming your learning prospects initially and that language really is C# right now. A C# developer should get £30k to £35k p/a real quick here which isn't too shabby a wage for someone with only a year or two of experience.
I wouldn't focus on ANY language. I'd focus on the OTHER things that go with being a good programmer. Good programmers aren't necessarily smarter than bad programmers. Most often, they just have better habits. Buy a copy of "Code Complete" by Steve McConnell and study it. DO WHAT HE SAYS TO DO.
2. Learn the Tools
Learn and use Git (preferably) or Subversion with every project you work on. Most projects don't happen in isolation or without screw-ups, so don't pretend otherwise. Learn to take advantage of a good text editor. You'll be using it for a while, you may as well know it thoroughly.
3. Diversify
Diversify your portfolio a little. Learn a couple of scripting languages, like Python and Ruby. Haskell and Erlang might come in handy, too. Learn why.
4. Practice
There's no substitute for experience. So, take a given pet "project" (one that you're familiar with what it should do) and implement it multiple times, using a different language each time. By doing this, you'll learn why certain languages may be better suited for certain projects. Join an open source project of a tool that you use and enjoy.
5. Profit :-)
Because they aren't pure functional ones. And they "support" procedural programming, in the sense that they use procedural semantics.
I know tobacco is bad for you, so I smoke weed with crack.
Right, so I'm gonna be a bit of a dick and say if you have to specialize in one of those languages, go with C++. If you know C++, you'll have the skills to quickly pick up Java and C#. Picking up C from C++, I'm not so sure, but at least you'll be kind of used to most of the syntax.
Don't use Java as your primary specialized language, because you get to be a lazy ass with memory management. Migrating from Java to C++ takes a bit more effort. The hardest thing about Java is knowing what does what, and that's not exactly hard.
But honestly, fuck only sticking to any language. Just learn to bloody well think about what you're doing and figure out what's the best language for the job you're trying to do. Proper problem solving is what you want to do, the language chosen is a purely implementation detail.
Whatever you do, make sure you get a /. account with a username you'd be proud for your employer to see when they come by and see you hardly working!
The best golfer doesn't use all the clubs to win a match, just the ones he needs.
The best projects don't use all the features of the programming language, just the ones they need.
One thing is learning about concepts and how they are implemented in different programming languages.
Another thing is to learn everything about a language. That's a waste, because no language is perfect, which is the same as saying that all languages have pitfalls.
Obligatory Edsger Dijkstra quote:
"Computer science is no more about computers than astronomy is about telescopes."
was learn as many programming languages as possible until one of them led to a job.
It happened to be Visual BASIC, but I learned COBOL, Ada, FORTRAN, 8086 Assembly, JCL/JECL, Turbo Pascal, GW-BASIC, Quick BASIC, Visual BASIC, C language, and a few others.
Back in the good old days of a Computer Science degree we used to be able to create our own operating system. But modern times they don't get that complex. You are most likely lucky enough to learn data structures and how to call an OS API call.
What I would suggest, is that you visit http://www.uglist.org/ or do a Google search for "YourCity YourState User Groups" and replace YourCity with the City you live in and YourState with the State you live in. Join up a few user groups and they will be free to join and you can learn the "complex" things by going to meetings and listening to lectures and networking with other Comp Sci Students and programmers and maybe a few managers that might help you get leads to jobs.
Ask for an entry level job that provides on the job training. You will most likely get a "Mentor" or a more experienced programmer teach you some complex tricks of the trade. I myself have had a few mentors in my life, and it is a good thing to have. I've also developed my own style of programming and debugging and documentations that I could write a book on and sell it to final year Comp Sci students. :)
Remember, Slashdot does not have a -1 disagree moderation, and no, troll, flamebait, and overrated are not substitutes.
One can always get a job. Follow your heart.
Well I admit, I had not had the chance to read all the responses, so forgive me if this is a repeat thought. I also recently graduated and had been out in "the real world" for about year now. My current job is actually nothing that was covered thru by my four years of school. From what I have been able to see is sell you problem solving ability. Languages (at least at a basic level) are the easy part, good solving is the hard part.
There is usually going to be someone to help you anyway, because chances are rare that you have learned anything about the business of whatever your job will be, and that's what the experts are for... just my 2 cents, hope it's at least worth the pixels it's printed on..