{
"path": "/3mdgo5qfhss2y",
"site": "at://did:plc:yltnuhmi5446q5gixfz277lu/site.standard.publication/3mbm2gtkoz225",
"tags": [],
"$type": "site.standard.document",
"title": "Beware the Pit of Success lined with razor wire",
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"id": "019bfb39-30bd-7884-b14e-0eee7be8bf27",
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.blockquote",
"facets": [],
"plaintext": "I’ve often said that a well-designed system makes it easy to do the right things and annoying (but not impossible) to do the wrong things."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 62,
"byteStart": 0
},
"features": [
{
"uri": "https://blog.codinghorror.com/falling-into-the-pit-of-success/",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "https://blog.codinghorror.com/falling-into-the-pit-of-success/"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Pits of success are great! In the ideal world, it should be trivial for someone to pick up a tool and start using it to do complex things, maybe even without reading the instructions."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Part of this is choosing good defaults. If your defaults are predictable, practical, and unsurprising you're in good shape!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Part of this is good API design. If you have to tell users \"You're holding it wrong,\" that's a surefire sign your API design needs some help."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "The problems arise when behavior is unpredictable, if overriding defaults is tedious, and there are easy ways to do wrong things."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Take serverless compute, which exploded in popularity over the last 10 years. For simple use cases, it works great. Infinite scalability! Fewer memory leaks! But if you need"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "a persistent cache"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "filesystem access"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "websockets"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "long-running processes"
},
"children": []
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "you're going to need an extra service to handle that. Complexity balloons. "
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Meanwhile, a single long-running server can handle all of those with aplomb, and has far more predictable usage patterns."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Cloudflare's developer platform addresses these problems really well, answering each with"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Workers KV"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "R2 object storage"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Durable Objects"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Containers"
},
"children": []
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "More complexity, yes, but all under the same umbrella, so it's easier to recognize and manage."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "I wouldn't call this the \"Pit of Success\" though, because it's still easy to do the wrong thing, and these specific solutions to these problems aren't always obvious, especially to a newcomer. You kinda have to know about the whole Cloudflare platform ecosystem to be able to properly take advantage of it."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 110,
"byteStart": 56
},
"features": [
{
"uri": "https://alexanderson.leaflet.pub/3mddpezr7uc2g",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "Maybe that's a good thing though? If a platform or tool forces its users to be intentional about their choices, which by necessity means understanding the tradeoffs of those choices, perhaps it will result in a better designed, more thoughtful, more successful end product."
}
}
]
}
]
},
"publishedAt": "2026-01-27T21:08:43.072Z"
}