Full stack developer with 20 years of experience creating content for the web, building everything from the back-end server architecture and database design to the page layouts and dynamic front-end interactions. I have constructed sites of all sizes, from single page applications to large multi-page cross-domain CMS engines and e-commerce storefronts. Since 2010 I have worked fully remote from my home office in San Diego, California as both a team member and as a team leader.
Queryize is a chainable query builder for MySQL on NodeJS. Built to serve as a lightweight alternative to full ORM stacks, Queryize makes it easy to construct complex queries programatically, while using bound parameters for proper data escapement. The website for QueryizeJS is an online API reference generated from JSDoc comments in the Queryize source code itself.
My own blog is a static site built using a custom written gulp.js process. Multiple gulp plugins work in congress to build the markdown, less and handlebars template files that make up the source material, compiling them all together into static content served by GitHub Pages.
In early 2016 I explored creating a web driven IRC client structured in the same manner as the Slack team communication service. The goal was to create an IRC client that would be as easy and pleasurable to use as Slack in order to encourage open communities to use public protocols instead of a siloed forum. The application was built in a multi-tiered architecture in order to enable easier scaling and redundancy. I chose to built it around the Freenode IRC network as a single gateway in order to simplify the user experience. Unfortunately privacy requirements by the Freenode network required a restructuring of my data management, and the project stalled. Bugs and a lack of available time led me to shutdown the site after 10 months.
I was hired by the V2 development team to help with application scaling and architectural concerns as the company's product demands increased. Within the company I served as a driving force in migrating to newer technologies and teaching more maintainable development techniques via regular training sessions.
I was instrumental in efforts to modernize and clean up the codebase, introducing the use of Backbone and Handlebars to simplify our front-end logic, and adding NodeJS into our back-end development stack in order to drive real-time pieces of the application, including a websocket powered real-time order pipeline. I also introduced the team to d3.js for creating dynamic visualizations of our application data, and trained my teammates in its use. I spearheaded the addition of an ElasticSearch data caching layer in order to facility faster search within our site.
Fullstack developer on the content operations team, maintained the internal applications used to review new content submitted for sale and manage existing content in Shutterstock's library of stock images and video. This involved front-end JS development in Backbone and React front-ends built on top of a Service Oriented Architecture of NodeJS and MySQL.
While working at Shutterstock I built and launched three new API services, two RabbitMQ workers, created a MySQL database library that is now used by four different teams, constructed a Selenium driven mid-level integration test suite, and helped to maintain two NodeJS powered web apps.
When I departed Synacor I was serving as a team leader on the version three total rewrite of the product, built on a Java backend using Service Oriented Architecture. I created the front-end framework for loading Backbone Views dynamically using hooks in the HTML, and a Grunt driven LESS compile process for selectively aggregating component css.
This position was fully remote from my home in San Diego, communicating with my team members in Buffalo, New York via company chat and Skype. Synacor has a strong unit testing policy (PHPUnit, Jasmine and QUnit) and uses Agile project management.
While working at Abtech I wrote a desktop application for rapid processing of available inventory. The app took input from barcode scanners and processed it into csv files that could be later merged and rapid checked against our inventory database. This app replaced a complicated process of entering serial numbers into Excel spreadsheets, increasing the efficiency of our auditing process by 30%.