Course Overview¶
Software Engineering Principles and Patterns is a graduate and PhD-level course centered on the design and evolution of software systems.
Unlike a survey course that treats design patterns as a catalog to memorize, this course connects patterns to:
- foundational design principles;
- architectural constraints and quality attributes;
- anti-patterns and design degradation;
- refactoring and behavior-preserving transformation;
- automated analysis, recommendation, and optimization;
- empirical research methodology.
Central themes¶
1. Principles before patterns¶
Patterns are context-dependent consequences of forces. Students first learn to reason about information hiding, stable dependencies, cohesion, coupling, substitutability, interface design, and architectural boundaries.
2. Patterns are hypotheses about change¶
A pattern is valuable when it makes an anticipated family of changes cheaper or safer. The course therefore studies the change scenarios that motivate patterns and the liabilities introduced by premature pattern use.
3. Smells are evidence, not verdicts¶
A smell is a signal that invites investigation. Metrics, static-analysis warnings, and structural anomalies are treated as evidence that must be interpreted in context.
4. Refactoring is a controlled transformation¶
Refactoring is studied as a sequence of small transformations with explicit preconditions, postconditions, and safety obligations. “Refactoring to patterns” connects low-level transformations to higher-level design intent.
5. Automation needs evaluation¶
Automated design tools are judged by more than precision or a prettier codebase. We consider semantic preservation, developer effort, applicability, runtime cost, quality improvement, false positives, generalization, benchmark bias, and reproducibility.
Intended audience¶
The course is suitable for MSc and PhD students in software engineering, computer science, and related areas, especially students interested in:
- software architecture and design;
- software maintenance and evolution;
- program analysis and transformation;
- technical debt and software quality;
- search-based software engineering;
- AI for software engineering;
- empirical software engineering.