A Engenharia de Software, como é ensinada hoje, é totalmente focada na programação orientada a objetos e na visão orientada a objetos 'natural' do mundo. Existe uma metodologia detalhada que descreve como transformar um modelo de domínio em um modelo de classe com várias etapas e muitos artefatos (UML), como diagramas de casos de uso ou diagramas de classes. Muitos programadores internalizaram essa abordagem e têm uma boa idéia sobre como projetar um aplicativo orientado a objetos do zero.
O novo hype é a programação funcional, ensinada em muitos livros e tutoriais. Mas e a engenharia de software funcional? Ao ler sobre Lisp e Clojure, deparei-me com duas declarações interessantes:
Os programas funcionais geralmente são desenvolvidos de baixo para cima em vez de de cima para baixo ('On Lisp', Paul Graham)
Os programadores funcionais usam mapas nos quais os programadores OO usam objetos / classes ('Clojure for Java Programmers', palestra de Rich Hickley).
Então, qual é a metodologia para um design sistemático (baseado em modelo?) De um aplicativo funcional, ou seja, no Lisp ou no Clojure? Quais são as etapas comuns, quais artefatos eu uso, como os mapeio do espaço do problema para o espaço da solução?