A software development effort is essentially a "translation" of a business need into a software solution. The problem is that several "translations" are required before machines can take over and generate the final software product.
The process typically starts with some requirements gathering, perhaps some level of analysis and design until code can be produced. Each of these steps represents a layer of abstraction that is essentially an interpretation of the previous layer .... In a perfect world, all these translations are perfectly aligned and a given business needs translates into a perfect solution - the center of the bulls-eye!
Now here is the challenge...
For each of these abstractions we use a different technique, i.e. natural languages for requirements, graphical notations for analysis & design and programming languages for the actual source code. Each of these techniques has very different characteristics with respect to semantic richness and precision. Natural languages are semantically extremely rich but very low in precision, programming languages are exactly the opposite, semantically very poor but so precise that a compiler can interpret it.
There have been many attempts to find a solution to this inherent problem, model-driven development is one them. Agile development ignores the translations in the middle focusing instead on churning out code until it meets business needs more or less. Bertrand Meyer tried to solve this problem by creating a single notation that can be used to capture requirements, source code and everything else in between (the notation is called "Eiffel").
The world is still looking for a solution..... Whoever is going to solve this fundamental problem is going to make a ton of money - and probably wins the Nobel price!