The key though, is not just "making to-do lists".... it's right-sizing the items on them.
Every task should have a finite end state and (this is crucial) shouldn't be longer than 15-20 minutes or so. If they are longer than that, it almost certainly needs to be broken down into constituent tasks.
So even something like "clean my office" probably needs to be broken down a little more -- when I'm on my game I break it down into "vac office", "dust office", "organize desk drawer", etc.
This pairs nicely with the "Pomodoro method" if you've ever tried it.
It seems obvious after it being mentioned, but I noticed a useful corollary: a list of done tasks actually makes me unhappy. So I avoid todo pages where a done list is visible. Hiding done tasks (i.e. archiving done cards on Trello, deleting a row on your todo list instead of strikethrough), etc. has led me to use it better.
This isn't your problem, clearly, but just wanted to share a useful tip.
Here's a large, open-ended problem I want you to solve this quarter. I'll secretly wait while you fix a thousand other unrelated problems that make our business better despite making no visible progress on the open-ended problem. Then I'll reframe your work to show management that the thousand other things you improved are more valuable than the open-ended problem, and get you promoted.
I miss that guy.
A technique I use is to break down the project into smaller pieces. What's the smallest well-defined task/goal I can work toward. Even if it's just setting up the repo, or writing out a README. It's amazing how often this little step can help kick things off.