I have often been asked what is looked for in technical candidates and what skills people need to develop in order to progress in a technical career path. Typically long lists of technology, languages and certificates on a CV/resume don’t do much for me. If the list is long it is likely that the candidate doesn’t really have deep knowledge in any of them. Equally technology changes so rapidly that knowledge of particular languages or platforms rapidly becomes redundant replaced with something new and shiny. For all of those reasons I have always considered the following to be the most important areas
- Ability to rapidly learn new technologies
- Problem solving ability
- Communication (with people)
Of these the third is the easiest to explore in an interview asking the candidate to explain some area of technology or some project they have worked on. If they can’t explain clearly or use too much jargon you have an issue – no developer/architect is an island. Ask them to assume you have no technical background and to explain in clear English something technical they worked on.
The area of problem solving can be tackled in a couple of ways either by written tests, or posing problems during the interview. A good approach is to give some realistic real world problem and ask the candidate how they would solve it. Provide them paper, whiteboards etc. Good candidates will first ask questions before drawing data models and architecture. The main point is to understand the process they would go through in breaking down the problem and of course is a bonus if they come up with innovative approaches on the fly to solving it. Depending on time you can probe areas such as performance, security and integration of the solution suggested. For a more rigorous approach for interviewing developers checkout Joel Spolsky’s Guerilla guide to interviewing
The hardest area to measure is someones ability to rapidly learn a new technology. You could for example ask someone to go learn and present on some technology with a demo although this is rather artificial. Another area to consider is which technologies the candidate has recently learned and applied. Another strong indicator is the passion they have for technology both inside and out of work – if they start talking about modules they contributed to Apache in their spare time then you have struck gold. It is also important to recognise how we learn new things which is mainly through comparison to existing knowledge. This type of pattern matching of course does require some foundations to draw on. Below then are some of the foundations that will help someone in being able to rapidly learn and apply new technologies.
For each of the following topics it is important that a candidate has at least an understanding of the concepts and ideally practical experience using at least one of the languages/tools. These are transferable skills that are not constrained to particular applications or domains and should continue to be a valuable foundation for any new technologies / approaches going forward.
- Design Patterns – The bible for developer design patterns is still the classic ‘Gang of Four‘ book. These patterns are now a part of the developer vocabulary and have been adopted by most modern languages and frameworks. The other essential reference is Martin Fowler’s Patterns of Enterprise Application Architecture.
- OOP – Object Oriented principles continue to permeate all modern languages and architectures. Experience of Java or C# should ensure a good exposure to the concepts of encapsulation, interfaces, inheritance, polymorphism etc
- AOP and IoC – understanding of these paradigms and experience of using them with particular frameworks
- Frameworks such as Spring, Hibernate, Struts, Rails, Symphony, Django – just knowing a language is not enough anymore as many applications now rely on frameworks and these kind of frameworks ultimately when used correctly should result in less effort and code to be written. These frameworks typically utilise several core patterns such as MVC, ORM, DI etc
- Dynamic interpreted languages such as Python, Ruby – these are expressive languages that can require few external libraries and can result in very compact readable code.
- Build tools and continuous build/integration ie ant, maven, cruisecontrol
- Source code control cvs, svn, git
- Testing - unit tests, TDD. Here are some examples of Java testing tools
- IDE’s – familiarity with a mainstream IDE such as Eclipse or NetBeans and how to use/configure tools within it such as debugging, version control, build control, etc
A book that I often recommend is The Pragmatic Programmer which encourages developers to embrace many of the areas above as part of a continuing investment in themselves and their career.
A good refresher and selection of technical interview type questions can be found in this blog by Michael Knopf.
Software is changing at an ever growing pace with areas such as cloud computing and social networking expanding rapidly so keeping on top of these developments will continue to be a challenge for developers and architects. However given a solid foundation as outlined above it will enable such new developments to be quickly absorbed and understood.