Home  C.V.  Contact  Portfolio 
 Basics  Skill Profile - Techical  Skill Profile - Other  Publications 

Technical skills

Software design

I have extensive experience in the design, from scratch, of complex software. The projects I've worked on have been primarily client / sever applications where the client sides have been both rich desktop applications and web interfaces. I've been involved in the design from high level architecture down to UI design and refinement through testing and interaction with testers and real users as well as implementation of both front and back end code.

I'm most fluent in Java, but have experience with other languages including PERL and various web 'languages' including PHP, CSS, HTML etc. Although not languages as such I also have extensive experience with the various XML related standards including XML Schema. I regard the choice of language for a project as potentially critical, and would rather learn a new language than use an inappropriate one.

Within the Java language I have experience with a number of key frameworks and APIs, detailed below:

Frameworks

  • Java Servlets - I introduced Servlet technology (and the Tomcat application server in particular) into the EBI in 2000, and have used it extensively in projects since.
  • Spring - Since 2007 I have used the Spring framework for almost all my projects, including writing custom extensions to the Inversion of Control (IoC) container to allow for on the fly download of code when initializing bean components.
    • Aspect oriented coding - aspects are a powerful element of Spring's IoC container, I have used them to create transparent caches and impose easily verifiable security constraints on server side code.
    • Spring-WS - creating and consuming web services with Spring, through contract-first service definition and integration of Spring into Tomcat.
  • Hibernate - Used to provide back end data services and accessed through Spring, including dynamic schema generation through detection of data objects within a set of plugins. This involved patching and building a customised version of Hibernate.
  • Google Web Toolkit - Used to generate rich clients within the web browser, including integration of GWT-RPC services into Spring to provide access control and connection to data access layers.
  • Web Service Frameworks - Various web service frameworks including Axis 1 & 2, CXF and Spring-WS, experience of both contract first and code first design methods. Experience included inter-operation with arbitrary third party services through dynamic clients, this required a much more in-depth knowledge of the web service technology stack than the more typical case where both service and client are written within the same project, or where clients are compiled specifically against a particular service.

APIs

I am familiar with the full API of both J2SE and J2EE, up to and including Java 6. In particular I have worked extensively with the reflection and introspection APIs, including creation of custom class-loaders and use of reflection to dynamically assemble code on the fly. I've also used the Swing UI framework to build highly complex MVC driven user interfaces, often dynamically generated from domain specific languages or introspection over Java objects.

In addition to the standard Java APIs I've used a large number of third party libraries - as with most Java programmers one of the first things I'll do when implementing a piece of software is search to find whether anyone else has already done so. Other than the APIs used by the frameworks listed above I don't have a comprehensive list of APIs I've worked with for the simple reason that adopting a new API is generally not very much work, so saying that I am familiar with, say, JDOM, doesn't really tell you anything. I would assume that any decent programmer would be able to make use of any properly documented third party API.

I have produced a number of APIs intended for third party use as a deliverable of one of my more recent projects, the Taverna Platform. This involved packaging and documenting the code in the form of comprehensive Javadoc, a substantial developer's manual and a set of Maven archetypes and template projects.

Tools

Build tools and environments I've used in past projects. This is not an exclusive list, but representative of the tool set I would use on a new project. (My early development work was mostly done in Emacs and using command line tools to build and verify, these days I prefer to live within Eclipse).

  • Apache Ant & Maven - My earlier projects used the Ant build system, moving to Maven 2 six years ago. Experience with Maven in particular includes writing custom plugins and archetypes as part of a framework project, allowing users of that project to generate template consumer code with a couple of simple Maven commands.
  • Eclipse IDE - I've used Eclipse as my main development environment since 2003, inluding plugins for Spring, GWT, Maven and many others.
  • Version control - CVS and Subversion experience, both used on projects with around twenty developers with commit access.
  • Testing frameworks - Primarily testing with JUnit, but some experience with continuous integration tools such as Hudson and CruiseControl (I've used but not configured the latter). Experience with using code coverage tools to ensure solid test coverage and general experience with test driven development methods. One of my main motivations when selecting the Spring framework for past projects was the ease of testing, although Spring is obviously not a testing tool in itself.
  • Others - Experience with the usual selection of project management tools such as JIRA and other issue trackers, code patching etc.