Recent work I've done
March 2018: CTO/co-founder at prop-tech startup FaultFixers
At FaultFixers, we are bringing quality software to housing and facilities management! Get complete management of your mobile workforce, reactive and planned repairs, inspections, inventories, and more!
We're already working with teams across Europe and Africa. And what is the feedback we consistently get? FaultFixers saves loads of time, and is the sexiest FM software any of our customers have used!
FaultFixers can be used by teams of any size -- we have some small customers, like a London-based nursery chain, all the way up to huge international organizations like the Foreign & Commonwealth Office.
With the company, I went through a 'Business Growth Program' run by London & Partners. As alumni of this network, we are proud to be able to say we are an official representation of London's amazing business scene.
CTO/co-founder at food-tech startup CityMunch
From 1st August 2016 until 9:58pm on 14th January 2018, I was CTO of CityMunch, an app that allows restaurants to offer real-time discounts whenever they have less demand, reducing the amount of food they throw away and bringing in new customers. CityMunch also offers an assortment of other tools to restaurants, and are building an amazing set of data to help inform ourselves and restaurants about what discounts work and when.
With the company, I went through a food-tech startup accelerator run by Just Eat -- their first ever infact -- from November to January 2017. Five startups including CityMunch got some great insight and access to Just Eat and the industry.
The company has large tech footprint, including multiple consumer-facing apps, multiple restaurant-facing apps, internal apps, API partner integrations, smart push notification targeting, chat bots like our Slack bot, beacons that broadcast messages to nearby phones, data-driven business intelligence tools, and more. The core API is built with Java and Spring Boot, the mobile apps with Ionic/Angular, and the websites with Angular -- check out the rest of the stack on StackShare.
(Although I used to care deeply about this company, I no longer do. This company is evil and I wish I never worked there. Want corroboration of this? Use LinkedIn to count the vast number of former employees who also left ShittyMunch.)
Senior consultant at HR & legal startup
I finished this contract on 29th July, 2016.
CTO at City Pantry
I worked as CTO / lead developer at food-tech startup City Pantry. The tech stack we used to deliver a single-page web app and REST API was PHP, Symfony, AngularJS (ES6) and MongoDB.
Along with modernising the tech stack and code, I implemented best practices that the development team lacked, including continuous integration with Jenkins and unit and functional testing (using PHPUnit, Protractor and Karma). I led the team with an Agile workflow.
We implemented deep integrations with many APIs and services, like using Twilio to keep close track of food orders and deliveries via automated SMS messages, HubSpot for helping the sales team manage leads, and many internal services that help the operations team get food from the kitchen to the customer on time.
I also oversaw the development of an Android application for the company's food vendors and delivery drivers, which is built with Ionic and Cordova.
I used Puppet to automate the configuration of the Ubuntu servers and Vagrant development VMs.
Twogether / partnermarketing.com
I worked as a developer at Twogether Creative Ltd., and lead developer for partnermarketing.com 2.
The main focus of my job was building the latest version of partnermarketing.com, which is a huge application built primarily with PHP, Symfony, AngularJS, MongoDB and Puppet. There were also some microservices built with Node. We created an extensive test suite with PHPUnit and Karma for unit tests and Protractor for full end-to-end testing.
I was involved in all parts of the project, including building the large infrastructure with Puppet and AWS, service architecture, automation with bash and other scripting languages, and making tools like a command-line deployment tool, and our command-line MongoDB migration tool Mongrate.
During this role I contributed to lots of open source projects, including AngularJS, Node Webshot, and Angular Charts, and extensively modified the Nunjucks lexer and library (some of those changes are open source). We also open sourced Mongrate, PartnermarketingFileSystemBundle, PartnermarketingTranslationBundle, and a OneSky API client.
As well as leading the development of partnermarketing.com, I led the development of Intuit's QuickBooks ProAdvisor Portal. This web app supplied Intuit's partners with country-specific and tier-specific QuickBooks resources. Built with Symfony and AngularJS, with tests written in PHPUnit, Protractor and Karma, the web app was extremely well received by the client, and is now being rolled out to all QuickBooks partners worldwide.
TD's iPhone Trading App
I worked in a team of 4 building a complex trading application in Angular, Cordova and Ionic. The app runs on iPhones, and allows the user to view their trading accounts, portfolio and orders, manage a watchlist, and trade instruments on a dozen markets via an API. We achieved a native-feeling app, which had very few bugs thanks to 95% code coverage unit tests (Karma and Jasmine) and end-to-end tests (Protractor and Cucumber).
Google's Twelve Days of Giving
I worked on building Twelve Days of Giving, a promotional site for Google which was featured on their US homepage in the run up to Christmas. It was built with AngularJS, responsive SASS and Grunt.
Open source projects
The most widely used open source project I've created is Mongrate, which brings testing and TDD to MongoDB migrations. See the official website for details.
- Mongrate, and its' related Symfony bundle.
- Symfony library: router validation.
- Symfony bundle: PartnermarketingTranslationBundle.
- Symfony bundle: PartnermarketingFileSystemBundle.
- Symfony bundle: Google+ authentication and API.
- Symfony bundle: Twitter authentication and API.
- Symfony bundle: Facebook authentication, API and Canvas apps.
- Symfony bundle: Google Checkout service-orientated listener.
- Symfony bundle: collect verified emails.
- Chess PGN parser.
- searchchessgames.com, made with Symfony.
- Extensively modified the Nunjucks lexer and library; some of those changes are public but most are private.
- Angular 'same height' directive.
- Contributed to Node Webshot.
- Contributed to Angular Charts.
- Contributed to AngularJS.
- A/B Performance, made with Google Closure Library.
- searchchessgames.com, made with Angular/Grunt/SASS.
- Amazon Products API reader.
- Simple JSON server for the Amazon Products API.
- Play framework file uploads and handling.
- A/B Performance, made with Play 1.
- Houl, made with Play 1.
And a repo for random things like my .bash_profile and Git hooks.
I have had a strong focus on PHP throughout my career, especially with Symfony. I started using Symfony back when version 1.0 was released, and have continued to use it through version 2 and now version 3. I also have extensive experience with PHPUnit and Doctrine, and I have touched other frameworks and libraries like Laravel, Zend, Propel, and Lucene throughout the years. I have built large enterprise-scale applications, APIs and backends with PHP and Symfony.
In the JVM world, I have used Java and Scala with Spring, Spring Boot and Play framework to build various websites and APIs. Some things I've built with Java include the massive CityMunch API, Zibbet.com, Houl (a messaging app which needed to handle many long-polling connections and WebSocket connections simultaneously) and A/B Performance. And I have built libraries like this Amazon Products API library and this DSL parser.
I have used Node for building many light-weight servers and APIs, and to automate tasks like validating custom HTML rules, generating files, and automating almost anything I possibly can. I have contributed to Node Webshot, which I've used to automate screenshot generation on a huge scale. I also have much experience writing tests with tools including Protractor, Karma, and PhantomJS.
Various experience in other languages including Go, Ruby and Python.
Interaction with many APIs, including AWS, Keen.IO, MailJet, Google+ authentication and API, Twitter authentication and API, Facebook authentication, API, Canvas and Apps, Amazon Products API, PayPal, Google Checkout, US Postal Service, Stamps.com, Google Base, Etsy, The Find, One Sky, Twilio, various betting companies, a football API... and probably some more!
I have wrote probably thousands of tests with Protractor, Karma and Jasmine.
Built several Chrome/Firefox extensions for various companies including Homie (a property search company who needed to automate some work) and Partnermarketing's dev-ops team (including an extension to list the active servers for different parts of an architecture).
I live in Angel, London, and only work in London or remotely.
I'm avid about going to networking events. (Had a goal of 3 a week for 6 months during 2018.) Some recent meetups I've been to are The Property Management Club, Housing Technology magazine's evening reception 2018, Paws.com events, Food Tech Wednesday, PHP London, Angular Zone, DevOps Exchange London, Digital Ocean London, and Hashicorp London. Conferences I've attended include Resi 2018, EMEX (Energy Management Exhibition) 2018, Symfony Live 2014 and MongoDB Days 2015.
I love automation -- whenever people need something automated, they come to me and I always manage it.
For years I was an avid Ubuntu user, so I have a strong grasp of Linux, the command-line and bash scripting. Eventually I gave up and got a Mac -- I believe the fabled "year of the Linux desktop" will never come, because Linux developers just don't understand desktops and normal people.
From 2008-2009, I attended University of Edinburgh to study computing science and astrophysics, but dropped out after the first year to work in a startup. I don't believe in the traditional method of education -- learning should be done on-the-job.
I've done various other contracts that aren't listed above, because they are not interesting.