I have some long running processes (2-3 days) and get some free time when these processes gets kicked off. At other companies I hear folks get things done during their free time - like set up a backup server or a subversion machine. But I am having a darn brain freeze and can't think of anything tight now. Any ideas how to use this down time. No reading, something concrete I can do to potentially have a dramatic effect for our team or company. This might go on for another two weeks.
When all else fails, learn something you don't know anything about and aren't paid to do. If your currently doing OOP, try picking up Functional Programming (I quite like Haskell, personally) and vice versa.
Spend some time thinking about things you do that take up time, involve a number of steps, and need to be taught to new people.
Figure out a way to automate the process. If it's not possible to automate find some way to document it in a central location so if someone is unsure how to do something they go to the central location to find information on it.
You could look for a small project that another group at your company needs done. I've done a few small projects writing a program or plug-in to help out groups that don't have programming expertise. It tends to earn brownie points and get you noticed by a wider range of people - but you may find yourself in meetings a year later to answer questions. All-in-all, I think it's a good use of time.
These projects can also be a way to try out some new technology you're learning.
Reading can potentially be very good if it's work related. You can find a few threads full of recommendations here on SO. This isn't "concrete," but it could help serve as inspiration.
Ask your manager what the business needs you to do while this other stuff is running.
When I have development downtime I try to do three things:
- talk to my boss and co-workers and make sure I am current on the happenings in the company.
- find ways to help my co-workers with their tasks. This will generally advance the company's bottom line and create social capital you can draw on later.
- continuing education. Ideally, I find out what upcoming projects are planned and pick up some new skills that will position me to work on those projects.
Analyze some of the tasks you or your co-workers do and see if you can't develop a simple but time saving little tool. Usually there is always a few repetitive tasks that could be handled/enhanced with a small little app. Even if its only something you find useful it still something that helps your productivity.
Try to take a simple programming task (maybe even one you've already done but aren't too happy with) and do it using a language you aren't familiar with. The more languages/tools you are familiar with (even if just at the very basic level), the better you'll be at picking the right tool for the job in the future. Sometimes the new version is even better than the original. If you have a couple of weeks you might even try doing it a few different ways.
Automate, automate, automate... (I know it has been mentioned in other responses.)
Your goal should be to make your job obsolete - the easier it is to accomplish your assigned task(s), the more time you will have to grow your skills and learn new things, making yourself a more valuable employee.
Programming is the way we get computers to make our lives easier (at least that's the idea). The more things you get the computer to do for you (or others) the more productive you will ultimately become. In my company alone, I can't tell you how many projects, started out as a little debugging tool or some script created to make the job easier, then end up becoming part of a product or used extensively by our TAC group to help support customers. Whenever this happens, the tool creator comes off looking like a rock star!
Simply put - look for a need or problem in your company, design an app/tool to fill that need, start coding, when you feel like it's ready, start showing people and getting feedback - don't be surprised when, one day, the bosses boss shows up in your cubicle asking for a demo.
One warning - It's easy to let extraneous projects keep you from accomplishing your job. That can get you into a LOT of trouble, so use good judgment when you pick up one of these "little" projects.
I would sit back and think about the code you wrote in the last week. How big is the code coverage of the code? Are there things you don't like but you wrote them because you wanted a quick solution to go on with your work? Try to use some static analysis tools like checkstyle, PMD, Software Metrics in general, findbugs to have a look at your code and find ways to improve it. Having a clean and good code base will always have a big speed impact in the latter project time. If you want to get noticed think about the things that all the team members are annoyed of in you code base then think about a way to change it and talk about your coworker with it and begin to change it. You don't need to make big changes a small fix here some more flexibility there if you use your spare time to make small improvements and stay in contact with the rest of the team to see if they also see it as improvements you can help your code stay free of broken windows and keep the code quality high.
Try to find a way to measure this to see how your works improve the code base. Like a continuous integration server that also calculates the code coverage and the runs some static analysis of the code style and publishes the results.
I'd use that time to find ways to optimize that 2-3 day process. You know you're finished optimizing when you no longer have time to work on optimizing it.
- Set up a continuous integration server, like TeamCity.
- Download and evaluate issue trackers.
- Write a mobile version of one of your group's products, taking care to target your boss' phone.
- Write one of the cleanup processes you've been putting off, like deleting files that accumulate somewhere after a batch process.
- Rebuild your workstation from scratch and image it for next time, creating a default "developer" image.
- Make a wiki for your department or project.
- Accumulate and organize a collection of internet resources, web pages and RSS feeds that would be beneficial to your coworkers. Save these off to a server share so that your whole team can access the resources you found.
- Comment your code with XML comments and make docs with doxygen.