Luigit
repositories / dotfiles

dotfiles

bugabingas dorkfiles

owned by admin

pi/agent/skills/optimize/references/anti-patterns.md

Raw
Rendered preview

Anti-Patterns

Cross-cutting performance mistakes spanning all categories. identify before profiling.

Data Fetching

  • N+1 queries → fetch parent, then query children per parent. batch with JOIN or eager loading.
  • unbounded collection loading → load all rows into memory. paginate or stream.
  • extraneous fetching → load columns/relations never used. select only needed fields.

Connection & I/O

  • no connection pooling → establish/teardown per operation. pool connections.
  • chatty I/O → many small requests over network or disk. batch into single round-trip.
  • sync blocking in async code → call blocking I/O from async path. use async APIs or offload to worker.
  • improper instantiation → create/destroy shared objects per use. reuse singletons or pooled instances.

Resilience

  • retry storm → unbounded retries without backoff or circuit breaker. cap retries, add backoff, use circuit breaker.
  • no caching → fetch same data repeatedly from backend. cache frequently-read data.

Memory

  • unbounded growth → collections/queues with no eviction or limit. bound caches, add TTL.
  • memory leaks → listeners, callbacks, references retained indefinitely. clean up handlers on teardown.
  • string concatenation in hot path → O(n²) repeated concatenation. use builder/buffer.

Design

  • premature optimization → tune before measuring. profile first, optimize measured bottlenecks.
  • performance decorations → optimizations that look fast but have no impact. verify with benchmarks.
  • nosy neighbor → single tenant/workload consuming disproportionate resources. isolate or quota.
  • busy database → offload all processing to the data store. move logic to application where appropriate.
  • monolithic persistence → one store for data with very different usage patterns. split by access pattern.

Detection

  • profile before optimizing
  • benchmark before and after changes
  • watch for patterns above during code review
  • load test with realistic data volumes before production
# Anti-Patterns

Cross-cutting performance mistakes spanning all categories. identify before profiling.

## Data Fetching

- **N+1 queries** → fetch parent, then query children per parent. batch with JOIN or eager loading.
- **unbounded collection loading** → load all rows into memory. paginate or stream.
- **extraneous fetching** → load columns/relations never used. select only needed fields.

## Connection & I/O

- **no connection pooling** → establish/teardown per operation. pool connections.
- **chatty I/O** → many small requests over network or disk. batch into single round-trip.
- **sync blocking in async code** → call blocking I/O from async path. use async APIs or offload to worker.
- **improper instantiation** → create/destroy shared objects per use. reuse singletons or pooled instances.

## Resilience

- **retry storm** → unbounded retries without backoff or circuit breaker. cap retries, add backoff, use circuit breaker.
- **no caching** → fetch same data repeatedly from backend. cache frequently-read data.

## Memory

- **unbounded growth** → collections/queues with no eviction or limit. bound caches, add TTL.
- **memory leaks** → listeners, callbacks, references retained indefinitely. clean up handlers on teardown.
- **string concatenation in hot path** → O(n²) repeated concatenation. use builder/buffer.

## Design

- **premature optimization** → tune before measuring. profile first, optimize measured bottlenecks.
- **performance decorations** → optimizations that look fast but have no impact. verify with benchmarks.
- **nosy neighbor** → single tenant/workload consuming disproportionate resources. isolate or quota.
- **busy database** → offload all processing to the data store. move logic to application where appropriate.
- **monolithic persistence** → one store for data with very different usage patterns. split by access pattern.

## Detection

- profile before optimizing
- benchmark before and after changes
- watch for patterns above during code review
- load test with realistic data volumes before production