- Create channels with `(chan)` for unbuffered or `(chan 10)` for buffered — use `(chan (sliding-buffer 10))` to drop oldest items under backpressure.
- Use `(go ...)` for lightweight coroutines — use `<!` and `>!` for non-blocking channel ops inside `go` blocks only.
- Use `(<!! ch)` and `(>!! ch val)` for blocking ops on dedicated threads — never call blocking ops inside a `go` block.
- Always `(close! ch)` channels when done — consumers should handle `nil` as the closed-channel sentinel and stop consuming.
- Use `(async/merge [ch1 ch2])` to fan-in multiple channels and `(async/mult source)` to fan-out one source to many taps.
- Use `(async/pipeline n out-ch (map transform-fn) in-ch)` for parallel ordered processing with built-in backpressure.
- Use `(alts! [ch1 ch2] :default :none)` for non-deterministic select with a default — `(alts!! [...])` for blocking selects on threads.
- Prefer `(async/to-chan coll)` and `(async/into [] ch)` over manual channel management for simple sequence-to-channel conversions.