The software crisis is due to the growing complexity of the software. Indeed, the software applications must follow the user needs and are thus constantly modified. Software developer groups should develop and change software to follow the changes at an increasing pace. In recent years, the software engineering area has provided new programming paradigm and tools to struggle against the software crisis: component-based and service-oriented programming. These approaches mainly propose to decouple the software elements, to reduce the number of elements to manipulated by a developer and to separate the various functional and non-functional concerns of the application. The course objective is to present the new software engineering approaches used by those paradigms, with both theorical and practical concerns.