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

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

https://git.sr.ht/~jship/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)