I have experience coding in various server-side languages. Many programming best-practice principles apply in any language.
Whatever language I’m working in I always strive to write expressive code and to create modular, simple & maintainable code structures using inversion of control and following established design patterns wherever possible.
I am also a big fan of behaviour driven development, although I’ve had few opportunities to put it into practice so far.
Python 3 is the primary server-side language we use at Canonical, where I’ve been for over 5 years. We manage about 20 websites in Flask and Django, and have written and published a number of supporting Python modules, many written by me. I have developed a deep understanding of web hosting, writing and communicating with APIs, caching libraries, writing Charms etc. in Python.
My first experience of Python and Django was at the first NHS Hack Day (that’s me in the picture!) working on NHSBugs.net (repository). I instantly liked the language’s semantic simplicity and straightforward approach to solving a large number of problems (even if it’s not always the fastest language).
I used PHP primarily from 2007 to 2014, after I branched out from doing mainly Perl-based web projects for Tamar. I have a deep knowledge of PHP’s setup, syntax, API and capabilities. I’ve used PHP in various environments and setups, and often compiled it from source. I keep up to date with the new features added in new versions of PHP.
I’ve am experienced in using many PHP frameworks and CMSs including CodeIgniter for Energise, Symfony 1.0 and 1.4 at IPC Media and Magento (based on Zend framework) at Hillarys. I have never used Symfony 2 commercially, but I have played around with it myself, and it seems like a fantastically neat and well documented project.
I have a thorough understanding of PHP design patterns and I have experience in writing behaviour-driven tests with phpunit (partly thanks to Inviqa).
I started learning C# in August 2012 when I started at Hillarys so that I could lead the first in-house site build (in Umbraco): arena-blinds.com. I thought carefully about how to implement my storage layer so that the site could both talk to the database (which I also created) and talk to the existing CRM system.
I also setup the hosting platform and release system (using web deploy) for this site. This project was so successful that it has has since become the basis for the rebuilding of two more major sites (premiershutters.co.uk and nextshutters.co.uk).
Through these projects and ongoing maintenance I now have a fairly deep understanding of C# as a language, and of managing projects and releases of compiled binaries.
Ruby & Node.js
The only proper Ruby project I’ve worked on was the Rails-based oportfol.io (repository), which I helped create one weekend at an NHS Hackday in Oxford - although I was mainly doing the front-end. My blog is built with Jekyll - a Ruby-based static site generator, so I understand the basics of how to manage a Ruby project.
At Hillarys we completely restructured the Vagrant and Chef configurations for web-blinds.com, which required a lot of hacking around with Ruby recipes which gave me a fair amount of Ruby experience.
I’ve had a fair amount of experience using centralised version control systems: At IPC Media, we used Subversion (with externals), and at Tamar we used CVS. However, I discovered distributed version control in 2010, and after playing around with Mercurial for a while, I settled on using Git as the VCS of the future (massively complemented by Github).
Distributed version control systems offer you so much more flexibility: You can use a centralised workflow if you like, but you can also have a completely decentralised one. You can work offline perfectly happily, and you can quickly and easily create copies of repositories, and above all, everything is stored in one simple folder. It’s genius.
At Hillarys I got the chance to recommend Git as the VCS for the team (even though I had to train the team in it), and it worked perfectly.
I have experience using Git on all sorts of projects - e.g. with submodules and projects over 1GB in size, and then rewritten history to reduce the repository back down to 150MB. I have a deep understanding of how the Git tree and branch pointers work, meaning I can quite easily perform complex tasks in Git.
I’ve primarily used Nvie’s Git branching model, but I actually prefer the idea of a pull-request-based workflow.
I have been using relational databases extensively for the whole of my development career. The bulk of my experience has been using MySQL with PHP, although I have a fair amount of experience with Microsoft SQL Server and I’ve played around with PostgreSQL. I’m also very interested in NoSQL databases.
I understand database normalisation and I have a lot of experience of create sensible schemas for data. I also have a lot of experience managing MySQL on servers, and setting up and managing a master-slave relationship. Although I’m not exactly a MySQL performance guru, I do understand how to write efficient queries, and to reduce overhead by creating indexes and stored procedures and temporary tables, and increasing reliability with database transactions. Actually, in Microsoft SQL Server stored procedures provide a very useful abstraction layer between the code and the database, but I’ve never used them in MySQL in this way.
I’m very interested in NoSQL databases, like MongoDB and (especially) CouchDB, although I’ve only played around with them for a short time each. I’d welcome the chance to try out either one in a proper project.
DevOps & continuous integration
I have experience setting up and maintaining (and writing configuration for) Linux and Windows servers including Apache, Lighttpd, Nginx and Microsoft IIS. I have a significant amount of experience managing unix-based systems.
I’ve made extensive use of virtualisation for development, and I have a lot of experience using and configuring Vagrant, chef and VirtualBox.
I have used Heroku extensively for many personal projects including this site and my blog site, including using the Heroku Postgres database service.
At IPC Media I helped to setup and maintain the Jenkins continuous integration build system. The CI server ran tests as well as automatically checking n-path complexity and code quality.