En muchos entornos de desarrollo de software, el uso de la función 'reduce' —una herramienta versátil para colapsar una colección en un solo valor— a menudo genera comentarios negativos durante las revisiones de código. Mientras que los desarrolladores utilizan con frecuencia 'map' y 'filter' sin mucha escrutinio, 'reduce' suele ser señalada por ser 'difícil de leer' o menos elegante que sus contrapartes.
El fenómeno social de la evitación de 'Reduce'
Evan Hahn informa que, aunque utiliza 'map' y 'filter' constantemente sin quejas de sus compañeros, su uso de 'reduce' frecuentemente resulta en comentarios de que el código es difícil de leer. Sugiere que esto puede deberse a que 'reduce' es menos familiar, más difícil de leer o menos elegante en lenguajes como JavaScript, Python y Swift.
Hahn señala que esta tendencia puede ser un fenómeno social más que un fallo técnico, aunque reconoce que en entornos de programación funcional como Clojure, estos comentarios son significativamente menos comunes. Observa que incluso cuando prefiere 'reduce', a menudo vuelve a otros métodos para satisfacer las expectativas sociales del proceso de revisión de código.
Carga cognitiva y patrones de razonamiento
Los comentaristas en Hacker News argumentaron que 'map' y 'filter' son preferidos porque permiten un razonamiento local, donde la salida de un solo elemento es independiente de los demás. En contraste, 'reduce' (o 'fold') obliga al desarrollador a razonar globalmente sobre el estado de un acumulador a medida que evoluciona a través de toda la colección.
Un comentarista señaló que 'reduce' añade una carga mental al requerir que el desarrollador 'conjure' un valor cero o un estado inicial para el tipo relevante. Otros señalaron que en lenguajes imperativos, 'reduce' a menudo ofrece pocos beneficios sobre un bucle 'for' estándar pero introduce una sintaxis más compleja, convirtiéndolo en un 'bucle con una sintaxis peor'.
Inconsistencia y compensaciones de implementación
Un obstáculo significativo para 'reduce' es la falta de consistencia entre los lenguajes de programación. Los comentaristas señalaron que diferentes lenguajes varían en si el acumulador es el primer o el segundo argumento en la función de retorno, o si la función acepta un valor inicial en absoluto. Esta inconsistencia convierte a 'reduce' en un 'footgun' donde una colección vacía podría causar un fallo si no se proporciona un valor inicial.
La discusión también destacó riesgos de rendimiento, como la complejidad O(n^2) de la concatenación de cadenas dentro de una función 'reduce' en Python. Un comentarista compartió una anécdota histórica donde 'reduce' fue degradado a una función de biblioteca en Python 3 porque causó un incidente en producción involucrando un algoritmo de ajuste de línea que agotó los pools de hilos debido a la complejidad de tiempo cuadrática.
El Principio de Menor Potencia
Se cita el 'Principio de Menor Potencia' como una razón para favorecer las abstracciones de nivel superior. Debido a que 'reduce' es tan potente y general, técnicamente puede lograr casi cualquier transformación de colección, pero a menudo se utiliza incorrectamente para reimplementar patrones que ya tienen funciones dedicadas y más legibles.
El consenso entre varios comentaristas es que si una operación de nivel superior como 'map' o 'filter' no es lo suficientemente flexible, a menudo es mejor descomponer la operación en múltiples pasos más simples o usar un bucle tradicional en lugar de recurrir a 'reduce' para hacerlo todo a la vez.
Incertidumbres y preferencias subjetivas
La evidencia del 'rechazo' a 'reduce' sigue siendo en gran medida anecdótica, ya que no se proporcionan datos cuantitativos para medir la frecuencia de estas quejas en revisiones de código profesionales. Además, la elección 'correcta' a menudo depende del lenguaje específico y de la familiaridad del desarrollador con los conceptos de programación funcional.
Mientras que algunos desarrolladores consideran que 'reduce' es un método de 'martillo/clavo' que simplifica la lógica compleja al alejar la implementación del lugar de la llamada, otros sostienen que la falta de transparencia en cómo se ejecuta la reducción lo convierte en una abstracción menos segura que 'map' o 'filter.'
