AT3 — Simplicity vs. Flexibility
BFS with an explicit queue is simple and correct but memory-intensive for wide graphs. DFS with recursion is simple but limited by the call stack depth — a dependency graph with 10,000 transitive dependencies will overflow the default Python call stack (default limit: 1,000 frames). Production implementations use iterative DFS with an explicit stack. The recursive version is easier to understand; the iterative version is safer.
AT8 — Coupling vs. Cohesion
A web crawler must couple BFS traversal with domain politeness, URL normalisation, deduplication, and priority ranking. Separating these concerns cleanly — the traversal logic does not know about politeness; the scheduler decides ordering — makes the system testable and modifiable. Coupling them in one class makes the traversal faster to implement but harder to tune.