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?"
First s learning personal finances will give you an edge on nearly every other student graduating. Know how to balance your finances, plan, budget, etc.
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.
Yes there are alot of those jobs, but many of them will take a skilled programmer of any kind even if they do not have the specific experience in the toolset. With that being said, i believe it is more important to focus on some aspect that you really enjoy more than what you think will make money, especially out of college the better programmers are the ones who did it because they enjoyed it not because they are tailoring their skill set to a particular part of the nerd market.
C is definitely a starting point - you need not concentrate on ASM (since C is effectively macro assembler), but get used to memory management and handling basic structures. The functional flow and practices that you learn through requirement in C becomes hugely relevant in higher level languages.
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.
.
You're really going to have to teach yourself. Remember the college only prepares you with the basics. If you want to really impress your potential future employers you really need to know the stuff cold. You can't expect some over-paid college prof regurgitating text from a book to properly teach you anything. Join a group, network and get ideas from other people.
It depends on what type of job you want, and how good you want to be. Really, it does, and the answer is not simple.
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!
Slashdotter, ID #101. UIDs are in binary, right?
I live in a place where the computer industry is doing well, and programmers seem to be in high demand, admittedly. But I'm also a Jr. in CS right now, and here's what I've observed so far between my own job experience and those of my other friends in school: Find something you enjoy and do it well. One of my friends got into ASP and C# real heavy, and is now the lead dev of a team working on his university's intranet. I'm very detail oriented, and got a job documenting an undocumented system, for which now I'm pretty much the sole dev type person around here, and I don't think they would dare to fire me, even though my school schedule's a pain in the butt. The point is, there is such a plethora of work available, you won't know ahead of time what you need. You just need to get all the experience in _something_ that you can. You'll find a way to use it, somewhere, sometime. If you learn it, they [jobs] will come? Good luck!
I spent every free evening I had as an undergraduate working till late at night teaching myself the subjects we were learning, and spent every reading week studying. To the extent that a lecturer who caught me in the otherwise empty lab at night told me to get out and get drunk like a normal student.
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.
I wholeheartedly second this. I've trained a number of implementation engineers in the past couple of years, so I've seen firsthand the difference a this makes.
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.
True, but you can boil the book down to 2 basic things (that I've found anyways).
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.
Volunteer, Get involved in 'hands on' classes. Volunteer with FIRST (If canada has it) or at other local high schools teaching kids something. Or take a course where the result isn't just a grade. I took a grad level course my senior year to help get me more knowledgeable with robots. I was asked more questions about how my robot worked on interviews than "Oh I see you know 50 programming languages."
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.
Of course it totally depends on what you want to be doing. I got my undergrad last December, and have been working on as a security engineer since last may. At school we did data structures in c++, operating systems in c, and compilers in java. I am sure that gave me a pretty solid base, but it is not how I got my job (I never let my schooling interfere with my education). I have one of the few jobs where knowing a ridiculous amount of languages is actually useful. For me, knowing how to calculate data flow in a multitude of languages is more important than familiarity with implementing specific solutions.
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.
If you want to do "infrastructure" programming, such as OS development, language development, clustering, virtualization, storage, etc, it's vital that you learn C and C++, and have a firm understaning of pointers and recursion, data strustures and algorithms. In my experience most jobs in this broad area are still done in-house. Your job will be particularly uninteresting to a non-geek, but pay well. If your problem domain is the computer itself, you had better understand every layer you work with down to assembly.
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?
Socialism: a lie told by totalitarians and believed by fools.
I like the 'yes' thing.
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...
1. Learn the art of bullshit. Become an expert at appearing you know what's going on even when your completely clueless. Keep in mind that this isn't just about bluffing or attempting to do something you aren't qualified for. It's all about appearance. If you look and act like you know what you're doing, 99% of the time most people will believe you. Instant credibility. Speaking of appearance, bathing at least daily and dressing like a real business person will make the bosses swoon and your peers hate your guts. You get real good at it, you will be able to spot another, less adept bullshitter a mile away.
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.
About communication, I agree wholeheartedly. I spent last semester as a TA at JHU. Admittedly it was in a non-comp sci field, but nevertheless I had to grade some pretty atrocious essays and exams from freshmen and sophomores. I found it shocking that kids could get into a top tier university without knowing how to write an essay. I gave each a page of comments, and almost all would start off with: number your pages, don't use the first person in academic writing, don't use contractions in formal writing, proofread to catch typos, etc. The second paragraph would go over organizational issues, e.g. not having a thesis until five pages into their ten page paper, not explaining how paragraphs of evidence support their argument, and so on. A lot of the exams read more like diagrams (especially from the engineering students) than essays.
The Rise and Fall of Online Community
Remember one thing though, there are a fairly limited number of "infrastructure programmer" positions around, whereas embedded systems programming is HUGE. The future of computing (and much of its past) is not in the box that sits on your desk, or the laptop that you carry. The future is embedded devices. Cellphones, cars, ipods, HDTVs, game consoles, media players, planes, controls, smart appliances, everything. The majority of computers are embedded, and this trend is only accelerating.
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
I'm doing non-realtime embedded work it my current company and my previous one. And I can say that we definitely would like strong C and networking skills, with some hardware familiarity. Some ability to comprehend other discipilines like SQL, PHP, HTML, etc. are also starting to be important in this field as everything's starting to incorporate web pages and web-based configuration.
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.