What are your strategies to improve the flow experience when doing work?
It's a bit like creativity. You can't force it, you can only prepare conditions favorable for it to appear. Some of the most important requirements:
- Distraction-free environment (you'll need hours of uninterrupted concentration).
- Clear goal.
- Genuine, intrinsic interest in that goal.
- Clear mind; not too much "should do this, should do that" issues nagging in the background.
So, before starting to actually work to problem, be sure to define the goal clearly, complete or at least write down other to do -items so that they don't disturb your mind, and go somewhere where you can concentrate. If you're interested in what you're doing, you now have a good chance of getting into flow.
I need a clear understanding of what I'm trying to accomplish. It's hard to achieve flow when I'm testing something because I'm searching around, trying to find stuff and figure out what to do next.
I need sensory isolation. By this I mean no distractions in any of my senses. If people are wandering through my field of view, or people are making noise around me, forget it (touch, taste and smell usually aren't too much of an issue in an office). A good set of noise-isolating earbuds and either some white noise (waves crashing on the beach, or a campfire burning and popping) or some music works for me. Any music needs to be devoid of lyrics; otherwise, my mind will be parsing the words, unconsciously, which will disrupt the flow. Ditto for people in my vicinity carrying on conversations; I try to "tune them out," but my mind will, unconsciously, lock on to the speakers and the conversation and distract.
Finally, I need an editor which doesn't force me to "pause." I can code for hours using vim; I use the control-n and control-p to auto-complete stuff, but that's really quick and I can usually get to where I can predict how many of those I will need to get the variable name or method name I'm seeking. Using Eclipse is largely devoid of flow because it is always pausing the input while it reformats stuff, checks to see if my syntax is valid, etc. The auto-completion for object-oriented stuff is too slow and unpredictable to achieve a state of flow.
In case you haven't guessed, flow involves a rhythm. Anything which disrupts that rhythm, disrupts the flow.
Turn off the email notifiers. Turn off the social networking notifiers. Turn off the alarms. Make sure you have a nice, long, uninterrupted block of time in which you can work.
Finally, copious amounts of caffeine seems to help.
Some of my least productive time involves sitting in a cubicle farm, trying to write Java, using Eclipse, when I forgot my smartphone and earbuds at home and the guy across the cubicle wall feels the need to use his speakerphone on a conference call.
This is an interesting concept for me. One reason I got into software development a couple of years ago is that I found it could be a 'peak experience' where one pleasantly loses track of time. But I experienced less and less of this as time went on, I suppose because the amount of stuff I seemed to NEED to know looked limitless. But I want to recapture the peak experience. It's important for my quality of life.
I found a helpful chart in Czikszentmihalyi's book 'Finding Flow". I probably can't post it here (though it's easily found on Google) but the essence of it is that to increase your chance of enjoyable 'flow' experiences, your current challenge should be somewhat balanced with your current skill level. Of course you want to always be learning new things in I.T., but too high a challenge could send you into an anxious or worried mood. Too low a challenge could send you into boredom or even apathy.
I had experienced a ton of boredom and apathy in my previous I.T. career (not s/w development). It was a kind of bottoming-out experience that forced me to explore how I could make work better. Having once gotten a charge out of a big Perl project, I decided to explore Java.
Speaking of having a clear goal, I got plenty of that from the programming classes I then took at a local university. The goals were mostly set for me. Of course the external discipline helped me focus: I needed to read and understand a particular chapter in a book by a certain date and time. Or I had to produce a working s/w project by that time. Maybe something about having someone else to please was at work. It's harder to set one's own goals, so I wouldn't mind working in an office again on a development team soon, for the extra external discipline that should bring. I suppose we can't all be entirely self-directed.
Back to answering your question. In working on my own, I got best results by taking my laptop (since stolen, ugh) to a coffee shop, listening to my own carefully-selected music (this one is good, if you're interested: http://en.wikipedia.org/wiki/Soundsystem_01) on headphones while I worked. It helped drown out local conversations. Lack of unwelcome distraction was/is VERY important to me. Plus I think being in a public place was good for me as I couldn't just decide to take a nap or watch TV. Plus it helped motivate me if the problem I was trying to solve with code was in a domain that already interested me.
Also I just realized that it's cool to write mobile phone software because you can always whip out your phone and show people (or yourself) what you've been working on. I do kind of get a charge out of that, which is motivating.