La respuesta simple es que si no tiene un estado extra del que preocuparse, es más fácil razonar sobre su código. Un código más simple es más fácil de mantener. No necesita preocuparse por cosas que están fuera de un código en particular (como una función) para modificarlo. Esto tiene ramificaciones realmente útiles para cosas como las pruebas. Si su código no depende de algún estado, es mucho más fácil crear pruebas automatizadas para ese código, ya que no necesita preocuparse por la inicialización de algún estado.
Tener un código sin estado hace que sea más fácil crear programas con subprocesos también, ya que no tiene que preocuparse por dos subprocesos de ejecución que modifican/leen un fragmento compartido de datos al mismo tiempo. Sus hilos pueden ejecutar código independiente, y esto puede ahorrar mucho tiempo de desarrollo.
Esencialmente, evitar el estado crea programas más simples. En cierto modo, hay menos "partes móviles" (es decir, formas en que las líneas de código pueden interactuar), por lo que esto generalmente significará que el código es más confiable y contiene menos fallas. Básicamente, cuanto más simple es el código, menos puede salir mal. Para mí, esta es la esencia de escribir código sin estado.
Hay muchas otras razones para crear código "funcional" sin estado, pero todas se reducen a la simplicidad para mí.
¿Debería mencionarse que la concurrencia es más fácil de hacer correctamente? – ebaxt
Sí, agregó eso. Gracias. :) – Oleksi
+1. Bien dicho, Oleksi. –