Forward-Engineering und Reverse Engineering befassen sich mit der Transformation abstrakter in konkrete Beschreibungen und umgekehrt. Im Software Engineering hat sich allgemein eine Klassifikation gewisser Standard-Abstraktionsebenen durchgesetzt mit jeweils spezifischer Begriffswelt und spezifischen Beschreibungsformalismen. Im einzelnen werden folgende Ebenen unterschieden:
Die Ebene der Anforderungen beschäftigt sich mit der Bestimmung von Informationen, Prozessen und Eigenschaften von Informationen und Prozessen, die der Nutzer eines Systems benötigt. Zur Darstellung von Anforderungen werden meist informelle Notationen, natürliche Sprache ( Lastenheft) oder Szenarien (z.B. in UML Use-Case-Diagrammen) verwendet.
Die Architekturebene beschäftigt sich mit der Auswahl von architektonischen Elementen, ihren Interaktionen und Beschränkungen an die Elemente und Interaktionen und liefert einen Rahmen, innerhalb dessen der Entwurf diese Beschränkungen zu erfüllen hat. Heute existieren eine ganze Anzahl von Architekturbeschreibungssprachen (siehe: Architecture Description Languages), welche abstrakte Architekturen beschreiben.
Die Entwurfsebene befasst sich mit der Aufteilung des Systems in Module, Schnittstellen der Module, zu nutzende Algorithmen, Prozeduren sowie Datentypen, welche die Beschränkungen der Architektur erfüllen. Beschreibungselemente auf dieser Ebene sind etwa die klassischen Diagramme der UML-Notation (Klassendiagramme, Strukturdiagramme, Interaktionsdiagramme, siehe auch: UML 1.x Überblick) oder auch Nassi-Shneiderman-Diagramme.
Die Implementierungsebene schließlich befasst sich mit der konkreten Ausformulierung von Datenstrukturen und Algorithmen, so dass die Architekturbeschränkungen erfüllt werden. Konkrete Programmiersprachen oder Pseudocode sind Beschreibungsmittel dieser Ebene.