The single most important thing I do to “boost creativity and/or productivity” is to work in such a way that I don’t need to “boost creativity and/or productivity” to get my work done. This has to be done the night before.
I always quit all online work at least 2 hours before bedtime and print whatever I’m working on.
Then I go into any other room with program listings, blank paper, and pens (especially red!) and plan out all of tomorrow’s work.
All analysis, design, and refactoring must be done at this time. I do not allow myself to sleep until the next day’s work is laid out. I also do not allow myself to get back onto the computer. The idea is to have a clear “vision” of what I am going to accomplish the next day. The clearer the better.
This does 2 things. First, I think about it all night (maybe even dream about it). Second, I can’t wait to get started the next day.
I always wake up and start programming immediately. Once I get going, it’s easy to keep going. Any difficulties are probably because I didn’t plan well enough the night before.
With proper planning, “getting into the zone” becomes a much smaller problem.
1. Do not have access to the internet on your work machine. If you don’t have 2 computers, get a netbook for < $300 and connect it to the internet. They should be in 2 different workstations, ideally in 2 different rooms. The thinking is that if you have to get up, you’ll only do it if it’s really necessary. It works pretty well.
2. You should have 2 modes: coding and not coding. For coding, you should be at your desk coding. For not coding you can be anywhere, but “not at your desk”. One of my biggest problems is that I often find myself in one mode when I should be in the other. If you’re having trouble writing code, then you probably don’t know what to write. Grab source code listings, pen, & paper and “get away from your computer”. Don’t come back until you know exactly what you’re going to be working on. Better yet, until you’re “dying” to work on it. On the other hand, if your doing analysis and are stuck, stop. Go back to the computer and code something, anything small, just to get going.
3. End every day in analysis mode. Don’t go to sleep until you have tomorrow’s plan ready. You should wake up knowing exactly what you’re going to be working on and excited to do it.
4. Never text or IM when working. Have the cell phone nearby only for emergencies. For email, go to the other computer once an hour (see #1 above).
5. Try 48 minutes on, 12 minutes off. For long coding sessions, this works pretty well for me:
http://successbeginstoday.org/wordpress/2006/09/the-power-of…
6. Ipod.
It’s really simple for me…
1. I write everything down in an unlined spiral notebook with perforated detachable pages.
2. I file every page into a labeled green file folder in a file cabinet.
3. I keep all of it.
I’ve been doing this for 30 years. I have “everything” I ever wrote. If fills 3 two drawer file cabinets.
I don’t print and save anything which is already stored digitally. I hardly save much else.
About once a month I pull out a folder a go through it. Obviously, there’s a lot of stuff that appears to be of little use now, but I never fail to find “something” of value. I give away or donate any that is replaceable (which includes all books). But not my own writings. I don’t remember how I handled that issue 12 years ago, but I do know that I can find all my notes on it pretty quickly. This way I don’t have to remember every detail, but I always have my younger self and much of my experience as a resource at my disposal.
I like to keep it simple. My list has 1 item on it. I work on that until either it’s done (often) or I struggle so much with it that I decide to change plans (rarely).
For the last 2 days, I’ve been writing a model configurator that explodes input parameters into individual objects. I probably have 8 or 9 things dependent on this (not really sure yet), so I plug away until done. Then I’ll figure out the new only thing on my list.
I’ve tried every conceivable “productivity hack” and nothing has worked as well as this. I have scratch pads, paper on the wall, 20 colors of markers, and all kinds of automated tools for scheduling and planning. I’ve varied my diet, my exercise routine, my daily routine, and almost anything else I could vary, and none of it really mattered. All it ever really did was take focus away from the real task at hand.
Just identify your critical path, remove it, and repeat forever.
I started with this and fine tuned what worked for me:
http://paulgraham.com/procrastination.html
Other inspiriation:
“I see only one move ahead, but it is always the correct one.” chess master Jose R. Capablanca
I love email. Why? Because I’m a programmer and I don’t want to be interrupted. I like to keep the day-to-day things simple because my work is anything but simple.
I use gmail and everyone I know has my gmail address. It has excellent spam filters and it’s easy to manage. Best of all, it never bothers me. When I’m ready for a break, I check and manage my email. It takes 5 minutes, just enough time to eat an apple.
Family, close friends, and some business associates have my cell phone #. They know not to text me because if I’m working, I will not respond. If I’m not working, the only response they’ll get is “ok”. If the phone rings, I know it must be important to talk. Usually not for long, then back to work.
I do not IM. I can’t imagine worse ways to ruin productivity. I IM’d for 3 days. I got nothing done, so I emailed everyone to never IM me again. Email me and I’ll respond when I’m available.
I surf my favorite sites during breaks. When the break is over, on go the headphones and up comes my text editor. See you in an hour or two. Not before then.
I absolutely “love” what I do and can’t imagine doing anything else. “However”…I have had very few jobs where I was happy. I think there are 2 primary reasons.
1. I want to work on what I want to work on. When I work on anything else, all I can think about is what I really want to work on. In a job situation, I rarely work on what I want. (OTOH, a job that has me working on what I want is usually a great job.)
2. I want to work when I want to work. Sometimes, 8 to 5 works, often it doesn’t. We were simply not meant to sit in cubicles without windows all day long. Enough said.
There are lots of other things most of us don’t like (difficult people, crappy code to maintain, poor management, difficult deadlines, etc.), but those are all part of the territory. I could live with them if I could work on what I want when I want.
I prefer to sit with my users. As you can imagine, this concept is met with a bit of resistance in corporate America.
I want to dwell with them and be a part of their lives. I want to hear them complain about their apps, their customers and vendors, their bosses, and each other. I want to know what they go through all day every day.
When I sit and suffer with them, the resulting software is “always” better. All the meetings, prototypes, demos, specs, etc., etc., etc. have never been able to deliver the same knowledge needed to develop their apps.
On the other hand, I “don’t” want to sit with other programmers, unless we’re working on the same thing at the same time. I don’t care about your problems, I have my own.
How I Write Code:
1. Copy the smallest piece of code I’ve already written and change it slightly to do something really small. Get it working perfectly.
2. Add a little bit. Get it working perfectly.
3. Add a little bit more. Get it working perfectly.
4. Repeat until it’s not so easy to add anything, even a little bit. Print a hard copy. Holy crap! Did I write all that?
5. Mark it up like crazy with a red pen. Combine similar code into common functions. Rename variables. Rename them again. Rename them again. Rename them to what they originally were, but without vowels. Restructure unwieldy functions. Rewrite the stuff I can’t believe I actually wrote myself.
6. Sit down at terminal and enter changes. Save every version (even though I never look at it again). Get it to work perfectly (again). Holy crap! What did I do? It’s totally broken! Debug, debug, debug. Good. Now it runs perfectly. Time to add more…go back to Step 1. (Except every 5th time through this loop: Scrap it all and rewrite it the way I should have in the first place.)
7. Repeat until dead.
This question reminds me of the greatest cook ever, my grandmother. She used no technology whatsoever. All of her tools had been her mother’s which were probably manufactured in the 1800s. She chopped everything by hand in a wooden bowl. If anyone else helped her with the chopping, everyone at dinner could tell. She never used pencil or paper and measured nothing. She stood in line at the farmer’s market, the butcher, or the grocery store and inspected every item. And absolutely nothing I have ever eaten since, in any restaurant or home, has been remotely close to hers. It was magnificent! And I miss it so much.
I’d like to think I have almost as much passion about my work. I use the most primitive tools, 24 x 80 green screen editor, no framework, no IDE, no debugger, and mostly pencil and paper. I savor every byte just as I imagine my grandmother savored every little detail of her cooking. I’m not trying to save time or be fast, I just aspire to creating Grandma-quality software. I only hope my software brings someone the same joy her food
brought all of us.
I’ve used many different tools. And I rarely care how fancy they are. Ironically, the simpler, the more joy I have found along the way.
Some of the things that have worked for me:
- Decouple analysis from coding. There are some things that should NOT be done in front of a terminal. Get a pencil and paper and go somewhere else. By the time you’re done, you’ll have plenty of stuff to code. (I have found that the main reason I get stuck is because I have not spent the requisite time “away” from the terminal laying things out. I’m always in too much of a hurry to “get back to work” before I’m ready.)
- Get a customer. They’ll give you something specific to work on. If it’s maintenance, all the more reason to get to just dig in and get to work.
- Ask yourself the question, “How am I making this too hard?” If you listen to yourself long enough, you’ll probably get a good answer and a fresh approach.
- Reduce scope. Remove outlying cases. Solve only for the most probable case. Get that working perfectly. The process of doing this will probably shed a lot of light on how to set up structure that will also handle the outlyers.
- Back up your current version and the go wild on it with some crazy approach. Knowing you have a good backup frees you up all the more. At the end of the day, if you have something cool, keep it. If not, just restore your backup and throw away today’s work. You may have wasted the code, but you didn’t waste your time. You probably got the juices flowing again.
- Backup your current version and forget about it. Wipe the slate clean and start over completely. You won’t have to worry about satisfying all the overhead you’ve already created. After a day or two, keep either the original version, the new version, or more likely, you’ll have a new project: combining the best of both. In any case, you’ll be busy working again.
- Set the project aside and work on something easy and fun that no one needs and provides little value to anyone. The byproduct is that suddenly, you’ll discover you’re working and enjoying it. The next thing you know, you’ll “want” to go back to the more difficult project.
- If you’re stuck on something, post your dilemma on-line. Read the responses. You may get a different approach that you can play with. And even if you don’t, you won’t feel so alone. That may help.