Aaron Swartz did a good post the other day called How to Build Decent Productivity Software. A subject close to my heart. Thing is, I really need the computer to help me with this kind of stuff - I've a lousy memory, tend to be sloppy at organising my information and am an advanced procrastinator.
When I first started seriously looking at the problem (long before GTD (and agile), but after the dread Microsoft Project), the most promising-looking things around fell into the the category of mindmapping tools or outliners - essentially the same idea, but the former is graph-oriented and the latter hierarchy-oriented. It didn't take long to realise that most of the existing applications conflated Model with View, either making the information hard to navigate or flattening the model down to a tree shape. It was also noticeable how unwebby the existing apps were, if they had any web-orientation it was usually a dump to static HTML. Long story a bit shorter, the obvious solution is to use a dynamic RDF-based model with a variety of views.
Something which took me a lot longer to figure out was that things like keeping records and dealing with todo lists are completely wide open when you have a completely wide open data model ( the original Ideagraph plan was foolishly open-ended, way too big for me - the Nepomuk project probably comes closest right now). To constrain things to manageable proportions, some notion of context is needed. The approach I chose for this was to associate pieces of information and tasks with a notional project ( as and when when I get back to IdeaGraph proper, it'll be a project management tool) hence the project vocabulary (which is on my list to revise this month, btw).
Now I have a Talis Platform store on which to host data, the backend side of implementation is effectively done. I've got a logical model in the project vocabulary. But more pressing this time around than todo list stuff was a done list, to log my activity. So I got the essentials together - I decided to use a little Java desktop app (more background at A little dogfood). I included some minimal bits for logging todos.
Prompted by sbp's reference to the FTDB approach to GTD I added a status checkbox, which allows options for 'open'/'done', so I can track when I've done five things and be happy. I've not attached anything new at the web view side yet, though my activity Timegrid seems to be working nicely. Here's what the QuickLog app looks like in its current incarnation:
Then I read Aaron's post. Ok, his first bullet point is Remembering everything. Well yes, eventually - I have a store which could contain everything, but hooking up all the tools I use to it isn't a small job - getting into the Nepomuk territory again. his second bullet point is Getting you to do stuff. Bravo. That's what we need. As he suggests, this will ideally be the best thing to do at that point in time.
As mentioned in comments there, a difficult part is the prioritization algorithm. I've looked into this quite a bit - planners are well documented in the literature, but they're generally designed for multi-agent systems. While an obvious thing for GroupWare 9000, I don't personallly need that. I'm relatively autonomous workwise, the external interactions with my schedule are pretty black and white: I must do something (by...) or I can't do something until someone else does something. Pretty easy to special-case.
But a significant factor for me is that a lot of the things on my todo list can help in several projects - e.g. I've got a couple of XSLTs to write which are essential for demos I have in mind on the Talis Platform, but they're also good for grddl-wg outreach which in turn is good for sweo (and vice versa...). The priority of such tasks should get pushed up because of these soft dependencies. I already created terms for these in the project vocab, and the way I intend to use them eventually is through a combination of 'digital' RDFS/OWLish inference alongside 'analog' numerics.
But I'd already got some kind of prompting mechanism on my todo
list for QuickLog, and with the soft dependency of Aaron's post I
just got it mostly done. First time around I did it like Aaron
suggested - a periodic popup.
Nooooo! Because the system doesn't know whether you're
productively occupied or zombie-biting in Facebook, it's hugely
distracting, flips your context when you're concentrating. But I do
need to log my activity, and popping up the empty logging box isn't
demanding in the same way (I guess it could double up as a 'time to
stretch legs' thing).
For now I've hacked a prioritization algorithm. What now happens when I click on the Next tab is the app runs a SPARQL CONSTRUCT on the Platform store which filters down to just the prj:Tasks and their properties, GETting the result into a local store (this part is just one method call (!) in the code : taskGraph.read(TASK_GRAPH_URI) - though I do need to add a popup 'in progress' dialog). Then my prioritizing algorithm is run on the tasks: multiply the age by the priority. This creates statements like <task> prj_aux:calculatedPriority "123"^^xsd:int. These are sorted (programmatically for now) and the highest valued resource pulled out, with its title showing in the app's panel (yeah, I need to work on the display too). Like so: