Una buena ingeniería de software requiere la diferenciación entre la especificación y la implementación.
La tarea del programador no es sólo escribir un programa, sino que su tarea principal es dar una prueba formal de que el programa que propone cumple la especificación funcional.