I have not been fully happy with Spaces. What I want out of a virtual desktop solution is good handling of the "tasks vs. apps" problem. What I mean by that is that the operating system views the world as consisting of applications and their windows, whereas to the user the world consists of tasks the user is trying to accomplish.

For example, suppose I have four things I'm in the midst of working on at the same time. I've just deployed an update to a set of load balanced servers, and I have terminal windows open on each server in which I'm tailing the logs to see if any unusual errors show up. I've also got a browser window open on a monitoring page for that service. Finally, I've got a chat window where I'm in contact with an IT guy who is also monitoring the deployment. Let's call this task T1.

I'm also writing some code. I've got a terminal window for running tests, and doing git commands. I've got a browser open to look up documentation. I've got an editor window for editing. This is task T2.

I'm also reading HN. That uses a browser window, sometimes two or three if I go off following links. I'm also got a chat window opened discussing the more interesting HN news stories with a friend. This is task T3.

Finally, I'm putting together a report. I'm running some log analysis scripts in a terminal window, getting some other data from some web-based sources, and actually writing the report in a text editor. This is task T4.

I'm using four applications: Terminal (which I'll call A1), Safari (A2), Textmate (A3), and iChat (A4).

Here's a little table showing what is going on. Rows represent applications, columns represent my tasks. An 'X' where a row and column intersect means that the column's task involves windows of the row's application.

A1 = Terminal
A2 = Safari
A3 = Textmate
A4 = iChat

T1 = monitor recent deployment
T2 = writing code
T3 = reading HN
T4 = writing report

| T1| T2| T3| T4
--------------------
A1 | X | X | | X |
--------------------
A2 | X | X | X | X |
--------------------
A3 | | X | | X |
--------------------
A4 | X | | X | |
--------------------

Working on a single desktop, there are two ways to manage windows. Minimization is focused on individual windows. In terms of the table above, minimization manages windows on the level of the individual cell.

The other way to manage windows is show/hide, which operates on the rows of the table. You tell Safari, for instance, to hide all of its windows.

What is missing is window management oriented toward the columns of the table. At any given instance I am working on one of my four tasks. I want to see all of the windows associated with that task, and do not need to see the windows for the other tasks (and often specifically do not want to see them as they are distracting).

This is where virtual desktops should be ideal. Use one desktop per task, and switch between desktops when switching tasks. The problem is that most (all?) implementations I've seen of virtual desktops do not sufficiently isolate the desktops. For instance, the "next window" functionality supported in many apps will switch to windows on different desktops.

What I want is for each desktop to be largely independent of the others. I want to be able to cycle through windows, alt-tab between apps, and use "hide", "hide others", or "show all" and have it only apply to the windows on that desktop.