Requirements engineering?
The primary measure of success of a software system is the degree to which it meets the purpose for which it was intended.
(Nuseibeh&Easterbrook ‘00)
If you look the toon you notice that it is dramatically true. I think that this picture could be used as a metaphor for each course of software engineering, and it is a very good example of the first cause of software failure: the poor requirements.
In an hypothetical model, the process of software production goes over two distinct phases.
In the first one, called verification, we find an answer for the question “Are we doing the product right?” (is our software bug-free?). In the second one, called validation, we find an answer for the question “Are we doing the right product?” (is our software what the user asked for?).
The two phases are ideally distincts but they can merge and iterate several times, at every step, or at every release.
Finally, I think that languages for specification are a good tool to solve this problem, but they are so heavy to be used in common projects. As examples I suggest you to visit the “Petri Nets World” (link) portal and the “Alloy” website (link).
