The All-Too-Common Justification for Microservices
Why is this DesignPatterns Architecture meme funny?
Level 1: Follow the Leader
Imagine you’re playing follow-the-leader on the playground. There’s a big kid (let’s call them Nick) who does a super complicated trick – they hop on one foot, juggle two balls, and spin around all at once – because that’s what works for Nick in a special situation. Now, you’re much smaller and you just wanted to have fun playing a simple game. But suddenly, you start doing exactly what Nick did, copying the whole complicated routine. It doesn’t make much sense for you, and pretty soon you’re tangled up and frustrated, maybe even on the verge of tears because it’s so hard. When someone asks, “Why are you doing all that?,” the only answer you have is, “Because Nick did it!”
In this meme, a company is like that little kid copying the big kid. Netflix (the big kid in tech) built their system in a very complex way to handle a really huge job. Other companies sometimes try to copy Netflix’s approach just because Netflix is successful, not because they themselves need all that complexity. It’s kind of silly – like using a giant hammer to crack a tiny nut just because you saw a builder use that hammer on a big construction project. We find it funny (and a bit sad) because the only reason given is basically “the cool kid did it, so we do it too,” which isn’t a good reason at all. It’s a reminder that just following the leader without thinking can lead you into doing things that are way more complicated than you need, making everyone confused and unhappy, just like the poor kid on the bench who realizes the idea doesn’t actually make sense for them.
Level 2: Microservices vs. Monolith
Let’s break down what’s going on in simpler terms. The meme’s joke is about software architecture choices – specifically, something called microservice architecture – and blindly copying industry trends. In a nutshell, a monolithic application (monolith for short) is like one big unified program that does everything. All the features and components are built together and run as a single unit. By contrast, a microservice architecture means building an application as a collection of many smaller, independent services (microservices) that talk to each other, usually over a network. Each microservice is designed to handle one specific piece of functionality (for example, one service just for user accounts, another just for the search feature, another for handling payments, etc.). These services often communicate through APIs (like web requests).
Why do people use microservices? One reason is scalability: if one part of your application (say, the search feature) suddenly needs to handle a lot more users, you can scale that part separately by adding more servers for just that service, without having to scale the entire app. Another reason is organizational: if you have a very large engineering team, splitting into microservices lets different teams own different services and deploy changes independently – this can speed up development for huge projects. Netflix, for example, famously moved to microservices so that each aspect of their streaming platform (user profiles, recommendations, video encoding, etc.) could be managed and improved by separate teams working in parallel. This helped them deploy updates and new features quickly, even as they grew to serve millions of users around the world. Each microservice could even be written in a different programming language if it made sense, and they could be updated one at a time without shutting down the whole system. That flexibility and resilience is why microservices became popular for large-scale systems.
However, microservices also introduce a lot of complexity – and that’s what the meme is really pointing out. If you only have a small application or a small team, building many microservices can be overkill (unnecessary complexity). Imagine you have a simple app that could run as one program, but instead you break it into 10 separate programs (services). Now, whenever those parts need to work together, they have to communicate over the network. This means dealing with things like network delays, messages not arriving, or one service being down and the others having to handle that gracefully. It’s much simpler in a monolith: a function in one part of the code can just call a function in another part directly (in the same process, using the same memory). In microservices, that function call might become an HTTP request to another machine somewhere – which is 1000x slower and can fail in new ways. So you’d need to set up retries, timeouts, and error handling for those calls. You also need to deploy and manage 10 applications instead of 1, which means more work in terms of DevOps (setting up servers or containers for each service, monitoring each one, etc.). If each microservice has its own database for its data, then your data is spread out – a simple query might require asking multiple services and combining the results, which is more complicated than just joining tables in one central database.
Let’s clarify some terms from the meme and context:
- Netflix: In tech discussions, Netflix is often cited as a model example of success with microservices. They had a monolithic system long ago, but as they grew, they broke it into hundreds of microservices. They even open-sourced a lot of their tools for this. So, Netflix has become kind of a poster child for microservice architecture done right at massive scale.
- “Because Netflix does it”: This phrase is highlighting an attitude sometimes seen in tech – doing something just because a famous company is doing it. It’s a form of copying without analyzing if it fits your situation. This is what we call cargo culting (or cargo cult architecture): mimicking the behavior of successful companies without adopting the underlying practices or understanding. It’s like seeing a winning sports team always wears red socks, so you believe wearing red socks will make you win, without practicing the sport.
- Over-engineering: This means designing a solution that is far more complex or advanced than what is actually needed to solve the problem at hand. In our context, using microservices for a simple application can be seen as over-engineering. It’s like using an industrial factory machine to crack a nut – sure, it works, but it’s unnecessarily complicated for that small task.
- ArchitectureTradeoffs: In any design, especially software architecture, there are pros and cons. Microservices trade off simplicity for flexibility and scalability. The meme implies that some teams are making that tradeoff without a good reason (they likely don’t need to handle millions of users or constant deployments yet).
- DistributedSystems: A fancy term for systems where components are on different networked computers and have to communicate. Microservices fall into this category. Distributed systems are inherently more complex because of issues like network failures, data consistency across multiple systems, etc. Netflix’s system is a distributed system; a simple app running on one server is not (it’s just local).
- TechHypeCycle: This refers to the lifecycle of new technologies: at first, a new idea (like microservices) is introduced and there’s excitement around it (hype), everyone talks about it as the next big thing. Then people try it everywhere, sometimes in situations where it doesn’t fit, and reality sets in – the limitations and challenges become apparent, leading to some disappointment or backlash. Eventually, people find a balanced understanding of where the technology is actually useful. The meme hints that microservices went through this hype cycle – it was the hot buzzword, some teams jumped on it just due to the hype, and now many are realizing it’s not a one-size-fits-all solution.
To illustrate the difference between a monolith and a microservice approach, consider a simple feature like showing a user’s profile page with their information and their list of orders:
- In a monolithic application, you might have one codebase and one database. Getting the data might look like this in pseudocode:
# Monolithic approach (single service):
user = database.query("SELECT * FROM Users WHERE id = 123")
orders = database.query("SELECT * FROM Orders WHERE user_id = 123")
profile_page = render_template("profile.html", user=user, orders=orders)
Everything happens within one application and one database, so it’s fairly straightforward – two queries and you have all the data you need.
- In a microservices architecture, the user data and order data might live in separate services and databases, perhaps managed by different teams:
# Microservices approach (multiple services):
user = requests.get("http://user-service.local/api/users/123").json() # call User Service
orders = requests.get(f"http://order-service.local/api/orders?user=123").json() # call Order Service
profile_page = render_template("profile.html", user=user, orders=orders)
Here, instead of direct database calls, the code calls out to two different services over HTTP or an API. Those services in turn talk to their own databases (e.g., user-service might have a Users DB, order-service its own Orders DB). This works, but now the profile page request depends on two network calls. If user-service is down or slow, the profile page will fail or hang. If the network is having issues, we might not get the data in time. Each service might be easier to maintain individually, but coordinating them adds complexity. In a real system, you’d have to add timeouts, retries, maybe some caching to make this robust – things that a monolith wouldn’t need to worry about as much for an internal function call.
So, what’s the meme’s message? It’s basically a light-hearted way to say: Don’t use microservices just because they’re trendy or because a big company does it. Use them if and when they make sense for your project. If your app is small and your user base is modest, a simple monolith might be perfectly fine and actually easier to manage. There’s even a saying in the industry: “Don’t microservice your monolith” – meaning don’t break something simple into a bunch of complicated pieces for no good reason. The meme shows a child asking “Why?” – which is the obvious question – and not getting a logical answer. That’s a sign that the decision might be driven by hype rather than a real technical requirement.
Level 3: Cargo Cult Architecture
For seasoned engineers, this meme hits a nerve by highlighting an architecture anti-pattern: cargo cult architecture. The term “cargo cult” comes from an analogy where people mimic the superficial aspects of something successful without understanding the underlying reasons. Here we have a team adopting a MicroserviceArchitecture just because a tech giant like Netflix did, not because it suits their own problem. The first panel proudly declares, “WE USE MICROSERVICES,” as if it’s a badge of honor or a magic spell for success. The child’s innocent “WHY?” in the second panel is the perfectly reasonable question any experienced architect would ask – “Why do we actually need microservices for our project?” – and the final answer “BECAUSE NETLIX [Netflix] DOES IT” delivers the punchline. It’s misspelled in the image (“Netlix”), which somehow makes it even more on-the-nose: the reasoning is not just shallow, it’s a bit sloppy – they can’t even spell Netflix right, yet they’re copying its architectural strategy. This is the epitome of hype-driven decision making in tech. Everyone’s heard stories of a CTO returning from a conference all excited about what the cool kids (Netflix, Google, Amazon) are doing, then mandating a shift to some trendy architecture without aligning it to the company's actual needs. This meme distills that collective industry eye-roll into a simple bench conversation.
Why is this so funny (or painful) to those in the know? Because many of us have lived through the mess that over-engineering creates. Microservices are often justified by very real needs: independent deployability of features, scaling different parts of an application separately, enabling large teams to work in parallel without stepping on each other’s code – essentially solving problems of scale, both in terms of traffic and organization. Netflix, for instance, deals with millions of users streaming globally, with hundreds of developers working on different parts of the system. Splitting into microservices helped them isolate functionalities (recommendation engine, user profile, streaming service, etc.), deploy updates daily, and remain resilient (one service failing shouldn’t down the whole site). But there’s a catch: doing microservices right demands significant engineering maturity and tooling. Netflix didn’t just break their app into tiny pieces; they also built an entire ecosystem to manage those pieces – think of things like automated deployment pipelines, sophisticated monitoring/alerting, a robust service discovery system (Netflix’s Eureka), load balancers, fallback mechanisms, and the famous chaos testing (e.g., Chaos Monkey randomly turning off servers to ensure the system can survive failures). In other words, Netflix paid a heavy investment to mitigate the complexity they introduced.
Now contrast that with a small team or a new startup that has, say, one tenth or one hundredth of Netflix’s scale. If they adopt microservices just because it’s trendy, they often end up with all the downsides and few upsides. A veteran developer reading the meme can practically hear the postmortems already: a half-dozen little services, each one perhaps easy to code in isolation, but collectively a nightmare to deploy and maintain without Netflix-level infrastructure. Suddenly, simple tasks require crossing network boundaries multiple times. What used to be an in-process function call is now a web request to another service. The team might not have invested in centralized logging or distributed tracing, so debugging an issue is like detective work: “Service A says the user ID was valid, but Service B threw an error – where did it go wrong?” A common joke in these circles is that microservices didn’t actually reduce complexity; they just distributed it (often onto the network and operations). It’s like sweeping dirt under the rug – the floor looks clean, but now the lump under the carpet trips you up.
The meme’s bench scene with the crying kid can be seen as a metaphor for the development team itself. Initially, management proudly proclaims “We use microservices” (the adult boasting to the child). Then engineers – especially those with experience – ask “Why?” because they suspect there’s no strong technical reason. When the only answer is “Because Netflix does it,” those engineers (like the child in the meme) might internally start to panic or cry, anticipating the trouble ahead. They know they’re now stuck maintaining dozens of separate deployables, writing boilerplate code for each service (database connections, health checks, etc.), handling API versioning between services, dealing with network timeouts and retries – all the fun of distributed systems without a clear need. It’s a classic case of ArchitectureTradeoffs gone wrong: the team accepted huge trade-offs (complexity, latency, DevOps burden) to gain benefits they might not even require (like theoretical scalability for millions of users, or the ability to deploy 50 times a day when they only release once a week).
This pattern of copying architecture from tech giants is often jokingly called “Not Google/Amazon/Netflix/Twitter Syndrome” – as in, “You Are Not $TechGiant, so don’t do what they do, because you don’t have their problems (or resources).” The IndustryTrends and hype cycles push technologies like microservices, Kubernetes, or serverless into the spotlight, and many companies jump on the bandwagon (TechHypeCycle in action). The meme points out the folly of this bandwagon effect. It resonates with senior devs who’ve heard various versions of “We have to use ___ because [Big Company] uses it” before. Often, those stories don’t end well. Perhaps the project got over-engineered and slowed down development dramatically. Or maybe the system became so fragile from needless complexity that it failed more often than the old simple design. In the worst cases, the company burns time and money on infrastructure and staffing (you suddenly need specialized DevOps and SRE skills to manage microservices at scale) instead of delivering business value.
To be clear, microservices can be great – when they solve a real problem. But using them as a status symbol or a tick-box because “that’s what cool tech companies do” is an anti-pattern. The meme humorously exposes that logic, and any engineer who’s sat through a meeting where higher-ups justify tech decisions with “But $FamousCompany does it” will likely chuckle (or cringe). It’s also poking at our industry’s tendency to chase silver bullets. Today it’s microservices because Netflix does it; yesterday it was adopting a NoSQL database because Facebook did; tomorrow it might be splitting into 1000 serverless functions because Amazon wrote about it. The scene of the adult consoling the crying child perfectly captures the aftermath: “Yes, I know it doesn’t make sense for us, but we’re doing it anyway.” There’s both comedy and tragedy in that image for anyone who’s been in those trenches.
Level 4: Partitioning Paradox
At the extreme end of technical depth, microservices turn a software system into a full-blown distributed system. This means the moment you break apart a monolithic application into network-connected services, you enter the realm of distributed computing theory. And with that comes the infamous CAP theorem (Consistency, Availability, Partition tolerance). In a microservice architecture, you can’t magically have all data always consistent and always available at the same time once network partitions or failures occur – you must choose your trade-offs. For example, a user’s data might be eventually consistent across services: one service might update an account record, and another service reading it a second later might still see the old data. Why? Because in a distributed setup, information takes time to propagate and you often prefer keeping the system running (availability) over locking everything down for perfect synchronization (consistency). High-scale systems like Netflix carefully design around these theoretical limits: they choose where to tolerate inconsistency, how to handle partitions gracefully (like using regional caches or fallback logic), and which parts absolutely must be consistent. The humor in the meme is rooted in the idea that a team might blindly adopt this complex distributed paradigm without understanding these theoretical constraints. Essentially, they’re inviting the paradoxes of CAP theorem and the headaches of network unreliability into their project simply because “Netflix does it.”
Deep in the weeds of distributed systems, there’s also the eight fallacies of distributed computing – classic misunderstandings that new architects might have, such as “the network is reliable,” “latency is zero,” or “bandwidth is infinite.” When a team copies a hyperscaler’s architecture without the same expertise, they often stumble over these fallacies. A call that was a simple in-process function in a monolith is now an RPC or REST call over the network that can fail or slow down. The meme’s scenario implies that no one asked “What about network latency, or what if Service A can’t reach Service B?” – those questions are the ones Netflix’s engineers deeply understand, using techniques like exponential backoff, circuit breakers (Netflix’s OSS tool Hystrix is a famous example), and bulkheads to contain failures. A blindly copied microservice setup might not account for these, leading to cascading failures when one tiny service crashes. In theoretical terms, the system’s reliability becomes the multiplicative product of each service’s reliability. If you have 10 services each with 99% uptime, the end-to-end request might only succeed about:
$$ 0.99^{10} \approx 0.904 \text{ (90.4%)} $$
roughly 90% overall success – yikes! In other words, more microservices = more points of failure, a concept an experienced distributed systems engineer painfully understands. So, adopting microservices because it’s trendy, without mathematical and architectural rigor, is like willfully stepping into a complexity avalanche. The deep irony tickling senior engineers here is that such a team is taking on all these hard distributed systems problems – consensus, data consistency, fault tolerance, idempotent retries, distributed tracing – not out of necessity, but out of a cargo-cult mindset. It’s as if someone saw a complex equation on a board and decided to use it to do basic arithmetic because it looked cool.
Description
This is a three-panel meme using a scene from the movie 'Finding Neverland'. In the first panel, a young boy with a tearful expression looks up and says, 'WE USE MICROSERVICES'. In the second panel, a concerned-looking man (Johnny Depp) asks, 'WHY?'. The final panel shows the man comforting the crying boy on a park bench, with the caption, 'BECAUSE NETFLIX DOES IT'. The meme satirizes the 'cargo cult' mentality in software development, where teams adopt complex architectural patterns like microservices not because it solves a specific problem they have, but because a successful tech giant like Netflix uses them. For senior developers, this is a deeply relatable critique of hype-driven development, which often leads to unnecessary complexity, creating a 'distributed monolith' that is harder to manage, deploy, and debug than a simple, well-structured monolith would have been
Comments
18Comment deleted
The best part of 'doing microservices because Netflix does' is when you end up with a distributed monolith that has all the latency problems of a distributed system and all the deployment coupling of a monolith. It's the worst of both worlds, now with more YAML
Love how a CRUD app with 12 concurrent users gets split into 60 microservices - nothing like swapping a couple of if-statements for eventual consistency and a shiny “Platform” job title
Nothing says 'we're a 10-person startup' quite like implementing 47 microservices, 3 service meshes, and distributed tracing because you read about Netflix's architecture handling 200 million concurrent users - now your todo app takes 12 seconds to load and requires a PhD in distributed systems to debug a simple null pointer exception
Ah yes, the classic 'Netflix does it' justification - because clearly your 5-person startup handling 100 requests per day has the exact same architectural constraints as a company serving 200+ million subscribers across 190 countries with thousands of engineers. Nothing says 'sound technical decision' quite like adopting distributed systems complexity, network partition handling, eventual consistency challenges, and operational overhead multiplication when your entire dataset fits in Postgres on a t2.medium. But hey, at least your architecture diagram will look impressive in that Series A pitch deck, right before you spend six months debugging why your 'user service' can't talk to your 'authentication service' and your deployment pipeline takes 45 minutes because you're orchestrating 23 containers for what used to be a Rails monolith
“We use microservices because Netflix does” - the fastest path from a monolith to a distributed monolith: no bounded contexts, a service mesh of silos, and p99s that buffer longer than the shows
Copying Netflix’s architecture without their org chart and error budget just turned our three squads into 60 services, two meshes, and one very expensive distributed monolith
Netflix's microservices thrive on chaos engineering and infinite SREs; ours thrive on 'it'll be fine' deployments
What is it Netlix? Comment deleted
netbsd + lix.systems /j Comment deleted
it's freebsd Comment deleted
i work at netflix btw btw Comment deleted
worked Comment deleted
Give me free subscription Comment deleted
close your agenda department Comment deleted
smh my head Comment deleted
when use freebsd cuz netflix does it :) Comment deleted
Netlix Comment deleted
i did not know netflix used freebsd… Comment deleted