Las personas que han trabajado en grandes bases de códigos funcionales, ¿qué no es mejor?

He trabajado en grandes bases de código escritas en lenguajes desde C ++ y C # a OCaml y F #. C ++ y C # se consideran OOP, mientras que OCaml y F # se consideran funcionales, pero, en mi opinión, estos agujeros de paloma ocultan las diferencias importantes.

El mayor problema con C ++ es que no es seguro para la memoria y, en consecuencia, se desperdicia una gran parte del esfuerzo de desarrollo tratando de localizar errores de memoria que a menudo son probabilísticos y difíciles de rastrear. La orientación a objetos ofrecida por C ++ es tan débil que es casi inútil en comparación con un lenguaje OOP genuino como Smalltalk. Entonces la orientación a objetos es realmente irrelevante.

La mayor ventaja de F # es el sistema de tipo ML (tuplas, registros y uniones) y la coincidencia de patrones. En realidad, esto no tiene nada que ver con la programación funcional además del hecho de que estas características del lenguaje solo aparecen en lenguajes funcionales. Las funciones de primera clase son una ventaja sustancial, pero también están disponibles en C #, que generalmente no se considera un lenguaje funcional.

Dicho esto, considero que OCaml y F # son mucho más productivos que C ++ y C #. Iba a decir que los programadores funcionales, especialmente los junior, tienen la costumbre de tratar de incorporar características oscuras porque tienen una fuerte tendencia a molestar en lugar de mantener el código de producción simple. Sin embargo, ahora que lo pienso, vi mucho más de eso con las plantillas de C ++ que alguna vez hice con OCaml o F #.

Escribí la base de código de back-end de tamaño mediano en CentralApp en Scala. Nuestro código está escrito de la forma más pura posible.

Si bien nuestra base de código ni siquiera es tan grande como la de Twitter, todavía ha alcanzado un tamaño bastante grande. Tenemos algo así como 20 servicios medianos en ejecución que cubren todos los aspectos de nuestro producto. Mi experiencia hasta ahora ha sido que hemos podido mantener un alto grado de legibilidad en todos los servicios. Además, el código ha sido razonablemente fácil de razonar sobre las dependencias e interacciones entre servicios.

Scala no es el lenguaje funcional más legible que existe. Hemos tenido problemas con los recién llegados que comprenden el código que tiene que ver con la variación de tipo de Scala [1], por ejemplo. Pero después de un poco de práctica, la gente ha leído el código con bastante facilidad. No solo eso, y odio usar el término, nuestro código se ha auto documentado. Incluso si Scala no es Haskell, todavía conduce a un código más limpio que los lenguajes imperativos.

Con legibilidad, también se debe hablar acerca de poder depurar. La programación funcional fomenta la transparencia referencial. Eso significa que se nos recomienda mantener separado el código de efectos secundarios. Solo eso, es uno de los rasgos ganadores de la programación funcional. Sabe exactamente qué parte de una base de código afecta a la base de datos, o al caché, o interactúa con una cola de mensajes. Hace que la concurrencia sea manejable.

Scala también tiene soporte de primera clase para la concurrencia, el patrón de actor, las construcciones monádicas y la comprensión que hace que el código sea limpio y la lógica obvia.

Estoy sinceramente sorprendido, después de mi experiencia, de que la programación funcional no ha captado más de lo que lo ha hecho, aunque cada vez más startups eligen la ruta funcional.

Notas al pie

[1] Variaciones – Documentación Scala

Hola, trabajé en una base de código oop bastante grande escrita principalmente en java y c ++, ahora estoy trabajando en un gran proyecto scala. Ambos proyectos tienen grandes deudas técnicas, por lo que los considero bastante malos tanto en estilo como en arquitectura. Lo principal que he aprendido es que no importa qué idioma se use, ya que está estáticamente tipado, todo es cuestión de experiencia. Si trabajó principalmente con lenguajes oop, le resultará difícil leer un código scala incorrecto y viceversa. Perdón por los errores, no soy un hablante nativo.