Make the computer do the work
Great software is a joy to use because it eliminates all extraneous actions that don’t require the user’s explicit attention and instead allows the user to focus on the task at hand. To start, this simply means making everything fast. In this case, the unnecessary “action” performed by the user is waiting for the computer to finish its calculation. Increasing speed can be accomplished through a combination of many factors. One way is making technical changes such as intelligent caching or multi-threading. Another way is making efficiency changes such as clean code or clear information architecture. And while these proposed improvements require non-trivial amounts of engineering effort, I would consider them basic steps because the issue is easily identifiable. Someone just needs to take the time to do something about it.
The next step is to get rid of actual actions the user has to take. In this sense, the software should be doing as much as it can to automate, prefill, guess, and parse. Examples of this include having changes auto-save or having text auto-complete. Furthermore, little details such as auto-positioning cursors or creating unobtrusive tool-tips go a long way in reducing the cognitive load induced upon a user when completing a task. Overall, the goal here is to minimize cognitive friction by making the computer guess what the user wants rather than making the person guess what the computer wants.
The third level of creating an effortless experience is going beyond minimizing clicks and onto removing a series of steps. A excellent example of this is restoring a user’s previous state to the last time they logged in. Another example is auto-syncing user content across devices. In these situations, the computer isn’t just helping eliminate a stray click here or there, but rather helping the user perform an entire set of actions.
Taking a step back, one must be cognizant of the fact that the computer doesn’t always get it right. As a case study, one can look at the decision to pre-populate form fields when a user is going through a checkout process. In this scenario, the computer already has access to a pair of text strings from when the user filled out the billing address. However, the user might end up sending the order to a different shipping address. In these instances, it may be tempting to give the user more freedom by leaving the second entry form blank, but for most people this isn’t necessary.
In concordance with the principles of Simplicity and Sensible Defaults, just because the system can’t predict every use case doesn’t mean it shouldn’t make an effort to speed up the lives of the majority of users who will enter applicable input. Admittedly, it is a fine line between balancing computer assistance and user control, but more often than not, you want to make the computer do the work.