Resume
Summary
Developer with 10+ years of experience building flexible solutions in various industries. Diverse experience spanning enterprise backend services, embedded systems, frontend web dev, and engineering management. Strong analytical and interpersonal skills, with a passion for statically typed functional programming.
Skills
- Languages: Haskell, Bash, and C++ are my strong suits. I have prior experience and general familiarity with PureScript, C, TypeScript, Javascript, HTML, CSS, Java, C#, Python, and PowerShell/Batch.
- Paradigms: Purely functional, declarative, stream processing, reactive, event-driven, imperative, and object-oriented.
- Databases: SQL (PostgreSQL, sqlite, MySQL), NoSQL (HBase, MongoDB, RethinkDB)
- DevOps: Generally familiar with Kubernetes, VMware vSphere, Jenkins, Travis CI, AWS, Azure, Puppet, and Vagrant.
- VCS: Proficient with git. Familiar with SVN, Mercurial, and Perforce.
- Environments: macOS, Ubuntu Linux, Windows 10+, Windows Embedded Server 2009, Windows XP Embedded
- Methodologies: Kanban, scrum, pair/mob/extreme programming, waterfall
Experience
Lumi
Senior Software Engineer 2 (06/2022 to 10/2023)
At Lumi, I worked on the Haskell/PostgreSQL backend and PureScript/React frontend to connect clients in need of packaging with suppliers that produce packaging. I championed improving engineering’s observability posture by integrating structured logging and OpenTelemetry-based tracing into the backend. These efforts dramatically reduced troubleshooting time in production and became invaluable tools for each engineer. In addition, I leveraged the improved observability posture to make numerous evidence-based performance improvements to the codebase, with a specific focus on ensuring we were employing appropriate database access patterns. I used these performance improvements as opportunities to educate the team on how to use PostgreSQL from Haskell effectively by pushing as much work as is reasonable into the database.
I collaborated closely with engineering and engineering’s stakeholders on new features, including significantly reducing friction in the quote/order lifecycles and reliably capturing item price history. Along the way, I developed a planning/documentation template for new feature work that was then adopted as the team’s standard. Designing features to this template made it easy to share feature context quickly and to establish team consensus on the feature’s approach. Through multiple rounds of using this template at design time and then executing on the design, I developed a reputation with stakeholders for consistently delivering quality work on time. I invested substantial effort into offering technical guidance to my peers through constructive pairing and design/PR review. I received feedback from my manager and fellow engineers that my practices were actively elevating code quality and I was considered a go-to resource for Haskell and PostgreSQL knowledge.
SimSpace
Senior Software Engineer 2 - Backend (11/2020 to 06/2022)
By 2020, SimSpace had again grown to the point where we needed to reconsider our engineering team organization. Engineering was redivided into teams of about ten people each, but this time the team composition was cross-domain across backend, frontend, and UX. Each team had an overall lead who was supported by a technical lead for backend and a technical lead for frontend. In my new team, I took on the technical lead role for backend. This role let me focus in on honing my software architecture skills, where I collaboratively defined feature designs with UX/backend/frontend and empowered the team to execute on those designs. Some significant contributions our team made included building out a framework to unify various event models (i.e. live-action events, product-scoring events, etc), and an automated content import process.
As of early 2022, I joined a new team dedicated to software reusability. Our team focused on building libraries and components that enabled engineering as a whole to move faster. Some of our backend-specific work included externalizing feature flags to a SaaS product and refining a service intended to be the single service for all WebSocket messaging from the backend to the frontend.
Senior Software Engineer - Backend (09/2018 to 11/2020)
As of September of 2018, I had accrued more technical and non-technical responsibilities at SimSpace. As the product to deploy cyber ranges came to fruition, SimSpace began to acquire contracts with various customers. One of these customers was pivotal to SimSpace’s growth in the coming years, and at the end of 2018, I became the primary technical liaison between SimSpace engineering and this customer. I regularly attended planning sessions and demonstrated our latest software updates to this customer along with SimSpace’s CTO and Director of Engineering. I also helped define the release process for this customer, refined/executed on this process for over a year, and ensured their ops/testing teams were able to apply our releases smoothly.
By late 2018/early 2019, SimSpace engineering had grown to the point
where we needed to split into smaller teams. I began leading a team
of five other backend engineers, serving as both the technical lead
and manager for the team. During this time, our team implemented
multiple new web services, providing functionality such as a searchable
index of platform content backed by PostgreSQL full-text search and
hierarchical organizations of users backed by the ltree
PostgreSQL
extension. While working on new services, we developed and iterated on
an approach to package structure with a strong focus on modularity,
minimizing dependency footprints to keep build times short, and testing
as much surface area as possible via leveraging temporary databases. Our
approach eventually inspired the recommended architecture for greenfield
web service work at SimSpace.
Software Engineer - Backend (01/2018 to 09/2018)
In January of 2018, I started at SimSpace as an individual contributor on the Haskell backend. At this time, engineering was under twenty people, and our focus up through the summer was largely to enable users to deploy cyber ranges (large-scale realistic networks of virtual machines used to train/evaluate cybersecurity professionals) at the push of a button.
Considering engineering was so small during this period, all of us collaborated very closely with each other. This was instrumental to my development as a Haskeller, as I regularly worked with colleagues who already had years of production Haskell experience.
Catalina
Programmer/Analyst - Ad Platform (06/2016 to 12/2017)
In June of 2016, I transitioned from the In-Store team to Catalina’s ad platform team. The ad platform aimed to fundamentally redefine how Catalina operated with realtime execution via geographically-distributed cloud computing and highly flexible offer rendering. Along the way, the ad platform simplified offer setup and opened the door for omni-channel opportunities (i.e. in-store, mobile, web, home delivery, etc).
This team was structured like a startup and we each worked on all areas of the ad platform, from the backend Java codebase, the HTML5/Javascript/Less web interface, the Node.js rendering component that runs alongside the In-Store software, to the Puppet scripts that provision the infrastructure in AWS and Azure. We used scrum on a two-week release cycle and deployed all releases via Jenkins. The ad platform leaned heavily on open-source projects, in particular, the Apache ecosystem. We worked with Hbase, Solr, Kafka, Hadoop, and Hive every day.
Programmer/Analyst - In-Store System (08/2015 to 06/2016)
I continued working on the In-Store system at Catalina and became the lead developer for the In-Store production support team. In this time, I significantly improved Awards’ performance/debuggability, devised a branching model to better fit Awards development, held sessions for the team where I taught the fundamentals of git, wrote multiple utilities to enhance developer and tester productivity, established group code reviews, and was the main liaison for the team’s offshore developers.
Programmer - In-Store System (06/2014 to 08/2015)
I began at Catalina as a programmer for the embedded In-Store system. Catalina has over 30 years’ experience offering a personalized digital media network for retailers and the consumer packaged goods industry. The In-Store system, known as Awards, is a collection of over 100 C++ applications and Object REXX scripts that run unattended on Windows Embedded Server 2009 at roughly 47,000 stores around the world. Awards communicates with Catalina’s backend, the store’s POS terminals, and the store’s printers to deliver unique offers to consumers right as they check out.
As a developer on the Awards team, I primarily worked on new features via scrum. Awards has minimal system requirements, so this position once again reinforced in me the idea that performance matters. A solution to an Awards problem must work just as well in a 2-lane US convenience store as an 100-lane store in Japan.
In June of 2015, I visited Microsoft’s Redmond campus for a week-long hackathon to get Awards running on Windows 10 Embedded.
CAE USA Inc.
Software Engineer - Sensors (05/2013 to 05/2014)
At CAE, I worked in C and C++ on the radar and underwater acoustics subsystems for flight simulators and weapon systems trainers. Areas worked include target detection, landmass processing, line of sight, UDP/TCP messaging, acoustics state management, and entity prioritization schemes. I learned a great deal about performance here, much like my time at Applied Research Associates. More importantly, this job often had me interfacing directly with the US Navy to hash out requirements and demonstrate recent changes. This was critical for the development of my soft skills. Communicating, receiving feedback, and knowing when to be assertive versus adaptable are just as important in software development as writing code. I also learned the ins and outs of the waterfall methodology here.
University of Central Florida
Tutor (05/2012 to 05/2013)
While working on my undergraduate degree in Computer Science, I tutored for graduate- and undergraduate-level courses, such as Graphics Programming under Dr. Sumanta N. Pattanaik, Operating Systems under Dr. Mark Llewellyn, and Web-based Information Technology also under Dr. Mark Llewellyn. Additional responsibilities included evaluating exams and assignments.
Applied Research Associates
CS Intern (03/2011 to 01/2012)
This was my first professional dev position and taught me why performance matters, how abstraction reduces cognitive load, and that supporting multiple platforms is challenging. I wrote C++ for ARA’s SHADE product, the Shared Architecture for Dynamic Environment. The US Army uses SHADE to provide extensible dynamic environment modeling in training simulations.
Open Source
monad-logger-aeson
https://git.sr.ht/~jship/monad-logger-aeson
monad-logger-aeson
is a Haskell library for structured JSON logging over the
ecosystem’s ubiquitous monad-logger
interface. The library is used directly in
production at multiple companies and also serves as the foundation for the
Blammo
logging library.
context
https://git.sr.ht/~jship/context
context
is a Haskell library providing thread-indexed storage around arbitrary
context values. The interface supports nesting context values per thread, and at
any point, the calling thread may ask for their current context. The libary is
used in production at multiple companies and also powers the log4j2
ThreadContext
-style (or log4j
MDC
-style) feature in
monad-logger-aeson
of scoping shared log metadata
throughout blocks of code.
I gave a talk on this library at the 2020 Haskell Love conference, viewable here: https://www.youtube.com/watch?v=Ujx4a8xVOSM
s3k
s3k
is a bash
script that sits between the Haskell developer and
stack
, aiming to improve productivity when working in monorepos. It
provides concise package/target selections via extended regular
expressions and aliasing invocations.
ld-wrapper-macos
https://github.com/Happy-Ferret/ld-wrapper-macos
ld-wrapper-macos
is a bash
wrapper script around the system
ld
linker for macOS Haskellers to work around Mach-O header size
limitations imposed by macOS Sierra and later. The header size
limitations were a significant blocker for engineering at SimSpace
while we were on GHC 8.2 and this issue plagued other Haskell shops as
well. SimSpace made the original repo private sometime after we went our
separate ways, but public forks of it are still available.
Education
University of Central Florida (08/2009 to 04/2013)
- Degree: Bachelor of Science in Computer Science
- Minor: Mathematics
- Societies: Upsilon Pi Epsilon, Burnett Honors College, Golden Key International Honour Society