La ingeniería de software, tal como se enseña hoy, se centra por completo en la programación orientada a objetos y la visión 'natural' orientada a objetos del mundo. Existe una metodología detallada que describe cómo transformar un modelo de dominio en un modelo de clase con varios pasos y muchos artefactos (UML) como diagramas de casos de uso o diagramas de clases. Muchos programadores han internalizado este enfoque y tienen una buena idea sobre cómo diseñar una aplicación orientada a objetos desde cero.
El nuevo bombo es la programación funcional, que se enseña en muchos libros y tutoriales. Pero, ¿qué pasa con la ingeniería de software funcional? Mientras leía sobre Lisp y Clojure, descubrí dos declaraciones interesantes:
Los programas funcionales a menudo se desarrollan de abajo hacia arriba en lugar de de arriba hacia abajo ('On Lisp', Paul Graham)
Los programadores funcionales usan mapas donde los programadores OO usan objetos / clases ('Clojure for Java Programmers', charla de Rich Hickley).
Entonces, ¿cuál es la metodología para un diseño sistemático (basado en el modelo) de una aplicación funcional, es decir, en Lisp o Clojure? ¿Cuáles son los pasos comunes, qué artefactos utilizo, cómo los mapeo desde el espacio del problema al espacio de la solución?