Complex systems are, in a word, complex. The underlying complexity of a given problem is constant. Complexity can be hidden, but it cannot be eliminated. Consequently, one major objective should be aimed at effectively managing complexity through an appropriately layered partitioning approach. Beginning in the systems engineering domain (top-down design), it is necessary to conduct a (strictly human) process of defining and bounding the problem space such that the initial set of steps taken in the system specification design accurately reflect a solution to the actual problem at hand, and not a redefinition of the problem. With sufficient functional and non-functional requirements, the next steps further the top-down design in which the system is partitioned into compositional subsystems, and within each subsystem a set of cooperative related entities that carry individually assigned tasks. With the system specification in place, the other dimension of complexity that underlies the problem space is handled (bottom up) in the software engineering domain. As the SLOC (source lines of code) required for implementation of the functional requirements increases, the human effort required for handling various non-functional aspects such as performance, security, testability, readability, and reusability and therefore understandability and maintainability, can very quickly grow beyond manageable thresholds unless certain design principles are adhered too. Automation is necessary to assist with management of aspects including but not limited to testability and reliability. One major design objective should be to optimize the use of “abstraction” to achieve appropriate levels of functionality partitioning. In this way we localize complexity in order that the system remains manageable regardless of how large it becomes. To achieve this, the design approach must appropriately adopt a multi-paradigm philosophy; otherwise abstraction becomes a means to only hide complexity, and this is dangerous because it influences us to forget that the complexity still exists, and often creates the illusion that magic is happening! In this talk we discuss a system engineering philosophy and a software engineering methodology that combines object oriented and aspect oriented models.