Software engineering is one of the most complex scientific activities humanity has developed. It is estimated there were nearly 23 million software developers in the world at the beginning of 2018: 11.65 million full-time developers, 6.35 million part-time developers, and 4.30 million nonprofessional developers. It is also estimated there are approximately 1 million physicists and 50 thousand quantum physicists in the world. Quantum Computing requires the most advanced, dynamic ideas from both areas. Over the past 18 years we have worked on innumerable software projects, and discovered that highly skilled software engineers are rare, and, for every case we reviewed, their understanding of Quantum Physics is infinitesimal. With this realization, our goal was to develop a comprehensive system that minimizes the learning curve of Quantum Computing programming by reducing the amount of Quantum theory knowledge required to program Quantum Computers, and maximizing the reusability of current software developing patterns and practices to exponentially increase short-term productivity.
The current software for Quantum Computers is based on programming QuBits and applying operations on them. Defining and writing Quantum Computing algorithms requires having the knowledge of Quantum physics’ theory and using this theory to develop solutions for specific problems. Our main question was how can we use and improve the current software development practices, developed in the last 40 years, to define a framework for Quantum Computing development? A framework that not only has a shorter learning curve but also provides a way to exponentially accelerate the production of Quantum Computer software.
We will go over the current programming tools we considered important to be re-used in the creation of a new environment for Quantum Computing programming, given that they are presently understood by any senior software engineer/computer scientist.
Current general programming tools and techniques
- High Level programming languages: Java, Scala, Golang
- Object Oriented Programming, Functional Programming
- Software Design Patterns
- Distributed Computing: Actor Model, Reactive Patterns
- Unit testing, Integration Testing, Continuous integration
- Backend and Frontend frameworks
- Operating Systems: Linux
- Databases: Relational Algebra, NoSQL, Graph based
- Integrated Development Environments: IntelliJ, Visual Studio, Eclipse
- Source code repository: Git, Gitlab, Github
- Continuous delivery software: Jenkins, Gitlab Runner
- Cloud services: AWS, Azure
- Blockchain: Proof of Concept, Tendermint
Quantum and Quantum Programming
We also considered the following concepts to understand the programming of Quantum Computers
- Basics of Quantum Mechanics: Planck’s formula, Particle and Wave nature of light, Quantum Wave Function, Model of Atoms (Bohr), The Uncertainty Principle, Bell’s inequalities
- Complex Numbers, Vector Space, Dirac Notation
- Matrices and Operators
- Quantum Information Processing
- Quantum Gates and Circuits
- Tensor Products, Superposition and Quantum Entanglement
- Teleportation and Superdense Coding
- Quantum Error Correction
- Quantum Algorithms
Requirements for a new Framework
The review and analysis of each technology and theory, along with the relation between each other, are outside of the scope of this document. The following list compiles the most important concepts to take into account during the definition of a new framework, that will speed up the software development for Quantum Computers.
- Abstract as much as possible from quantum physics theory
- Universal programming technique that will be used to create quantum algorithms in the same way we define Turing machines and Turing complete systems
- Programming patterns that programmers will quickly understand and re-use
- Ability to quickly test and validate results
- Smart development environment
- Libraries to support the most used operations
- Large storage and file versioning
- Web services to support rapid integration with classical systems
Proposed new Framework
Universal Programming Technique
The core of the framework (and the most challenging development) is the definition of a standard method to write software to solve any kind of computing problems.
High Level Language for Quantum Computing
Programming algorithms, using QuBits and quantum registers, is similar to programming in Assembly for classical computers using bits and registers, an activity that is time and resource intensive. We will abstract as much as possible to tackle the complexity. Code generation and compilation will be used as a main tool to minimize coding responsibly and errors.
Quantum Software Libraries
Building software for Quantum Computers requires as much or, in some applications, even more effort and attention than is needed to build the Quantum Computer hardware. We propose to organize the software into suites of well-tested libraries, establishing a solid technical maturity from day zero, using new patterns.
Quantum Testing Kit
We believe the process of writing new complex software requires continuous testing, a new and proper testing environment, with tools for validating the code in a timely manner, running tests executions, using a dedicated Quantum Simulator server for the initial pass and a physical Quantum Computer for the final testing step.
Deployment and Integration
The last step is to have an automated, reliable way to place the new system into a production environment. Interaction with databases and existing services will be accomplished by using data definitions included in the coding step (using the provided high level language) to generate web APIs with their corresponding versioning.