This may be controversial, and all of the usual disclaimers apply - this is based on my own experience using both of the languages/frameworks to do real work on real projects. Your mileage may vary. Because this is something that has the potential to spiral into vague comparisons, I am going to…
|—||Nolan Bushnell - Atari founder (via it8bit)|
First, go grab some headphones. The best ones you’ve got. If the best ones you’ve got are these suckers (or something similar), you should really go buy new ones, but use the best you’ve got for right now.
Take a break from whatever you’re doing for 2 minutes and listen, but just listen to the whole thing, even if you have to multi-task.
Headphones on? Ok. Good.
Now, press play.
“Upular (3D Audio Version)” - Pogo
YouTube - Nyan Cat Progress Indicator on YouTube
(Ryan why you so good at comics so much all the time)
I get easily distracted when I work. I easily get into tack ons or spend way to much time doing major work in areas that have little effect on what I’m supposed to do. I need a way to organize what I’m doing. Writing this blog post is somewhat of a tack on i suppose. I already failed. Blah.
Lets start out with three example projects. A web app, a web framework (which the app uses), and an IRC client (not related to the other projects at all).
Some thinking has created broad todos for each, probably use cases (such as “Usercreates an account” in the web app and “User connects to a database” in the framework).
I organize all these todos into the different projects.
I choose one project that I will work on exclusively to avoid losing focus. What project I choose depends on deadlines mostly, or if it’s hobby programming then I pick the one I would like to work on.
Say I choose the web app. Sounds fun.
I take the first todo. I don’t pick one that sounds fun, here or the hardest one or anything like that. I just arbitrarily pick the first one.
I start thinking about the todo, is it a lot of work (say >30 minutes)? If it is a lot then I try to split it up into parts that i estimate will take about that much time, if it’s less that’s completely fine. If it’s more than 30 minutes then I can split it up further later. All these new todos are added to *the end* of the todo list. I then move on to the next todo until I find one that looks small enough for me to do.
I start work on it. When working on it I’m bound to think of other things I haven’t thought of before, (oh the user needs to be able to log out as well, I forgot about that). I append that to the todo list. If I figure out this todo has other dependencies there are several possible categories here:
- It’s a minor dependency in this project (Add a submit button), I can then do it without creating a new todo. If I think I may forget it i might make a separate todo for it and add it to the top of the list (above the todo I’m working on) since I’m going to finish it in conjunction with the current todo.
- It’s a major dependency in this project. I create a todo for this, then stash all the current work I’ve done, move this todo to after the major dependency todo (so next time I get to it the major dependency is solved). I then proceed with the next todo.
- It’s a major dependency in another project (Web framework needs database layer). I then add it to the end of that project’s todo list. Can’t do it now, working on another project.
- It’s a minor dependency in another project (Web frameworks API for connecting to the database is somewhat verbose). Add it to the end of the todo list for that project. I don’t want to do it now since I’m working on another project. I can use the verbose interface for now and then refactor later when I’ve finished the framework todo.
- It’s a completely unrelated todo (IRC client has a bug in it, I need to vaccum my room). I just append that to that projects todo list.
This keeps me going in the right track. I’m always working where I should be. It’s also very satisfactory to know that I don’t just ignore things, I add them to my lists. Another good thing about it that I just realized, which made me want to write this blog post is the fact that when something big and unplanned comes up (Forgot to implement proper authentication for web app) then I don’t have to immediately do it. Future Adam will take care of it. So I just append, and keep doing the much smaller and easier task (since it’s < 30 minutes of work). It really motivates me at this point, since I don’t have to think about “all that other stuff” yet.
I also never do anything that isn’t a todo. Fixing minor styling issues in the app is not something I need to be bothered with when I’m doing a todo. I’ll instead just add a todo for it, either specific (submit buttons have an ugly color), or a general one (review graphic design).
I have been working kind of like this for a long time, but for the last few days I’ve been following it blindly. I have been more productive than I have for very long.
I’m not sure if everyone will be efficient like this, or if everyone will find this rigid structure as motivating as I do. But try it out :-)
I’m using Things for OS X to organize my todos. It’s not really necessary to have a proper application, multiple text files (emacs org-mode comes to mind) will probably do equally well. The top down approach also prevents me from needing to specify dependencies between todos, they are sorted topologically as I move through the list.
Viktigt budskap! Uppsatt i Skelleftehamn.