At Shopify, we have tens of thousands of partners building on our APIs that depend on us to ensure our merchants can run their businesses every day. In April of this year, we released the first official version of our API. All consumers of our APIs require stability and predictability and our API versioning scheme at Shopify allows us to continue to develop the platform while providing apps with stable API behavior and predictable timelines for adopting changes.
We spend about $3 million every year to run all the versions of Basecamp and our legacy applications. That spend is spread across several on-premise data centers and cloud operations. It does not include the budget for our 7-person strong operations team, this is just the cost of connectivity, machines, power, and such.
This week, I wanted to clue you in to 12 different "health indicators" or "benchmarks" that I use when consulting to evaluate the overall health of a Rails application. For each one, I'll share a little bit about how I came up with it, what it means, and how you can fix it if you're scoring poorly on it.
A number of customers have contacted me with a common problem:
"We run a multi-tenant system where our users can perform an action which results in a huge number of jobs being enqueued. When this happens, other users see significant delays in their jobs being processed while our Sidekiq cluster works through the backlog for that one user."
This is the 7th part of a series of blog posts about Shrine. In this part we will dive deeper into Shrine’s eager processing feature, showing some interesting use cases that are possible thanks to its advanced API.
This is the second post in a series about asynchronous collaboration. By asynchronous, I mean “people on the team not always working at the exact same time.” This can occur when teams occupy different locations and different time zones.
The money premise: we’re in this for the money. In software, money comes from shipping more value faster. TDD is the fastest current way to do that, regardless of the particular kind of value we need, as long as getting that value means changing layered branching logic.