views:

981

answers:

23

Here's what I'm wondering. Every night that our 3 months old baby lets us sleep, I jump to my computer and start coding my hobby projects. I have about 20 different projects that I'm working on: different types of projects, from C++ games to web apps along with some contribution to open source projects. It's truly a passion and has been for a lot of years.

Yet, when I look back, I see that I haven't been able to fully complete one of my hobby projects. I've always done the prototypes and setup the most important features, but with time instead of finishing my project I end up switching to another project that seems "so much cooler" at the moment. Hence I ususally end up with buggy and incomplete games that have no end nor story, 3D engines that have the fastest PolygonDraw routine ever, yet lack to implement anything else, etc... The list is long. I think I must have written unfinished Pong over a hundred times different!

I've been told that the remedy is to write specs for my hobby projects.

On one hand, I write a lot of specs at work. I know how crucial they are for defining a product's roadmap and staying within schedule. On the other hand, specs and hobby project just quite don't seem to go along! It seems to me that the learning curve to building a game is actually what makes it fun; not the game itself. Hence the fun of loosing time restructuring an entire engine, the fun of creating the most useless features, and so on...

So here comes the question: Do you ever write specifications for your hobby projects? How are they different then the ones from work? How do you manage to complete your hobby projects?

I'd be glad to know while I work on my new project: a piano sonata generator :)

+1  A: 

Yes and no. I write notes in a notebook as I'm thinking about it, and add to it as I implement it. It is a somewhat different process from work projects where someone else may have to see the spec.

I finish about half of what I start.

Jesse
do you keep the handbook along as the years go by? I sometimes work on my projects for years!
m_oLogin
I follow the same procedure as Jesse. I have notebooks that are over 10 years old. Sometimes I even refer to them, since I'll grab an idea from one thing ages ago to put into something new. Most often the type of stuff that gets that kind of reuse is the creative stuff like game stories.
rmeador
My stuff tends to be business utilities for my side business, but I do keep all of my specs.
Jesse
+10  A: 

It is all about 'Self project management' ... even for FUN!

I feel for you ... I have many repos that tend to all get stuck at around revision 200 or so ... this cant be a random event:

Here is what happens , because I don't do enough planning, after around 200 commits, things get messy and need a rewrite ... then interest disappears because it seems like too much hassle.

I learned to write my own specs for personal use

to

  1. Give me focus to get the job done, and not go off into feature creep lane
  2. Remind me What I am working towards
  3. To have great ideas before I get coding

For me, writing my own specs is vital to getting anything done!

You wouldn't start a business without a plan would you?

For personal projects I have tons of moleskine books filled with rough specs and ideas. When they mature, they migrate from the note books into real documents and the coding begins.

BIG EDIT: On a drive for personal efficiency and, to get projects finished. I read "Getting Things Done" ... Despite all the hippy crap about 'psyche' and various levels of mind (which im sure is not based in any science) the tips are very good.

Aiden Bell
I guess not. Do you write personnal specs differently than you do at work?
m_oLogin
I work for myself, so somtimes work and personal overlap. When a project is for a hobby I generally follow a similar workflow to those that are developed to pay the bills.
Aiden Bell
This way, both get done and I am happy. Otherwise, I would be coding commercial projects and thinking "I wish I was coding that pong game" ... 50/50 work and play is only good if both get done!
Aiden Bell
great answer, thanks
m_oLogin
Ah! The Bold! My eyes, my eyes!
Simucal
@Simulcal ... Its my style! :P
Aiden Bell
+7  A: 

I don't get too complicated, but listing out all of the features and requirements that you want included in your application really does help. As with most hobby projects you often don't just sit down and code them straight through for 2 months and finish them. It's an hour here, two hours there, etc. Basically it's very common to forget what you were working on last and what the original purpose of this super great idea for an application was.

If you spend a few hours writing down specs and requirements it will be very valuable to you 6 months down the road when you get some free time or your ADD switches to that project and you try to remember what it is this was suppose to do.

Jeremy Coenen
+1: that's a great reason
m_oLogin
One nice thing about BDD approaches to development is that you can clearly see which behaviors have been implemented and which have not. This can go a long way when picking things up again.
y0mbo
+2  A: 

I usually write a first set of spec when I get started.

I'm also a big fan of paper thinking, so I'll draw screens, UML, diagrams, flow charts, design elements... It's just a matter of defining the scope of your project and be able to watch what you had in mind. It really helps me think.

These documents will be my specs for the whole project. I will add others as I go, but I'm not trying to maintain the old ones as much as I would have it it was a work project: I know where I'm going and I can keep track of the changes looking at my code.

Of course, some of my hobby projects are done collaboratively. In these cases, I write down more specs in order to have a better communication with my team and I try to keep documents such as DB Diagrams up to date.

marcgg
good answer thanks
m_oLogin
+2  A: 

I also have several hobby projects that I have not finished. I have about 10 and have written a specification for exactly one of them, the largest in scope (also a game).

I have not finished either the ones without specifications, nor the one with. I think this is because I never publish the work or show it to anyone so it remains full of bugs and never 'finished.

I suppose that this means that regardless of whether or not you have a spec, it will not affect the success of the project as much as other factors, like having the time, motivation, help, and having confidence.

NetHawk
thanks for your answer. Perhaps as my starting objectives, I should have a sort of public release for my personnal projects
m_oLogin
+10  A: 

I don't think writing specs is the solution to your problem. Clearly, your "hobby projects" are things that you find fun. You write the fun parts but then avoid the not fun parts that would be necessary to complete something.

If you're just "programming for fun" then good, you're succeeding. I don't think writing specs is fun.

If you really want to "finish" something, the best way isn't to write a spec, it's to not jump to another project when the fun factor dips.

anthony
+5  A: 

I just found out recently that writing specs is really the thing I need to get my projects done.

I've been a bit like you, tons of projects, jumping from one to the other and never getting things finished. Until about 6 months ago, when I started to actually write specs and have a kind of roadmap for my projects.

All that I can say is that, it actually works, because you break your projects into smaller steps, just like a race with checkpoints, and when you start to mark the checkpoints as done, it feels good, addictive and your focus will be on the finish line.

This way, you get to keep only 1 or 2 projects at the same time, but actually finish them. And of course, you have the extra and pretty valuable bonus of keeping up with the project even if you don't touch it for about a month or more. The specs will always be there to remind you of the goals and purposes of your project.

This is just my personal experience, and I believe that you should give it a try. Hopefully it will workout for you too.

rogeriopvl
thanks for your answer
m_oLogin
+4  A: 

I've been able to do some hobby projects and finish some of them. I try to finish them all but some i just cant muster.

The reason i think is that the amount of details that are needed to finish a projects are so many that it goes from a passion project to a chore of a project.

What helped me finish most of mine is that they stayed a passion until the finishing touches were left. So i just plowed through them.

Will a spec help, to some degree yes. They get you further into the project but almost always there's a point where the passion fades and you look for the next shiny object.

Ólafur Waage
+1 ... I think a spec with your "grand vision" at the start can help keep you on track when the core goodness turns to boring input validation :) ... then when you work through that you get the 'realized vision' that makes you happy
Aiden Bell
Well put : )
Ólafur Waage
+1 good answer...
m_oLogin
A: 

Short answer: developing specifications for a hobby project is neither necessary nor sufficient to guarantee completion.

That being said...

I keep an engineering notebook for all of my personal projects. I use the notebook to capture all sorts of things about the projects on which I work. This includes project motivation, valuable resources leveraged during the project, things developed over the course of the project that might potentially be reused later, key insights gained, etc. etc. It also includes, more to your question, specifications for most of the projects. I employ an agile/lean approach to creating these specifications which, for me, is compelling from a cost/benefit perspective.

btw...I have many, many personal projects that did not culminate in a complete working system. Some of these I might get around to completing 'someday maybe'. I consciously chose to stop working on some of the others because they had served their purpose (e.g. introduced me to a new technology, helped me better understand a language feature, etc.) Continuing to crank away at projects like these would have led to diminishing returns so I chose to reallocate my time to projects I felt were higher leverage.

Brandon E Taylor
A: 

Unfortunately, after writing specs for the core of the DIFL engine (don't bother looking it up, as there's no trace of it outside my home systems), I still didn't finish it up.

David Thornley
+4  A: 

It doesn't work for me! Infact whenever I'm writing up specs I'm generally making the projects even bigger, and less likely to be finished.

Sometimes the best way to do it is to just do it.

Ze Frank explains this much better than me: http://www.zefrank.com/theshow/archives/2006/07/071106.html (video link with swearing)

EDIT: Just to add. If you are finding you want to leave your half-finished project for a new, grand idea... do it! Don't look back!

Completion is not a requirement for your own pet projects. Nobody will blame you for not finishing stuff that barely anyone else would even bother starting.

The reason you started was because of passion. That is very important. You should not force yourself to 'slog through' in your free time. You will drain your passion which is your most vital resource.

Chris Burt-Brown
+1  A: 

I've helped with development on a range of systems from safety critical avionics to throwaway personal projects like a Sudoku solver. Obviously with the avionics systems, specifications were critical to the safe operation of the system and to prevent killing somebody, but I've never bothered with my personal projects.

I think this is because specs are generally boring to read and write. Joel wrote an interesting article about this, and how to make them better if you do write them:

Painless Functional Specifications

Unfortunately I haven't had the guts to try making my specs more fun to read at work yet.

Maybe intead of writing specs you should try working on some projects for or with other people? That could provide some external motivation. I do some web devleopment for my cousin's drive in theater, and if they need a feature they won't stop asking me about it until I finish it.

Shea Daniels
+1 for the link. I've always thought that the only reason to make specs funny was for other people to laugh at it. I guess making personnal specs funny will probably make me smile a few years down the road reading them back!
m_oLogin
+1  A: 

The single biggest piece of advice I could give you would be to get something out there - make the spec for your first version small enough that you actually feel you can complete it, even though it won't have nearly all the features you want.

Once you get something out there, the pressure from users of your software will be enough to hopefully keep you going on it. It also ensures that the direction you take in development is the same direction your users want you to go.

If you don't actually get any users, then don't feel so bad about dropping the project - if nobody is interested, it probably isn't worth pursuing.

If pressure from your users isn't enough to keep you focused, then open source it. If there's enough interest in it, somebody else will pick it up where you left off, and you are free to move on to bigger and better things.

Eric Petroelje
+2  A: 

The single best thing I've ever found to help move towards completion is to have someone else working on the project with you. Find a friend (or two) who is interested in the same thing and design/code it with them. Not only do you have someone to bounce ideas off of, but you've also got someone to motivate you, not to mention progress is twice as fast so you'll hopefully finish before you give up :)

Of course, it requires source control, but you were already using that for your projects, right? :)

rmeador
+2  A: 

Do you want to finish them?

I think it's reasonable to never finish a hobby project. You can just keep working on it as long as you live. Aciddose has been working on his virtual instrument xhip for years, stubbornly never getting to 1.0, making the instrument patches people program worthless from one release to the next. Yet he and the users of his softsynth seem to be having a grand time.

Maybe if you just aim for a "release" and not being "finished" you'll be more satisfied. Betas let you keep dreaming.

Nosredna
A: 

The real question is: what is your hobby? Is it finishing a project, or tinkering. If getting the last ten yards is a chore, you have to decide if it's worth it to you. Writing detailed specs will work; so will self-flagellation if you're into that sort of self-discipline. Nothing will make it easy if it's against your make-up, so you have to decide whether the end-goal is worth anything to you.

And, just to demonstrate that there is nothing programming-specific about this point, you might really like this guy. One of the main points in his work is that conceptual artists, such as Picasso and Da Vinci never really cared about the final execution--the idea was everything, and, having asserted it, they were strangely content with someone else finishing the actual work or leaving the sketch unfinished and unpublished.

David Berger
A: 

hi there,

I'm working on a large automation project (testing) in which we followed the framework guidelines to create the infrastructure for a programmatic testing, however when lot's of folks got into the team and started to mess around (especially lot's of testers with little to no coding skills) I realized that we are going crazy, so I started to create high level specs (after reading Joel's spec related topics) and now I really realize how is to think backwards, usually in my own freelance project I didn't used to write specs and some them are not recognizable anymore :)

Tiberiu Hajas
A: 

I'm not sure that writing specs is the solution to your problems (or mine which seem similar) however in the case where I want to make something more than a throwaway experiment there are a few things that help me slightly without taking the fun out of it.

Specs really are quite tight and should be technical but for a hobby approach you could write up a little bit of something similar much more loose that outlines some of the things you would like to feature and shows how they fit together in a sort of design draft. Though not as detailed or restrictive as a proper spec it might help to keep the tinkering leading in the right direction.

Secondly you could break it down and depending on your time allowances maybe add a few goals in. If you focus on building one part of the project as a time breaking it into subprojects that can be linked together at the end, it gives a feeling of progress as you move from part to part rather than feeling like you have been working on the same thing for ages and can't be bothered any more. It works if you tick it off on a list, since usually it has to happen atleast mentally anyway.

In saying this if your goal is to play with certain concepts and not actually create a final product then you probably won't because you aren't working towards it. One way might be to take the above mentioned idea of breaking it up and then find a way of adding something personally interesting into each part that bores you, maybe trying to add a challenge into it or something.

I'm not particularly experienced still learning, but this is how I keep my tinkering together(sometimes unless I hit a total block cause by inexperience) and how I've approached many multimedia and web projects on a hobby basis in past years. Though the guy who said open-source it when you get bored and let someone else pick it up, that was a good idea if you want to see your code used but have satisfied your personal goals.

Toby
A: 

I have much the same problem. One thing I've noticed that HAS helped though, is lowering my ambitions. like WAY WAY low. Writing a spec is one way to reign in the ambitions, if you have some kind of limiting rule for the spec, like "The spec can only be one page", or "the spec can be no longer than 300 words long", or "Spec only something that I can get done in one day of coding". Getting the balance right can take some practice. If you go with the last limit, you can impose the rule of MANDATORY dismissal of the project if you can't finish it in one day.

The nice thing about this, is it limits you to achievable goals. This might sound really stupid or wrong at first. Or maybe it sounds reasonable, but you just can't help it, you wanna do amazing things, not ordinary things! Not small things that you can only get done in a few hours!

but keep this in mind:

“A complex system that works is invariably found to have evolved from a simple system that worked. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work. You have to start over, beginning with a working simple system.”

—John Gall

It is SO MUCH easier to make that ambitious project, if you already have a FINISHED and WORKING project to base it on. Then the "more complex thing" CAN be a project that fits in a day. This is the ideal and philosophy I'm working towards, because I think it has the best chance of succeeding. Looking at past successful projects, the vast majority of them evolved in this way, whether it was intentional or not.

Breton
A: 

What helps me a lot is to split a new feature into small tasks that could each be done in an evening hacksession. So if I have time, I simply pick one task from the list and just finish it. This is often enough to get "in the flow" and do "just one more".

I do this only for one feature at a time so I don't get distracted by all the other cool things I could add to my application.

ftl
A: 

I constantly write specs for my projects, in work, at university and outside in my free time. The biggest weakness of a programmer is his/her memory, so I find it good to keep myself busy during my thinking time by writing down my every thought into some sort of structured document. Before you know it you've written a full database schema or have a Requirements Specification.

At the moment I'm working on improving my SQL skills, and I've been spending a lot of this free time between writing queries writing down my experienced. After a couple of tweaks I had a decent document outlining what needed to be done.

EnderMB
A: 

I think the core problem is not the lack of specs, but rather that finishing something (anything) is hard.

It is hard work. It may seem as if your program is 90 % done. But doing those last 10 % (rooting out all bugs, getting the application to release quality, writing documentation, etc) requires as much work as the first 90 %. And if you want to be serious about marketing your program, answering support emails, fixing other people's bugs, that's more work still. And perhaps not the kind of work you are most interested in.

It is also hard mentally. An unfinished project has unlimited potential. It is an empty canvas where you can project your unbridled ambitions, lofty ideals and revolutionary thoughts. Once it is finished and made real you have to see it for what it is. Limited. Flawed. Never as pretty as the idea that spawned it.

That said, finishing something can also be very rewarding. You learn a lot, get a reality check on your ideas, the satisfaction of having completed something and you get to see what other people think of your work.

Some advice:

  • Make sure that you really want to finish the project. I.e., that the rewards are worth all the hard work. (If not, then accept that fact and remain a happy tinkerer.)

  • Find ways of motiviating yourself through the "boring" parts. Specs, maybe, if it keeps you focused. But find whatever works for you, whether it is ticking of todo-items, rewarding yourself with a cookie or dreaming of fame and fortune.

  • Release early, release often. The more you save for a "big release" the bigger is the chance that that release never happens.

  • First release, then rewrite. When you feel the urge to do a major rewrite, do a release first, then do the rewrite (if you are still up for it). Software is never perfect. If you strive for perfection without any pressure to release your half-baked (but existing) code, then you will never be done.

A: 

Most hobby projects of mine don't really get finished either. As long as I'm working on something and learning though I don't think thats a problem. Currently I'm not writing specs, but I am practicing/training TDD. I bring it up as I write tests that are the specs. Some days I'll sit down and just create a bunch of tests outlining what the software should do. Some days I make those tests pass. Its enjoyable in that I don't have to keep the code all in my head, and at any point I can sit down and make further progress by fixing the broken tests. Things just work, its kind of surreal.

Frank Schwieterman