  Experience from seven decades of classical computing suggests that a
sustainable computer industry depends on a community of software engineers
writing programs to address a wide variety of specific end-user needs,
achieving both performance and utility in the process. Quantum computing is an
emerging technology, and we do not yet have the insight to understand what
quantum software tools and practices will best support researchers, software
engineers, or applications specialists. Developers for today's quantum
computers are grappling with the low-level details of the hardware, and
progress towards scalable devices does not yet suggest what higher-level
abstractions may look like. In this paper, we analyze and reframe the current
state of the quantum software stack using the language of programming models.
We propose an abstraction hierarchy to support quantum software engineering and
discuss the consequences of overlaps across the programming, execution, and
hardware models found in current technologies. We exercise this hierarchy for
solving the eigenvalue estimation problem in two ways (a variational algorithm
with error mitigation, and phase estimation with error correction) and pinpoint
key differences in these approaches in terms of these layered models and their
overlaps. While our work points to concrete conceptual challenges and gaps in
quantum programming and proposes some specific steps forward, our primary
thesis is that progress hinges on thinking about the abstraction hierarchy
holistically, and not just about its components.
