When learning a new skill, even if we have been instructed exactly what to do, it is often necessary to practice for hours or even weeks before we achieve proficient and fluid performance. Practice has a multitude of effects on behavior, including increasing the speed of performance, rendering the practiced behavior habitual and reducing the cognitive load required to perform the task. These effects are often collectively referred to as automaticity. Here, we argue that these effects can be explained as multiple consequences of a single principle: caching of the outcome of frequently occuring computations. We further argue that, in the context of more complex task representations, caching different intermediate computations can give rise to more nuanced behavioral signatures, including dissociation between skill, habit and cognitive load.