Tuesday, December 22, 2009

TimeAgent progress 12-22-09

I'm happy to report that I'm making steady progress.  Fewer hours at work may mean slimmer paychecks and more stress about paying bills, but it also means more time available to write code and slog through bugs.

So, here are my changes.

No Marque.

I got rid of the scrolling entirely.  It's gone completely.

However, I didn't get rid of the ability to move items to different places along the bar.  It is still a simple matter to click and drag to rearrange the order that items appear.

This means that I have a bit more work to do, namely I have to add in a way to "snap" items in place.  It's a little hard to explain, since the English language doesn't have a word or short phrase to describe this...  so here's the problem and how I want to solve it:

Imagine that you have three items in your list, and you just don't like the way they're sorted...  You want to exchange item 2 with item 3.  Right now, you can click and drag item 2 over to where item 3 sits, then move item 3 in place...  but it would be a lot easier for every day use if you just dragged item 2, and 3 moves automatically to the space recently vacated.  Understand what I'm getting at?  A sort of "gravity" effect towards the front of the list, items moving to the front in the absence of any other task to keep them in place.

In fact, writing this out is helping me to form a plan...  have a "shadow" of the task stay in place, until the middle that task is more than 50% to the other side of another task...  then have a short animation of the tasks switching place.   The animation lets the users know what is really happening.  Also have a shadow of the task you're dragging attached to the cursor, so that the user knows that the program is responding to their actions. (Note to programmers world-wide:  always let the users know that the program is listening and responding.)

Task Windows

I have also added pop-up windows, after the task is clicked on.  (The windows do not appear if the user dragged the tasks at all...  I'll have to do some tuning on this, as right now, it is ultra sensitive, and not everyone uses track balls like me.  Mice are such imprecise tools that should be thrown away at the soonest possible moment.  This means that for most people who have never learned the joy of control that a trackball gives, it might be a chore to click on a task without inadvertently dragging the task a pixel or two over, turning the click into a click-and-drag.)

The task windows show a description of the task, hopefully more in-depth than the task's short title which appears in the app bar...  but it can be as concise or elaborate as the user wants...  it can even be completely empty.  The windows, right now, have 5 buttons with the following functions:

  • Set the task to inactive
  • Set the task to "currently working" (or back to the normal, "active" mode, if you're taking a break)
  • Edit the task
  • Open a web page associated with the task
  • Close the window
The first button, to set the task to inactive, will be the button to push when you're done with the task...  at least, done for now.  If it's a one-time task, i.e., pick up mom from the airport, then the task will remove itself afterwards.  (Future versions will have an option to log the task for statistics, but this isn't a feature planned for the 1.0 release.)  If it's a recurring task, i.e., check email, then the task will be removed from the app bar until it is scheduled to reappear.  (It will still be available in the main list of tasks, so that it can be edited.)

The second button, to switch a task's status to currently working, will be for marking a task as the one you're working on right now.  It will move the task into a special area on the app bar, and provide quick buttons for marking the task as done and opening its web page.  This is a bit of forward thinking, which will tie into the statistics tracking in future versions, but in version 1.0, it will just be a handy shortcut and reminder for the easily distracted like myself.  Only one task can be the working task at a time...  if any other task is set to currently working, it will automatically demote the working task back to a normal active status before setting the new one's status up to currently working.

The third button, to edit a task, is pretty self-explanatory.  Clicking it opens the task editor, and loads the task, allowing you to do anything you want to that task.  (Future versions...  {far, far future versions, like 3.0 server edition versions...  yeah, it'll be a while...}  will have client/server support, and you can only edit tasks that you have permission to edit...  but that will be quite a while, as the soonest I'm planning on writing a server for this is version 3, a few years down the road.  No firm plans on when to release a server edition, so please don't hold your breath.)

The fourth button will open a web page associated with the task, if appropriate.  Obviously there is no web page for a task telling you to pick weeds or go to the store...  but if the task is to write a post in your blog, or check your email, then the button will open that page for you.

And the final button will let you close the window.  Simple, sweet, and easy.

Program Options

I've added a window for setting program options...  things like the default position of the app bar (top of the screen, bottom, or the last position used), where to save the data files, etc.  Nothing works on it yet, mainly because I won't be working on saving files (and program options require configuration files) until I'm confident that there won't be any major changes in the structure of tasks.  Still, having the window allows me to add the options in as they become relevant, rather than taking notes somewhere and hoping I check them a few months down the line.

Up Next

As much as I want to tackle the interesting task of snapping tasks into place when other tasks are moved, I really need to get the the more meaty, and more boring, parts of the program.  Mainly, I need a way to create and edit tasks, without changing the source code...  So next up, it's time to make a window for managing my tasks.

On another note...

I installed a program today to add virtual desktops to my computer...  kinda sorta like having multiple monitors...  but not quite.  Unix and Linux users know what I'm talking about, but I don't have the time to explain what it is here.  Well, I'm running into an interesting problem: When TimeAgent is running, and I switch desktops, my program disappears from the screen, but it doesn't release the screen real-estate.  I'd like to find a way to address this within TimeAgent itself, so that there is never a problem with other people's computers, but I'll probably have to find a way within the virtual desktops program, and give instructions on how to get around it.

Sunday, December 6, 2009

TimeAgent out of prototype phase

I suppose that it would help if everyone knew what TimeAgent is.

I'm writing time management software.  Some people who have followed me on my previous blogs will remember me mentioning it before.

The Problem (that TimeAgent will solve):

I have worked with a few time management applications and methods of tracking my daily tasks before...  with mixed results.

I have used Google Calendar with great results...  when I would actually check it.  It never became a habit, never caught on, so despite its great number of features and ease of use, it failed because I wasn't checking it often enough to be reminded.

I have used programs installed on my computer that pop up reminders at certain times, including Microsoft Outlook.  After a couple of weeks, I'd either uninstall them or remove all of my tasks, because they were just too annoying; their reminders would pop up no matter how important the task, would interrupt my work flow, and cost me at least 15 minutes of quality development time, as I'd have to get myself un-distracted and back into the flow of programming.

I have also used no-tech solutions, such as pen and paper, even buying fancy day planners and such...  and after a couple of weeks, I'd stop updating them because I'd get tired of writing the same things over and over again.

The "product" with the best results so far have been to-do list widgets on my iGoogle page...  I check that page daily (it's my home page), and I have found lists that allow me to mark tasks as done without the task being deleted.  However, these lists are always there, and they don't have any distinction between different days...  if I leave a task marked completed one day, then it stays completed the next.  If I have tasks that I only perform on days that I work, or on my days off, then the tasks will still appear on my list regardless.  After a while, I tend to ignore the lists.

The Solution (that I hope TimeAgent provides)


So, what I want and need is a program that will be ever-present, but never annoying.  It has to have as little tedium as possible, yet robust enough to know when to remind me of a scheduled task should be worked on.

I hope to achieve the ever-presence by having TimeAgent run primarily as a deskbar application...  That is, it takes up an edge of the screen just like the Windows Task Bar does, or the Google Desktop application, if anyone has used that.  When a task is scheduled, it will appear as a button on this bar, allowing me to take action on it.

To prevent the program from becoming annoying, it will not pop-up reminders (okay, maybe in a future version a few years down the road, high importance tasks might pop-up, if the user wants them to), it will not make any attention-grabbing sounds, it will just sit there either quietly congratulating the user on having completed all of their tasks, or silently displaying what tasks they still have to accomplish.

The lack of tedium will come by allowing people to create a schedule on when the task will appear again, so that once a task is added, it won't be deleted when you're done, or when the next day begins...  schedules like daily (i.e., for cleaning your cat's litter box), hourly or minutely, or even at certain times throughout the day (i.e., for checking your email...  for the neurotic, it can be set to every minute, every 15 minutes, every 90 minutes, or even every 27 minutes for the truly random...  for the more laid-back, every 4 hours, or just after you wake up and just before you normally go to sleep), certain days of the week (i.e., monday-friday for getting your kids off to school, or tuesday nights for getting the trash cans out to the curb), certain days of the month (such as for paying bills), or even certain days of the year (for birthdays, anniversaries, or even multiple days of the year for quarterly reports or such activities).

For true robustness, though, I am adding in project scheduling, where individual tasks can have their own schedule, but the tasks are grouped together, and follow an even larger schedule...  For instance, if you have team meetings at work every Monday at noon, but this Monday is a work holiday, then the task won't show up...  since you won't be at work, and all, and nobody will be at the meeting no matter what the computer may say.  This would be especially important for someone who has a rather...  unpredictable work schedule (like me...  monday-friday is vastly over-rated).

My Progress So Far (and a look at how it is designed)


Well, I'm pleased to announce that after a couple of years of slowly prototyping and tinkering, I'm entering a phase of real and earnest development.  I have a solid plan on how the program is to act, what it is to look like, and how people will interact with it.  I have completed my basic prototype which, while it is technically useless right now, it is a great place to start further development.

My next, most immediate step, is to create a development plan, complete with deadlines.  That includes not just thinking about the features I want, but actually writing them down, organizing them, and making a plan for when and how to implement them.

The step after that will be to make a functional GUI...  create panels to display detailed information about the tasks, open web pages in different browser windows, and create a way to actually make and schedule tasks without making users muck around with source code or cryptic data files.  After that, create a file structure (probably XML) to save the tasks in...  since until I actually have all of the features implemented in their final form, I have at best a great guess at exactly what data I'll need to save, and how to save it...  and if I guess wrong, I don't want multiple versions of datafiles floating around to confuse and cripple my program...  I don't want my first release to have to worry about backwards compatibility with the development versions.

Once all of that is finished, I'll start with some user-testing.  Not quite beta-testing, because I won't be leaving the program out for people to intentionally break it...  I'll be testing people's first looks at the program, as far as how easy it is to use each feature, i.e., add a new task, change a task's schedule, open a web page related to the task, etc.  After all, I'm the developer...  I have to assume that all of my assumptions about how easy the program is to use are completely wrong, since I'm the one who will have written the thing.  For me, adding a task is as simple as clicking this menu item, selecting that panel, and entering the information...  when the reality is that most people won't even know that the menu item exists, much less that there is a panel where information can be entered.  (Honestly, if it weren't for the precedent set by Windows 95, who would know that the little circle with a flag in it, in Windows 7, is actually a system menu useful for shutting down the computer, running programs, or accessing the nuts and bolts of the machine?)

Then, my final step will be to call in a favor with a GUI artist, and make the program look clean and polished. I'm leaving that as the last step because I want the base program to be as rock-solid as possible, and I want as few major changes remaining as possible, before I worry about its shelf-appeal.  I'll enlist the help of the artist as soon as I'm ready to release a beta product.

Then, I'll spend a few months chasing down bugs that appear in the beta version, put a little more spit and polish on the thing, and I'll finally have a released product that might...  just maybe... be good enough to bring a little extra income.  That last step is still quite far down the road...  with an average of 20 hours per week of development time, if I'm lucky, I'm looking at least a year down the road, probably even two years.

Provisional timeline:

So, with that being said, I'm going to stick my neck out and make a guess on when TimeAgent will meet its milestones.

Now: Complete a plan (making this estimated guess obsolete, since I'll be basing my plan on researched data), finish in a couple of days.  Enter "Core Development" phase where nothing actually works, but all of the pieces are being fit together.

1 month: Semi-useful GUI.  I'll be able to add and remove tasks, and manage their schedules.  The heart of core development.

3 months: "Complete" GUI.  Adding and managing tasks will be old hat...  I should have a very reliable scheduling system in place.  Begin Alpha Testing.

6 months: Chase down most of the annoyances, begin user testing.  Late Alpha phase.

7 months: Finish initial user testing, implement changes and incrementally engage in more user testing as each change is made.

9 months: Contact GUI artist, begin limited Beta testing among trusted developers.

11 months: Finish polishing look and feel, begin open Beta.

13 months: RTM (release to market).

14 months: After action review, begin collecting data for next version.

Now, none of this portrays my marketing...  Honestly, that's the part that is the most daunting to me.  I know that I'm going to be producing a product that fills a need...  but if I tip my hand too early, I'm afraid that someone will steal my idea (you can't copyright ideas, only implementations)...  Since I'm just one developer, and most of my time is spent on other projects, I can't compete with developers who already have a market base.  If I start my marketing too late, then the launch will be slow, and I'll lose out on valuable beta testers, and major bugs might leak into my RTM version.

I could  protect myself by making this open source, in which case nobody will steal the idea (why compete with that which is free?), and I'll get high quality testers...  but I lose control over the code, I'll get burned out on the project, and nobody will pick it up...  the idea dies.  If, however, I keep it proprietary, I'll be able to focus on upgrades and fixes, and I'll have motivation to keep on producing it, as well as produce other, more ambitious software...  hire employees and contribute to the economy, saving people time (which equates to money, especially if you have hourly employees), and improving everybody's standard of living by 0.0000000001%.