Context-switching among multiple projects can be tough. I'm currently:
- working full-time on one project (a Drupal 6 non-profit website)
- consulting on another (helping an educational institution with Drupal 7 questions)
- supporting a third (Ruby on Rails site I built for a local nonprofit, almost done), and
- trying to wrap up on a fourth (PHP/AJAX dashboard for a call center in the US).
I'm doing the Drupal 6 development in a virtual machine on my system, with an integration server set up externally. Consulting for the second project is done on-site or through e-mail. The Rails site is on a virtual server. The dashboard project is now on the company's servers (IIS6/Microsoft SQL Server), which I can VPN into and use Remote Desktop to access. I'm glad I have two computers and a standing desk (read: kitchen counter) that makes it easy to use both!
Today was one of those days. I helped my new team member set up his system so that he could start working on our project. He's on Mac OS X. It took us some time to figure out some of the quirky behaviour, such as MySQL sockets not being where PHP expected them to be. Still, we got his system sorted out, so now he can explore the code while I'm on vacation tomorrow.
In between answering his questions, I replied to the consulting client's questions about Drupal and the virtual image we set up yesterday. That mainly required remembering what we did and how we set it up. Fortunately, that part was fairly recent, so it was easy to answer her questions.
Then I got an instant message from the person I worked with on the fourth project, the call-center dashboard. He asked me to join a conference call. They were having big problems: the dashboard wasn't refreshing, so users couldn't mark their calls as completed. It was a little nerve-wracking trying to identify and resolve the problem on the phone. There were two parts to the problem: IIS was unresponsive, and Microsoft SQL Server had stopped replicating. The team told me that there had been some kind of resource-related problem that morning, too, so the lack of system resources might've cascaded into this. After some hurried searching and educated guesses about where to nudge the servers, I got the database replication working again, and I set IIS back to using the shared application pool. I hope that did the trick. I can do a lot of things, but I'm not as familiar with Microsoft server administration as I am with the Linux/Apache/MySQL or Linux/Apache/PostgreSQL combinations.
I felt myself starting to stress out, so I deliberately slowed down while I was making the changes, and I took a short nap afterwards to reset myself. (Coding or administering systems while stressed is a great way to give yourself even more work and stress.)
After the nap, I was ready to take on the rest. The client for the Rails project e-mailed me a request to add a column of output to the report. I'd archived my project-related virtual machine already, so I (very carefully) coded it into the site in a not-completely-flexible manner. I found and fixed two bugs along the way, so it was a good thing I checked.
Context-switching between Drupal 6, Drupal 7, and Rails projects is weird. Even Drupal 6 and Drupal 7 differ significantly in terms of API, and Rails is a whole 'nother kettle of fish. I often look things up, because it's faster to do that than to rely on my assumptions and debug them when I'm wrong. Clients and team members watching me might think I don't actually know anything by myself and I'm looking everything up as I go along. Depending on how scrambled my brain is, I'd probably suck in one of those trying-to-be-tough job interviews where you have to write working code without the Internet. But it is what it is, and this helps me build things quickly.
On the bright side, it's pretty fun working with multiple paradigms. Rails uses one way of thinking, Drupal uses another, and so on. I've even mixed in Java before. There were a few weeks I was switching between enterprise Java, Drupal, Rails, and straight PHP. It's not something I regularly do, but when the company needs it, well… it's good exercise. Mental gymnastics. (And scheduling gymnastics, too.)
I like having one-project days. Two-project days are kinda okay too. Four-project days - particularly ones that involve solving a problem in an unfamiliar area while people are watching! - are tough, but apparently survivable as long as I remember to breathe. =)
Here are tips that help me deal with all that context-switching. Maybe they'll help you!
Look things up. It's okay. I find myself looking up even basic things all the time. For example, did you know that Ruby doesn't have a straightforward min/max function the way PHP does? The canonical way to do it is to create an array (or other enumerable) and call the min or max member function, like this:
[x,y].max. Dealing with little API/language quirks like that is part of the context-switching cost. Likewise, I sometimes find myself wishing I could just use something like
rails console in my Drupal sites… =)
Take extensive notes. Even if you're fully focused on one project and have no problems remembering it now, you might need to go back to something you thought you already finished.
Slow down and take breaks. Don't let stress drag you into making bad decisions. I felt much more refreshed after a quick nap, and I'm glad I did that instead of trying to force my way through the afternoon. This is one of the benefits of working at home - it's easy to nap in an ergonomic and non-embarrassing way, while still getting tons of stuff done the rest of the day.
Clear your brain and focus on the top priority. It's hard to juggle multiple projects. I made sure my new team member had things to work on while I focused on the call center dashboard project so that I wouldn't be tempted to switch back and forth. Likewise, I wrote the documentation I promised for that project before moving on to the Rails project.
Breathe. No sense in stressing out and getting overwhelmed. Make one good decision at a time. Work step by step, and you'll find that you'll get through everything you need to do. Avoid multi-tasking. Single-task and finish as much as you can of your top priority first.
I prefer having one main project, maybe two projects during the transition periods. This isn't always possible. Programming competitions helped me learn how to deal with multiple chunks of work under time pressure, and I'm getting better at it the more that work throws at me.
What are your tips for dealing with simultaneous projects?