What makes a good developer?
Date: 2008-09-16 10:07:28

Early last year I became very curious about what it was that made the best developers in the industry so good at what they do.

Jay Fields points out some things that he believes indicate that a developer is good at the end of http://blog.jayfields.com/2008/08/elephant-in-server-room.html[this post] but a former colleague and I tried to come up with a list of areas that any Developer needed to be skilled in to justifiably consider themselves good.

This is not an exhaustive list but it was just some ideas we brainstormed and I've expanded on them a bit.

== Languages and Tools

The first skill any developer needs to have is an ability to work with programming languages and the main tools that are used with them. These could include build tools, IDEs, web frameworks, messaging APIs.

Although Martin Fowler talks about how he http://www.martinfowler.com/bliki/PreferDesignSkills.html[prefers design skills over language skills], I think it is important that you do have a good level of knowledge of at least one language.

These skills can best be acquired through practice, learning APIs, playing around with different frameworks etc. There are also infinite books available which go through the features of different languages which I won't list here.

In a Java development environment you might need skills in some of the following, for example:

* http://www.java.com/en/[Java language]
* http://ant.apache.org/[Ant]
* http://www.mortbay.org/jetty/[Jetty]
* http://www.springframework.org/[Spring]
* http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html[Spring MVC]
* http://www.jboss.org/[JBoss]
* http://www-01.ibm.com/software/websphere/[WebSphere]
* http://activemq.apache.org/[Active MQ]

Clearly the more languages and tools you are familiar with the more useful you become on any team you're on. Knowledge of different types of languages (e.g. static/dynamic/functional) can help bring different points of view in understanding how to solve problems.

== Programming Paradigm

This concerns the http://martinfowler.com/bliki/PreferDesignSkills.html[design skills] which Martin talks about. Martin covers it in much more detail, but one area this would cover is having a good understanding of object orientation which is vital for writing maintainable code with imperative languages.

An understanding of ways to approach different problems you might encounter in enterprise development by knowing different patterns and when to apply them is also useful.

The following books would make good reading in this area:

* http://www.amazon.co.uk/Software-Development-Principles-Patterns-Practices/dp/0135974445/ref=sr_1_4?ie=UTF8&s=books&qid=1221518071&sr=8-4[Agile Software Development Principles, Patterns and Practices - Robert Martin]
* http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&s=books&qid=1221518071&sr=8-1[Clean Code - Robert Martin]
* http://www.amazon.co.uk/Code-Complete-Practical-Handbook-Construction/dp/0735619670/sr=8-1/qid=1168982606/ref=pd_ka_1/202-6197730-3734252?ie=UTF8&s=books[Code Complete -- Steve McConnell]
* http://www.amazon.co.uk/Design-patterns-elements-reusable-object-oriented/dp/0201633612/ref=sr_1_2?ie=UTF8&s=books&qid=1221524532&sr=1-2[Design Patterns - Gang of Four]
* http://www.amazon.co.uk/Head-First-Design-Patterns/dp/0596007124/ref=sr_1_1?ie=UTF8&s=books&qid=1221524532&sr=1-1[Head First Design Patterns - Kathy Sierra & Co]
* http://www.amazon.co.uk/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683/ref=sr_1_2?ie=UTF8&s=books&qid=1221550329&sr=1-2[Enterprise Integration Patterns - Gregor Hohpe, Bobby Woolf]
* http://www.amazon.co.uk/Object-Design-Responsibilities-Collaborations-Addison-Wesley/dp/0201379430/ref=sr_1_1?ie=UTF8&s=books&qid=1221523766&sr=1-1[Object Design: Roles, Responsibilities and Collaborations - Rebecca Wirfs Brock, Alan McKean]
* http://www.amazon.co.uk/Enterprise-Application-Architecture-Addison-Wesley-signature/dp/0321127420/ref=sr_1_1?ie=UTF8&s=books&qid=1221550329&sr=1-1[Patterns of Enterprise Application Architecture - Martin Fowler]
* http://www.amazon.co.uk/Refactoring-Improving-Design-Existing-Technology/dp/0201485672/ref=sr_1_1?ie=UTF8&s=books&qid=1221523628&sr=8-1[Refactoring - Martin Fowler]
* http://www.amazon.co.uk/Refactoring-Patterns-Addison-Wesley-Signature-Kerievsky/dp/0321213351/ref=sr_1_1?ie=UTF8&s=books&qid=1221523677&sr=1-1[Refactoring to Patterns - Joshua Kerievsky]
* http://www.amazon.co.uk/Pragmatic-Programmer-Andrew-Hunt/dp/020161622X/sr=8-3/qid=1168982606/ref=pd_ka_3/202-6197730-3734252?ie=UTF8&s=books[The Pragmatic Programmer -- Andrew Hunt, Dave Thomas]
* http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052/ref=sr_1_1?ie=UTF8&s=books&qid=1221659599&sr=8-1[Working with Legacy Code - Michael Feathers]

== Domain Specific Knowledge

Specific knowledge about the domain (e.g. Investment Banking) is vital for writing a system which is closely linked to the problems it is trying to solve.

Although a lot of this knowledge is acquired by the Business Analyst on the project if Developers can gain it too then conversations with users will be much easier to deal with as amongst other things the terminology they use will make sense.

Beyond this it is useful to understand the goals the business people have, the processes they use to achieve those goals. An understanding of the history of their business so you can see where their industry is going and why is useful for context.

Some domain knowledge can be gained by reading books - this is especially true once you start reading the books that practitioners are reading - but a lot of the knowledge can only be learned by speaking to or watching people who do that job for a living. For example I found out that http://www.amazon.co.uk/Options-Futures-Derivatives-Prentice-Finance/dp/0136015867/ref=sr_1_1?ie=UTF8&s=books&qid=1221527451&sr=1-1[Options, Futures and Other Derivatives] is a very popular book in the investment banking world from my time working in that environment.

Eric Evans' http://www.amazon.co.uk/Domain-driven-Design-Tackling-Complexity-Software/dp/0321125215/sr=1-1/qid=1168982507/ref=sr_1_1/202-6197730-3734252?ie=UTF8&s=books[Domain Driven Design] details a way of writing code specific to the domain that you're working in. Specific domain related books are probably best located with an Amazon search.

With regards to learning domains, the approaches one can take vary from focusing very heavily on one domain and learning it inside out to getting an understanding of a broad set of different domains.

== People Skills

One of the most important skills in software development is the ability to work effectively with other people - fellow developers, Quality/Business Analysts, clients, users, the list is endless. If you can do this effectively then you go a long way to ensuring your success.

All the skills of Emotional Intelligence as Daniel Goleman has termed it.

Some useful reading around this area:

* http://www.amazon.co.uk/How-Win-Friends-Influence-People/dp/0091906814/sr=8-1/qid=1168982426/ref=pd_ka_1/202-6197730-3734252?ie=UTF8&s=books[How to win friends and influence people - Dale Carnegie]
* http://www.amazon.co.uk/Emotional-Intelligence-Daniel-P-Goleman/dp/055338371X/sr=1-1/qid=1168982736/ref=sr_1_1/202-6197730-3734252?ie=UTF8&s=books[Emotional Intelligence - Daniel Goleman]

== Problem Solving

The ability to solve problems that don't have an obvious solution is key in software. Coding wise it could be debugging a class-path issue when deploying your application to JBoss or finding a tricky bug that a test reveals.

I found http://www.amazon.co.uk/Debugging-Indispensable-Software-Hardware-Problems/dp/0814471684/[Debugging: The Nine Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems] to be very useful reading around this area as it helps to keep you honest when solving coding problems and not over thinking the problem.

The best problem solvers logically go through the problem logically using small steps, investigating potential causes until they solve the problem.

== Personal Management

The art of managing your time effectively, prioritising your work correctly and keeping focus on what's important. http://www.amazon.co.uk/Getting-Things-Done-Stress-free-Productivity/dp/0749922648/ref=sr_1_1?ie=UTF8&s=books&qid=1221554657&sr=1-1[GTD] is a famous book in this area although I think it comes down to experience and understanding the way to best exploit the way that you work.

== Communication

This links to people skills but includes written communication, how you transmit ideas and your ability to persuade people.

These skills come in very useful when taking part in exercises such as http://en.wikipedia.org/wiki/Pair_programming[pair programming] for example.

I have read a lot of information around Neuro Linguistic Programming (NLP) in this area - http://www.amazon.co.uk/Introducing-Neuro-Linguistic-Programming-Joseph-OConnor/dp/1855383446/ref=sr_1_4?ie=UTF8&s=books&qid=1221554485&sr=8-4[Introducing NLP] is a useful book to start with on this subject. NLP amongst other things is a gathering of techniques which effective communicators have been seen to use. link:http://www.nlpweekly.com/index.php?PHPSESSID=1jc4cnhopro1ogmiis3hlnehd4;www;board=29[NLP Weekly] is a useful online resource.

== Gaps

Acknowledging when the facts don't match your theory and keeping room for possibility.
In other words approaching things with an open mind, keen to learn other approaches to solving problems.

== Go Meta

The ability to learn how to learn - the skill of skill acquisition - as well as knowing which skills to learn next and which to abandon.

Andy Hunt's http://www.amazon.co.uk/Pragmatic-Thinking-Learning-Refactor-Wetware/dp/1934356050/ref=sr_1_1?ie=UTF8&s=books&qid=1221532484&sr=8-1[Pragmatic Thinking and Learning] strikes me as a book which covers most of these things. It has only recently come out but I will review it when I get my copy.

---

There are bound to be things I haven't considered for this list. I would like to hear other ideas. My underlying desire is to hear the skills that people are developing to make themselves a better software developer.

Construx have the idea of a http://www.construx.com/Page.aspx?nid=233[Professional Development Ladder] but I think you need to be a member to see a proper version of it.