惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
K
Kaspersky official blog
T
Tenable Blog
Hacker News: Ask HN
Hacker News: Ask HN
S
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
The Exploit Database - CXSecurity.com
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Last Watchdog
The Last Watchdog
P
Privacy International News Feed
W
WeLiveSecurity
Know Your Adversary
Know Your Adversary
T
Threatpost
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Project Zero
Project Zero
www.infosecurity-magazine.com
www.infosecurity-magazine.com
人人都是产品经理
人人都是产品经理
V
Vulnerabilities – Threatpost
Scott Helme
Scott Helme
小众软件
小众软件
Application and Cybersecurity Blog
Application and Cybersecurity Blog
AWS News Blog
AWS News Blog
AI
AI
博客园 - 聂微东
Webroot Blog
Webroot Blog
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
爱范儿
爱范儿
F
Fortinet All Blogs
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
I
InfoQ
H
Heimdal Security Blog
N
News | PayPal Newsroom
Google DeepMind News
Google DeepMind News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Visual Studio Blog
Spread Privacy
Spread Privacy
SecWiki News
SecWiki News
Google Online Security Blog
Google Online Security Blog
雷峰网
雷峰网
Attack and Defense Labs
Attack and Defense Labs
腾讯CDC
宝玉的分享
宝玉的分享
C
Cybersecurity and Infrastructure Security Agency CISA
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic

Sophie Alpert

There are no lossless transformations of natural-language text I don’t want AI agents controlling my laptop Materialized views are obviously useful TODOs aren’t for doing Everyone is wrong about that Slack flowchart Hire me to empower and upskill your eng team How React Changed the Web Forever: A Documentary Fast and maintainable patterns for fetching from a database React Conf: “Building a Custom React Renderer” Why review code? Metrics by proxy Yak shaving and fixing Voice React Conf: “React Today and Tomorrow” Why we host conference talk dry runs React Podcast: Inside React Type errors with inference need stacks Observable programming React 16: an API-compatible rewrite Hi, I’m trans. Initializing on the main thread using dispatch_once A near-perfect oninput shim for IE 8 and 9 Using React to speed up the Khan Academy question editor What I did at Khan Academy, 2012 edition Preventing XSS attacks when embedding JSON in HTML Rolling back to an old revision in Mercurial (like git reset)
Deconstructing “services”
Sophie Alpert · 2025-12-16 · via Sophie Alpert

I think when people talk about breaking things into “services”, it’s often a conflation of three different concepts:

  • Hard interface boundaries (code organization)
  • Independent code release cadences
  • Isolation of compute resources

The first is typically what’s most important for keeping a large codebase maintainable; having clean interfaces helps make code easier to reason about and easier to change parts of. Services can be nice because it’s a lot harder to stick to a hard rule of “no, you really must not import my private method” if there’s a network boundary in the way — but if you are reasonably disciplined with a strong linting strategy then you can achieve this goal no matter how your code is deployed.

Having a single deploy cadence is often convenient in a monolith-ish codebase, but if you want to decouple the deploy timings, services aren’t the only answer: you can also make internal packages with strong interfaces and deploy more quickly or less quickly than changes to their callers’ code, even if they end up in a single binary.

Finally, separation of compute. I’ve even seen several cases where the same exact code is deployed to multiple services that receive different traffic patterns. This can be nice to avoid one noisy neighbor hogging resources from other work, to provide stronger failure isolation, for different hardware requirements, to be thoughtful about data locality (e.g., it can be helpful to colocate a cache with code that uses it), to have more control over server lifetimes, and probably more that I’m not thinking of right now. But this alone doesn’t solve the other two at all! And of course there are costs — sometimes large ones — to turning function calls into network calls.

I find it helpful to be specific about which (or which combination) of these goals is the desired result when discussing splitting things out, to be precise about what we’re solving for at any given time. The details often matter and it’s easier to talk about them if we’re specific about what benefit we’re trying to get.