Estrictamente hablando, si un programa / función modifica el estado de otra cosa (fuera de su propio alcance), entonces está produciendo un efecto secundario. Esto podría incluir algo así como “mostrar un personaje en la pantalla”, o podría estar cambiando el valor almacenado en alguna ubicación RAM arbitraria, o algo similar.
Algunas de esas cosas son malas ideas (por ejemplo, la modificación de variables globales o, peor, el ajuste de un valor guardado en la memoria RAM en alguna ubicación arbitraria). Otros son casi imposibles de evitar: es posible que su programa no pueda “funcionar” si no se “permite” cambiar algo en la pantalla. O, ¿qué pasaría si quisiera guardar algún estado de su programa para persistencia, es decir, guardarlo en un disco?
Por esta razón, la mayoría de los programadores ignoran los casos en los que los efectos secundarios son inevitables. Tienden a considerar solo aquellos que pueden evitarse como efectos secundarios “prácticos”, que deben evitarse por preferencia.
La regla es (o debería ser): ¿se puede evitar el efecto utilizando en su lugar otros medios? Si no, entonces úselo. Si puede, ¿existe una razón decente para usarla en lugar de una alternativa? De lo contrario, evitarlo como la peste.