After working hard and saving money for a decade+, I "retired" to be a stay-at-home dad. I'm trying to live modestly, to make the money last, but it will run out. Returning to work full-time would be a shame, and I don't need that much money anyway.
I'd like to work part-time.
I've always found my productivity as a programmer scales with my immersion in the problem. I fill my brain with the software. I become the solution I am creating. I spend just about every waking minute thinking about it.
If I were to work part time, I'm worried that I wouldn't be able to work to my full potential: at 1/2 time I wouldn't be doing 1/2 as much work. Unless, of course, I spend all my non-working time thinking about the problem, and then I'm not really part-time.
Furthermore, in my experience, time to market matters a lot: taking twice as long to produce something doesn't do much for market success.
What's your advice? How can I maximize my productivity while programming part time?
The quickest way to have anything done that works for me:
Plan plan plan. (even if you just write your tasks in paper.. no technology required here)
If you are going to work with a particular technology you know you can find the answer to most if not all of the issues you will come across by googling your way out..avoid this like the plague, try to mock up your path prior to any implementation that might drive you into one of those google searches where you get the answer in seconds, but you remain online and distracted for another hour or more..
Don't think with your fingers!
Read above, timing yourself and restricting your own use of the computer/internet can save you hours and days, try to use the computer only when you know exactly what you are trying to do..
Time yourself and avoid compensating.
Say you planned to finish a task in 3 hours, but after those 3 hours you think you might squeeze all the work you should have done 3 hours before, in the coming 15 minutes..do not throw good time after bad..make a point to yourself that you failed to finish the task in those 3 hours and reschedule accordingly. Use those following 15 minutes to make a note to self of why you failed to achieve your goal for those lost 3 hours.
It seems counter productive to throw planning time into projects and work, but it gives you self metric capabilities that will seriously improve your ability to evaluate your self, your performance and will define how successful your time management will be.
Took me months and years to get this right, but just like any addict, when I fall back on the habit of not timing myself and not planning my future tasks well enough, time becomes this einsteinian thing which can stretch and shrink beyond human comprehension.
Apart from Ric's excellent answer, I can offer a few tips as I mix client projects from a wide range of disciplines with my own development projects, thus am effectively a part-timer in any given domain.
One of the classic gotchas is the time taken to regain your immersion (flow) state:
Other tips:
Here are some things that work for me to maximize productivity, although full disclosure I work full-time:
With regard to your other question about how to not get sucked back into working full-time due to your natural inclination to spend most waking hours thinking or working on the software issues at hand, I can only make suggestions. I too spend much of my 'non-work' time thinking about work issues because I enjoy software development and problem solving, like most people here. I would suggest:
Hope you find some of this useful, good luck!
Not sure this answers your specific question, but I'd look into consulting (vs permanent placement). Consulting usually allows you the freedom and flexibility to set your own hours. So if you can't or don't want to do the 9-5 thing, consulting will most likely give you the option of working weekends/nights and doing the dad thing during the weekdays.
Take on smaller, short-term projects. Or break up larger projects into a series of small ones, and try to limit the scope of each deliverable. Solve the hard problems one at a time, rather than building up a lot of parallel, ongoing work.
Some years ago, I was doing part-time software development as a consultant, and I found it very satisfying as long as I kept the task queue short and expectations manageable. By pacing my work (plus a little over-estimation on delivery time) and not worrying too much about the “big picture” (left that for the full-time people), I kept myself sane and productive. I had more balanced time for hobbies and home life as a result.
I tried doing the "part time" thing at interviews a few years ago. It didn't fly. I did eventually find an employer who agreed that my philosophy was good and he was looking for part-time and full time developers.
That has worked out ok, but the biggest challenge you are going to find is getting the work. (unless you have your own company/product(s)/consulting
I am now working full-time and have a few after-hours projects.
Be very diligent about wasted time. Focus on the tasks you need to get done. be ruthless with everything else.
When I was doing part-time work I found that I worked a lot some days and not at all on others. Working "2 hours a day" sounded nice, but didn't work for me. I needed more time than that.
You might be able to start full time, establish yourself and then suggest moving to part-time. If I had to do it over again that is the way I would approach it rather than trying to get hired and go for the part-time thing all at once. It turns people off.
There is a great chapter in the book Micro-ISV:From Vision to Reality [1] by Bob Walsh about using Getting Things Done (GTD) with Programming. It's a great intro and very quickly applicable.
The GTD method has five stages: collecting, processing, organizing, reviewing, and doing. Each of these stages is governed by these key insights:
"Control your attention: The more tasks you have on your mind and the more tasks, projects, and obligations that have your attention, the less attention you can bring to what you’re trying to get done right now. A big part of GTD is clearing your mental desktop so you have somewhere to work. Nothing beats having lots of RAM to use. Build a comprehensive process: A leaky process is a bad process. If your commitments are scattered over multiple bits of paper, hundreds of emails in your Microsoft Outlook Inbox, and piles all over your office, that’s not a process. You’re building a process here, and everything that goes in has to go somewhere. Trust your process: Once you’ve got the GTD process working without any memory or commitment leaks, you can start to trust it and devote your full attention to what you’re doing at the moment. Keeping your GTD process trustworthy means keeping it up to date."
Hope that helps.. There is about 10-15 pages in the book on specifically using it for programming.
[1] http://rads.stackoverflow.com/amzn/click/1590596013Excellent answers. I'm a part time dad as well and here is what works for me:
I am actually working part-time on a project now and I think the fact that my time is limited has helped me. When you have too much time on your hands, it's easy to either procrastinate or do unnecessary work. With less time, you focus on what is essential, the core of your product and there is less likelihood of feature-creeping.
Have a notepad with your and write down a short, achievable to-do list for the day. It could be just one single feature. You will find that over the course of a month or two that you were actually quite productive despite the lack of time.
Apart from the great tips above my number one is seclude yourself! I've been working part time on a hobby project for quite a while now and this is what I always try to do.
Decide how much time you want to work on your thing and when you do, make sure you disconnect from everything. Let the mom take the kid, don't bring the phone, unplug the internet, go into a room and close the door around you telling everyone not to disturb you short of a fire or disaster occuring. This way you easily get into the flow and stay in there and a few hours later you get out having actually gotten quite a few things done.
This is universally good I think. Other things I do that might not be your cup of tea are:
Keep things in your head until you implement them, that way you can change them very quickly and you don't spend time on writing detailed things down and going over notes. If something pops up when it's not work time, think about it a little and then push it back into the back of your head, it'll come up again when it's time to work. Do keep a list of what you plan however, but just as keywords, no details. Checking things off a list is a great feeling.
Never mind time to market. It might be important, but it most likely isn't. Do what you believe in and do it well, no one likes a bad and rushed product. The second comer may very well take the lion part of the market if he has the better thing, there are numerous examples out there.
Avoid spending too much time on things only you care about. You're just one guy and have only so much (part) time. Get together with some people and have them test the thing you're building, listen carefully to what they say so you don't build something only you will ever want to use.
Work half time but do full days if it's possible. Two days of 10 hours is 1/2 time, but you will have two full days to remain immersed in your problem rather than having to give up after a few hours each day.
I am in somewhat the same boat as you are, being a Full time student and a part time developer. Apart for money issues I took the job for work experience.
I found that working part time helped me more than as if I was working full time. Mostly because the tasks given to me sometimes have some kind of time limit therefore not giving me enough time to properly research new solutions(although I tend to get most out of the given timelimit). Therefore I emulate the same tasks at home but trying out new technologies to solve them (usually for a school assignment or a pet project).
I come to this conclusion since I share what I learned to the full time developers (who I personally find quite intelligent) in the company, they seem amased that such technologies existed etc since they didnt have time to research themselves.
A good example is that I have a school assignment (sort of a mini thesis) were I have to develop a program with 30 functionalities using a .NET technology. I took the liberty to develope said assignment in Silverlight , a language I never touched before and now learning quite deal about. Now my employers are finding the knowledge I am aquireing to be quite usefull.
It all boils down to how much you enjoy doing pet projects in your free time.
Two short and simple tips:-
1) Separate your work from your private life. When you leave the office you leave the work there. So don't make anything from your work situation available from your home. If working from home, have a separate working space that you do not visit "after hours". I think this is easier to do when having a child to fill your non-working time. That should occupy your every minute of your non-working hours now. ;-)
2) Do something that doesn't engage you. Somthing you find dull and boring. Find a job using some techniques you aren't too keen on. Find a project that are outside your interest zone. Try to get into the mind set that it is only a job. IT's amazing what you can get used to in no time at all!
And of course you have to find your own balance here, so the job is boring enough for you to not engage in it during your non-working time, but interesting enough for you to actually do the job once there.
I've found that you don't have to always sit down and code to make progress. Use your available part-time at the keyboard and let your mind wander some while doing your more important task of raising your kids. I find that time away of the problem clears my thoughts for solving the problems. I think you'll find the same to be true.
I'm not really working part-time, but work 2 days a week as a Java programmer and 3 days a week as a Smalltalker for a different customer. So I have to deal with a context/paradigm switch each week.
The hardest part is the java part, but it helps to work in iterations with Scrum like sprints.
Every 2 to 3 weeks I sit down with the customer and we plan the tasks for the next release. Most tasks can be done within one or two days, so I try to finish a task within the same week. Does not always work however.
What really helps to pickup my work after a week is the Trac timeline feature. I make several small atomic commits a day to subversion with a decent commit message. When I look back at the timeline from last week, I can easily see what I was doing, thinking and why. I have a look at each change at get into the zone again.
You can easily give this approach it a try by working on a pet project and use a system like google code or github. It might even help getting you a job later on as it easy for an employer to have a look at your code and progress.
Jay, I assume that your job is solution oriented which means that you are paid for the solution you produce.
There are required resources to develop a solution and I think I should also assume the amount of resources are fixed for you, that means you have certain amount of hours you will dedicate to your work. And you would like to go offline from your work outside that time.
With fixed resources, improvements of efficiency and effectiveness can only be improved by the reallocation of them. I think if you research on ways on reallocating resources will help you out.
Here are something for you in my mind:
1) Knowledge management
Solution is developed heavily based on your knowledge. So knowledge management is probably a good starting point. One focus is on storing knowledge. If you have good amount of knowledge in your solution domain, you are readily prepared for that task and you can spend less time thinking about it.
Another focus can be on knowledge sharing. If you know more people who are willing to share knowledge with you, then you can get more of the required knowledge for your project with their help.
2) Solution reuse
It can be done either reusing your own solutions or open source solutions out there. It is related to KM again because you need to organize your information on solutions in order to retrieve them in a timely manner. :-)
3) Delegate tasks that are not in your strength
Focus on your strength and delegate when it can be done just as good by someone else. This way, you can maximize your productivity because you are really focusing on the things that will bring you highest return. Making connection is quite important. :-)
4) Measuring and planning your project
I assume that your work is achievable in the time given to you, so that you need to measure and plan on how you are going to deliver your solution. The big three elements of project management are time, resource and quality. I think if you manage them well, you should have no problem working only in the work hours. If my assumption is invalid, then you need to work on how much you want to get paid. :-)
Hope they are helpful. All the best to your work and life. :-)
Get off StackOverflow ;-) (I figure everything else was already mentioned)
Follow your team!!, discuss, plan, even code when you need/want!
Not that I have any experience with this subject, but you could consider trying to work from home. You could do as much work as you wanted or felt was necessary, but feel less like you were working. Plus, when you get frustrated you could take time off to spend with your children. And you wouldn't have working hours - anytime you wanted you could decide it was time to switch from work to play, or vice versa.
You could always try some kind of top-coders competition to make money... or create something you know a little niche needs and go saas?