Esto no se explica más. Intento encontrar una explicación.
Es algo inherente a muchos de nosotros que hemos depurado bases de datos masivas, pero hay que lidiar con una escala lo suficientemente grande en el nivel de supervisor durante un tiempo lo suficientemente largo como para apreciarlo. Es como entender la importancia de estar en posición en el póker. Inicialmente no parece una ventaja tan útil ir al final de cada turno hasta que registre un historial de manos de un millón de manos y se dé cuenta de que ganó mucho más dinero en posición que fuera.
Dicho esto, no estoy de acuerdo con la idea de que un cambio a una variable local es un efecto secundario. Desde mi punto de vista, una función no causa efectos secundarios si no modifica nada fuera de su alcance, que cualquier cosa que toque y manipule no afectará nada debajo de la pila de llamadas o cualquier memoria o recurso que la función no adquirió .
En general, lo más difícil de razonar en una base de código compleja y a gran escala que no tiene el procedimiento de prueba más perfecto imaginable es la administración de estado persistente, como todos los cambios en objetos granulares en un mundo de videojuegos a medida que avanzas decenas de miles de funciones al intentar reducir entre una lista interminable de sospechosos cuál realmente causó la violación de un invariante en todo el sistema ("esto nunca debería suceder, ¿quién lo hizo?"). Si nunca se cambia nada fuera de una función, no puede causar un mal funcionamiento central.
Por supuesto, esto no es posible en todos los casos. Cualquier aplicación que actualice una base de datos almacenada en una máquina diferente está, por naturaleza, diseñada para causar efectos secundarios, así como cualquier aplicación diseñada para cargar y escribir archivos. Pero hay muchas más cosas que podemos estar haciendo sin efectos secundarios en muchas funciones y muchos programas si, por ejemplo, tuviéramos una rica biblioteca de estructuras de datos inmutables y adoptaramos esta mentalidad aún más.
Curiosamente, John Carmack se ha subido al carro de la LISP y la inmutabilidad a pesar de comenzar en los días de la codificación C más microajustada. Me he encontrado haciendo algo similar, aunque todavía uso mucho C. Tal es la naturaleza de los pragmáticos, creo, que han pasado años depurando y tratando de razonar sobre sistemas complejos a gran escala en su conjunto desde un nivel superior. Incluso los que son sorprendentemente robustos y desprovistos en gran medida de errores aún pueden dejarlo con la incómoda sensación de que algo mal está al acecho a la vuelta de la esquina si se modifica un estado persistente complejo entre el gráfico interconectado más complejo de llamadas de función entre Los millones de líneas de código. Incluso si cada interfaz se prueba con una prueba unitaria y todas pasan, hay '
En la práctica, a menudo encuentro que la programación funcional hace que sea más difícil comprender una función. Todavía hace girar mi cerebro en giros y nudos, especialmente con una lógica recursiva compleja. Pero toda la sobrecarga intelectual asociada con la determinación de un par de funciones escritas en un lenguaje funcional es eclipsada por la de un sistema complejo con estados persistentes que se cambian en decenas de miles de funciones, donde cada función que causa efectos secundarios se suma al total Complejidad del razonamiento sobre la corrección de todo el sistema en su conjunto.
Tenga en cuenta que no necesita un lenguaje funcional puro para que las funciones eviten los efectos secundarios. Los estados locales modificados en una función no cuentan como un efecto secundario, como una for
variable de contador de bucle local a una función no cuenta como un efecto secundario. Incluso escribo código C hoy en día con el objetivo de evitar los efectos secundarios cuando sea posible y he ideado una biblioteca de estructuras de datos inmutables y seguras para subprocesos que pueden modificarse parcialmente mientras el resto de los datos se copia superficialmente, y me ha ayudado a mucho para razonar sobre la corrección de mi sistema. Estoy totalmente en desacuerdo con el autor en ese sentido. Al menos en C y C ++ en el software de misión crítica, una función puede documentarse como que no tiene efectos secundarios si no toca nada que pueda afectar al mundo fuera de la función.