It's like riding a bicycle: relearning how to work with Gems

They say it’s like riding a bicycle - once you learn, you never forget. But after nearly 8 years at Amazon, I’m discovering that muscle memory can get pretty rusty when it comes to Ruby gems and the broader open source ecosystem.

Don’t get me wrong - Amazon’s internal tooling is impressive. When you’re building systems at AWS scale, you need tools that can handle the complexity, the security requirements, and the operational rigor that comes with serving millions of customers. Internal package managers, build systems, and deployment pipelines are all optimized for that environment. They work incredibly well for what they’re designed to do.

But stepping back into the world of bundle install and gem update feels… different. Foreign, almost.

The Small Frictions Add Up

It started with something simple - updating this very blog. The middleman-s3_sync gem I wrote years ago needed some attention. What should have been a quick bundle update turned into an afternoon of reacquainting myself with dependency resolution, version constraints, and the subtle art of Gemfile management.

Inside Amazon, dependency management is largely abstracted away. The build systems handle most of the complexity, and when they don’t, there are teams of people whose job it is to resolve conflicts and ensure compatibility. You focus on your business logic, not on whether your JSON parsing library plays nicely with someone else’s HTTP client.

But in the gem ecosystem, you are that person. You’re the one making decisions about semantic versioning, evaluating the trade-offs between features and stability, and sometimes diving into someone else’s code to understand why your tests are failing after an update.

The Muscle Memory Returns

The interesting thing is how quickly it comes back. After that first afternoon of frustration, I found myself falling back into familiar patterns. Reading changelogs with a critical eye. Understanding the implications of a major version bump. Appreciating the elegance of a well-crafted API.

There’s something deeply satisfying about working with gems that embody the Ruby philosophy of developer happiness. The expressiveness, the focus on making common tasks simple, the assumption that you’re a smart person who wants to get things done efficiently. It’s a refreshing contrast to systems that assume you might break everything if given too much flexibility.

Different Tools for Different Problems

This isn’t a criticism of Amazon’s approach - quite the opposite. When you’re building infrastructure that needs to work reliably for millions of customers across dozens of regions, the constraints are different. The tooling reflects those constraints, and it should.

But working on personal projects reminds me why I fell in love with Ruby and its ecosystem in the first place. There’s a joy in discovering a gem that solves exactly the problem you’re facing. There’s satisfaction in contributing back to projects that have made your life easier. There’s learning that happens when you’re forced to understand the full stack of your dependencies.

The Value of Context Switching

Having worked in both worlds - the highly controlled internal ecosystem and the more chaotic but creative open source one - I’m grateful for the perspective it provides. Each approach has strengths that the other lacks.

Amazon’s tooling taught me the value of consistency, reliability, and operational excellence at scale. The gem ecosystem reminds me of the power of community, the importance of developer experience, and the beauty of solving problems with elegant code.

Moving Forward

As I continue to work on side projects and contribute back to the open source community, I’m trying to bring the best of both worlds together. The operational rigor I learned at Amazon, combined with the creative problem-solving and community spirit of the Ruby ecosystem.

It really is like riding a bicycle. The balance might feel shaky at first, but once you’re moving, it all comes back. And sometimes, the ride is even better than you remembered.


Have you experienced similar transitions between different tooling ecosystems? I’d love to hear about your experiences in the comments or reach out directly.

I'm Back!

A whole lot has happened since I last wrote here. I’ve been busy with work, family, hobbies,and personal projects. I’ve also dealt with some personal issues and challenges that have shaped my perspective and priorities. I’ve learned a lot about myself and...

Read More...

Moving Out of the Home Office

New Office

I was mostly on distributed teams when I worked at Sun Microsystems. Sometimes it was on a multi-site team, but more often than not I was on teams where I was one of the few, if not only, members based in Colorado. As a result, I had a well appointed...

Read More...

Cups of Coffee

coffee Image by Toshiyuki IMAI

I measure my mornings in cups of coffee.

The first one is for me. It accompanies breakfast, is savored as I read my Twitter feed and some interesting stories and helps me ease out of sleepiness into awakeness.

The second cup...

Read More...

Kubernetes Service Discovery

I am helping my client transition from a few large monoliths hosted on AWS to micro-services hosted on Kubernetes. It is my first experience with Kubernetes and I must say that I am impressed so far.

Of course, micro-services work best when it is easy...

Read More...

OpenID Connect and ID Tokens

OAuth2 is fundamentally an authorization protocol. It is not meant to be used for authentication. In general, OAuth2 based authorization services provide an end point that can be used to retrieve user profiles and identifiers. In some cases, they use...

Read More...

Signed JSON Web Tokens

Let’s continue using the analogies used in my last post and explore the JSON Web Tokens (JWT).

You hand over both your boarding pass and an identity document. The agent scans the boarding pass and examines the identity document to check it’s authenticity...

Read More...

Identity and Flying

Airport Security. Public Domain, https://www.flickr.com/photos/sixmilliondollardan/3382932556/in/photolist-69WpZo-6ovssq-4Pud5x-3yTksP-BMEB-6jdHz1-4vGox9-e8WbBd-Eq1JM-4u6cXw-f49kST-9yMyqh-2mPphB-7tQfFt-7zd55c-a6UnD2-4MZHTA-8G8fAm-8iDGiZ-b2hbhp-b636x-661hXd-459nE-acE949-kQFt6-53B2Fg-EMBoQ-b5awD-8SNYPd-8U8gQ7-6EsPiP-5YKWV9-nXRXdD-5NpqpQ-6jq1w-4FZCDR-b5axC-8UYf8L-AHptGi-5MF1mL-vBhvH-e3zcE-eNmLN9-58Vjve-96E2cA-6unyV7-7qNu4W-5588mk-bXavMg-ggg1g

Authentication and authorization are two concepts that are often mingled together. In a lot of Rails app, there is little thought given to it beyond adding devise to an app and running the generator to build the User model. In Spring based app, including...

Read More...

PhantomJS, Capybaras, and Poodles

Poodle source: https://secure.flickr.com/photos/imagesbywestfall/3452788638/in/photolist-6g7rLA-5Ly2TJ-dhgp22-7Eq65g-4L9Gkr-4L9Gkv-5MgFuL-86RKEk-a2Vhpv-54pS7t-uKNEz-2yMbx-7KkzPK-7BizcU-6fJFni-38DoTP-8smzb-rQXyi-fcDEVr-7b85h1-7Y7hwQ-dKEkPA-7AtcjM-keJ7tm-7NDCUj-dGSKFe-7kYDHP-8cXRa5-bKAgZ-5McrAk-6eCU2x-ijPiDn-9ycYtL-2rSBGq-7DRCHb-7Aniiq-7BiAts-dTdnGK-9wm9XC-dKEkb7-7tzuvX-7pSYi1-7uyoDN-dKyToP-7yA4oj-6x661Y-7nXHTq-7B9BnA-7zfV92-kSpeT/

The client that I am working with runs a web store and needed some changes made to the Spree/Paypal Express Checkout gateway to support receiving addresses from Paypal. This involves a fair amount of coordination between Paypal and Spree. It’s also...

Read More...

Page 1 of 7

Next page