The reassuring save button
Recently, I attempted to answer a question on SE.SE, which was a blatant XY problem. The author of the question misunderstood the problem he was facing, came up with a solution which would only make the issue worse, and asked how to implement this solution technically.
More precisely, the person was complaining: “our users are being silly and close a form window instead of pressing the save button.”—it is obvious here that the user interface is completely broken, and needs to be fixed by matching the users' conception of the piece of software.
I tried to explain the issue, but, long story short, wrote a long answer that, while being outstanding in terms of the different concepts, was rather poor in properly communicating them, and required a major shift in paradigm that the author—and a few other members—were not ready to make.
In my answer, I also mentioned a difference between the applications that keep something the user works on in volatile memory, and the ones that persist it. See, when I work with a photo in Adobe Photoshop and the power goes off, my changes are lost, unless I manually saved them prior to the outage. However, when I work with a photo in Adobe Lightroom, floppy disk button is nowhere to be found.
From the perspective of the user, the Lightroom paradigm makes sense, while the Photoshop one is broken.
Forget for a moment about computers. Imagine that you are speaking with a colleague, and asking him to perform a task. You take half an hour explaining the task in all the details, but then you get an urgent call which abruptly stops your conversation with your colleague. As soon as you end your call, you come back to your colleague.
— So, everything's clear regarding the task?
— What task?
— The one I gave you.
— I'm sorry, I have no idea what are you talking about.
— Wait, what? We spoke. Five minutes ago.
— I don't recall. Did you forget to ask me to remember our conversation?
It feels weird, isn't it? And still, software behaves exactly like this all the time.
Why would software products do that?
Historically, persistent memory was not very good at fast writing. In order to avoid slowing down the user, computers were storing things in memory, and used persistence only on rare occasions. Many patterns emmerged, where the decision to persist was given to the user.
This came with a huge problem. You are working on Friday evening on an important report. You just finished it and you are about to press that magical floppy disk button and go home, when suddenly your computer crashes. How sad!
My current PC has an M.2 NVMe SSD with read and write speeds of 3 GB/s—that's nearly half the peak speed of the RAM I had three years ago. So should the solution be for the software product to just perform a Ctrl+S at every user action?
That would probably be a really bad idea.
You see, if I'm working with a large image in Adobe Photoshop, saving the modified image every time I perform an action is very likely not what I want. It would slow me down even with a 3 GB/s SSD, and things would get really ugly as soon as I would work on a slower machine. Moreover, it would increase my electricity bill. And, most importantly, this is absolutely not what I want—I may decide to persist the changes I make, but I may also decide to discard them.
Take Adobe Lightroom. Here, all the changes are always persisted, automatically. But they are not persisted in the same way a Ctrl+S would do in Adobe Photoshop. What happens is that I can always close Lightroom, reopen it later, and go back through every change I made to the photos. Lightroom doesn't automatically rewrite the photos. Quite the opposite: it never changes the originals. Instead, it stores only the history of the changes I do.
Many other modern applications behave the same way. Google Keep, for instance, keeps the version history of the notes. Others, however, use a different approach. In WhatsApp, for instance, drafts are always persisted, but you can't go back. This makes sense. While Lightroom is all about experimentation where it is very likely for a user to want to go to some previous editing step, and Google Keep is occasionnally about long notes that were edited for a long time and represent quite a lot of effort, WhatsApp is for relatively short messages that are expected to be send to the recipient rather quickly—a history is pretty much useless in this scenario.
Some software products also use a notion of committment—an action by which the user tells that he finished the work he was doing. In WhatsApp, the committment is the fact of clicking a button to send the message to the recipient. In Lightroom, it's the export function that would publish the JPEGs to a remote service. In Visual Studio Code, it's the actual Ctrl+S—yes, the IDE persists the changes to a special location, so that you could close the IDE without saving, and when you come back to it, your changes are still there as if you never closed the IDE in the first place. As I write this article, my blog engine persists all the changes to the database. Committment, in this case, would be an active action for my part of publishing the draft.
History persistence and committment patterns are two excellent ideas from the perspective of user experience. They bring electronical devices much closer to the real world.
If those excellent approaches are used in Adobe Lightroom, why wouldn't Adobe use them for Photoshop as well? I would guess that this is all about the same hardware constraints. You see, in Lightroom, while there is an original raster image, all changes that are applied to it are not raster. Highlights adjustement, use of a healing brush, or cropping are all relatively tiny in space to store. This makes it possible to persist all those changes on the fly, with minimal impact on hardware. Photoshop is a bit different: while some usage is similar to Lightroom's, there are also many cases of direct raster changes, which could quickly grow to megabytes or even gigabytes of data to be written. I would guess that, at some point, Adobe developers would find a way to get rid of the floppy disk button, but we're not here yet. Meanwhile, the button is a reminder of the limitations—both software and hardware—but by no means a positive thing that needs to exist, unless it exists in a form it is used in Visual Studio Code—to act as committment, and not a willing to persist the changes.
Save button is reassuring
When discussing this subject with a colleague, he made an interesting remark. It is reassuring, he said, to have the floppy disk button.
We started exploring together what exactly is reassuring, or more precisely, why the lack of a save button is making him anxious. It appeared that when he uses applications such as Google Keep on his smartphone, he would still prefer having a floppy disk button there. Progressively through our discussion, it appeared that the person was not confident that permanent persistence is actually working as expected, as he had no clue how it actually works. Taking Google Keep as an example, if I'm writing a note, is the note persisted after every keystroke? Or at regular intervals? Or when a user performs an action, such as switching to another note, or closing the application?
The problem is that the very same person had no actual idea what happens when he asks an application to save a file that he's modifying.
Let's take an example of a file stored on a hard disk. I edit it, close the application, and when asked if I want to save the changes, I say “yes.” Half a second after the application is closed, there is an outage. When I turn the PC back, what should I find?
There are two important things here.
Firstly, the operating system doesn't necessarily write the file immediately to the disk. It may cache the data, tell the application that the file is saved, and perform the actual save a bit later.
Secondly, hard disks have use internal cache to enhance read/write performance. When asked to write a file, the operation would terminate usually before the file is actually persisted on the hard disk platters. It may also be completely in write cache, or partially on platters, and partially in cache.
This means that after the outage, you may find the last version of the spreadsheet you saved, or the original version, or a corrupted file (depending on the file system and on the way the application actually performs a file save).
Other types of storage require even more consideration. If you're using a directory that is synchronized with the cloud, the action of pressing Ctrl+S means absolutely nothing. It may take seconds or even minutes before the new version reaches the cloud. Or, sometimes, not at all, if there is a network issue, or the synchronization service is down.
Imagine a machine that uses RAID 6 and also performs backups to an offsite data center once per hour. If you want to be confident that the file was saved properly, you need a bit more than a Ctrl+S. You would need to start by checking the status of your RAID. If there are two failing disks, too bad—you could possibly lose your modifications in a very short time—as soon as one of the remaining disks fails. Anyway, after checking RAID, you'll wait for an hour for the replication to take place to the offsite data center. Finally, you'll have to verify that the replication was successful.
Save button may be percieved as reassuring, but it only hides the complexity of the actual process. Users want to believe that Ctrl+S is enough to keep their file safe, while in reality, the action means little about the actual persistence of the data. In fact, it doesn't correspond to “the changes are now persisted,” but rather “the changes were enqueued to be persisted at a later moment, depending on the exact meaning of persistence and the level of redundancy that is required for this type of information.” The save button is therefore actively misleading, and doesn't give to the user more control of data persistence, compared to the permanent persistence approach.