339 lines
15 KiB
HTML
339 lines
15 KiB
HTML
---
|
|
title: "Resume"
|
|
date: 2023-09-13T15:08:12-07:00
|
|
draft: false
|
|
---
|
|
<section class="content">
|
|
<h1>Resume</h1>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="#work-experience">Work Experience</a>
|
|
</li>
|
|
<li>
|
|
<a href="#education">Education</a>
|
|
</li>
|
|
</ul>
|
|
|
|
<h3 id="work-experience" class="anchor">Work Experience</h3>
|
|
</section>
|
|
|
|
<!-- Meta -->
|
|
<div class="columns is-mobile mb-0">
|
|
<div class="column is-narrow pr-1">
|
|
<img src="/img/meta.jpg" width="32" height="32" alt="Meta company logo">
|
|
</div>
|
|
<div class="column pl-1">
|
|
<h4 class="subtitle mb-0">Software Engineer <small class="has-text-grey">@ Meta</small></h4>
|
|
<p>
|
|
<small>Mar 2023 - Present | Portland, OR (Remote)</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="content smaller ml-5">
|
|
<p>
|
|
Supernatural was <a href="https://www.latest.oculus.com/blog/within-to-join-meta/" target="_blank">acquired by Meta</a>
|
|
in March 2023 to bring our VR application in-house as a first-party Oculus studio.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
I helped spearhead the data migration effort (along with a few other senior engineers) to adapt Supernatural's
|
|
database and API servers into Meta's infrastructure (rewriting back-end services from Python into Hack).
|
|
</li>
|
|
<li>
|
|
<strong>Technologies:</strong>
|
|
<i class="fab fa-python"></i> Python (Flask, SQLAlchemy); <i class="fab fa-js"></i> JavaScript (Vue.js);
|
|
<i class="fab fa-php"></i> Hack (like PHP); Graph API; GraphQL; several proprietary internal tools for CI/CD,
|
|
issue management, code review, etc.
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Supernatural -->
|
|
<div class="columns is-mobile mb-0">
|
|
<div class="column is-narrow pr-1">
|
|
<img src="/img/supernatural.jpg" width="32" height="32" alt="Supernatural company logo">
|
|
</div>
|
|
<div class="column pl-1">
|
|
<h4 class="subtitle mb-0">Principal Software Engineer <small class="has-text-grey">@ Supernatural</small></h4>
|
|
<p>
|
|
<small>Oct 2018 - Mar 2023 | Los Angeles, CA</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="content smaller ml-5">
|
|
<p>
|
|
Within rebranded to Supernatural named after the Oculus VR app of the same title after finding a
|
|
market fit with that application.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
I helped build out the back-end Python API server for Supernatural and its deployment pipeline on
|
|
AWS Elastic Beanstalk <small>(and later in <abbr title="Amazon Elastic Kubernetes Service">EKS</abbr>)</small>.
|
|
</li>
|
|
<li>
|
|
I extended the Within CMS to support managing content & data for Supernatural before forking
|
|
the CMS into a dedicated app for Supernatural.
|
|
</li>
|
|
<li>
|
|
I built an internal Music Curation tool <small>(named Wormhole)</small> to help the content team
|
|
identify and manage licensed music to use with the app. It provided a user interface to peruse
|
|
the massive volume of music data delivered to us by our partner labels (sent in <abbr title="Digital Data Exchange">DDEX</abbr> feed
|
|
format). Behind the web app was a pipeline of Python worker scripts that ingested the DDEX feeds
|
|
and handled licensing updates and metadata sync (with Spotify and Music Reports, Inc). Wormhole
|
|
was backed by a Mongo DB which was the best fit for the loosely structured music data we were working with.
|
|
</li>
|
|
<li>
|
|
<strong>Technologies:</strong>
|
|
<i class="fab fa-python"></i> Python (Flask, SQLAlchemy); <i class="fab fa-golang"></i> Go;
|
|
<i class="fab fa-js"></i> JavaScript (Vue.js); <i class="fab fa-github"></i> GitHub;
|
|
<i class="fab fa-docker"></i> Docker; MongoDB; PostgreSQL; Redis; AWS
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Within -->
|
|
<div class="columns is-mobile mb-0">
|
|
<div class="column is-narrow pr-1">
|
|
<img src="/img/within.jpg" width="32" height="32" alt="Within company logo">
|
|
</div>
|
|
<div class="column pl-1">
|
|
<h4 class="subtitle mb-0">Senior Software Engineer <small class="has-text-grey">@ Within (Virtual Reality)</small></h4>
|
|
<p>
|
|
<small>Apr 2017 - Mar 2023 | Los Angeles, CA</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="content smaller ml-5">
|
|
<p>
|
|
I joined Within back when their primary product was a <abbr title="Virtual Reality">VR</abbr> 360° video
|
|
streaming platform <small>(with multiple web & native apps)</small>, where videos were published via hand-edited JSON
|
|
files (unique format per platform) and there were no dynamic web apps within the company. Within had ambitions to create a
|
|
"Lobby" app for you & your friends to hang out in VR and join multiplayer "interactive experiences" together.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
I built out a Python microservice architecture that included an Authentication service (centralized
|
|
user accounts for the Lobby app) and a Matchmaking service to coordinate multiplayer VR games. I also
|
|
created a custom Push Notification service (written in Go) to target our desktop apps and website,
|
|
which did not have a native push mechanism like Android or iOS do.
|
|
</li>
|
|
<li>
|
|
I built a Content Management System (CMS) in Python to consolidate and automate the content
|
|
publishing pipeline for the 360° VR streaming platform. I studied the various legacy JSON config
|
|
formats (for the Android, iOS, PS VR, web player, and Unity stand-alone VR player apps) to determine
|
|
the commonalities and data requirements to translate into a relational (PostgreSQL) database and
|
|
CMS platform.
|
|
<ul>
|
|
<li>The video transcoding pipeline was based on <code>ffmpeg</code> via a third party API called Hybrik.</li>
|
|
<li>The CMS also managed Unity asset bundles and content publishing for our VR interactive experiences.</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<strong>Technologies:</strong>
|
|
<i class="fab fa-python"></i> Python (Flask, SQLAlchemy); <i class="fab fa-golang"></i> Go;
|
|
<i class="fab fa-js"></i> JavaScript (Vue.js, Photon); <i class="fab fa-github"></i> GitHub;
|
|
<i class="fab fa-docker"></i> Docker; ffmpeg; PostgreSQL; Redis;
|
|
<abbr title="Amazon Web Services">AWS</abbr> (Elastic Beanstalk, S3)
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Media Temple -->
|
|
<div class="columns is-mobile mb-0">
|
|
<div class="column is-narrow pr-1">
|
|
<img src="/img/mediatemple.jpg" width="32" height="32" alt="Media Temple company logo">
|
|
</div>
|
|
<div class="column pl-1">
|
|
<h4 class="subtitle mb-0">Software Developer <small class="has-text-grey">@ (mt) Media Temple</small></h4>
|
|
<p>
|
|
<small>Dec 2015 - Apr 2017 | Culver City, CA</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="content smaller ml-5">
|
|
<ul class="mt-0">
|
|
<li>
|
|
Built out Python microservices (Tornado framework) to translate between Media Temple and parent company
|
|
GoDaddy's systems (for example, a Payments service that ran within a secure server on GoDaddy's infrastructure
|
|
and was called out to from legacy Perl apps at Media Temple).
|
|
</li>
|
|
<li>
|
|
Helped maintain and add new features to a legacy Perl codebase (including the Account Center web app).
|
|
</li>
|
|
<li>
|
|
<strong>Technologies:</strong>
|
|
<i class="fab fa-python"></i> Python (Tornado);
|
|
<img src="/images/perl.png" width="12" height="12"> Perl (Template::Toolkit, Moose);
|
|
Puppet; RabbitMQ; cgit; Atlassian FishEye & Crucible.
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- ZEFR -->
|
|
<div class="columns is-mobile mb-0">
|
|
<div class="column is-narrow pr-1">
|
|
<img src="/img/zefr.jpg" width="32" height="32" alt="ZEFR company logo">
|
|
</div>
|
|
<div class="column pl-1">
|
|
<h4 class="subtitle mb-0">Software Engineer <small class="has-text-grey">@ ZEFR</small></h4>
|
|
<p>
|
|
<small>May 2013 - Dec 2015 | Venice, CA</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="content smaller ml-5">
|
|
<ul class="mt-0">
|
|
<li>
|
|
Built out a Python/Flask web app called <abbr title="Brand ID">BrandID</abbr> that provided search and
|
|
notifications for brand managers regarding YouTube. The idea was that if a video was about to go
|
|
viral about your brand, you should hear about it from us first. <small>(We had code that would deeply crawl
|
|
YouTube daily and make predictions based on view counts and trends detected).</small>
|
|
</li>
|
|
<li>
|
|
Also built out a free-to-use, consumer facing app called BrandID Pulse where users could input topics
|
|
they're interested in and get daily digest e-mails of new and trending videos that match their interests.
|
|
</li>
|
|
<li>
|
|
Helped build out an advertising platform that helped match advertisers to specific YouTube videos that
|
|
we detected are about to go viral. <small>(On Google's ad platform, you can either target general demographics
|
|
or you can target specific Video IDs, but the latter feature is rarely used because it was tedious and unpredictable;
|
|
ZEFR's product helped match advertisers to specific videos relevant to their brand that were detected to be going
|
|
viral, e.g. the same data that powered BrandID).</small>
|
|
</li>
|
|
<li>
|
|
Upgraded several codebases from Python 2 to 3;
|
|
</li>
|
|
<li>
|
|
<strong>Technologies:</strong>
|
|
<i class="fab fa-python"></i> Python (Flash, Celery); <i class="fab fa-js"></i> JavaScript (jQuery, Knockout.js, Angular, MEAN stack);
|
|
<i class="fab fa-github"></i> GitHub; MongoDB; PostgreSQL; Redis; Amazon Web Services (EC2, S3, SQS, SES, Elastic Beanstalk, RDS);
|
|
HTML/CSS (Bootstrap); <i class="fab fa-docker"></i> Docker; Jenkins
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- DreamHost -->
|
|
<div class="columns is-mobile mb-0">
|
|
<div class="column is-narrow pr-1">
|
|
<img src="/img/dreamhost.jpg" width="32" height="32" alt="DreamHost company logo">
|
|
</div>
|
|
<div class="column pl-1">
|
|
<h4 class="subtitle mb-0">Senior Hosting Developer <small class="has-text-grey">@ DreamHost</small></h4>
|
|
<p>
|
|
<small>Feb 2012 - Apr 2013 | Los Angeles, CA</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="content smaller ml-5">
|
|
<ul class="mt-0">
|
|
<li>
|
|
I helped maintain and add features to web apps written in Perl (using a custom <abbr title="Object Relational Mapper">ORM</abbr>
|
|
and templating system for server-side rendered pages) and HTML/JavaScript (jQuery).
|
|
</li>
|
|
<li>
|
|
Projects included work on the customer Control Panel, report automations for financial & marketing,
|
|
and integration for customer sites and <i class="fab fa-cloudflare"></i> Cloudflare.
|
|
</li>
|
|
<li>
|
|
<strong>Technologies:</strong>
|
|
<img src="/images/perl.png" width="12" height="12"> Perl;
|
|
<i class="fab fa-javascript"></i> JavaScript;
|
|
Chef; RabbitMQ; cgit.
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Fonality -->
|
|
<div class="columns is-mobile mb-0">
|
|
<div class="column is-narrow pr-1">
|
|
<img src="/img/fonality.jpg" width="32" height="32" alt="Fonality company logo">
|
|
</div>
|
|
<div class="column pl-1">
|
|
<h4 class="subtitle mb-0">Software Engineer <small class="has-text-grey">@ Fonality</small></h4>
|
|
<p>
|
|
<small>Jun 2008 - Feb 2012 | Culver City, CA</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="content smaller ml-5">
|
|
<ul class="mt-0">
|
|
<li>
|
|
Maintained and contributed features for a customer control panel (written in Perl) for
|
|
Asterisk <abbr title="Private Branch Exchange (Business telephone system)">PBX</abbr> servers
|
|
(running a custom CentOS-based operating system branded as PBXtra and Trixbox).
|
|
</li>
|
|
<li>
|
|
One project had me port our PBXtra OS to newer Dell server blades after our OEM discontinued
|
|
the model we were selling. PBXtra was based on the (already outdated) CentOS 4 which lacked hardware
|
|
drivers to support the new blades. I troubleshooted and created new installation ISOs that slipstreamed
|
|
an updated Linux kernel and CD-ROM driver to function on these newer servers.
|
|
</li>
|
|
<li>
|
|
Worked on an HTML5 web front-end for Fonality HUD (an in-house softphone and productivity tool that
|
|
showed online/call status of your co-workers and managed chat and calls).
|
|
</li>
|
|
<li>
|
|
<strong>Technologies:</strong>
|
|
<img src="/images/perl.png" width="12" height="12"> Perl (Template::Toolkit, Moose);
|
|
<i class="fab fa-javascript"></i> HTML/JavaScript (jQuery in some places, mostly vanilla JS, AJAX);
|
|
<i class="fab fa-asterisk"></i> Asterisk; MySQL; Linux (CentOS)
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Liquid Web-->
|
|
<div class="columns is-mobile mb-0">
|
|
<div class="column is-narrow pr-1">
|
|
<img src="/img/liquidweb.jpg" width="32" height="32" alt="Liquid Web company logo">
|
|
</div>
|
|
<div class="column pl-1">
|
|
<h4 class="subtitle mb-0">Linux Systems Administrator <small class="has-text-grey">@ Liquid Web</small></h4>
|
|
<p>
|
|
<small>Jan 2008 - May 2008 | Lansing, MI</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div class="content smaller ml-5">
|
|
<p>
|
|
The job description was tech support and tech support at a web hosting company is synonymous with
|
|
systems administration. A large portion of our customer base ran Linux servers (CentOS). My aim was
|
|
to get hired as a software developer but as I had no prior work experience they started me out in
|
|
support.
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Helped customers debug issues with their Apache config, managed cPanel installations,
|
|
reading exim logs, and wrote custom Perl scripts to help me troubleshoot their e-mail
|
|
servers and other such tasks.
|
|
</li>
|
|
<li>
|
|
After a couple months I transitioned to the software dev team and worked on some internal
|
|
tools and the customer control panel written in Perl.
|
|
</li>
|
|
<li>
|
|
<strong>Technologies:</strong>
|
|
<img src="/images/perl.png" width="12" height="12"> Perl (Template::Toolkit, POE);
|
|
<i class="fab fa-javascript"></i> HTML/JavaScript (jQuery); CVS version control;
|
|
MySQL; Linux (CentOS)
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<section class="content">
|
|
<h3 id="education" class="anchor">Education</h3>
|
|
|
|
<h5 class="mb-0">ITT Technical Institute</h5>
|
|
<p class="smaller">
|
|
<em>Associates, Computer Network Systems</em><br>
|
|
<small>2006 - 2009 | Swartz Creek, MI | Culver City, CA | Torrance, CA</small>
|
|
</p>
|
|
|
|
<h5 class="mb-0">Flushing High School</h5>
|
|
<p class="smaller">
|
|
<small>2002 - 2006 | Flushing, MI</small>
|
|
</p>
|
|
</section>
|