What Skills Should Undergrads Have? 587
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?"
Personal finances and Confidence are the two (Score:5, Interesting)
Second is confidence. Confidence in the skills you do have an ability to gain new ones. Have confidence in interviews especially. Confidence enough to demand more sometimes, too. Confidence directly addresses your questions of how to make yourself more employable.
The skills you need and success in life should follow those two. Actual skills programming have less to do with you getting employed than you may think.
I wouldn't worry about the job aspect. (Score:2, Interesting)
Learn the low level things. (Score:3, Interesting)
Also, linux or some type of posix-based system. C and Linux go together nicely, and most things for linux are written in C. Get out of the IDE environments as well - they're good tools, but they're tools that should be used after you're comfortable elsewhere. I suggest learning and using vim.
Few people these days in an engineering organization have a good understanding of filesystems and underlying technologies. Someone capable of identifying and handling performance issues in applications are highly valued. Linux and C will force you to learn these things. Do GPL work, join some linux kernel lists - even watching these lists for purely curiosity reasons gives you an excellent method of peer review and gives you a good understanding of how development SHOULD work in an organization, even though it doesn't often happen that way.
Self Taught... (Score:2, Interesting)
A few projects good for ANY programmer! (Score:4, Interesting)
I really feel it is best to concentrate in core subjects during college. It is trite, but nobody cares if you know high level language X, be it Java, Python, Ruby, etc. This will change. Knowing how to program, that is a skill that will never go out of date.
I do most of my programming in a very scientific environment, which requires MATLAB for "quick and dirty" computations, but I have also written elaborate C programs when needed for speed (up to 15 times as fast as interpreted MATLAB code despite the claims of optimizations.)
If I were you, I would learn C in and out, through and through. It will guarantee you skills that you will use for the rest of your life, and you will never be an idiot. The way to best do this is to write moderate sized programs in C. I would take as many high level courses in the college environment as possible, preferably one on Operating Systems, which are some of the most complex programming environments and concepts that you will be exposed to. If you are truly into CS theory, then high level mathematics courses are favorable.
What to program, you ask? Why, the standard lot. Here are some of the coding projects we were given in college.
Hello, World (just kidding.)
The game of life.
The game of animals (teaching navigation of link lists, etc.)
Make a program that plays Connect 4 against you. (basic algorithmic concepts, basic "AI")
Make the above program graphical, for fun (GUI / display concepts).
Write a program that implements the Zip algorithm (Huffman encoding -- not as hard as you'd think.)
If these are too basic for you in C, then I'd try to understand a bit of the linux kernel, or get involved in an open source project. Good luck!
Student's Perspective (Score:2, Interesting)
Re:Learn the low level things. (Score:2, Interesting)
From a strictly job-search prospective, I must also sadly say that ASP/.NET experience seems to be in reasonably high demand, but job and internship postings typically also include *nix experience and C programming.
Re:Don't overlook people skills (Score:3, Interesting)
Social life is important, yes, but after a year of this I was so far ahead of my fellow students that while the course was really hurting for them, I was having the time of my life, and I ended up actually teaching a first year course whilst in my third year.
If you just study what's in the lectures, you'll be, at best, as good as everyone else in that classroom. If you read around the topics and hack code at night, you'll get your head above everyone else when it comes to the job market.
Each of my friends who socialized more than they studied ended up with mediocre to normal degrees. Those who spent a lot of their free time studying and (more importantly perhaps), hacking code for fun, got good degrees, and very nice jobs almost to a man/woman. Not me, I ended up in a four year PHD course, so I have yet to see a fiscal return for my work.
My views may be extreme, but it is possible to go out a bit less, and benefit a great deal from extra study time.
Re:Don't overlook people skills (Score:2, Interesting)
The trainees with good people skills do much better in the field than those without. In fact, the few engineers I've trained with very little technical knowledge are doing quite a bit better than those with highly technical backgrounds because they have better interpersonal abilities.
My suggestion is to take plenty of social classes that emphasize speech, writing, psychology, and even drama.
Re:Don't overlook people skills (Score:5, Interesting)
1) Remember names!
2) Be genuinely interested in other people. Everyone has something interesting about them. Figure out what it is and then let them talk about it. Remember, whoever talks most in a conversation is generally going to think it was a good conversation.
Re:If you want to be a developer (Score:3, Interesting)
College doesn't teach you everything you need to know in the workplace. I'm a Mechanical engineer and I work for a big company that makes big mechanical things. I don't know anyone that's sat down and actually done a FE (finite element analysis) by hand. We have tools, but you also have to know the concepts behind it.
I'm a 'bastard ME' as I'm actually in Mechatronics. (I took a liking to Matlab and went that path). I had some classes in building robots and I had those on my resume. I also had some completely unrelated experience. I found a job that I love. But in no way did any of those fully prepare me for what I needed to know, for example:
I know Matlab, PHP, C, C++ and some Assembly. Mangers and other engineers still love Excel and Powerpoint to view data. I had to learn VB. I didn't have VB on my resume, but given that I knew some different languages my boss knew I wouldn't have a problem picking those up. I'm now learning how to interface Powerpoint with Matlab via ActiveX so that we can get some plots automatically generated. Again, I learned none of this in college. I don't even know if we had classes on it. But I knew the basics (for, if, while) and I learned to adapt that to other languages. I'm sure it's not prefect, but it gets me high ratings and it gets the job done.
Re:Repeat after me... (Score:3, Interesting)
Keep in mind that computer science is essentially a branch of discrete mathematics. The skills you learn in the undergraduate curriculum are useful to a multitude of fields. It's not just a degree in "computers" as some people seem to think. For example, a good friend of mine did his undergraduate in CS, then got an MBA. He now works for a consulting firm that optimizes business hierarchies for multi billion dollar corporations.
Re:You should be good (Score:5, Interesting)
If you want to do "business" programming: inventory, payroll, CRM, SCM, vertical apps in a variety of fields, than by all means learn Java. But it's your business skills that will make you stand out, and as these jobs are largely outsourced, you very much need the people skills to work as a consultant, or manage consultants. If your problem domain is business operations, you had better understand how a business operates.
If you want to do "embedded" or "realtime" programming, again the low-level details are important, but I caution you that these jobs pay significantly less than infrastructure jobs (despite often being harder). Also, non-realtime embedded programming is shrinking as a field, as the cost of hardware needed to run a full Linux or BSD OS install goes down every year. The world will always need realtime programmers, however.
If you want to do "games" programming, I have no idea what skills you'll need, but you'll be paid crap and worked until you burn out and quit the industry, so do you *really* want to write games?
Re:Don't overlook people skills (Score:4, Interesting)
You're right about smiling, also look them in the eye.
And while we're adding more items to the list, Chris Rock had a good one on how to make women happy. Just ask "How was your day?" I first did this with random girls I met as a joke, but then realized how right he was when he said that that one question can lead to a 45 minute conversation. I wasn't even aware that much 'stuff' could happen in one persons day lol...
It's easy (Score:3, Interesting)
1a. Communicate well. If you're sounding like an illiterate teenager (in person, e-mail, it doesn't matter) that's what people will think you are. Maybe it won't be kewl and l337 to your peers, but the old people that write the paychecks seem to like it. If you're working internationally at least be functional in the language. Being in a meeting while natives are jabbering away right in front of your clueless face is not fun. The look on their faces once they discover you understood all the foolish American remarks and offer to buy them a beer is priceless.
2. Always be able to articulate the value you add to whatever you're working on. Currency value is best since even the dumbest managers are keen on money. Understanding the business need behind the technology will help.
3. Choose a technology that's interesting to you and that you like to work with. It doesn't matter if it isn't in the top 5 in last week's Network World. Even if it pays less than the skill-o-the-day. Nothing sucks the joy out of life more than a job that you hate. You'll also find that your natural enthusiasm for whatever it is you decide to be good at adds to the credibility you get from 1 and 1a.
Re:Requirements lacking in most graduates (Score:3, Interesting)
Re:You should be good (Score:5, Interesting)
However many of these devices are starting to resemble more "traditional" computing platforms. They run a full OS, have virtual memory support, FPUs, etc. However one thing they do have in common is that they run on a limited set of hardware, and often have strict memory, performance, and power constraints. The skill set does not really need to include knowing more than basic ASM programming (if you used SPIM in a computer architecture class you should be okay). You need to know the fundamentals of computer architecture, and a class on OS is very important (you must understand some of the different memory models etc).
But, as a CS student, your job is not to know the details. Your job is not to know the languages and the tools, your job is to learn the algorithms, to learn the thought processes, to learn how to design. What tools you know how to use aren't very relevant, and will change over the next couple years anyhow. Being adaptable, and knowing the fundamentals, and having strong problem solving skills is far more important. The rest will come. Any company that won't hire you because you don't know their specific languages and tools is either not looking for a student out of college, or is looking for an IT monkey to write code for them. If they don't want a CS student, beware, as the job is likely quite boring anyhow.
Phil
Re:Learn the low level things. (Score:1, Interesting)
Re:You should be good (Score:2, Interesting)
But even discounting the higher level languages, we've had a horrible time finding anyone with anywhere near the skills we'd need. And we're in Irvine, CA... theoretically one of the tech centers in SoCal.
I'd actually think this field would be growing _because_ the harddware costs are getting lower, and it's becoming easier to just put Linux on everything.