Software-Design AOP Aspektorientierte Programmierung mit CDI TDD Test-driven Development DDD Domain-driven Design Clean Code