Common Dev Sandbox vs. Individual Dev Boxes: The Real Tradeoff
Why shared developer sandboxes often provide better integration testing than isolated individual boxes, and how to balance developer freedom with deployment confidence.
# DEV SANDBOX STRATEGY
Let me walk you through a real-world pain point that surfaced recently in our internal Navceed setup. One of our developers was working on a seemingly routine task — modifying a page layout.
He retrieved the component from his individual developer sandbox, made the change, created a PR to the PreProd branch… and got caught by surprise.
Suddenly, the PR showed other people's changes. His reaction? "Wait — where did these come from?"
He felt like he was discovering some new complexity in the system. But if you pause and reflect, this isn't a new problem. It's just more visible with metadata types like page layouts.
📦 Apex vs. Page Layouts — It's Not Just About the Component
Let's be fair: this issue could happen even with an Apex class. If multiple people work on the same class, you'll get merge collisions too. But the probability is lower — usually one dev owns an Apex class at a time. It's typed by hand, personally familiar, and linear in structure.
But page layouts? Completely different beast.
- •Multiple people often change different parts of the same layout
- •The structure is not human-friendly
- •You don't read or write it like code — it's generated
- •So when diffs show changes, it's hard to mentally parse what's happening
So yes, the frustration is real. But it's not a problem with page layouts per se. It's a problem with the workflow — specifically, how we're retrieving components and where we're retrieving from.
🧱 The Developer Sandbox Dilemma
Let's talk about developer sandboxes.
It's tempting to think: "Why not just give everyone their own dev sandbox?" That way, people won't see others' changes. Clean diffs. Clean PRs. Right?
Well… not quite.
Even if your feature branch looks clean because it only includes your changes, there's a hidden trap.
Let's say:
- •A big feature with 10 components went to
main
last week. - •Now a KTLO ticket comes in, asking you to tweak just one of those 10 components.
You retrieve it from your individual dev sandbox, make your change, and raise a PR. But wait — your dev sandbox doesn't have the other 9 components from that earlier feature.
Your diff might be accidentally wiping out parts of the layout or object config that others added.
And worse: you won't even know it unless someone else catches it in code review — which doesn't always happen.
🔄 The Back-Retrofitting Nightmare
This is where the real time loss begins.
To avoid the issue, you now need to back-retrofit your dev sandbox from main
:
- •Pull in the other 9 components
- •Ensure you're working on the latest full state
- •Test locally
- •Then make your change and raise the PR
Now imagine doing that over and over again, across multiple KTLO tasks. Just to be sure your "tiny change" doesn't nuke something critical.
It's not just about diff size — it's about confidence.
And even then, you're assuming your retrofitting is "just in time." But Salesforce metadata isn't that isolated. Objects fire triggers, layouts hide/show fields based on dependencies, etc. The interference risk is real.
So now we've lost the very thing we wanted to preserve with individual dev boxes: speed and confidence.
Of course, you might think: "Why not just refresh dev boxes on a set schedule?"
In theory, that sounds reasonable. But practically, it's a challenge that deserves its own deep dive. Many things can get in the way of regular refreshes:
- •In-flight development work — What happens to the code someone's actively working on?
- •Recreating test data post-refresh — All your carefully crafted test scenarios are gone
- •Refresh frequency — Too often disrupts work; too infrequent defeats the purpose
- •Coordination overhead — Scheduling around everyone's sprints and deadlines
The logistics alone make scheduled refreshes difficult to sustain in practice.
🧠 The Hidden Value of a Common Dev Sandbox
Here's the realization that finally clicked:
By using a common dev sandbox, you're implicitly baking in integration.
You don't need a separate "integration env." You don't have to manually retrofit or wonder if your sandbox is behind.
Because:
- •Your unit tests now include everyone's changes
- •You discover conflicts early
- •You avoid ghost diffs and surprise deletes
- •You move faster and safer, even if you lose a bit of experimentation freedom
You're not running separate tests. You're running unit + integration in one shot — naturally, by virtue of shared context.
But of course, we're not naive about the messiness this can introduce. That's why we've prescribed a diff process in VS Code that devs are expected to follow for each component they touch — before raising a PR.
This means:
- •You manually diff what you retrieved from the dev box vs. what's currently in main
- •You review each component line-by-line for anything unexpected
- •You consciously curate the changes that should go into your feature branch
It's not fun, but it's real. And it's better than blindly pushing a diff full of surprise deletions.
🧪 But Don't Kill Developer Freedom
Yes, we lose some flexibility. You can't just try weird things in a common box without affecting others.
So what did we do?
We introduced a Dev Play sandbox.
- •It's meant for sandboxed experimentation
- •It's not wired into the CI/CD flow
- •It expires and refreshes every 30 days
- •You can try risky changes, explore new features, or just test something messy
This preserves creative freedom without compromising the integrity of your real Dev environment.
✍️ Final Reflection
For now, this is the big takeaway:
Don't blindly follow a developer sandbox strategy just because it feels clean. A shared sandbox with tight hygiene often gives you true test coverage — not just on paper, but in behavior.
And that's worth more than any idealized isolation offered by individual dev boxes.