Pro:
- In the end side effects are what you want to accomplish.
- Side effects are natural for code that interacts with outside world.
- They make many algorithms simple.
- To avoid using side effects, you need to implement loops by recursion, thus your language implementation needs tail call optimization.
Con:
- Pure code is easy to parallelize.
- Side effects can make code complicated.
- Pure code is easier to prove correct.
For example Haskell, at first it seems very elegant, but then you need to start playing with outside world and it's not so much fun anymore. (Haskell moves state as a function parameter and hides it into things called Monads, which enable you to write in imperative look-a-like style.)