Monday, November 17, 2008

Distributed Denial of Service

One of the best tools in the chest of a serious procrastinator is social interruptions. Having a large assortment of "friends" that talk to you during the day allows you to stay away from important tasks. A much more powerful tool, however is the social network; if a website allows you to see the interaction between your "friends" and their "friends", the number of events grows by the square of your connections!

If you have eight connections (which is quite a conservative number), and each connection has eight connections of its own, and each connection gets at least one comment on its page from each of its connections, that's 64 updates that you can be on the lookout for --- well over one event every ten minutes during a normal work day, or more than enough to keep you from getting anything done at all.

Sunday, October 19, 2008

Waiting for Perfection

The completeness condition can be used not only for information, but also for the state of the world around you. Imagine, for example, that you've somehow gotten married, and you and your spouse want to have a child. However, there are many reasons not to do it right now...

Perhaps you're doing well at work? Having a child now may get in the way of a promotion. Better to wait until after the promotion.
Did you just get promoted? Having a child now would be a really bad idea, you need to be focused on your job until you've gotten on top of your new responsibilities.
The economy is doing poorly, or perhaps you're not doing very well at work? It would be really unfortunate if you had a child, and then got fired.
Perhaps you need to lose a few pounds before getting pregnant?
Perhaps you've always wanted to run a marathon, and you think it will be harder get in shape for it if you get pregnant first.

Anytime you can wait for things to be just right before taking an action, that action can be put off indefinitely, because things will never be just right.

Monday, September 1, 2008

The Completeness Condition

One of the best ways to procrastinate is to find something that can block you from doing what you should be doing. If, for example, you want to avoid buying a new computer, then there is a wide variety of reasons for not doing it now, all based on the reasonable demand of having complete information before committing.

  1. New Intel CPUs will come out soon. There is no point in getting a computer that will be outdated in just a few months.
  2. The new Intel chips are too expensive. Better to wait for the price to go down a bit.
  3. The new AMD CPUs are supposed to be out soon. If they are as good as people say, I'd feel foolish having just bought the Intel machine...
  4. New Intel CPUs will come out soon...
Any time you can find condition like this, you can put acting off almost indefinitely; having complete information is never possible when making forward looking decisions. Ideally you will be able avoid doing things entirely by having the window of opportunity close while you're waiting for more information.

Monday, May 26, 2008

Top Ten Reasons to Procrastinate

10. There's really no hurry, I have all week.
9. I already know what to write. Typing it out won't take any time at all.
8. I already have three pages. Writing the next seven will be easy.
7. I promised my friend to help him spell check his essay.
6. It's not like anyone is going to be there at midnight to check that you hand it in, anyway.
5. I have to update my facebook profile.
4. I don't need to read the book; I can just go by the class discussion.
3. I remember better if I study the morning before the test, anyway.
2. If I relax today, and go to bed early, I will be rested and can get a fresh start tomorrow.
1. I'll update my blog first.

Sunday, April 20, 2008

Don't listen to Yoda!

Don't do. Try. That way, you enter with failure as a likely outcome, allowing procrastination to take full force. You can then feel guilty about not giving it your best effort, and take solace in that while you failed, at least you didn't give it your best effort.

Don't prime the pump! Make sure to leave work with your task completely finished. That way you have to start the day by figuring out what to do next, and how to start it. Figuring out what to do next is an excellent excuse to procrastinate. Further, getting started is much easier when you're flush with success after finishing something. Starting something at that point might get your work to flow, which would significantly cut into procrastination. On the other hand, getting started both on the process of working, and on a new task, at the same time is quite overwhelming and fertile ground for procrastination.

Don't reward yourself until it's perfect. Rewarding your efforts early might reinforce the habits of starting on projects and getting outlines done. Give yourself rewards before doing work instead of after; that way you can get the reward, and then procrastinate as usual.

Don't ask for help until you're desperate. Ideally, get rescued, not helped. By not asking for help early, you can procrastinate while "trying to figure out how to do it". When you ask for help late, there's typically so little time left that the only way to help you is to take ownership of the problem. This reinforces a useful feeling of helplessness.

Don't account for eating, sleeping, recreation, health activities, commuting, social demands, shopping, errands, or any of the other things you have to do to survive. Always be unrealistic about your schedule. This way, you can make it impossible to work as many hours as you "should", making your goal unreachable and promoting procrastination. You can also punish yourself for your failure, which will lower your self esteem.

Thursday, April 17, 2008

Kill it before it's too late

Self esteem is the arch enemy of procrastination. With strong self esteem, you will most likely not procrastinate, because procrastination is an act of avoidance, and with strong enough self esteem you will not feel the need to avoid things.  Fear of criticism, one of the main allies of procrastination, can be completely demolished by strong self esteem. Confronting self esteem, and keeping it down is critical in sustaining procrastination. This can be done through some simple techniques: 
  1. Take an all or nothing attitude. By doing this, you can make sure that anything that is not a total success is a complete failure. Since complete success is so rare, you're ensured of a long string of abysmal failures, keeping your self esteem properly deflated.
  2. Internalize all criticism without question. Whenever you're given a negative assessment of any kind, add it to the repertoire of your inner critic. Never question the motives or objectivity of the person criticizing.
  3. Never forgive yourself. Following the techniques above, you will have a steady inflow of failures and flaws to deal with. By making sure to never forgive yourself, you will keep your list of mistakes steadily growing, pushing your self esteem further down.
  4. Never analyze your mistakes. When you've done something that you later regret, make sure to treat it as a character flaw, not as an unfortunate event that you can learn from.
  5. When you hurt others through your actions, never seek to atone for them. Never ask for forgiveness. If you try to atone and ask for forgiveness, you're likely to receive both that and sympathy, and you might start to forgive yourself, violating rule 3.
  6. Apply rigid rules to yourself. Rules such as "I have to be independent", "I have to get all A:s in school" or "I have to be liked by everyone" are almost impossible to live up to, and create more instances for you to fail even while you might appear to be succeeding by other standards.
  7. Make your rules mutually exclusive. That way, you can make sure to always break at least one of them. 

Tuesday, April 15, 2008

Know thine enemy

A great enemy of procrastination is task management. If tasks are broken into sufficiently small sub tasks, it becomes trivial to finish one of these smaller tasks within a small number of hours. Once tasks can be finished that quickly, it becomes possible to accurately track progress even over a single day.

Tracking progress has two unfortunate effects: first, it may induce guilt as you notice that you're not actually making progress, and, second once you do happen to complete a task it is immediately obvious that you have accomplished something. This sense of accomplishment may then lead to self esteem, and, in essence, make you addicted to finishing tasks. Forming a new habit takes only a few weeks, and by continuously tracking progress over such a short time span, you can find yourself making significant progress on your projects without negative stress; instead, you will be chasing your next goal.

If you have spent 4 minutes of a 5 minute task --- walking half a mile, say --- and accomplished nothing, then you'll most likely realize that you will not be able to accomplish your goal. However, if you've spent 4 months of a 5 month tasks and accomplished nothing, then you can still convince yourself that another day doesn't matter.

This example might appear to be somewhat disingenuous; walking a fixed distance is an activity where it's easy to track progress. If you had 5 minutes to come up with a name for your firstborn, having spent 4 minutes without thinking about it might still not instill a sense of urgency. So, it's the ability to track progress, rather than the duration of the task, that's the key. Walking half a mile can intuitively be broken into subtasks, coming up with a name on the other hand, at least superficially appears to be an atomic task.

The goal, then, is to avoid breaking up tasks into pieces that can be intuitively understood. If you cannot know that you're making progress, then there's no way of knowing that you're not making any, and procrastination can move forward unhindered.

To further promote procrastination, you want to avoid setting mile stones. Instead, use deadlines. With sufficiently fine grained milestones, you reach mile stones so often that it becomes quite impossible to lose track of progress; the pace at which work proceeds becomes obvious both to yourself and to outsiders.

Deadlines anchor progress to an arbitrary date rather than to an accomplishment, which make them strong procrastination promoters. You make "progress" by doing nothing since that brings you closer to the date when you have to be finished, and you can always pretend that there's enough time left until the deadline is reached, at which point you can almost always make up a new one. If you do meet the deadline through a heroic last ditch effort, you will be sure to procrastinate even longer the next time, to keep things challenging.

Even when deadlines are fine grained and close together, they are negative; if any single part of the project takes longer than expected, you're continuously behind, and will fail to meet future mile stones even if the remainder of the project proceeds as expected. Again, this promotes procrastination because you can easily procrastinate before you've failed to meet a deadline, and once you have failed, you can't catch up anyway, so you might as well procrastinate.

Saturday, April 5, 2008

Getting things done? Check!

As I wrote in the last entry, polling can be used to promote procrastination. Here, I'm planning to address another useful tool: Multi tasking.

Multi tasking is the art of performing multiple tasks at the same time. It has the interesting property that you're almost guaranteed to perform each task less well than you would if you had performed them one after the other.

Method 1: Cooperative multi tasking
Cooperative multi tasking works much like polling. Every so often you break off from your task to check if there's anything else that needs to be done, then do that for a while, until again checking. If there's only one task to do, you'll check and immediately get back to what you were doing. Embedded systems sometimes work like this, because it gives complete control over where things are interrupted, and can in theory give very good performance. In the real world, this can be used, for example, for talking to multiple people at the same time in a chat system. By switching slowly between them, you will be able to keep up the semblance of a conversation with a large number of people. Another example would be switching from one task to another whenever the task becomes difficult or stressful. This practically guarantees that nothing will ever get finished, and also teaches a healthy habit of avoiding difficult problems and working on easy tasks.

Method 2: Time slicing and preemption
Time slicing relies on an interrupt firing every so many "ticks", giving control to a scheduler that picks a task to run for the next "time slice". Interactive computer systems use this, with an appropriately short time quantum, to provide the illusion of performing multiple tasks at the same time. If the time quantum is too large, the illusion will not be upheld, and if too short, the overhead associated with switching tasks will dominate the real work. In modern computer systems, where locality of reference in the caches (TLBs as well as instruction and data caches) is important, switching quickly also makes the temporal locality so poor that the cache brings little benefit. The human mind, working much like the memory hierarchy in a computer, will also be made more inefficient by switching rapidly between different cognitive tasks. You can use rapid, regular switching between tasks to make sure that you never spend long enough on a task to internalize it and make significant progress.

Sunday, March 30, 2008

Polling or interrupt driven processes

A clever way of procrastinating is to defer to less important tasks only momentarily. For example, you may set your mail application to show a clearly visible sign whenever you have a new email, or get your RSS reader to display a sign when there's a new article for you to read.
In this way, you can use plentiful little unimportant tasks to block those stressful and frustrating tasks that you actually should be performing. By making sure that you're instantly alerted whenever there is an email that might require your immediate attention, and then ensuring that you have a constant stream of emails that could require attention, you will be able to turn what threatens to be productive time into something completely different.

Interrupts are often used in computer system and embedded devices that have to deal with real time demands --- either from other hardware devices, or from big squishy things such as users. Processors, which typically present a serial behavior to the user deal with these annoyances by using interrupts or polling. An interrupt driven machine has hardware dedicated to waking it up in a new state when there's something that has to be done NOW. It will then get on with handling the pesky interruption, and return to the regularly scheduled programming. Unless, of course, another interrupt happens while the interrupt is being handled. This can put the machine into a terrible state of confusion, so a common approach is to simply not allow it. Another is to allow it, but only allow more important things to interrupt, for example using interrupt priority levels. When servicing a level 1 interrupt, you might be interrupted by just about anything, whereas you would never get interrupt when running, say, a level 31 interrupt. This would be equivalent to not letting a coworker interrupt your work, but immediately responding to your manager.

Computers that don't have interrupts use polling; instead of performing useful work, they check on the state of the things that could be sending an interrupt. (Has the user pressed a key? No? What about now? No? What about now? No? ...) While interrupts superficially appear useful for the purposes of procrastination, polling is pure brilliance. By training yourself to go your email application and check for new email every so often (and then go to CNN, just in case the world is about to end, or O.J. got up to something, and then check FARK, because if O.J. didn't get up to anything, surely someone did, and ...) there is really no end to how much procrastination you can get in. Further, though it is probably already obvious to the astute reader, it turns out that interrupts are only truly useful if they force you to poll; a good email filter would trivially sort out the wheat from the chaff and leave you without good interruptions. Polling, on the other hand, because it forces you to actively check, and ideally to remember a lot of external state (have I already read this story?) will not only take time in its own right, it will also have the added benefit of significantly decreasing your productivity when you do happen to turn to the real task. 

Home work for the next time:
Read this blog every minute for the next several days, just in case I edited the article.
If you're not able to do that just yet, don't give up, try practicing on first.

Saturday, March 29, 2008

Lazy invocation

Closely related to procrastination is the deferral of work. Unlike procrastination, this does not guarantee the replacement of one useful activity by some other less important (but less stressful or strenuous) activity. Instead, the idea (absurd, surely!) is to defer the less important work, and perform it later, or perhaps not at all. 

Lazy languages take this to one extreme, and guarantee that it will be impossible to observe them doing any work that they do not have to do. Of course, programs then spend more work figuring out what they have to do than actually performing the work, but that is just part and parcel of being truly lazy. As it turns out, compilers for these lazy languages spend lots of time working out when it is possible to not be lazy --- sometimes the programmer has to help out with strictness annotations --- and some even go so far as to be eager, assuming that you might need something in the future, and that they might as well just get it out of the way!

In a more productive case, the work is performed asynchronously, perhaps incrementally, or even by someone else, and if we're so fortunate that it has already been done by the time we need it --- surely in some distant, and unlikely future --- we have to do nothing other than reap the benefits. If not, we have to wait, or even complete the task ourselves. These asynchronous units of work that we hope not to have to do ourselves are often called futures.

sort(array, count) {
if (count > 1)
half = count / 2;
left=future(sort(array, half));
right=sort(array+half, count-half);
return merge(need(left), right, count);
return array;

(A really clever compiler for a lazy language might be able to figure out that  it could introduce the future above, taking that burden away from the programmer. Writing one of those appears to be hard work.)

A procrastinating version of the program above might look something like this:

sort(array, count) {
if (count > 1)
half = count / 2;
left=future(sort(array, half));
right=future(sort(array+half, count-half));
while(!(done(left) && done(right))) clean_room(); 
result= future(merge(need(left), need(right), count));
while(!done(result)) pot_plants();
return need(result);
return array;