I / O es dos cosas, entrada y salida.
Tomar datos significa consumir datos que otro lector puede querer leer (por ejemplo, salir de una cola), o verificar algún recurso que no sea una entrada directa a la función (leer un archivo del sistema de archivos, incluso si el nombre de archivo es un argumento para la función). La función cambia el estado de otros lectores o depende del estado fuera de sus argumentos. Decimos que tiene efectos secundarios porque otro código tiene que saber que cambia las cosas o que la misma llamada en dos momentos diferentes puede dar dos resultados diferentes (porque ese archivo fue cambiado).
La escritura de salida significa cambiar los datos que otro código puede leer. ¡Ese es todo el valor de la producción, de hecho! Actualizamos la base de datos para que el sitio muestre una nueva publicación de blog, o escribimos en el búfer de salida para que el terminal muestre las palabras al usuario, o enviamos bytes al bus para que la computadora sepa que se movió el mouse.
Como el propósito de la entrada y la salida es compartir datos entre sistemas discretos, siempre tienen efectos secundarios.