はじめに
当記事は以下の記事の補足となります。
この記事は、Webアプリ開発に限定して、プログラミングパラダイム(プログラムの書き方、設計)の2000年~2025年までの変遷を整理してみます。
1995年頃~2000年初頭:構造化プログラミング
Webシステム開発に限って言えば、C言語の構造化プログラミングから始まったと思います。構造化プログラミングの特徴は、「順次・分岐・反復という3つの論理構造」をつくることです。これは、C言語に限らず、初期のPHPやPerlでも構造化プログラミングをしていたと思います。
2000年初頭~2020年頃:オブジェクト指向プログラミング
大規模案件の場合、オブジェクト指向が多く採用されました。そのうちオブジェクト指向は、システムの規模の大小を問わず採用されるようになりました。
オブジェクト指向は、以下のようなチーム開発での効率化や混乱を防止する仕組みがあり、大規模開発に向いていると考えられていたように思います。2000年から2020年ぐらいまではかなりオブジェクト指向が幅を効かせていたように思います。
オブジェクト指向のメリット
・ポリモーフィズムによるコードや処理フローの統一化
・継承による機能重複の削減
・カプセル化によるモジュール利用時の容易化や意図しない値の更新防止
など
2012年頃~:宣言型プログラミング
※年数はAnsibleのリリースされた年数が古かったのでそれを記載しています。
後述する関数型プログラミングや関数型言語の説明をみると、宣言型という言葉も目につきます。同じような扱いにしているものもありますが、Webアプリ開発ではReactの特徴として「宣言的UI」の指摘があります。こちらに引き付けて、Wikipediaから説明を引用します。
宣言型言語は、what the program must accomplish(何をなすべきか)方針で、副作用を排除した式や純粋関数の実装に努める
上記の説明に即したプログラミングを踏襲しているライブラリとしては、React、Terraform、Ansibleなどがあります。
Ansible と Terraform はどちらも構成を定義し、さまざまなインフラストラクチャ・ターゲットに適用できます。ただし、構成管理に対するアプローチは異なります。Terraform は、宣言型プログラミングと呼ばれるアプローチを使用します。
Terraform、Ansibleは、OSやネットワークサービスの構成(構築)をコードで定義し、自動的に環境構築するツールです。これらのコードは宣言的な形式です。Ansibleは、Railsでも採用されているYAMLで記載します。Terraformは独自のコードスタイルですが、JSONやYAML形式でも利用できます。
関数型言語を使わないコードにおいても、「仕様を定義する」形式があり、これらは「宣言的プログラミング」、「宣言的コーディング」と言えます。
2019年頃~:関数型プログラミング
ただ、2020年より少し前からオブジェクト指向は思ったほどうまく使いこなせないという意見も増えてきました。
以下の『オブジェクト指向プログラミング — 1兆ドル規模の大災害』というオブジェクト指向への批判記事は有名だと思います。
この頃から関数型プログラミングの採用も増えてきたように思います。特に、Reactの機能として、React Hooks(2019年)が登場してきた辺りから、Webフロント開発では関数型プログラミングの採用が増えたように思います。
また、GoやRustも関数型言語ではないですが、プログラミングパラダイムでいえば関数型プログラミングに近いスタイルを取られることが多い印象です。
関数型プログラミングは、基本的に、関数内でしか引数に影響を与えない純粋関数をつくります。関数外の影響をうけないため、処理の影響範囲が限定されます。また、テストが容易になります。
一方で、オブジェクト指向とは違い、処理する値はすべて引数で与えますので、コード数がオブジェクト指向よりやや増えると思います(構造体を渡すとしても)。
また、高階関数やモナドなどについては、直感的にわかりにくいと感じる人もいます。一時期のオブジェクト指向のように、関数型プログラミングがソフトウェア開発の現場を席巻していない現状をみると、万人にとって使いやすいプログラミングパラダイムではないのかもしれません。
プログラミングパラダイムの変遷
1.構造化プログラミング
2.オブジェクト指向
3.宣言的プログラミング
4.関数型プログラミング
まとめ:人間の認知や作業負荷を低減することを志向した変遷
プログラミングパラダイムの変遷も、結局は、人間がわかりやすいプログラムの流れ、複数人で問題なくモジュールを製造すること、拡張性を高めることを模索した結果だと思います。
オブジェクト指向は、コーディングの工数を減らそうとして継承やポリモーフィズムなどを使いました。ただ、それが依存関係を高めたり、インターフェースの利用などで処理の流れがスパゲッティ化したり、コードの可読性を低下させました。また、テスト実施も難しいという批判もあります。
関数型プログラミングは、純粋関数に象徴されるように、できるだけ小さい範囲で関心事をとどめ、関係性だけを扱うようにしています。人間は幅広い関心をカバーすることはできないので、関数型プログラミングの観点は人間にとっては管理しやすいと感じます。
また、宣言的プログラミングは、ライブラリが手続的な部分を吸収してくれているので、「目的仕様」を定義するだけでよく、作成しやすく、理解しやすいコードになります。