The Process Failed You, Not the Other Way Around
You're three weeks into a two-week task, nothing has closed, and you've started to suspect the problem is you. It probably isn't. It's that you were handed something with no edges, and you can't finish what has no edges. Here's how to give it some.
There's a specific kind of stuck that feels like a personal failing. You're deep into a piece of work, you've been "almost done" for a week and a half, the ticket has quietly become a swamp, and every day you sit down expecting to close it and every day you don't. Somewhere in there the story you tell yourself shifts from "this is hard" to "I am slow."
I've been in that exact hole, and I've watched good developers sit in it convinced they're the problem. They almost never are. What actually failed is upstream of them: the work arrived as one giant undifferentiated blob with no natural place to stop, and a blob has no done. You can't be behind on a thing that was never cut into finishable pieces. So before you grind harder, fix the shape of the work.
A blob has no done
The core problem with "rebuild the thing" or "fix the performance" or "modernize the module" is that none of them contain a definition of finished. There's no line you cross where the ticket closes on its own terms. So you work, and it improves, and it's still open, indefinitely, because nothing about the task tells you when to stop.
That open-endedness is what rots morale. It isn't the difficulty, it's the absence of a finish line, because a task with no finish line reads as failure every single day it's still open. The fix is not to work faster. It's to carve the blob into pieces small enough that each one has an obvious, checkable done, so that closing things becomes possible again.
Spike before you commit
Before carving anything, though, resist the urge to start guessing at pieces. Spend a fixed, boxed amount of time, an afternoon, a day, poking at the thing specifically to find where the real cost and risk actually live. A spike, throwaway on purpose, aimed at learning not shipping.
The reason is that your intuition about where the hard part is will usually be wrong, and building a plan on a wrong guess is how a two-week estimate becomes a two-month one. The spike replaces the guess with a finding. Now you know the bottleneck is the serialization, or the one query, or the coupling in that module, and you can carve pieces around the real problem instead of the imagined one.
Small enough to close in a sitting
Then break it down, and use a hard rule: if you can't finish a piece in roughly a sitting, it's still too big. Cut again. A ticket you can open, close, and move on from in a day gives you two things a blob never will, a real signal of progress and a place to stand.
This isn't busywork or ceremony. Each closed piece is a checkpoint you can't fall behind past. If piece four goes sideways, pieces one through three are still done and still solid, and you're debugging one small thing instead of an entire tangled month. Small tickets aren't about looking organized. They're about shrinking the size of the thing that can go wrong at any one time.
Then just run the loop
With pieces that can close, the work becomes a loop instead of a slog. Instrument the thing so you can see what it's actually doing, analyze where the real cost is, fix that one piece, and repeat. Measure, don't guess, at every turn, because the whole reason you were stuck was building on guesses.
Each pass through the loop closes something. That's the difference. Instead of one long open wound of a task, you have a sequence of small closeable ones, each leaving the system measurably better and provably done, and the "am I slow" feeling quietly evaporates because you can point at what you finished this week.
The rebuild that taught me this
I relearn this every time I rebuild one of my own projects. On a from-scratch rebuild of a game with a lot of moving parts, the pull is always to treat it as one heroic blob, disappear for a month, and resurface with everything. Every time I've given in to that, I've come back with a mountain of half-finished work and no idea which part actually mattered.
The times it went well, I did the unglamorous version. Spike to find the real bottleneck. Carve the smallest closeable piece. Put it in front of real use. Watch what broke. Fix it. Close it. Next. The blob version builds the thing you guessed at in week one. The loop builds the thing you learned you actually needed by week four, and you're never once "three weeks into a two-week task," because there was never a two-week task, only a stack of one-day ones.
If you're stuck right now, don't start by blaming your pace. Look at the shape of what you were handed. If it has no edges, that's the bug, and it's a fixable one. Give the work a finish line and the stuck feeling usually turns out to have been a process problem wearing your name.