Estudia
- Artes y humanidades
- Ciencias
- Ciencias de la salud
- Ciencias sociales y jurídicas
-
Ingeniería y arquitectura
- Doble Grado en Ingeniería Civil e Ingeniería de los Recursos Mineros y Energéticos
- Doble Grado en Ingeniería en Tecnologías y Servicios de Telecomunicación / Grado en Ciencia e Ingeniería de Datos
- Doble Grado en Ingeniería Informática del Software / Grado en Matemáticas
- Doble Grado en Ingeniería Informática en Tecnologías de la Información / Grado en Ciencia e Ingeniería de Datos
- Grado en Ciencia e Ingeniería de Datos
- Grado en Ingeniería Civil
- Grado en Ingeniería de los Recursos Mineros y Energéticos
- Grado en Ingeniería de Organización Industrial
- Grado en Ingeniería de Tecnologías Industriales
- Grado en Ingeniería de Tecnologías Mineras
- Grado en Ingeniería Eléctrica
- Bachelor´s Degree in Industrial Electronics and Automatics Engineering
- Grado en Ingeniería en Geomática
- Grado en Ingeniería en Tecnologías y Servicios de Telecomunicación
- Grado en Ingeniería Forestal y del Medio Natural
- Grado en Ingeniería Forestal y del Medio Natural (En extinción)
- Grado en Ingeniería Informática del Software
- Grado en Ingeniería Informática en Tecnologías de la Información
- Grado en Ingeniería Mecánica
- Grado en Ingeniería Química
- Grado en Ingeniería Química Industrial
- Grado en Marina
- Grado en Náutica y Transporte Marítimo
- Información, acceso y becas
Diseño del Software
- Prácticas de Laboratorio (28 Hours)
- Tutorías Grupales (2 Hours)
- Prácticas de Aula/Semina (7 Hours)
- No Presenciales (0 Hours)
- Clases Expositivas (21 Hours)
Software design plays a fundamental role in the development of complex computer systems, comprising a set of principles and techniques that allow transitioning from requirements to implementation and obtaining quality code. A good software design is easy to understand and easy to change to adapt to changes in requirements. It is thus an essential component in the education of software engineering graduates, providing them with the specific knowledge necessary for their professional practice.
The course, which is predominantly practical (albeit a solid knowledge and understanding of the design principles and patterns to be applied is required), belongs to the specific technology module in software engineering, which in turn is part of the software engineering subject. Its aim is twofold: firstly, to provide a higher-level overview of the knowledge acquired in other programming courses, such as Introduction to Programming, Programming Methodology, or Programming Technologies and Paradigms; and, secondly, to lay the foundations that will enable students to subsequently tackle the design and construction of industrial-scale software, applying existing best practices (specifically, focused on the object-oriented paradigm). Similarly, the course equips students with the competencies to tackle other courses such as Software Architecture and Programming Language Design.
The student should have a solid understanding of at least one object-oriented programming language (in this course, although specific features of different languages may be discussed, Java will be used as the implementation language). It would also be desirable for the student to possess basic notions of object-oriented design, such as modularity, low coupling, high cohesion, inheritance versus delegation, and so forth, beyond the specific syntax of the programming language used. However, these concepts will be reviewed and expanded upon in the course to quickly raise the level of abstraction and focus on teaching design patterns, which constitute the core of this course.
Specifically, the student must have completed and passed at least the courses Introduction to Programming, Programming Methodology, and Programming Technologies and Paradigms.
It is expected that the student will learn advanced object-oriented design techniques, primarily design patterns. By the end of the course, the student should not only be familiar with the majority of fundamental design patterns described in the classic book on the subject (Gamma et al., 1995) but also be able to reason about application design in terms of these patterns, being capable of identifying where the use of a specific pattern is necessary in contexts different from those seen in class. Additionally, the course aims to establish basic principles of object-oriented design, such as correctly identifying participating classes and interfaces in a design and determining their behaviour, collaborations, and responsibilities. Furthermore, by the end of the course, students should have improved their programming style, learning to use style guides and code refactoring principles.
In addition to this, and in accordance with the verification report of the Bachelor's Degree in Software Engineering from the University of Oviedo, the competencies that students should acquire when taking the Software Design course are as follows:
Technical or specific competencies:
- Ability to plan, conceive, deploy, and manage projects, services, and computer systems in all areas, leading their implementation and continuous improvement and evaluating their economic and social impact. (Com.2)
- Ability to analyse, design, build, and maintain applications in a robust, secure, and efficient manner, selecting the most appropriate paradigm and programming languages. (Com.8)
- Knowledge of the characteristics, functionalities, and structure of operating systems and the ability to design and implement applications based on their services. (Com.10)
- Ability to develop, maintain, and evaluate software services and systems that meet all user requirements, behave reliably and efficiently, are affordable to develop and maintain, and comply with quality standards, applying theories, principles, methods, and practices of Software Engineering. (ISW.1)
- Ability to identify and analyse problems and design, develop, implement, verify, and document software solutions based on adequate knowledge of current theories, models, and techniques. (ISW.4)
- Ability to identify, evaluate, and manage potential associated risks that may arise. (ISW.5)
- Ability to design appropriate solutions in one or more application domains using software engineering methods that integrate ethical, social, legal, and economic aspects. (ISW.6)
General competencies:
- Competence in designing solutions to problems. (CG-1)
- Abstraction ability. (CG-3)
- Analysis and synthesis skills. (CG-4)
Learning outcomes:
- RA.IS-1. Carry out complex Software Engineering projects to solve real problems and address them using techniques and technologies related to software manufacturing processes, including frameworks, architectural patterns, and design and integration patterns, aiming for the development of quality software. [Com2], [Com.8], [Com10], [ISw.1], [ISw.4], [ISw.6], [CG1], [CG3], [CG4]
- RA.IS-3. Apply different software construction techniques in low-level design. [Com.8], [ISw.1], [ISw.4], [CG1]
- RA.IS-4. Develop object-oriented designs and programming with a high level of competence. [Com.8], [ISw.4], [CG1], [CG4]
- RA.IS-5. Evolve and refactor existing designs in response to changes in requirements. [ISw.1], [ISw.6]
- RA.IS-6. Determine the degree of maintainability, reliability, and efficiency of software designs. [Com.8], [ISw.1], [ISw.4], [CG1]
- RA.IS-9. Design and carry out efficient and effective validation, verification, and quality control inspections and test plans. [ISw1], [ISw4], [CG4]
- RA.IS-10. Statistically analyse defect density and failure probability. [ISw1], [ISw4], [CG4]
- RA.IS-11. Evaluate the quality of a software process from the perspective of product quality. [ISw1]
Based on the objectives outlined, the following contents are selected:
- Techniques and quality principles for disciplined software design
- Introduction to design
- Design representation
- Design criteria
- Transition from design to implementation
- Design patterns
- Introduction to patterns
- Structure of a pattern
- Patterns by family: creational, structural, and behavioural
- Catalogue of patterns
- Disciplined evolution of designs and reengineering
- Patterns as a communication tool
- The role of design in the software development process
- Introduction to design reuse using frameworks
- Design in agile methodologies
These are the different teaching methods that will be used in this course:
Theory classes: Principles and design patterns will be explained from a conceptual standpoint. Given the nature of the course, these classes will be interactive, fostering guided learning. Additionally, the professor may assign reading of articles, wikis, and specific design pattern chapters from the textbook.
Seminars: Real design problems will be presented in these seminars, which students will solve on paper, either individually or in groups, applying the principles and patterns covered in the theoretical classes. This facilitates discovery learning. Subsequently, solutions will be reviewed and discussed in class, analysing the advantages and disadvantages of the proposed solutions.
Practical laboratory classes: A problem-based learning approach will be followed. Thus, a design problem will be presented, and students will begin to work on it in the classroom, autonomously, albeit under the supervision and guidance of the professor. Then, they will have one week to submit the finished project. Typically, each practice involves the use of one or more design patterns, and the objective is that the students discover them by themselves, before they have been covered in theory class. At the beginning of the next practical session, the correct solution will be explained, and other solutions proposed by students will be discussed.
Group tutorials: Monitoring of students will be conducted in group tutorials to identify any gaps and provide guidance on how to address them.
The following table breaks down the activities described above by topics and hours:
IN-CLASS WORK | AT-HOME WORK | |||||||||
Topics | Total Hours | Theory classes | Classroom practices / seminars / workshops | Laboratory classes | Group tutorials | Evaluation sessions | Total | Work in group | Individual work | Total |
Techniques and quality principles for disciplined software design | 42 | 6 | 2 | 8 | 16 | 26 | 26 | |||
Design patterns | 79 | 11 | 4 | 14 | 1 | 2 | 32 | 47 | 47 | |
Disciplined evolution of designs and reengineering | 29 | 4 | 1 | 6 | 1 | 12 | 17 | 17 | ||
Total | 150 | 21 | 7 | 28 | 2 | 2 | 60 | 90 | 90 |
What follows is a summary of working hours related to the teaching method used:
IN-CLASS WORK | AT-HOME WORK | |||||||||
Topics | Total Hours | Theory classes | Classroom practices / seminars / workshops | Laboratory classes | Group tutorials | Evaluation sessions | Total | Work in group | Individual work | Total |
Techniques and quality principles for disciplined software design | 42 | 6 | 2 | 8 | 16 | 26 | 26 | |||
Design patterns | 79 | 11 | 4 | 14 | 1 | 2 | 32 | 47 | 47 | |
Disciplined evolution of designs and reengineering | 29 | 4 | 1 | 6 | 1 | 12 | 17 | 17 | ||
Total | 150 | 21 | 7 | 28 | 2 | 2 | 60 | 90 | 90 |
Due to exceptional sanitary conditions, online activities could be included. In such case, students will be informed accordingly.
As seen in the previous section, the teaching methodology integrates different types of classes in a cohesive manner, so that theory is inseparable from practice, and vice versa. The various activities of the course have been carefully designed to provide the best didactic itinerary possible, so that by the end of the course all pieces fit together, and students have naturally acquired a comprehensive understanding of this complex subject, enabling them to apply the design techniques acquired to a wide range of problems.
Each week, within the practical classes, a specific design problem will be presented. In certain instances, students will have to start from scratch, while in others they will be provided with operational code that exhibits design flaws that the student must identify and solve, applying general design principles and, if applicable, one or more design patterns, which should have been ideally discovered by themselves. Any submission made after the deadline or in a different activity than the specifically assigned for each group and laboratory session will not be considered.
It is essential to note that the importance of these practices, and their utility as assessment and learning tools, lies not so much in their correctness, but rather in process followed by the students in their completion, even if they are unable to achieve the "ideal" solution. Moreover, it can be even more instructive for them when they are not able to find out the right solution, since, when the correct design is explained in the next practical session, they will quickly recognize the benefits of the corresponding pattern in terms of code flexibility compared to their solution.
For this reason, these practices will not be associated with a numerical grade as such, but only with a pass or fail, as the aim is for students to complete them freely, on their own, knowing that the correctness of the final design will not be the sole criterion. As mentioned, during the next practical session, the first part of the class will be dedicated to discussing the various solutions proposed by students, debating the merits and flaws of each, and the exercise will be corrected, with the source code of the solution made available to students so they can compare it with their own and make the necessary changes in their design and implementation.
This final point (making the code with the solution available to the student) is considered an essential part of learning in this course, which is another reason why it would be difficult to evaluate these practices with a numerical grade when the student already has the solution.
Therefore, evaluation in the ordinary call will encompass the following activities:
- To pass the practical component of the course, it is necessary to fulfil the requirements of continuous assessment, which means attending at least 80% of the practical classes and achieving at least the same percentage of positive evaluations in their weekly practice submissions.
- Additionally, there will be a practical exam consisting of a task like those of the laboratory sessions. This exam evaluates, on one hand, the weekly work completed (ensuring that the practices submitted were done autonomously by the student), serving as a tool for formative and continuous assessment in practical work, and, on the other hand, it constitutes the final assessment of laboratory practices, contributing 50% to the final grade. A grade equal to or higher than five is required in this exam to pass the course.
- Furthermore, there will be a theoretical exam consisting of two parts: multiple-choice questions, accounting for 40% of the exam grade; and several theoretical questions and design exercises like those covered in seminar classes, representing the remaining 60% of the exam grade. This theoretical exam contributes 50% to the final grade, and a grade equal to or higher than five is required to pass the course.
Once all the requirements have been met, the final grade for the course in the regular examination period will be calculated using the following formula:
Final grade = Theory grade × 50% + Practice grade × 50%
Otherwise, if a student has taken at least one of the two final exams but fails to meet any of the mentioned requirements (i.e., does not achieve the minimum requirements in either of them or does not meet the continuous assessment criteria), the final grade for this regular examination period will be calculated as follows:
Final grade = minimum (4, grade according to the previous formula)
Students who do not attend either of the two exams will be marked as absent.
Lastly, if a student attends only one of the two exams, their final grade will be calculated using the previous formulas, as if they had got zero points in the other one.
For students who have been granted the differentiated assessment system, they are exempted from continuous assessment (attendance and practice submission requirements are waived).
In the case of extraordinary calls, the requirement for continuous assessment is waived, and assessment will be conducted solely through a theoretical and practical exam. The final grade will be calculated following the previous formulas.
In both the ordinary and the advanced extraordinary calls, students who have passed the theoretical exam but fail the practical assessment or do not take the practical exam, will have the option to retain their theoretical grade for subsequent examination periods in the current academic year, if they wish to do so, and will only need to take the practical exam in those calls. The practical grade will never be retained under any circumstances.
In exceptional cases, if sanitary conditions require it, non-face-to-face assessment methods may be included, in which case students will be informed of the changes made.
This will be the basic textbook for the course:
- Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. 1995. Design Patterns. Elements of Reusable Object-Oriented Software. Addison-Wesley. Translated into Spanish by César Fernández Acebal and Juan Manuel Cueva Lovelle: Patrones de diseño: Elementos de software orientado a objetos reutilizable. Pearson Educación, 2003
Additionally, the following books are recommended for different parts of the course:
- Martin Fowler. 1999. Refactoring: Improving the Design of Existing Code. Addison-Wesley
- Martin Fowler. 2003. UML Distilled: A Brief Guide to the Standard Object Modeling Language (3rd ed.). Addison-Wesley Professional
- Robert C. Martin. 2008. Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall
- Steve McConnell. 2004. Code Complete: A Practical Handbook of Software Construction (2nd ed.). Microsoft Press
- Joshua Bloch. 2008. Effective Java (2nd Edition). Addison-Wesley
- Elisabeth Freeman, Eric Freeman, Bert Bates, and Kathy Sierra. 2004. Head First Design Patterns. O'Reilly Media
- Joshua Kerievsky. 2004. Refactoring to Patterns. Addison-Wesley Professional
- Steve Maguire. 1993. Writing Solid Code. Microsoft Press
- John Ousterhout. 2021. A Philosophy of Software Design (2nd ed.). Yaknyam Press
And the original wiki contains interesting discussions about design patterns:
- http://c2.com/cgi/wiki?DesignPatterns