今日教えられているソフトウェア エンジニアリングは、オブジェクト指向プログラミングと「自然な」オブジェクト指向の世界観に完全に焦点を当てています。ドメイン モデルをクラス モデルに変換する方法を説明する詳細な方法論があり、いくつかのステップと、ユース ケース図やクラス図などの多くの (UML) 成果物があります。多くのプログラマーはこのアプローチを取り入れており、オブジェクト指向アプリケーションをゼロから設計する方法について良い考えを持っています。
新しい誇大宣伝は関数型プログラミングであり、多くの本やチュートリアルで教えられています。しかし、関数型ソフトウェア エンジニアリングはどうでしょうか。Lisp と Clojure について読んでいるときに、次の 2 つの興味深い意見に出くわしました。
関数型プログラムは、トップダウンではなくボトムアップで開発されることが多い ('On Lisp', Paul Graham)
関数型プログラマーは、OO プログラマーがオブジェクト/クラスを使用するマップを使用します (「Clojure for Java Programmers」、Rich Hickley による講演)。
では、Lisp や Clojure などの関数型アプリケーションの体系的な (モデルベースの?) 設計の方法論は何でしょうか? 一般的な手順、使用するアーティファクト、それらを問題空間からソリューション空間にマッピングするにはどうすればよいですか?