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?
-
I am assuming you mean graduating from a university?– Michael ShawNov 27, 2010 at 10:03
-
1@Ptolemy: In the States the term college is correct.– MacneilNov 27, 2010 at 16:08
-
1A will to kick oneself in the arse and unlearn text-message speak, you young punks! socializedpr.com/…– JobNov 27, 2010 at 16:27
7 Answers
By far, I would say an eagerness to learn. College isn't really intended to give you the skills you need to become a programmer. It's intended to teach you the skills you need to learn those skills.
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.
-
These are all useful. However, almost zero university graduates have them, and they're not critical, as most are easily acquired in the workplace. I think you were answering a different question.– dbkkNov 27, 2010 at 18:04
-
@dbkk - I beg your pardon, but the question was not "what skills graduating programmers have" but "what ... should have". Also, no, they are not easily acquired. Quite the opposite - more often than not, people with years of experience are still missing most of them.– RookNov 27, 2010 at 18:33
-
1These are general skills, and many aren't real suitable for learning at school. Nov 28, 2010 at 3:11
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.
-
4Because what people are taught is computer science, not software engineering. This problem would go away if universities and students realized that computer science != software engineering, computer science is a science, computer science is not about programming, and software engineering is about more than programming.– Thomas Owens ♦Nov 27, 2010 at 15:14
-
-1. Learning how things work under the hood (compilers, OS's, assembly language, etc.) is important even if you never actually work at this level, because you will face leaky abstractions at some point.– dsimchaFeb 24, 2011 at 3:59
-
@dsimcha, if you believe that, you have a very narrow view of what kinds of software engineers are being employed by companies right now in the real world. It's not that those things don't add any value - it's the opportunity cost of not teaching something more essential.– NicoleFeb 24, 2011 at 4:02