Software Component Engineering

Software Component Engineering is an advanced course on Software Engineering offered within the context of our Computer Science Degree Program. It focuses on software development as arrangements of configurable software components. In order to define a systematic approach to support component-based software development, a variety of software engineering concepts, methodologies, techniques, and tools are explored during the course. Depending on the audience, more emphasis can be given either on software component construction or on tool development.


The formal requisite for this course is Data Structures. However, students are supposed to be skilled Object-Oriented Designers and Programmers.

Program (72 hours)

Topic Notes Hours
1 - On Software Components PDF 4
2 - Software Component Engineering PDF 10
3 - Development Tools HTML 8
4 - Case studies 24
5 - Experiments 24
6 - Discussion 2


Students will have their skills to engineer software components evaluated through a seminar and a practical work. The seminar consists in a case study about an specific software component development strategy, and the practical work consists in designing and implementing a small component-based system utilizing the software engineering techniques discussed during the course. Students that eventually fail the ordinary evaluation will be allowed a written exam.


  1. Daniel Lohmann and Olaf Spinczyk, Aspect-Oriented Programming with C++, Tutorial at AOSD 2007.
  2. Don Batory and Sean O'Malley, The Design and Implementation of Hierarchical Software Systems with Reusable Components, ACM Transactions on Software Engineering and Methodology, 1(4):355-398, 1992.
  3. Ted J. Biggerstaff, A Perspective of Generative Reuse, Annals of Software Engineering, 5:169-226, 1998.
  4. Special Section on Component-Based Enterprise Frameworks, Communications of the ACM, 43(10):24-66, 2000.
  5. James O. Coplien, Multi-Paradigm Design for C++, Addison-Wesley, 1998.
  6. Krysztof Czarnecki and Ulrich Eisenecker, Generative Programming: Methods, Tools, and Applications, Addison-Wesley, 2000.
  7. Ant˘nio Augusto Fr÷hlich, Application-Oriented Operating Systems, GMD - Forschungszentrum Informationstechnik, 2001.
  8. William H. Harrison and Harold Ossher, Subject-oriented Programming (a Critique of Pure Objects), in Proceedings of the 8th Conference on Object-oriented Programming Systems, Languages and Applications, pages 411-428. Washington, U.S.A., 1993.
  9. Ian M. Holland, Specifying Reusable Components Using Contracts, in Proceedings of the European Conference on Object-oriented Programming, pages 287-308. Springer, Utrecht, The Netherlands, 1992.
  10. Ivar Jacobson, Grady Booch and James Rumbaugh, The Unified Software Development Process, Addison-Wesley, 1999.
  11. Mehdi Jazayeri at al., Generic Programming, in Report of the Dagstuhl Seminar on Generic Programming, Schlo▀ Dagstuhl, Germany, 1998.
  12. Ralph E. Johnson, Frameworks = (Components + Patterns), Communications of the ACM, 40(10):39-42, 1997.
  13. K. Kang, S.Cohen, J.Hess, W.Novak and S.Peterson, Feature-Oriented Domain Analysis (FODA), Software Engineering Institute, CMU/SEI-90-TR-21, 1990.
  14. Gregor Kiczales at al., Aspect-Oriented Programming, in Proceedings of the European Conference on Object-oriented Programming'97, pages 220-242, 1997.
  15. Barbara Liskov and Stephen Zilles, Programming with Abstract Data Types, ACM SIGPLAN Notices, 9(4):50-59, 1974.
  16. Mira Mezini and Karl Lieberherr, Adaptive Plug-and-play Components for Evolutionary Software Developmen, in Preceedings of the Conference on Object Oriented Programming Systems Languages and Aplications, pages 97-116, 1998.
  17. David Lorge Parnas, On the Design and Development of Program Families, IEEE Transactions on Software Engineering, SE-2(1):1-9, 1976.
  18. P. J. Plauger, The Standard Template Library, C/C++ Users Journal, 13(12):20-24, 1995.
  19. Johannes Sametinger, Software Engineering with Reusable Components, Springer, 1997.
  20. Yannis Smaragdakis and Don Batory, Implementing Reusable Object-Oriented Components, in Proceedings of the Fifth International Conference on Software Reuse, 1998.
  21. Bjarne Stroustrup, C++ Programming Language, IEEE Software (special issue on Multiparadigm Languages and Environments), 3(1):71-72, 1986.
  22. Bjarne Stroustrup, The Design and Evolution of C++, Addison-Wesley, 1994.
  23. Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley, 1997.
  24. Clemens Szyperski and Rudi Vernik Establishing, System-Wide Properties of Component-Based Systems: A Case for Tiered Component Frameworks, in Proceedings of the Workshop on Compositional Software Architectures, 1998.
  25. Michael VanHilst and David Notkin, Using C++ Templates to Implement Role-Based Designs, in Proceedings of the Second International Symposium on Object Technologies for Advanced Software, pages 22-37, 1996.
  26. Michael VanHilst and David Notkin, Decoupling Change from Design, ACM SIGSOFT Software Engineering Notes, 21(6):58-69, 1996.
  27. Todd L. Veldhuizen, Using C++ Template Metaprograms, C++ Report, 7(4):36-43, 1995.
  28. Peter Wegner, Classification in Object-oriented Systems, ACM SIGPLAN Notices, 21(10):173-182, 1986.
  29. David M. Weiss, Software Synthesis: The FAST Process, in Proceedings of the International Conference on Computing in High Energy Physics, 1995.
  30. David M. Weiss and Chi Tau Robert Lai, Software Product-line Engineering: A Family-Based Software Development Process, Addison-Wesley, 1999.
  31. Niklaus Wirth, Program Development with Stepwise Refinement, Communications of the ACM, 14(4):221-227, 1971.