I’m Paul Herron,
a full-stack developer and technical manager.
I focus mainly on back-end development with tools like Symfony
and devops with tools like Docker
SHOWstudio website rebuild
Working with front-end developer Sally Northmore, I built the SHOWstudio website in CakePHP. Notable features include search, a calendar system, online store and a custom-built blog, all manageable through an intuitive admin panel.
I played a key role in the site’s development, having input on issues like how content would be structured and what features would be present. I was solely responsible for the back-end build. As well as coding the site, this included a large data migration effort, pulling nearly a decade's worth of content out of the old site. I also took care of the new site's deployment to a scalable web hosting platform, Amazon EC2.
The site makes heavy use of Cake’s plugin architecture, server-side caching and shell script functionality.View project
Other things I’ve been working on recently
- Inspectee, a search tool for product specifications. Lets you find products by given specs (e.g. "wireless bluetooth headphones with noise cancelling"), and compare specs between products. I built the app with Symfony and Bootstrap and deployed it with Docker, Traefik and Nginx. Various Python scripting is done to generate content.
- The Angry Architect, a blog and content management system for an architecture journalist.
- Various projects on GitHub.
A brief CV
Contract web developer with 12 years of commercial experience and a history of successful web builds. Proven ability to do successful 'technical turnarounds' on struggling projects, both through hands-on development and technical leadership. A focus on pragmatism and creating robust, elegantly simple solutions.
DevOps and Systems Administration. Several years of working with Docker to create automated builds, scalable infrastructure and predictable development environments. Extensive use of tools like Jenkins, GitHub Actions and BitBucket Pipelines. More than a decade working with Linux servers: provisioning, maintaining and tuning. Ability to administer Nginx, Apache, PHP, MySQL, PostgreSQL, HAProxy, Exim, OpenSSH and other services. Extensive command-line knowledge across Linux and Mac. Experience with cloud platforms like Amazon AWS, Rackspace Cloud and DigitalOcean. Experience working with production Kubernetes clusters.
Management and Workflow. Experience introducing and using agile workflows, and driving improvements on documentation and conventions. Ability to switch between management and hands-on development roles. Experience of building a development team and meeting business-critical deadlines. A history of liaising successfully with product owners and stakeholders, both technical and non-technical. Extensive use of Git Flow and continuous integration. An overall focus on pragmatism.
March 2019 — Present: Lead Developer (Contract), Capitalise.com
Building a REST API and related features to automate the main business workflow. Working across a microservice architecture using Symfony, RabbitMQ, Kubernetes, Docker, Node and Loopback. Integrating with Microsoft Logic Apps and Salesforce. Working mostly remote.
February 2017 — February 2019: Senior Developer & Support Team Lead, Wireless Logic
Building features for SIMPro, an online platform for managing SIMs and IoT devices. Working with Symfony 3, RabbitMQ, Solr, MySQL and Angular 2. Building customer-facing APIs, both REST and SOAP. Leading the Development Support team, responsible for bug fixes and maintenance of the platform, as well as general troubleshooting issues arising from the management of millions of SIMs integrating with many third party providers. Responsibility for code review and production releases. Working to agile principles, using pull requests and code reviews. Helping to establish better testing and the use of tools like PHPUnit and SonarQube.
July 2016 — October 2016: PHP Developer (Contract), Adaptive Lab
Developing a RESTful API used by Forevr, a contacts application for Android and iOS. Using Symfony 3, domain-driven design, TDD and BDD, PHPSpec, PHPUnit, Dredd, PostgreSQL and Vagrant. Using PHP 7 for its enhanced language features and working with large denormalised datasets in Elasticsearch. Working closely with iOS and Android developers to establish desired functionality, and using BDD and API Blueprint to help codify this. Liaising with the business founder and other stakeholders. Maintaining load-balanced infrastructure in AWS, and deploying to it using Ansible and Travis. Integrating with the Facebook API and building a feature with SQS to send push notifications to mobile devices.
May 2016 — July 2016: Senior PHP Developer (Contract), Havas Worldwide
Maintaining and improving a Symfony-based crowdfunding platform for a global drinks brand. Deploying with Capistrano to a load-balanced setup in Rackspace Cloud. Working with CDNs, database migrations, unit and functional tests, the Facebook API and multiple translations for the website's worldwide audience. Front-end development with Twig, Sass, Grunt and jQuery.
May 2015 — April 2016: Technical Lead (Contract), MBA & Company
Leading the development team in a total rebuild of this startup's web application and server infrastructure. Ensuring good architecture and a robust product. Hiring a technical team of seven developers and helping establish a productive working environment. Developing using Symfony, Doctrine, MySQL, Twig, Bootstrap and Sass. Scripting data migration and orchestrating the switchover to new infrastructure in Rackspace Cloud. Reporting directly to the COO and attending board meetings to update the company's investors. Working with the Product team to define an MVP for launch, successfully meeting a very tight relaunch deadline, then leading the tech team in iterating rapidly on this. Establishing an agile workflow and test-driven approach. Using Chef to manage infrastructure and Jenkins for continuous integration.
October 2014 — February 2015: Senior PHP Developer (Contract), Amaze
Working on a CakePHP-based social publishing platform for a global hotel company. Working as sole developer, from early prototype to production site used by 22,000 employees. Establishing an agile workflow, coding conventions, Vagrant-based development environment and a focus on unit testing. Co-ordinating with project stakeholders both from the agency and the client company. Integrating with some of the company's existing infrastructure, such as LDAP authentication. Using tools like CakePHP, PHPUnit, Jenkins, Grunt, Sass and jQuery.
May 2014 — September 2014: Senior PHP Developer (Contract), MBA & Company
Acting as the technical lead, working with an in-house Junior Developer and remote teams in India and Russia to improve the application for a funded recruitment startup. Building features and reducing technical debt on the Yii-based platform. Reducing code duplication and establishing coding best practices for the team. Using tools like Backbone, Sass and Elasticsearch. Establishing an agile workflow and regular deployment process using tools like Jenkins.
July 2009 — April 2014: Back End Developer, SHOWstudio
Working alongside a Front End Developer on a total rebuild of the SHOWstudio website using CakePHP. Migrating server infrastructure from a single dedicated machine to AWS, using S3 and Cloudfront for assets and Wowza Media Server for live video broadcasts. Building and maintaining server instances in EC2. Migrating 10 years of editorial content into the new application and orchestrating the switchover to it. Building features from scratch such as a blog, events calendar, project archive, online store integrating with Sage Pay and a content management area used by the editorial staff. Using tools like PHPUnit and HAProxy. Building some 'big data' features such as tracking millions of tweets and Instagram photos to create data visualisations. Managing mailing lists, corporate email and all other infrastructure.
Latest blog posts
The simplest Docker deployment
Using Docker with Traefik and Nginx
Opening a file in the current Neovim window
Opening a file from the Gnome file browser and getting it as a new buffer in the current Neovim window
Raspberry Pi project: Simplest internet radio
Using a Griffin PowerMate as an interface to a really simple Raspberry Pi radio
Vim: get a link to the current file in Bitbucket or GitHub
Mappings to get a link to the current file in VCS
Setting up the Dell C1760NW printer in Manjaro Linux
Using the Xerox driver to get the printer working
Finding a front light for the Brompton
A front light setup that doesn't get in the way of the fold.