What Skills Should Undergrads Have?
kramed8 writes "As a student myself, after reading the recent 'Slam' article on Java I really began to be concerned with the path of my education. I am currently attending a small Canadian University as a 3rd year Computer Science and Business student set to graduate next year. What seems to have troubled me from reading the article and user comments is that I do not feel as confident as I want to be in C, ASM and other related low-level programming topics. I was taught C++ in my introductory courses, with subsequent classes using C# or Java. My education has not been particularly difficult or time consuming to get good grades, so I have spent my free time dabbling in topics and languages that interest me (ie Multiple GUI Toolkits, Python, Linux). How can I spend my free time in the next year to prepare to enter the work place with a proper toolbox of skills? From what I have been told, there are more jobs for Java and Data Warehouse development teams compared to lower-level programmers. As an undergrad, what skills should I be trying to attain now to further my employability in the future?"
If you can afford the 'free time' see if you can apply for any internships at different large companies. Or see if a smaller one would take the chance with you interning with them. The price is right for them, and you get to tail someone who's more experienced in the field.
You can also look up some open source projects that need assistance (there are many of them that do) and see where you can help on them. Open source projects are a great way to get experience and critiquing your own skills.
You can also learn these three words:
"Hello. Geek Squad."
There are no loopholes. It's either legal or it's not.
I'll wholeheartedly second everything Tritonman says here. You don't have to become a low-level master to be a good programmer, but a basic working knowledge of C and C++ is the key to understanding the majority of languages you'll face later (including ones that do not yet exist). Assembly teaches you why software is laid out the way it is, as that's what all compilers must eventually boil down to in one way or another. You don't need to be able to compose a serious tool in Assembly - you don't even have to know how to write anything useful in it. However, knowing the basics will give you a more solid framework for all later programming skills you tackle.
However, here is another piece of advice. You'll hear many advising you to maintain a wide array of general skills, and they're absolutely right. On the other hand, I've been a programmer for about a decade, as well as an administrator (win and unix), graphic artist, management, and a wide array of other job descriptions - each of which I am well above average in, but none of which I specialize in (though my resume paints me as primarily a programmer). I'm well versed in more languages than anyone I know (including assembly language for four different chipsets), and I'm at least somewhat experienced in an even greater number. I'm able to easily install, configure, troubleshoot, and often hack many different operating systems. I'm also known at my job for being able to pick up almost any skill quickly, as-needed (such as studying for a CCNA, my most recent hobby) - I'm the resident fix-it-all here, especially when the task requires knowledge that none of us have at the time, or would normally require experts from a number of different areas. I have a range of experience that, in my line of work, is more comparable to the 50-something old-school techies that are inevitably found in this industry, than it is to my peers (who are in their late 20's and early 30's, have some range, but are usually unfamiliar with subjects outside their specific skill set).
I'm not bragging though, and here's why.
For all my wide range of skills, I've found I have been valued less in the corporate world than those more limited specialists. True, I can complete projects that normally take a whole team to do - and often faster. True, I've shown time and time again that I can find solutions and create software that even our better-paid experts haven't been able to seriously attempt. That doesn't matter, though, because as an accomplished generalist at a (large and growing company) I've found myself sidelined over and over, forced into a job of very limited scope that is filled with specialists (in ASP.Net in this case) who I now have to compete with (in the one area I was always weakest at - web design). I've had the empty pleasure of seeing my old tasks pulled away, one by one, so they can be moved into specialist departments (with the end result apparently being the same quality of work, but requiring a much larger work force). This wasn't due to overload (I can automate almost anyone out of a job) or poor work on my part, but simply a matter of corporate architecture. All of these skills I have, all of these years of experience, are now going utterly to waste, not because I have an inflated ego and believe myself to good for my present task, but because all I can do now is advise others on how to do the jobs I used to do, while I perform a now-monotonous role where quantity of output is the only way you're judged. That sort of thing, though, doesn't attract much attention or pay. If only I'd spent more time on one of those many subjects, mastering it more completely, because total mastery over one subject is eventually more useful than significant proficiency in many subjects.
The long and short of it is... expand your horizons. Learn new skills, and maintain the habit of studying, even long after you're out of school. Grow and adapt, and become at least marginally familiar with as many areas of technology as possible, because th
Do not confuse "Freedom of Choice" with "Free Will".