The evolution of web applications, each richer and more intuitive than the last, has created a large gap between web applications and the desktop environment we spend most of our time in.  Here are some conceps that I think are outdated and due for a fix in the near future.

File systems

I’m currently in the process of trying to organize my file system so I can back it up, so I can re-install Windows (a post for another day).  A big challenge is photos from my digital camera.  At one time I tried organizing them by date, as in: …/2008/09/06/foobar.jpg.  This is okay, but what if I want all images, across all years, related to “foobar”?  I could organize them by subject matter, by events, etc, but the bottom line is no matter what I do there will be some cases where another method would make more sense.

Filesystem abstraction layer

So here’s my question: why do I care what path a file goes in?  Back in the days of DOS games I recall having to tell the games who made my sound card, what port it was in, what IRQ and DMA to use.  Now with hardware abstraction layers, I don’t have to worry about that.  How about a filesystem abstraction layer?

That I know of, it’s been done in the application level.  Google’s Picasa lets you store images and tag them according to various subject matter.  Let’s take that theme and apply it to the whole OS.  I want to be able to put an image on my hard drive and tag it with keywords related to it: where I took it, who is in it, how I was feeling at the time.  I’d also like the OS to automatically tag it with some useful information like the file creation time, the file size, and (we have the technology) the major colors in it.

Once I’ve done that I want to navigate my files by keyboard, not directories.  If I want a picture of my bird Jimmy from Febuary 2008 I want it to look something like this:  /febuary/2008/jimmy.  Of course, each step along the way, I want to see a summary or detailed list of files that fit in that bucket.  If I just want all of my pictures of Jimmy, I want to be able to navigate to: /jimmy.

What if I didn’t tag a file, but now I want it?  No big deal.  If it was a spreadsheet that I saved this month, I would start looking in “/spreadsheets”, and I would sort by date to look at the most recent.  Failing that, I would add “/spreadsheets/this month”.  The OS would know that “this month” means the current month.

So where do they live?

As a user, this is just an abstraction layer; a more user-friendly way to get at the underlying filesystem.  But it’s still there.  I generally don’t care how the files are laid out.  If I really want to see the underlying FS, there’s no reason why it can’t be exposed through an advanced interface.

As an OS developer, I can continue to store files in the same kind of structure.  Or I can store them in a way that is the most efficient.  Where I work, for example, if we want to store a file called “foobar.jpg” we put it in “/f/o/foobar.jpg”.  This prevents directories from getting bloated and huge, which makes them more efficient for traversal.  If the user doesn’t have to make this decision the OS is free to, and it can probably make it better and smarter than the user without impacting the usability at all.

Saving your work

Here is another one that’s outdated.  It sort of goes hand in hand with filesystem abstraction.  When I’m working on a document, I have to be conscious of whether or not I’ve saved the file and I have to be sure to save it as I go or I lose my work.  Why do I have to tell my OS that I want to save what I’m working on?  Aren’t we past that yet?  Should I have to care whether or not it’s written bits to the hard drive yet?

Some apps have auto-save, and some even have auto-save that don’t require your file to have a name yet.  Most apps that I use, though, won’t auto-save a file until I’ve saved it at least once and given it a name.  If it’s an untitled file, no auto-save.

I’d like to see the word “save” obliterated from modern user lexicon.  All applications should automatically save as I work.  If I haven’t tagged the file yet (see section above) then it should just be saved as untagged, or better yet tagged with useful things like “spreadsheet” and “work in progress”.  Maybe even pull some keywords out of what I’m working on.

Ok so any engineer reading this will point out that this is a pipe dream that can’t happen due to resources.  What if I want to revert the file to where it was when I opened it?  I should still be able to do that, otherwise this is a big step backwards.  To support that, though, wouldn’t I need each auto-save to save different copies of the file?  Coupled with the fact that the file system is now abstracted from me, couldn’t this lead to 50 auto-saved copies of my file eating up precious hard drive space?

Well, this is out of my area of expertise, but I have a few ideas that might point in the right direction.  One is don’t save whole files; save diffs.  Save binary-safe diffs for images and things like that.  As long as these diffs remaing on file and intact, we should be able to get back to any previous point without eating up a whole lot of space.  Now make sure the underlying FS knows that these diffs are linked to a certain file.  Don’t ever let a diff be deleted unless all diffs older than it are as well, because they are useless with that missing link.

I propose that maintaining file history be taken out of the application and handled at the file system level.

Taking a step back to userland, I want the icon for my various files to indicate whether or not it has a history.  If it does, I want to be able to pull up the file’s properties and see a complete history: who changed it, when did they change it, and how did it change.

If it’s a text file, I want to see side-by-side diffs.  If it’s an image, I want the OS to show me the current file (that’s easy), and to traverse the diffs back to the one I’m comparing against so I can the current and old version side-by-side.  It gets trickier for audio and more complex file types, but it’s nothing that can’t be gotten around if the OS allows 3rd party developers to hook into this feature.