プログラミング学習を始めた時に、「ライブラリ」と「フレームワーク」って言葉が出てきて、一体何が違うの?と思った事ありませんか?
例えば、「jQuery」は、Javascriptの「ライブラリ」です。
一方で、「Ruby on Rails」や「Vue.js」は、「フレームワーク」です。
一体何が違うのでしょうか?
この記事では、「ライブラリ」と「フレームワーク」の違いについて考えてみたいと思います。
結論
単純化してますが、「ライブラリ」と「フレームワーク」の違いをまとめると以下の様になります。
- ライブラリは「機能」を提供
- フレームワークは「仕組み」を提供
- ライブラリは「機能」の活用の仕方に腕が試される
- フレームワークは「仕組み」の決まりに従うのが大切
「ライブラリ」も、「フレームワーク」も他の誰かが書いた開発上の一般的な問題(例えば、Webサービスを作りたい)を解決するための便利な仕組みです。
ですが、大きな違いは「主導権」の違いです。(Inversion of Control)
「ライブラリ」は、主導権が「プログラマー」であるのに対し、フレームワークは主導権が「フレームワーク」そのものです。
これを、「ハリウッドの原則(後で解説します)」と言うこともあります。
ライブラリ | フレームワーク | |
目的 | 「機能」を提供 | 「仕組み」を提供 |
具体例 | NumPy (Python) Pandas (Python) jQuery(Javascript) Bootstrap(HTML/CSS) | Ruby on Rails (Ruby) Django (Python) Angular(Javascript) ASP.NET(C#) Laravel(PHP) |
ちょっと良く分からないですか?
もう少し詳しく「ライブラリ」と「フレームワーク」を見ていきましょう。
ライブラリとは?
「整理」して「まとめる」仕組み
「ライブラリ」とは、開発に役立つ機能を関数をクラスなどの形にして整理し、プログラムの中からいつでも呼び出して利用出来る様にまとめたものです。
ライブラリは時間を短縮出来る
このような機能を自分で1から作ろうとすると、大変ですよね?
そこで、ライブラリという形でよく使う関数やクラスをまとめ、先人がインターネット上で共有してくれているものがライブラリです。
ライブラリの活用はプログラマの腕に左右される
ライブラリは便利な仕組みですが、用意されている関数・クラス類がどの様なもので、どの様に使うかを理解しないといけません。
なので、いかに使いこなすかは、利用するプログラマ自信の腕に左右されます。
ライブラリの具体例
- jQuery (Javascript)
- NumPy (Python)
- Pandas (Python)
- Matplotlib
Pythonで機械学習をした事がある人であれば、Numpy、Pandas、Matplotlib等のライブラリは必ず使った事があると思います。
【ライブラリ】まとめ
- ライブラリとは、「整理」して「まとめる」仕組み
- 自分で1から作る必要がなくなるため時間を短縮出来る
フレームワークとは?
それでは、フレームワークについて見ていきましょう。
「システム」そのものを提供する
フレームワークは、単に関数やクラスなどをまとめるのではなく、「システム」そのものを提供します。
ライブラリと違い、全体の処理の流れが実装されており、用意されている関数やクラス類は全て関連性があります。
決まりを理解する事が大切
フレームワークを利用するプログラマは、用意されている関数・クラスを勝手に利用する事は出来ません。
プログラムの基本的な動きはシステムによって決められており、
「こういうときはこれを用意してください」
「こうしたいときはこの部分を作成してください」
といった決まりに従ってプログラムを書くことになります。
プログラムの主導権は「システム」
プログラムの主導権は、プログラマではなく、フレームワークのシステムにあります。
「MECE」や「SWOT分析」などもフレームワーク
ビジネスの現場で使われる「MECE」(ミッシー)や「SWOT分析」という考え方なども、一種のフレームワークと言えます。
漏れなく要素を検討する為のこの考え方では、大体皆同じ「結論」に達するので、外資系コンサルとかが、納得感を引き出す上で良く使いますね。
決して創造的な思考を導くためのフレームワークではないことに注意、、
具体例
- Ruby on Rails(Ruby)
- Django(Python)
- Flask(Python)
- Angular(Javascript)
- ASP.NET(C#)
- Laravel(PHP)
Webアプリケーションの開発でおなじみなものを取り上げましたが、もちろんフレームワークは、あちこちに存在します。
【フレームワーク】まとめ
- フレームワークは「システム」を提供する
- プログラムの主導権は「システム」が握る代わりに、誰でもそれなりのものが出来る
ハリウッドの原則とは?
それでは、「ライブラリー」と「フレームワーク」の主導権が逆とはどういう事かもう一度考えてみましょう。
面白い例えとして、「ハリウッドの原則(Hollywood principle)」というものがあります。
A software design principle, stated as “Don’t call us, we’ll call you“, that assists in the development of code with high cohesion and low coupling that is easier to debug, maintain and test.
wikipediaより
映画監督が映画を作る時は、映画の世界観に合わせて俳優や女優を選びますよね。
つまり、映画という仕組み(フレームワーク)が俳優や女優を決定し呼び出します。
俳優や女優が映画監督に自分を売り込むのは禁止で、作品の配役が発表される時に、自分が選ばれたかを知ります。
この暗黙の了解(Don’t call us, we’ll call you)をソフトウェア開発原則に据えたのが、「ハリウッドの原則(Hollywood principle)」です。
何でこんな事するかって?
簡単です。
大規模な開発に秩序をもたらし、成功させるためです。
「High cohesion and Low coupling(高凝集で疎結合)」というちょっと難しい概念が出てきますが、分からない人は大規模な開発を成功させるための原理原則の様なものとして捉えて貰えればOKです。
まとめ
さて、あなたが小学生に「ライブラリ」と「フレームワーク」を説明するなら、何と説明しますか?
自分は、「ライブラリ」を「めんつゆ」、フレームワークを「カレーのルー」と言うと思います。
めんつゆは、「醤油」と「みりん」と「水」と「だし」から出来ています。
1から作っても良いですが、既に絶妙の配合で出来上がっているのであれば、それを買ってきた方が便利ですよね。
ですが、めんつゆは、「システム」かと言うと、微妙です。
例えば、ソバを食べる時は最後に「めんつゆ」を水と混ぜて付けダレを作れば良いですよね。他にも、色々な使い道があります。
一方で、「カレーのルー」はカレーを作成するという、「システム」を提供しています。
野菜と肉と野菜を炒めて、水を加えて沸騰したら、アクを取りながら煮込み、火を止めた後にカレーのルーを割り入れ、再び弱火で煮込みます。
いきなりカレーのルーを炒める人はいないですよね?
誰でもそれなりのカレーが出来る代わりに、料理の流れは大分制限されます。