Download PDF


  • I am a Backend Engineer with 5 years of industry experience. I've worked extensively with Amazon Web Services (AWS), Python, Javascript, Express.js, and Docker.
  • When working with a Model-View-Controller (MVC) pattern I prefer to compose models that use raw SQL queries as opposed to an Object-Relational-Mapping library. The benefits of having transparency into your queries and the ability to make fine-tuned adjustments outweigh the benefits of an ORM abstraction layer. I find that ORMs are great for quick prototyping but for large, long-lived applications it's best to rely on raw queries.
  • In my spare time I like to build projects that benefit the communities I am a part of. Specifically, I love taking open source and public domain data and remixing it in some useful and creative way. Some examples:
    • RyeWatch, 2013: Ryerson University sends out a weekly summary of campus security incidents (burglary, assault, etc.). I manually collected these events and created an interactive heat map, pinpointing the safest/most-dangerous parts of campus.
    •, 2015: I queried the OpenStreetMap database for all publicly-accessible dog parks around the world and built a website that made it easy to find local dog parks using an interactive map. Emphasis on intuitive UI/UX.
    •, 2015: Compiled a list of Toronto dance studios and built a website to easily find one via an interactive map.
    • Splash, 2019: Taking public domain comic book covers, restoring them using manual and Machine Learning methods, and selling them on Shopify.
  • I recently wrote about how to form an effective technical debt strategy for a software team:


Web Frameworks

I've worked with various web frameworks in most major languages over the past 8 years. I have extensive experience with Express.js (Node.js) and appreciate that it chooses a configuration-over-convention approach. I've worked with most common middleware libraries and have also had to write my own. I'm not a fan of the fact that Express defaults to the Jade templating language and personally prefer EJS. I enjoy the questions one has to answer when working with web frameworks: raw SQL queries vs ORMs, when to offload a heavy-compute task into its own async process, when to use thin vs. thick clients, etc. I have exposure to Flask (Python), Sails.js (Node.js), and Spring Boot (Java).

Amazon Web Services

I've been working with AWS for 5 years and have worked on 3 commercial projects in which I was responsible for architecting non-trivial AWS solutions from scratch. Some of the services I'm comfortable with are: EC2, Lambda, RDS, S3, VPC, SES, SNS, CloudWatch, CloudFront, API Gateway, Step Functions, ECR, and IAM. AWS Lambda's `update-function-code` can be frustrating to work with in that uploads can timeout if the payload is too large. This is typically because dependencies are being bundled up into the payload instead of being extracted into their own Lambda Layers and stored on S3.


I've been using Docker, Docker Compose, and Docker Swarm in commercial settings for 2 years. I've found it useful in creating inter-dependent, fault-tolerant services. I appreciate that it allows a team of engineers to develop against a canonical environment thereby reducing the dreaded "Well, it works on my machine" syndrome. I like that it makes reproducing production-bugs on your local machine much easier and that it's trivial to get something up and running quickly (`docker run postgres`). One hiccup I remember was setting up a Continuous Integration (CI) environment (Jenkins) where we ran into issues when the Jenkins process would attempt to create child containers. Bind-mounting the Docker socket into the Jenkins container fixed the issue.

Work experience

Aug. 2019Oct. 2019
Illustrated Chess (Contract)

Backend Engineer

Skills used: Amazon Web Services, Python, Postgres, Jinja, Bash

Role overview: I was responsible for designing, architecting, and implementing an eBook publishing pipeline. The pipeline was constructed out of a series of interconnected AWS Lambdas. The input was raw, transcribed chess game data. It would be imported into the database, enriched using native and third-party sources, and rendered into an EPUB format using Jinja templates—ready to be sold online. The Lambdas were packaged into an AWS Step Function in order to automate the passing of data and were exposed via AWS API Gateway. I was responsible for designing the database schema, performing Quality Assurance on the generated EPUBs, and generating thorough and intuitive documentation for future developers.

Interesting challenges: I needed to find a secure way to run migrations and manually administer the production database (AWS RDS). However it was inside of a VPC without access to the outside internet. I decided to create a bastion server (single EC2 instance) with a highly-restricted Security Group (only allowing ingress to my current IP address) which I would spin up on demand long enough to perform migrations and then would stop once the work was done. I created a simple Makefile target that would create a tunnel to the bastion server via `ssh`, allowing me to connect directly from my local machine using the `psql` command.

March 2017April 2019
Borealis AI

Backend Engineer

Skills used: Amazon Web Services, Python, Spring Boot, Docker, Postgres, Java, C#, Javascript

Role overview: Helped build Machine Learning products for financial services. Two projects include: a viral-tweet-prediction tool and Apollo - a Natural Language Processing (NLP) system which reads real-time news and presents insights to the bank's internal Analysts for the purpose of making strategic investment choices. We built it as a series of inter-operable Docker services running in a Swarm. I gave talks aimed at developing in-house technical knowledge (mono- vs. multi-repo, unit testing, logging) and trained a junior developer.

Interesting challenges: One morning I checked our CloudFront logs and saw that the CPU was spiking aggressively on one of our nodes. I `ssh`ed into a Docker manager and ran `docker stats`. I saw that the container running our Postgres database was to blame. I `ssh`ed into the container and saw that there was a second, seemingly superfluous, process running in addition to postgres. I searched for the process name on StackOverflow and learned that it was a crypto-miner - we had been compromised. Here's what had happened: some script had figured out our db admin password, logged in, and ran an SQL command that downloaded a file and started a malicious process in the database container. We tore down the container and recreated it, tightened up our Security Group, and strengthened the db password which prevented future issues. Overall an exciting morning!

May 2016Nov. 2016
Polyup (Contract)

Backend Engineer

Skills used: Amazon Web Services, Node.js (Javascript), Postgres

Role overview: Architected and implemented a complete backend solution on AWS for an educational startup and helped them deploy their flagship product - an online game that helps teenagers learn math and logic skills. Duties involved setting up a secured, tiered VPC composed of EC2 instances that supported "git push" deploys, implementing a backend API using Express.js (Node.js) and Passport.js with fine-grained authorization rules using OAuth2 scopes, setting up a Postgres database on AWS RDS and implementing a given schema, and porting an accompanying chatbot to Facebook Messenger.

Interesting challenges: I wanted to make deployments to EC2 quick and easy so I implemented "git push" deploys. I set up Node.js to run as a system service on EC2. I then created a post-commit hook that would stop the service, copy over the newly-pushed code into the app directory, and restart the service.

Sept. 2015May 2016

Backend Engineer

Skills used: Amazon Web Services, Openshift, Heroku, Node.js (Javascript), MongoDB

Role overview: Responsible for architecting, extending, and maintaining the core API service that powers Wirkn's job search and recruitment platform across Android, iOS, and web. Upheld industry best practices: unit tests, Scrum, gitflow, code reviews, pair-programming, post-mortems at the end of each sprint. Performed devops and load-testing. In charge of developing a chatbot (Kik & Facebook) to help users find part time jobs in their area.

Interesting challenges: The chatbot I developed had to withstand heavy load; I wanted to find a way to realistically load test it. The bot was modeled as a state machine: users would transition from state to state based on the commands they would write in the chat box. I used the Locust load testing tool (Python) to simulate a user traversing this state machine. I assigned each edge a weight based on the probability that a user would take that action. I simulated a series of workloads in which many users were traversing the state machine simultaneously and plotted the results.

Open Source Experience

LUNA - 2014 -

  • A lightweight HTTP Server written in Node.js
  • I wanted to write a Node.js web server from scratch (using only the `http` and `fs` modules) in order to better understand what happens under the hood of more-complex frameworks such as Express.js

Flyte - 2015 -

  • Makes it easy to work with the HTML5 canvas element.
  • An interactive object model on top of the canvas element. A lighter-weight, boiled down version of Fabric.js
  • Downloaded over 2000 times on the NPM registry.
  • Written with ES6.


Ryerson University

BSc. Computer Science

George Brown College

Computer Programmer/Analyst