ソフトウェアアーキテクチャの多くのアプローチはアーキテクチャを最初に計画することを前提としている。残念ながら、この方法で計画されたアーキテクチャは、後で変更することが難しい。関数型プログラミングは、事前の計画を最小限にとどめ、アーキテクチャの決定を後から変更できる程度の疎結合を実現するのに役立つ。
Michael Sperber氏はOOP 2023 Digitalでソフトウェアアーキテクチャと関数型プログラミングについて講演した。
Sperber氏はシステムのコードをビルディングブロックに分割することを例に挙げた。これは異なるビルディングブロックを別々に異なるチームで作業する場合、特に重要な種類のアーキテクチャ上の決定である。これを行う方法は粗い粒度のビルディングブロックであるバウンデッドコンテキストにドメイン駆動設計(DDD)を用いることである。
DDDでは最初にコンテキストマッピングによって境界のあるコンテキストを特定する必要があるとされている。しかし、コンテキスト間の境界を間違えると多くのメリットを失うことになる。そして、少しでも間違いがあると、後で動かすのが大変になる。
Sperber氏によると関数型プログラミングはOOPに比べてアーキテクチャの変更を可能にし、結合を減らすことができるという。マクロアーキテクチャの決定を先送りするためには常に分離しなければならない。関数型プログラミングにおけるコンポーネントは基本的にデータ型と関数だけであり、これらの関数は状態が変更可能でなくても動作するという。このため、依存関係が明示的になり、一般的なOOコンポーネントに比べて結合がかなり緩くなる。その結果、マクロアーキテクチャに依存しない機能を構築することが可能になる。とSperber氏は言う。
Sperber氏は、関数型プログラミングは「OOPのように、変更可能な状態がないだけ」ではないことを明らかにした。ドメインモデリング、抽象化、ソフトウェア構築のための独自の手法や文化が付属している。OOプロジェクトに不変性を採用するだけで、そのメリットのいくつかを得ることができる。しかし、そのすべてを手に入れるにはより深く掘り下げ、適切な関数型言語を使用する必要がある。とSperber氏は説明する。
関数型アーキテクチャは再利用可能なコンポーネントを実装し、さらに重要なこととして、未来を予測するしなやかなドメインモデルを実装するために高度な抽象化を駆使する。このようなドメインモデルの探求と開発において、関数型プログラマは数学が提供する豊富な語彙を頻繁に利用する。その結果得られる抽象化は関数型言語が提供する高度な抽象化機能によって基本的に実現される。
InfoQは、Michael Sperber氏に現在のアーキテクチャ技術のツールボックスが後で元に戻すのが難しい間違った決定をする要因になっていること、そしてこの問題に対してどうすればよいかをインタビューした。
InfoQ: プロジェクトの開始時にマクロアーキテクチャを定義することの難しさは何ですか?
Michael Sperber氏:ソフトウェアアーキテクチャの一般的な定義として、「後で変更するのが難しい決定事項である」というものがある。これを最初にやるということは、最も情報が少ないときにやるということだ。その結果、決定が間違っている可能性が高い。
InfoQ: コンテキスト間で境界を移動させるのが難しいのはなぜでしょうか?
Sperber: アーキテクチャのコミュニティでは、境界のあるコンテキストやモノリスの中でモジュール性を実現する方法を忘れてしまったようだ。だから、「Modulith」という新しい用語があるのだが、これは、通常のモノリスはデフォルトでは非モジュールで、その内部は密結合であることを意味する。
InfoQ: つまり、モノリスの中で疎結合を実現する方法がわからないということですか?
Sperber: その通り。なぜなら、OOアーキテクチャの基本は、可変状態、つまり、オブジェクトをその場で変更するプログラミングだからだ。このような状態の変化は、目に見えない依存関係を作り出し、ビルディングブロックを混乱させる。これは、プロジェクトの機能面だけでなく、他の品質目標にも影響する。
InfoQ: 例を挙げていただけますか?
Sperber:例えば、高性能を実現するための戦術として、並列化を選んだとしよう。集約されたルートを選択し、そのルートへのアクセスを相互排除で保護する必要がある。これは面倒な作業でエラーが起きやすく、高速化も難しいし結合も劇的に増加する。
InfoQ: アーキテクトや開発者がアーキテクチャの決定方法を改善したい場合、どのようなアドバイスをしますか?
Sperber: プロジェクトで関数型言語を使えないとしても、関数型プログラミングの基本を試して、そこにある違いや機会を感じ取ること。もしあなたがFPを初めて使うのであれば、How to Design Programsというアプローチで始めるのがおすすめだ。ドイツ語圏の人ならDeinProgrammでもいいだろう。
また、関数型プログラミングによるソフトウェア構築に関する本も2冊ある。