Learning Outcomes¶
After successfully completing the course, students should be able to:
Design reasoning¶
- Analyze a design in terms of responsibilities, abstractions, dependencies, change scenarios, and quality attributes.
- Explain information hiding, modularity, cohesion, coupling, substitutability, dependency inversion, and stable dependency principles using concrete code and architecture examples.
- Distinguish a principle from a heuristic, a pattern, a tactic, a style, and a rule.
Patterns and architecture¶
- Select, adapt, combine, or reject design patterns based on context and forces rather than pattern-name matching.
- Compare alternative architectural structures and make trade-offs explicit.
- Recognize accidental complexity caused by unnecessary patterns or indirection.
Smells and evolution¶
- Detect and explain design/architecture smells using qualitative and quantitative evidence.
- Construct a behavior-preserving refactoring sequence from a problematic design toward a more appropriate structure.
- Apply the idea of refactoring to patterns without assuming that the pattern is the goal in every case.
Automation¶
- Represent software artifacts using ASTs, dependency graphs, call graphs, metrics, embeddings, or hybrid representations appropriate to a design-analysis task.
- Design or critically evaluate an automated technique for pattern detection, smell detection, refactoring recommendation, or program transformation.
- Explain the role of search, optimization, ML, RL, and LLMs in automated software design, including their failure modes.
Research¶
- Define research questions, baselines, datasets, metrics, and threats to validity for a software-design automation study.
- Reproduce or replicate a selected technique at an appropriate scope.
- Produce a research artifact that is sufficiently documented for another researcher to rerun or inspect.