Since I have a job, and I want to write some my own software at my spare time. So I want to know how you guys organize, plan and develop such small project. Since it is not a job, you may be interrupted by many other things, how can I make it keep going well?
Put it on code.google.com (or other open-source hosting engine of your choice), "flog" it in the mailing lists, sites &c that might have people really enthuses by the concept, and let 'er rip. It's unlikely to gain much traction until you have SOME semi-working code out there in svn or hg, but, you never know!-)
Open source is the key: if you can only work on the project in occasional snatches of time, it's going nowhere much, until you can get other contributors on board -- which means open source;-).
Turn off your phone, give away your TV and disconnect the internet.
Further steps that may be necessary depending on your situation: dump your girlfriend, find a hobby for your wife, sell your kids and hire a housekeeper.
On a more serious note, I find early mornings much more productive than trying to work at night when there are so many distractions. As a side effect going to bed earlier makes you a much more energetic and happier person in my experience.
Generally, it's best to appoint a fixed day when you want to spend some hours on your project per week. Regularity is very important to keeping things going over a long period of time.
Other than that, I would recommend using Version Control Management (Google Code, as already mentioned, is a good idea since you've got a backup on a remote machine. Also, there is OpenSVN or SourceForge. With OpenSVN you can use TRAC, with is handy for tracking your progress and bugs).
The rest depends on your project size, but some coarse-grained milestones with dates certainly won't hurt the process. Apart from that, doesn't make much sense to do too much project management on a small project. :)
I found this Blog Post very useful, too: Getting yourself into the “zone”, and some notes on programming as a craft
Basically, I organize my day. It's just as if I would schedule any other routine, like going to the gym.
I specifically tell myself that I will set aside particular hours of the day to work on my personal projects. Now, because they are personal, they should be fun to do, so it shouldn't take ALL that much effort. However, if things interrupt you, it's perfectly okay.
In the end, I just tell myself that it is worth pursuing, especially since there is a great deal to learn about software development when you undertake a personal project.
I write my ideas on a notepad (pen & paper) during my lengthy train ride to/from my real job. I probably average about 3 hours of planning and writing for every 1 hour of actual coding. Because I spend so much time planning and designing, when I actually sit down to write some code, the code is much higher quality and doesn't need to be re-written as often. I would probably be slightly less productive if I spent all of that time just writing code.
In addition to that, you can also use FogBugz at home for free, although I didn't really like it as a project management tool.
Use a s/w project management website to track your tasks and source code. The worst part about working on an after-hours project is only being able to work on it in short bursts, so it is essential to be able to pick up from where you left off as quickly as possible.
Personally I use Codespaces.com and recommend it highly for tracking small projects. It has a task board, wiki and SVN repository. Best of all it's free for projects under 500MB!
I am in the same situation. I have my own little project I work on in my spare time.
The key element here is to keep believing in your toy. Do not get frustrated over it going too slow. of course, if there is little time, it will be slow. It may take months or years. just believe in it and keep working on it, without setting the deadline (you will miss it almost certainly).
At day you can think on what you will be doing this evening, research internet, gather some information, read a few blogs and examples, then in the evening you will already know what to do and how to approach it.
A more pragmatic answer...
- Make sure you have remote revision control (subversion & git are both really good).
- Host your revision control on a server that gets backed up (either yours or free service)
- Trac for bug tracking/tickets, project milestones, wiki, etc. Integrates with most open source revision control systems. (if you're a git user, then I recommend github rather than trac)
Here are a few things that I have found useful:
- Figure out your peak productivity hours: Some people work better at 6 AM, some people at 6 PM, some at midnight. You probably have other commitments as well, so make sure you figure out the best times, out of the time that you have, to get things done.
- Getting Things Done: There is a great book (of the same name) by David Allen which deals with how to manage all of your time, whether it be work, play, relaxation, or your small projects. I found his techniques extremely useful. They won't help you lay out your project schedule directly, but they will help you maximize whatever time you do have.
- Lay out a project schedule: Give yourself a due date, and some intermediate target dates for various phases of the project. Even a single hour spent laying out a roadmap for your project can help to solidify the process in your mind, and identify what kind of schedule you can realistically achieve. I find that scheduling rewards (dinner out, a day off, a new video game) for meeting targets helps a lot. Be sure to keep track of your progress once a week or so. This will help you stay focused on the project.
- Keep your work area well-defined: Set aside an area (ideally, a home office or something similar) where you will work on the project. When you are in that place, work only on the project. Even if it is just a small corner within your office, that place should be reserved for the project. When you have time to work on it, sit in that place. When it is time to relax or do other things, sit somewhere else.
- Take time to relax: You will not last long working a full 8-hour day, taking care of all other commitments, and then spending every remaining waking hour working on your project. Your body (and mind) need time to relax and rejuvenate.
- Don't be afraid of failure: Many small projects fail. If you want to do something, give it a good shot. Accept that it might not work out, but if you decide to work on it, commit yourself to the thought of it succeeding, and don't look back.
- Have fun: If you aren't enjoying it, find a way to make the work enjoyable. Listen to your favorite music, write your code in a cozy little coffee shop somewhere, or simply work on a different part of the project for a while.
One of the most effective methods I learned was to grab a partner. When you start to venture into a project it can get very lonely and depressing. A one man show makes it easier to just fold up shop and go home.
With a partner you might find an obligation to deliver what is needed to fulfill your promise, which should be "we're going to be successful". Plus if you have a partner, you can bounce ideas of off him. Out of the box thinking will be much easier.
Other tips may be. Set milestones, weekly, if not daily.
I have a pretty large c++ project for years now. (only coder...) My tip: take a break from it if you need to: forced code == bad code. Furthermore your head will go on, even if your fingers are not typing... (propably)
I am currently doing the same as well and didn't want anything fancy, simple yet effective solution. With a free code hosting solution taking care of version control, I use MonkeyGTD to record and track all actions in the project. I can also setup ticklers, alerts for timed actions. Organising my thoughts
I then use MonkeyPirateTiddlyWiki to record anything i find useful and can be reused in the future. Persisting my thoughts.
All this on simple html files with automatic backup.
Get a free FogBugz account
First, do the things Alex Martelli recommends... they are all great hints.
Second, get a fogbugz account... it's free for a small project such as yours. Use it to record your thoughts, break down tasks, etc.
It is surprising how much of a difference having a plan for your project helps when you have bits of time to work on it.
http://www.fogcreek.com/FogBugz/StudentAndStartup.html?isl=140855
Well I don't manage my small project...it manages me!
When I'm in the mood of playing with it, it will absorb all my energy. This usually lasts for some days. Then I abandon it (but only temporarily of course).
Bottom line : if it is a hobby, do it when you feel like it and don't let it stress you.
Put a notebook by your bed. I always have the best ideas at 3am.
As for planning a small project, you can do a lot of project management in a spreadsheet before it gets unwieldy. If there's only one of you, that's unlikely. Spend 10 minutes a day noting tasks completed and to do. Keep the whole thing up to date.
I've been working on a pet project for 10+ years now, and what I do to keep the planning sane and motivation in place changes year-on-year. I currently use Google Code where the issue tracking system lets me manage the work I want to do (and bugs from users) in a sane, easy way. It also nicely integrates the source control and issue tracking making keeping the two in sync nice and easy. It's the best system (with the lowest cost) that I've found for managing the project.
For tracking the work, I define a set of milestones for roughly the next three releases, and put things I want to do into those milestones and then hammer away. It's important not to get stuck in a rut though, this project is partly for me, so every now and then I'll add a new feature or re-write a big chunk on a whim. Sure, it wasn't in the plan, but then nobody's paying me to deliver on-time and in-budget :)
For interacting with users I previously ran mailing lists, but these seem to be less popular now and require more of a perceived investment from users. I added forums to my site (thanks to bbPress) and have seen much more take-up and benefit from those. The main website I run is a very minimal skin on top of Wordpress to make it look less like a blog - using a set of pre-built tools to manage your sites means you don't spend time on non-core activities. I want to spend time developing my text editor, not a CMS. Finally for documentation I've gone through a number of different approaches, but the one that's currently working well for me is hosting a wiki. It's very low friction for people to contribute to, and for me to dip into at any time to document something in response to a question on the forums. The pre-compiled help file that I used to build is becoming completely obsolete.
One of the most important lessons I've learnt is how to say no. Once you get a bunch of users they will start to request hundreds of features/configuration options/bug fixes and it got to the point that I felt like I was living under a cloud of work I didn't want to do. From watching other projects I learned how to say: "Sure, nice idea, but I won't be working on this". The benefit of open source is that someone else can do it if it's important enough for them.
For motivation I find that wanting to use what you're building is essential - if you're not dogfooding your code or making any money from it, then you will probably get bored of it and move on.
Finally, remember you can take a holiday from the project - it helps to come back fresh with new enthusiasm.
I have to recommend that you give FogBugz a try. I tend to work on a number of projects on the side, and I wouldn't be able to keep things going with it. Some quick things I like about it:
- Wiki for project planning and documentation. If the project requires documentation as a deliverable to the customer, I also use the wiki as a starting point and copy it out to PDFs once it is completed.
- Bug tracking for tracking progress on feature development and bugs that I find along the way. I think this ends up being more scalable than a paper list or TODOs in code, even for small projects.
- Integrates with my SVN repository so my commits show up attached to the appropriate ticket.
- All of my customer help inquiries go straight into FogBugz by way of the API. Makes it easy to track support requests and save the information for the future.
As mentioned elsewhere in the thread, FogBugz has a free version for up to 2 people. If you're looking to set up a source repo, try Beanstalk (beanstalkapp.com) - they also have a free version.
You might also consider Basecamp (basecamphq.com). I don't use it personally, but most people seem to love it.
The best way to keep it going would be to consider it equally serious like your job. I would suggest including few more like minded friends in the project if that is a possibility. I would even suggest including your family to do some of the project chores like usability testing, documentation etc. This way it won't sound like a routine work & you would love to work on it since everyone is supportive, dedicated & hopeful to see the project succeed.
Regarding project organization, I am working on a large-scaled project on my own and have many aspects that I need to consider. I have experience with coding and developing large sites, but this one will be 100% my own. I use two tools that help me to organize my thoughts before I start tackling code and avoid wasting time are as follows:
- FreeMind - Free mind mapping software which allow you to brainstorm features and functions and display them in an organized fashion
- Voice Notes Recorder on my BlackBerry Storm - Whenever inspiration hits or I recall a missed item, I quickly leave myself a voice note and save it until I can add it to the mind map.
I have been working on the all-inclusive mind map for about 3 weeks, just to make sure I am not leaving out any aspect of the development and I not feel like I am ready to start coding. The mind map will be good to hash off items that are completed and get a visual method of tracking my progess.
Hope this helps.
- If it's a small project you should be able to keep track of the overview in your head. If you can't, it's too big. Having said that, a bug and feature list (say in Excel) is a good idea.
- Work out how long you generally get to work in a single strecth, and prepare a list of tasks that fit well within that time. For example, if you get (say) an hour in the evenings after work but before tea, make a list of half-hour tasks. They should be tiny (eg "line up these controls", "refactor this single class", "add one extra input field"). It's better to cross off one tiny task than say "I've made 1% progess on this big task".
- Keep it small. Trim, trim, and trim some more. Work out what's the absolute minimum v1. Even if that has no hope of making money, it could generate ad revenue or at least some web discussion. Once you've done v1, you can worry about v2. If you manage one hour a night, then a six-man-month project will take nearly three years.
- Use source control, and use backups. Got more than one machine? I use a laptop as an SVN server, and work on my main machine. I use a batch file to save a dump of the repository to Dropbox once a week. Free and easy.
- Don't dump your girlfriend - get buy-in. Can they help on the project? Write the docs? Promote it? Graphic design? Test? Code?
2 simple tasks: 1) establish weekly goal 2) set appart 1 hour a day to work on those goals
If you don't have a clear gaol, you will not achieve anything. Also, if you don't set the time to work on it, most probably you will never star your project.
Kind regards.
I have a small consulting company that I run "on the side". I have had a few projects over the years - some of them large enough that I had to bring in other developers. The biggest thing for me was to get an upfront understanding with my clients of time constraints - and budget. I know that I can do my full time job - work 2 hours a night during the week and 5 hours a day on the weekend. Any more than that and I have to budget for more staff than just myself. I know a lot of folks may say that 5 hours a day on the weekend is not much - but I say to them - have you actually done this before with paying clients. There are necessities of life that you must also take care of - and there are only so many hours in a day. So far - I have not had any disappointed clients using this system - and to me - that is what counts the most.
I know some of you are about to say "But wait - he said his own small project". This is true but then he is his own client. If he wants to "keep it going" he needs to treat every project as if it has a client to answer to - even if that client is himself. He can set up his own time requirements and "budget" his developer time accordingly.
Best of luck in your endeavor arsane.
Most the jobs that I have had have been the kind where there is plenty of down-time (waiting for junk to happen), not to mention the excruciating bus rides to/from work.
As a result I have always kept a project book with me (eg a dollar-store address book), that I keep all of my projects and ideas in. I am then able to map things out on paper (which is always faster and easier than on a computer). That way I can get all of the design done as well as the pseudo-(and not so pseudo) code.
Whenever I get stuck on my projects while working on the computer, I try to print out the relevant chunks of code so that I can get see the whole picture (with better resolution that on a monitor), and make all kinds of notes and changes in pencil, much easier and faster.
I find I am always more productive with pencil/paper. Even better is that in this manner, I can get things (even quick, little bits of work) done in the shortest of breaks (say while going up an elevator or waiting in line at the store). This way I can do significant amounts of work on my projects in the “useless time” that would otherwise get wasted.
In addition to my coding projects, I have all my other ideas in there (screenplays, sketches, lists of all kinds, inventions, etc.) This way anytime I have a free moment, I can always find some sort of productive thing to do. The only catch is that after a while it gets to be pretty bloated and I have to prune out completed/dead projects, etc. :)
As for logistics, I can only recommend what I always recommend: make a list! Whether you use a program, or paper, make a list of your tasks (and sub-tasks, and sub-sub-tasks, etc.) It’s impossible to be productive if you have to attempt to keep track of your tasks in your head. I can’t even count high enough to count the number of times that I have yelled at my mother when she nags about having too much to do and being overwhelmed even though I told her to bloody write it down. I remember once when she went to Norway to see her mother for a month, so I had to take all of her responsibilities here. I keep telling her that because I had freakin’ checklist of things to do I managed to do it all without being overwhelmed.
Make a list and cross the tasks off as you go. You would be amazed how much easier things are when you can see the tasks and your progress before your eyes.
GTD is always a good help. A list of bite size actionable items to check off as you go along keeps progress and morale at a maximum. Setting aside time and space to work are also key.
Another tool that is indispensable is to either have someone else who is working on their own project or someone who understands the motivation for yours available to help hold you accountable. Having progress updates a couple times a week with someone else will generally keep you productive because it gets to be very difficult to bring nothing to the table at the meetings. Even just a phone conversation will work and it will add an amazing amount of productivity to your project.
Keep the project as ubiquitous as possible too. I find that if I can have my TODO/Project Spec somewhere that I can access it at work and home it really helps me be more productive. I can refer to it if I have a thought at work and check my ideas when I get home to work on things. I utilize Evernote for my spec/TODO and a Moleskine notebook for an on the go idea catcher.
Along the lines of the person to keep you accountable, you can also set up a blog to do status posts to. This will provide many benefits. One it allows you to break up work into post sized pieces so you can tackle discrete pieces of the project at a time then write about them. Second it cements things in your mind by getting them out into words, similar to teaching someone else how to do something. Lastly it makes it that much easier when you are done to have content for your customers to see how the product came about, know your story and start your marketing/branding.
My recommendation:
Try PivotalTracker. Put into "stories" what your project should achieve, insert found bugs. Since we use PivotalTracker there is much more motivation in the team, and also in my own projects. You are really in track of what you did and what still has to be done.
But most important: You may be interrupted at any time. Even being interrupted by another project is fun (often happens to me) because it's just one click and you are up to date with other project's progress. And can tell your customer (if the program is not only for you) what you have done in the last week.
Of course it's just a tool, but from the available ones I saw, my favorite.
I use www.manymoon.com
Its a very simple to use yet power enough for small projects.
You should give it a try. basic version is free.
I use Codebase (codebasehq.com) for my git server and code management. There are also numerous other SaaS-based project management apps that are relatively inexpensive, e.g. Basecamp.
The one major thing I'd advise, however, is to find another person to code with you - it makes projects so much more interesting when you're working with another like-minded person. I've found that all of the projects I've worked on alone have consisted of much more grind than those I've completed with a 'coding buddy.'
Good luck!