Thursday, May 20, 2010

What skills are worth learning for a programming career and/or resume?

What skills are worth learning for a programming career and/or resume?
What skills, languages, tools, etc. would you suggest someone interested in a career in programming learn?

The things I look for when reviewing a resume are:

SCM (Subversion, CVS, Git, Perforce, etc)
Unit Testing (JUnit, JMock, etc)
Issue Tracking (Bugzilla, Mantis, etc)
A diverse set of languages (Java, Lisp, Ruby, PHP, etc)
I think having these basic skill sets lets you know that the potential employee has been around the block a few times. As with all things in an interview, make sure you ask follow up questions because resumes are not always the whole story.

Failure: and this is a big one. If you do not like to fail, then do not start your future in programming. I fail over and over every day. You write some code, compile, fail. Repeat that process until you get it to compile. Then you run your program, fail. Repeat the cycle until it compiles again and then re-test the software.
Problem Solving: programming is all about solving problems. All of those failures that I mentioned in item 1 above... you have to find solutions to each failure. Every programming task you work on will be a set of problems which need to be overcome.
Coding Style and Documentation: Work on this from the very beginning. Other programmers will love working with you if they can a) read your code and b) figure out what it is supposed to do. Not only that, but adhering to good coding style and best practices will often prevent a bunch of mistakes and hard to find bugs in your programs.
Finally, don't be caught up on what language is the hottest or not. Learn a language and learn it well. Learn to solve problems. Learn the concepts of programming. After that it's all semantics.
Here is some further reading material from Alex Iskold which is very good:

Top 10 Concepts That Every Software Engineer Should Know

Learn to write well in the native language of your company (for me that's English). This will help with all the other skills you want (including resume writing!). That includes bug reporting, writing and reading specs and requirements, asking questions, commenting code and any report writing or paperwork you may need to do. In an indirect way, it may also help your coding.

This is important: learn to be concise. Remove all unnecessary words in your writing.

Also, learn to ask questions and seek help, especially in areas that are new to you. If you dither for an hour, that's an hour lost. And that's a shame when it can be prevented.

Here are my top few suggestions:

1) Make sure you know how you learn. Do you prefer examples, abstract concepts, learning visually or orally, etc. Chances are you will likely have to learn some technology over your career and this may make it much easier.

2) Understand some basics of software development: Testing, basic data structures like stacks and queues, as well as a methodology or two like Waterfall or Agile, would be another key point.

3) Find your market. Do you like web development, games, databases, neural networks, numerical analysis, embedded systems, mobile devices, scripting or something else? There are lots of different areas one can focus which I'd suggest finding which you'd like to specialize in on as few programmers are good at all of these.

4) Know how to investigate a problem and solve it. This skill may require some work but it can be useful when given a problem that can be solved many ways where some may work better than others. This is also how to get through the part of a job interview where you have a whiteboard and you're asked something that may seem fairly simple that turns out was given vaguely enough to test how well you communicate or do you just assume things that may or may not be true in a hypothetical case.
Here are some basic starting areas:

Common Programming Patterns (MVC, Bridge, Observer)
Languages: ASP.NET, PHP
IDE: Eclipse, Visual Studio
Regular Expressions
Unit Testing: nANT, NUnit, JUnit

Get involved with open source projects. This can give you experience with teamwork, source control, and coding standards.

Look for local user groups in your area you can attend. Showing an interest in participating in the community will show your enthusiasm.

Be prepared to answer questions about everything you mention on your resume. Try to have some real world examples you can speak off about the technologies you mention. Just learning the facts about a technology will not show that you can apply the knowledge.

The book "The Pragmatic Programmer" has a great section on that! If you haven't read it, I would highly suggest that you do. Basically though, stay current with technology. Try and learn a new language every year. Beware of adapting bleeding edge technology. And try many different tools. Don't become too reliant on one technology, cause it might not be the right technology for the job or project.


No comments: