In my previous post, "Getting Started With Your Own Software Company," I wrote about some of the personal discoveries about one's limitations that one discovers after making the leap to entrepreneurship.
If you feel the reason that you are lazy is that your current work doesn't motivate you; you'll probably find out that you are still lazy even on your own at which point you may wonder if your fatigue level is due to lack of exercise or diet. Working on your own presents you initially with an unprecedented sense of control, yet you then realize that you have little control over the world and over yourself.
Joel's answer is to keep doing a little bit each day, "motion." This is the same sort of conclusion that I came up independently. When I am out of my programming mood, I do the easiest possible task, or I accomplish a non-programming chore that I have put off for weeks such as full backups. I continue to do the easiest little tasks until I tire. These tasks do themselves take time and ultimately accumulate to a substantial amount of work. It is either that or the fact that small tasks have a disproportionate impact on the sense of progress, because it is often the number of tasks done not the difficulty of the tasks performed that influences perception.
This echoes another comment from a recently read blog article, the author of which I cannot recall. Good programmers get off their butts. Typically, programmers won't write code until they have resolved some design issues, but in the process time can go by with very little advancement in the design. Productive developers will write some code, even if the design is vague, because software development is an iterative process.
I believe that much of this is what extreme programming is based on. Extreme programming limits the amount of design work done before the coding process, but, in actuality, writing unit tests before development replaces the design stage. The use of pair programming also forces programmers through peer pressure to develop code.