Introduction
About Me

00 /             

About Me

I’m a software engineer in Billings, Montana. I live with my beautiful wife, Johnna, our two children, and our supremely spoiled dog, Lily.

I’m an engineer, veteran, and founder. I take pride in my work and consider software both an art and a science. I believe in practicing craftsmanship, pursuing equity, rewarding merit, and supporting a free and open internet and uncensored access to information.

Highlights

01 /           

The Highlights

Throughout my career, I’ve solved a diverse array of problems across different industries, scales, and constraints.

Professional Engineering
 0years
Managing Technical Teams
 0years
US Military Service
0years

My career began as an electronics technician in the US Navy, where I built a strong foundation in technical thinking and leadership, enabling me to deliver excellence on every project. Since then, I’ve worked at a multinational defense company, a Google Ventures-funded startup, and a boutique software agency. I’ve also worked as an independent contractor and, in 2016, cofounded an angel-funded software company. In each role, I’ve operated at different operational scales and faced unique constraints.

In most of these roles, I’ve also been trusted to lead small technical teams, bring focus to ambiguity, and clearly communicate technical concepts to non-technical stakeholders.

2003
US Navy
2013
Serco Inc.
2015
Webgrain Inc.
2016
Robot Snacks Inc.

Some of the projects I’ve worked on:

I’ve had the privilege of working on a variety of projects in the web software space. Some of the most interesting projects are highlighted below. I’m not done yet, though. The most interesting projects are still ahead.

Web Content Management System

Designed and built a TypeScript and Node.js content management system featuring a GraphQL API and React server-side rendering, supporting enterprise customers with 20,000+ page websites optimized for Web Vitals and dynamic content management.

  • TypeScript
  • React
  • Node.js
  • MongoDB
  • GraphQL
  • Elasticsearch
  • Kubernetes
  • Varnish

Image Processing Services

Built image-processing and caching microservices using sharp and libvips to provide synchronous and asynchronous processing of user-uploaded images, with support for cropping, rotating, resizing, and filtering, and output formats including WebP, PNG, JPEG, and GIF, via a RESTful API.

  • TypeScript
  • Node.js
  • REST
  • sharp
  • libvips
  • Varnish
  • GCloud Storage
  • AWS S3
  • Redis

React Webpage Builder

Built a TypeScript and React drag-and-drop website editor specifically for non-technical users to create and manage website content. It also included a built-in Monaco-based HTML, JS, and CSS code editor, enabling power-user customers to have full code-editing capabilities on their websites.

  • TypeScript
  • React
  • Styled Components
  • Monaco Editor

IoT API and Data Processing

Developed a RESTful API and a server-side application for collecting, processing, and indexing IoT sensor data. This project required close collaboration with hardware engineers to minimize data usage, maximize device battery life, and reduce cellular and satellite data costs.

  • PHP
  • Laravel
  • PostgreSQL
  • AWS EC2
  • AWS S3
  • AWS SNS

What’s next?

I’m currently seeking a new full-time software engineering role. I’m interested in working on projects that are challenging and that make a difference in the world. If my background and skills sound like a good fit, please reach out on LinkedIn.

Skill Set

02 /          

My Skill Set

I’m a full-stack software engineer and I’ve worked with a wide range of languages, technologies, and frameworks.

My core skill set is TypeScript, Node.js, and React, but I’ve worked with a wide range of other languages, technologies, and frameworks. I believe in using the best tool for the job, and sometimes that means learning a new language or framework, but not always.

Programming Languages
  • TypeScript
  • JavaScript
  • Go
  • Rust
  • Zig
  • Python
  • C
  • PHP
  • Bash
Infrastructure and CI/CD
  • Kubernetes
  • Helm
  • Github Actions
  • GCloud Build
  • Jenkins
  • Pulumi
  • Ansible
UI Paradigms
  • React
  • Angular
  • Svelte
  • Web Components
DBMS, Search, and Caching
  • PostgreSQL
  • MongoDB
  • MySQL
  • Elasticsearch
  • SQLite
  • Redis
  • Varnish
Runtimes
  • Node.js
  • Deno
  • Bun
Clouds
  • GCP
  • AWS
  • Azure
ORMs, Testing, and Libs
  • Prisma
  • Drizzle
  • TypeORM
  • Webpack
  • Vite
  • Rollup
  • AI SDK
  • AJV
  • Zod
  • Jest
  • Vitest
  • Playwright
  • Cypress
  • Tailwind CSS
  • Shadcn UI
  • Material UI
  • Chakra UI
Philosophy

03 /           

My Philosophy

I’ve learned many lessons in software engineering over my career, some the hard way. These are some of the principles I practice that I’ve found the most difficult to learn or the most pernicious in the industry.

01The code is the easy part.

It’s so easy that an LLM can do it. But writing code has never been the hard part. The hard part is understanding the problem the code is solving, the context in which it’s being used, and the constraints of the system it’s being used in.

It’s also easy to write bad code, for both humans and LLMs. It’s the engineer’s job to ensure that whatever code is produced, whether by humans or machines, is correct and maintainable.

02Complexity is the enemy and makes code feel difficult.

As in every system, complexity leads to fragility, instability, and failure. If a system is too complex to describe, it’s too complex to reason about, maintain, and evolve.

If the code feels hard, it’s probably because the system is too complex.

03Software is for people.

While machines may write code, they don’t use it. People use software to solve problems and achieve their goals.

There are definitely intermediate steps where machines talk to each other, but ultimately all software is written to serve humans and solve real problems in the real world.

04Use the best tool for the job, unless you can’t.

There’s usually a best tool for the job. If you can, use it. But sometimes you can’t, and other times you shouldn’t.

Sometimes the best tool performs only marginally better than the next-best tool, but at a greater-than-marginal cost. It’s the engineer’s job to determine the cost-benefit trade-off.

05Avoid reinventing the wheel.

If you think the wheel is broken, it’s probably because you don’t understand how it works or you misunderstand the problem it’s meant to solve.

Too often, engineers are dissatisfied with a tool or library and decide to build their own, only to find themselves converging on the same solution as the original.

06Sometimes, you should reinvent the wheel.

Very occasionally, you should reinvent the wheel or throw it out entirely. Unlike actual wheels, software evolves over time, can become obsolete, or can grow so complex and ugly that it’s easier and more cost-effective to start over.

But usually, you really shouldn’t.

07Perfection is the enemy of progress.

Nothing is, or ever will be, perfect. There is always room for improvement and optimization. We must accept imperfection in the name of progress, because perfect software has never been shipped.

Perfection is the natural predator of the software engineer. We should fear its pursuit as our ancestors feared bears.

08Embrace abstraction.

Abstraction is the foundation of the natural world and of software. Systems function by abstracting away the details of the underlying implementation.

Just as a hammer is made of steel, a crystalline lattice of atoms, we can only use the hammer effectively if we ignore its constituent parts.

Background

04 /           

My Background

I wrote my first line of code in 1997, when I was twelve. The internet was spelled with a capital “I,” and America Online CDs littered every supermarket checkout lane. I was homeschooled for most of my primary education, so what I lacked in peer interaction, I made up for with computer time.

At seventeen, I decided to join the US Navy. I spoke only with Navy recruiters and never considered any other branch of service. Why would I be drawn to the Navy after growing up in a landlocked state? I have no idea. But there was something impressive about the massive, imposing presence of a Navy ship, and I think I wanted to be part of it. So once I graduated from high school, I was on a plane headed to boot camp.

My Time in the US Navy

I served for eight years in the US Navy, advancing to First Class Petty Officer (E-6). I deployed twice during the Global War on Terrorism (GWOT) at my first duty station aboard USS Bunker Hill (CG-52). At sea, I served as an air search radar, navigation, and communications technician. As I advanced, I became the CE-03 Work Center Supervisor and led the team responsible for maintaining, troubleshooting, and repairing that equipment.

During my tour aboard the USS Bunker Hill, I received two Navy and Marine Corps Achievement Medals and earned the Enlisted Surface Warfare Specialist, Officer of the Deck, and Combat Systems Officer of the Watch qualifications.

My second duty station was at US Third Fleet Headquarters (COMTHIRDFLEET), where I served as a Leading Petty Officer and communications technician. The Vice Admiral and staff at COMTHIRDFLEET oversaw all US Navy assets from the US West Coast to the International Date Line. My role was to ensure that the staff (and the admiral personally) maintained uninterrupted communications with those assets and with the chain of command above Third Fleet.

I was awarded the Navy and Marine Corps Commendation Medal and a Navy and Marine Corps Achievement medal for my service at COMTHIRDFLEET.

Transitioning to the Software Industry

After I separated from the US Navy, I decided to pursue a degree in Computer Science. I was fortunate to be accepted into the Computer Science program at the University of California, San Diego (UCSD).

While attending UCSD, I worked as a Network Engineer at Serco, Inc., a large multinational defense and government services company. At Serco, I designed the wireless and telehealth networks for the new US Naval Hospital Guam, which was under construction. I traveled to Guam several times during construction to verify and configure the systems I designed, and later for final acceptance testing by the US Navy.

Because I’m a glutton, I also worked as a freelance web developer while attending UCSD. I built many websites and web applications for small businesses across the San Diego area and back home in Montana.

Moving Back to Montana

After graduating from UCSD, I decided to move back to Montana. Webgrain Inc., a web design agency I freelanced for, was based in Billings and offered me a position, which I accepted. At Webgrain, I worked on a variety of projects ranging from boutique websites to migrating the company’s infrastructure to AWS.

Some of Webgrain’s customers were prolific web publishers and event websites that faced serious challenges with existing systems for managing their websites’ content (mostly WordPress and a plethora of plugins). These systems simply didn’t provide the flexibility small and medium-sized online publishers needed to rapidly publish different kinds of content to their websites in appealing presentations that were easy to monetize.

That market gap led Jessica Baldwin, one of the partners at Webgrain, and me to start our own company to build a SaaS solution that would give online publishers an easy-to-use website platform, allowing them to publish any kind of content in any format and monetize it however they want.

Cofounding Robot Snacks, Inc.

Jessica and I founded Robot Snacks to build Cardsetter, a website platform for small and medium-sized publishers that could scale with their content and offer them new, flexible ways to present and monetize their work. It had to be powerful enough for websites with tens of thousands of pages, and easy enough for an intern to use.

We pitched our startup at Early Stage Montana (now called Scaling Montana) and were accepted into their inaugural Startup Accelerator. This experience was invaluable and led to us closing two rounds of investment with an angel investment group and other private investors in Montana.

We’ve made several pivots over the years with Cardsetter. We’ve built, operated, rebuilt, and grown the product to serve hundreds of customers, many of whom fit the exact target market we set out to serve, and many who do not. The one constant throughout the product’s evolution has been solving new and different challenges across software, user experience, marketing, and business.