- empty select blocks
select {}
- if you can't block but have to wait on something, block in another routine
go func() {
wg.Wait()
}()
go func() {
<-ctx.Done()
}()
- channels are not queues
- use errgroup to start things that are needed(together) for something else
- write a blocking functions and compose using routines
- defers are executed even when panics happen
- defer stop the timers
- context is easy to use and use it whenever possible