My team decided to avoid #1 at all costs recently. The prime example was for Twitter's Timer class which for some reason is an implicit argument in a lot of their library code. We just always pass in timers explicitly now. We generally only use implicits for (de)serialization, whether it be JSON, bytes, encoded strings, etc. The one exception is our DAG state machine code which uses implicits to resolve which data is available at each step. I didn't work on the base code, but it makes writing DAGs really straight forward and mostly painless.
Also for anyone that sees this, Intellij has a shortcut for viewing which implicits are being used in statements (CMD + Shift + P on MacOS). It's really helpful if you're trying to figure out implicit resolution.
Also for anyone that sees this, Intellij has a shortcut for viewing which implicits are being used in statements (CMD + Shift + P on MacOS). It's really helpful if you're trying to figure out implicit resolution.