sudo README

My thoughts on software, security, and leadership. Oh, and motorcycling.

Reading List

Some of my favorite articles along with their ChatGPT-produced summaries.

Thinking in Systems Summary

Ideas are easy. Execution is everything. Objectives and Key Results (OKR), popularized by Intel, Google, Dropbox, LinkedIn, Slack, Spotify, and...

Measure What Matters Summary

Ideas are easy. Execution is everything. Objectives and Key Results (OKR), popularized by Intel, Google, Dropbox, LinkedIn, Slack, Spotify, and...

When in Doubt, Iterate Faster

Iteration speed is crucial to startup success. Companies tend to add processes and get slower as they grow. You must actively combat this tendency...

How High is Your Technical Debt's Interest?

Moving fast is a crucial competitive advantage. However, this speed is sometimes translated to "ship as fast as possible and only fix the mess you create...

SQS Best Practices

Best practices for working with AWS's simple queue service (SQS).

Getting MMS Working on GrapheneOS With Google Fi

Solve "MMS delivery failure; please contact Google Fi Support", "Account access only" and "Your SIM card couldn't be read" errors on GrapheneOS with Google Fi.

Why I Quit Drinking

On my son's first birthday, I stopped drinking with the goal of reassessing after four months. I get asked why a lot. Here's the answer.

Death to (Synchronous) Standups

It's up to each team to decide if an async standup is right for them. Make sure the benefits of synchronous standups outweigh these costs.

OpenAPI Spec-First API Development

Recent APIs I've built follow both the OpenAPI (formerly known as Swagger) and JSON:API specs. The former allows us to generate server-side data models and A...

Rust: First Impressions

Scala is great for recent microservices I've written, enabling incredible velocity. However, certain scenarios benefit from lower-level languages. I have fi...

Running Linux GUI Apps in Docker on Mac

Run Linux apps in Docker on Mac using an X Window system to avoid cross compiling dependencies or to sandbox an app.

Git Fundamentals

Git can seem overwhelming, but while performing typical day-to-day tasks, you'll use only about ten commands. Here they are.

Scala Best Practices

Rather than using random examples from Scala projects in the wild, these are meant as my evolving "best" way of doing things.

Scala Learning Resources

Like any new technology, Scala and its ecosystem take a while to master and can be frustrating at times. Don't get discouraged! Here are some resources to he...

Kotlin: First Impressions

I played around with Kotlin recently and was pretty impressed. It seems like they took the best parts of C#, Scala, and Go. Here's a quick rundown of some fe...

Scala: The Good Parts

Scala allows you to accomplish tasks in different ways. I recently gave a talk explaining some of the more readable, maintainable approaches while attempting...

When IntelliJ Loses Its Mind, Run This

Occasionally, IntelliJ goes haywire and won't run your project or tests. Next time this happens, close IntelliJ, run the script below in your project directo...

Use a Script to Call It a Day

One of the cons of working from home is deciding when enough is enough. It's all too easy to get sucked into a problem, lose track of time, and let hours sli...

Serverless Webhooks Talk

In March, Dwolla updated its webhooks to a serverless architecture, improving their timeliness, configurability, cost and reliability. Watch the talk I gave ...

Hashing vs Encryption

Encryption is a two-way function. You can encrypt data, like a file, and then later decrypt it provided you have the proper encryption key. This is useful wh...

Go Learning Resources

I've only dabbled with Go in my spare time, but compiled this list of resources I found helpful. Getting Started Take A Tour of Go brew update && brew inst...

Show Low to Flagstaff, I Dropped the Bike

The long way through Apache-Sitgreaves National Forest looks like a good one as I'll be riding Pine tree-lined highway all day. I'm meeting two friends, the ...

Santa Fe to Show Low in the Snow and Rain

It's in the low 30s and snowing when I wake up in Santa Fe. I put on my warmest clothes including a scarf I bought 14 years ago at a ski resort in New Zealan...

Del Rio to Big Bend, The Wild West

Waking up in Del Rio, I haul my stuff down to the bike, drop my key card in the motel office, and grab a half cup of coffee. It's been sitting for a while an...

Houston to Austin Where I Rest My Bike to Bike

The sixth day starts like the last few, I wake up in a strange room and it takes me a second to remember which town I'm in. This Airbnb has a dorm-style setu...

New Orleans to Houston with Most of My Stuff

I wake up in New Orleans with every intention of staying a second night. I've never been downtown and Brad says he'll show me around. I sleep in and lazily c...

My Tentative Route Across the Country

I dismissed the idea of renting a motorcycle for this trip early on because it's expensive. I rented one for a visiting friend last year and the total for on...

Motorcycling Across America

Who doesn't love a good adventure? There's something fascinating about submerging yourself in new experiences and leaving the comfort of routine. Like my fir...

Prime Factors Kata in Scala

I like running through the Prime Factors Kata when learning a new language to help uncover the language's power. I've done this before in Clojure and now it'...

Test Before > Test After

By now, I hope we can all agree that unit tests are a good idea. I recently gave a presentation on why I think testing before writing production code (TDD) i...

Android Development: Casino Strategy v2.0

The first feature I wanted to add after I published v1.0 was the ability to change between Blackjack strategy cards by swiping rather than selecting from a m...

Prime Factors Kata in Clojure

I'm learning Clojure and thought doing the Prime Factors Kata would be a good way to dive in. For those unfamiliar with the Kata: > Write a static method pr...

Farewell to John Deere

Copied below is the e-mail to my John Deere coworkers. It's a bittersweet goodbye, but I'm excited for my future with Dwolla. After 6 years, I'm leaving Joh...

SOLID Principles to Code By

Uncle Bob's book Agile Software Development, Principles, Patterns, and Practices calls out 5 principles that aid greatly in Test-Driven Development and make ...

Android Development: Casino Strategy v1.0

Maybe it's because I'm listening to The Lean Startup, but I decided to create a minimum viable product (MVP) as the first version of my app. I went with the ...

Diving into Android Development in Java/Eclipse

I've always wanted to write a smartphone app and finally got the kick I needed from a coworker. The decision for OS was between iOS and Android. I hardly con...

Setting Linux System Time, Date, and Time Zone

Embedded systems sometimes require setting the system time, date, and time zone. On Linux, there are two clocks. The first is a hardware clock that is typica...

Command-Line Mercurial

I started using Mercurial, a distributed source control management tool similar to Git, about two years ago. I began interacting with it using TortoiseHg, a ...

Linux Bash Aliases

Bash aliases are essentially keyboard shortcuts or abbreviations for longer command sequences. If, for example, we include alias lm="ls -l | more" in ~/.bash...