Saturday 22 December 2012

What Should a Programmer Learn?

I've come across a few kinds of thinking when it comes to hiring developers:

It seems that most, especially agents, try to look for very specific skills.  I remember speaking frankly to a recruiter and telling them, "Well, you're going to have a very difficult job finding the person you're looking for."  And they agree'd...  They had been looking for a while, and hadn't found anyone yet, even though they were offering a very high salary.  They were looking for a .NET developer who had five years experience in building Metastorm BPM solutions.  The idea sounded a bit unrealistic to me.

On the other extreme, I once received a phone call from a company trying to get an ASP.NET developer.  At the time I hadn't had any experience in ASP.NET, but they didn't seem too worried and invited me to come for the interview regardless.  I also spoke to a friend of mine recently, who told me that their company has a policy that they don't hire people for specific skills, but rather look for good, smart, experienced programmers who they can train to do the job.

The third kind of thinking is a hiring within the specific industry or type of work.  This kind of thinking makes it very difficult for a good programmer to get into the favourite industries, like game development.

On the positive side, seeing as different companies hire for different reasons, it may be possible to get into one company where a similar company would reject you for not being in the right blood group, or having the wrong star sign, or something equally ridiculous.





So, let me start with what I think is the most important:

What to learn to become an amazing programmer, regardless of the specific skill or industry.

The basic skills required for a junior programmer usually include some object oriented programming language, the ability to create a relational database, and SQL.  If you can afford it, the best way to learn these is probably to go to university.

The next thing you'll probably want to learn is design patterns.  You can either look up the most common design patterns on the internet, or read a design pattern book, such as Design patterns : elements of reusable object-oriented software or Design Patterns For Dummies.  Code Complete is a famous book which teaches how to write quality code, but it's quite old, so there may be a more up to date book.  There are also books on patterns for specific areas of software development, so you could get a book specifically about design patterns in ASP.NET for example.

If you look at job descriptions, you may find three letters which pop up in almost every advert: "TDD."  Once you have a good knowledge of the basics of programming, you need to learn Test Driven Development.  It may seem strange, but I would go as far as to say that if I ran a company, I would expect all of my developers to either have read a book on TDD before they're hired, or I would insist that they read one as soon as they start.  If you're a C# developer, I would recommend Wrox's Professional Test Driven Development with C#.

Test driven development is not as simple as writing tests before doing the development, but is rather a comprehensive method of developing extremely high quality code, including design patterns, best practices, dependency injection, refactoring, unit testing, integration testing and mocking; knowledge and understanding that every programmer should have.

There is some debate about TDD, although for me it's like this:  If you're developing something extremely simple for your own use, you don't need to worry about TDD.  If you're developing a complex banking application that processes billions of pounds, you absolutely must use TDD.  Everything in between requires the programmer's knowledge and experience with TDD in order to make the right decision.

You should know about DDD (Domain Driven Design), and ensure you understand principles like SOLID, YAGNI and DRY.  Depending on the type of development you're going to be doing, you may also wish to look into document databases (e.g. MongoDB).  Modern distributed applications might use micro services, message queues (like RabbitMQ) and cloud computing (like Azure or AWS) so check those out.  If you're doing web development you should understand the MVC pattern, and for WPF development you should understand MVVM.

Learning a new programming language or skill.

Consider the following two approaches to learning a programming language:  The first is to read the entire manual and the other is to learn the basics and then look up how to do things as you go along.

I have tried both of these approaches and, well, the best approach is probably somewhere in the middle.

The problem with trying to learn an entire programming language is that programming text books are typically around a thousand pages.  It takes a lot of work to digest all of that information.

On the other hand, trying to learn a programming language on the fly may cause you to miss out on some fantastic features of the language that you've never heard of before.

The following is my method of choice:

I accept that learning a new language is a big task and set myself a reasonable goal for how long I'm going to take to learn it.  Then I find a book which teaches by having me build a project as I learn.  Learning programming requires lots of practice, so you can't just read it and expect to remember everything.  If one is lucky enough to be working with the same language that one is learning, then it is perfect for remembering information.  If not, one should probably work on one's own project which requires the skills being learned.  I also like to spend some time on stackoverflow.com, a very useful resource for programmers, but instead of asking questions, I try to answer questions on the topic that I'm learning.

Learn about the industry you want to work in.

While I don't consider this as important as the previous two topics, it can be very important in certain circumstances.  For example, if one wants to work as a games developer one will need to do some research to find out what skills are required for the jobs that are available, and then make a decision as to whether or not it's worth the effort to make yourself marketable enough.

If you don't really care about the industry, then do start researching as soon as you get an interview or find out which industry you may be working in.  It will help you a lot in your job if you know a lot about the company you work for and the software which they develop.

Ongoing learning.

Programmers have to constantly keep up to date with the latest in software development.  I'd recommend subscribing to news about your area of interest, and setting aside some time every week or two to find out what's new.

And finally, ...

... please learn how to type :)

If you're going to spend your entire life typing every day, you really need to do it properly.  Get a cheap program which teaches you to type, and if you like you can get a game like Typing of the Dead.  Typing of the Dead is an addictive game where you have to type quickly in order to kill the zombies.  It's good fun!


Images:

1. Courtesy of jscreationzs at FreeDigitalPhotos.net
2. Courtesy of adamr at FreeDigitalPhotos.net
3. Courtesy of David Castillo Dominici at FreeDigitalPhotos.net

How to reduce complexity and know everything.

Quality We have a great QA. His code is like a Rolex. You look at his gherkin, and smile.  It says what it's testing, in plain English, ...