We had a guest lecturer at our school he went on a tangent regarding those graduating and not being upto the skill level he expects ie. knowledge of one big-time compiled languague like Java, C++ or C#, one scripting language like Python or Ruby, one web framework. What are some other skills that you guys think should be absolutely critical to graduating student?
New graduates need more than just a desire to learn, they need an obsession of learning, an understanding of how to learn, and a firm grounding in the realities of software. I generally don't care what languages you know, but every junior must:
Understand history. Computer science is a well researched field, with many solved problems. Knowing this fact opens the door to learning from what's come before you. Even knowing that there is a rich history to mine knowledge from is more than many graduates grok. This includes things like big-O notation, history of algorithms, principles of the prophets (Knuth, K&R, Hofstdater, etc.), and commonly accepted practices and patterns.
Know that it can be solved. I am always surprised when a developer is stumped by a problem. Part of learning to learn is the simple principle that problems are easily soluble, always. Once you know this, it frames your thinking for finding a sane answer.
Understand decomposition. Not only can problems be solved, but the path to doing so is as simple as divide and conquer. Reduce a problem down to simpler components, and your answer will always present itself.
Know how to measure. In addition to being able to decompose problems, new developers need to know how to gather facts about these problems. How long? How large? How fast? How many? Simple facts are a step to understanding and objective thinking. Making assumptions without facts is an easy way to get lost in the problem space.
Be objective. All problems can be decomposed, measured, and understood simply. The problems that can't be understood simply merely require additional decomposition, measurement, and understanding. There is no use in getting angry or frustrated, nor is it productive to argue about theories or place blame. Any irrational behavior or belief related to the process of solving problems is poison, making solutions very difficult to find.
Prefer patterns and principles. You will encounter dozens of right ways to do things, languages, programming models, computer architectures, and even engineering methods. There is no single right way, but there are solid underlying concepts that you can apply over and over again. Learn to see these patterns, as they will guide your learning and thinking every step of the way.
As an employer, I will only employ people as programmers who:
- Have experience of single stepping through code.
- Can select an appropriate design patern to solve a simple specific problem.
- Can implement code that reflects their chosen design patern.
In my experience, less than 5% of computer science graduates applying for programming jobs actually have these skills, at a basic level. These are the minimum skills that are needed to be commercially useful, and importantly, not everyone is capable of learning these skills.
Other nice to haves are:
- Experience of working on a team project
- Use of source control
- Experience of Unit testing
These make their integration with the existing development team easier, but are subjects that can normally be taught on the job.
I had once a team I "inherited" with mostly newly graduated staff and I had my experience that those who did real programming "next" to there study (to earn some extra money) were the most capable team members. Hence experience is the key and it does only little matter what language.
However if you look what recruiters are looking for (at all the common recruiter sites like jobserver.com etc.) it is interesting to observe that there is a lot being asked for the C++, C#, Java but also there are others looked for and also "exotic" things like COBOL is still around.
- Interpersonal and communication skills
- Pragmatic approach (not that academical theory)
- Ability to think as a client who is not technically-inclined
- Ability to evaluate what's important/and what can be disregarded, in terms costs/benefits
- Ability to work in a team
- Ability to think strategically: architecture, extensibiliy, scalability
- Openness to accept that university teachings have little to do with the real world (depends on university - some fare better on this).
Learning process in this profession never ends. One must constantly learn and improve himself, otherwise, he "flunks out" of the game real fast.
The other answers are good, but I would say the #1 overlooked skill in university seems to be actual software engineering.
The basic classes to teach OOP and a language like Java are great, but in the 3rd and 4th year why are students (at least at my local university) writing compilers and operating systems instead of learning how to identify and create a good architecture, how to dissect requirements and create from that a list of technical specifications, and perhaps most importantly, what the difference is between good code that works and bad code that works.
It's like our universities almost want to churn out coders instead of software engineers. I would never hire somebody who didn't display some skill/talent in engineering.