Skip to content

Learning Outcomes

After successfully completing the course, students should be able to:

Design reasoning

  1. Analyze a design in terms of responsibilities, abstractions, dependencies, change scenarios, and quality attributes.
  2. Explain information hiding, modularity, cohesion, coupling, substitutability, dependency inversion, and stable dependency principles using concrete code and architecture examples.
  3. Distinguish a principle from a heuristic, a pattern, a tactic, a style, and a rule.

Patterns and architecture

  1. Select, adapt, combine, or reject design patterns based on context and forces rather than pattern-name matching.
  2. Compare alternative architectural structures and make trade-offs explicit.
  3. Recognize accidental complexity caused by unnecessary patterns or indirection.

Smells and evolution

  1. Detect and explain design/architecture smells using qualitative and quantitative evidence.
  2. Construct a behavior-preserving refactoring sequence from a problematic design toward a more appropriate structure.
  3. Apply the idea of refactoring to patterns without assuming that the pattern is the goal in every case.

Automation

  1. Represent software artifacts using ASTs, dependency graphs, call graphs, metrics, embeddings, or hybrid representations appropriate to a design-analysis task.
  2. Design or critically evaluate an automated technique for pattern detection, smell detection, refactoring recommendation, or program transformation.
  3. Explain the role of search, optimization, ML, RL, and LLMs in automated software design, including their failure modes.

Research

  1. Define research questions, baselines, datasets, metrics, and threats to validity for a software-design automation study.
  2. Reproduce or replicate a selected technique at an appropriate scope.
  3. Produce a research artifact that is sufficiently documented for another researcher to rerun or inspect.