フレームワークとライブラリの違い

#フレームワークとライブラリってどう違うのか？
先日、若手のOさんにライブラリを作る話をしていたら、
**フレームワークとどう違うんですか？**
との質問を受けました。
インターネットで調べれば、答のある話ですが、
逆にインターネット上の情報で分からなくなっている側面もあるようです。
そこを補足して説明したので、それを記録しておきます。

2019/3/13追記：この記事にリンクを貼っていただける方が複数いらっしゃるので、この疑問って、抱いている人が多いんだなと思いました。
2019/4/25追記：若い人に「クラスライブラリを作る」と話しても、「この繰り返し処理は、、、」とか、「使う側にとっての一連の使いかたの流れをライブラリに入れないのか」、利用者にとって共通処理になる可能性があるものであれば、共通のモノはライブラリに入れるべきじゃないかとか、疑問に持つらしい...。

#若手Oさんの考え
.NET Framework は、ライブラリじゃないの？

...うーん、なるほど。
確かに、**.NET Framework クラスライブラリ** って言葉を聞いたことあるね。

#フレームワーク
フレームワークは、簡単に言うと、
「全体の処理の流れが実装されており、その中の一部の具体的な処理を自分で実装して、はめ込めるようになっているシステム」
のこと。
はめ込めるようになっている箇所を**ホットスポット**と呼んだりします。

分かりやすかったのは、
[ソフトウエアのフレームワークとはなにか](http://itpro.nikkeibp.co.jp/article/lecture/20070205/260697/)
の図1。
詳細はこのページに書いてあったので、しっかりと知りたい人は参照してください。

具体例を検索したところ、
[プラグイン・フレームワーク構造型POSパッケージ「NSW-GADGET STORE」](http://www.nsw.co.jp/solution/detail.html?ssid=gadget_store)
http://www.nsw.co.jp/solution/detail.html?ssid=gadget_store
があった。
私から見ると**これぞ、こてこての、ザ・フレームワーク**という印象。
フレームワークの図があるので、見てもらうと、具体的なフレームワークのイメージが分かりやすい。

Javaフレームワークで有名なものに、Strutsがある。
Wikipediaの説明をよくみると**「Webアプリケーションフレームワーク」**とある。
つまり、**Webアプリケーションとして機能する枠組みシステム**を提供するので、
その中に、ロジックを埋めることでWebアプリケーション構築が楽になるということ（だと思う。使ったことないので...)。
こてこてのフレームワークと比べると、ホットスポットの範囲が広すぎて漠然とした印象が強い。
ただ、フレームワークだとは思う。

また、.NET Frameworkもフレームワークだから調べてみると、
マイクロソフト公式解説書『プログラミング.NET Framework 第4版』のP(7)に
>ある意味で、.NET Frameworkそのものがオペレーティングシステムです。

と書いてある。
オペレーティングシステムっぽいフレームワーク、と言われてしまうと、
フレームワークってなんだ？ と思ってしまうのも頷ける。
（実は、かなり抽象度の高いフレームワークってことなのだけれど。）
いずれにせよ、
ただ.NETでプログラミングしているだけの人から見たら、フレームワークって感じないよな、
と思います。
最近は、マイクロソフトの.NetFrameworkのページを見ると「開発フレームワーク」と呼んでますね。なるほど、「開発という行為を機能させてくれる枠組み」という意味なのね、、、。って、前よりの親切になったけど、一般的な使い手の思考の抽象度に合ってないから、やはり分かりづらいですね、、、。(# 2023/03/07追記)

#ライブラリ
ライブラリは、使いたい部品が入っている道具箱。
一番簡素でイメージが分かりやすいのが、
**[C言語標準ライブラリ](https://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96C%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)**

これを見て分かるのは、**フレームワークみたいな全体を動かすためのロジックがない**ということ。
ただの部品の集まり。

##ライブラリとクラスライブラリの違い

C言語はクラスがない言語なので、再利用可能な関数の集まりが、ライブラリ。
C#のようにクラスのある言語で、再利用可能なクラスをまとめたものが、クラスライブラリ。

ちなみに、**.NET Framework クラスライブラリ**は、
**.NET Framework**上で使うための **クラスのライブラリ**。
「フレームワーク ＝ クラスライブラリ」ではない。

#まとめ
改めて調べてみると、2017年現在、
いわゆる**こてこてのフレームワーク**ではなく、
**ホットスポットの見えないフレームワーク & そこで使うためのライブラリのセット**に、
**フレームワーク**という名前がついているケースが当たり前みたいで、
20～30歳くらいの人には、フレームワークとライブラリの違いが分かりにくいのだろうな、
ということが分かりました。

単に、フレームワークとライブラリの定義を調べるだけではなくて、
なんで混乱しているのかを考えてみると良いかもしれませんね。

フレームワークという言葉が示すもの自体が、時代によって変わってゆくことはあるとは
思うのですが、その根源が何を示しているのかを忘れては、
せっかくのフレームワークという言葉の意味が失われてしまい、
過去の人たちの思慮深い知識が失われてしまうと、私は思います。
従来よりも幅広い意味でフレームワークという言葉が使われるとしても、
そこは失ってほしくないと思います。

#2019年11月のコメント
最近、知人と話していた時、
「（最近のコンポーネント技術の話で、なんだかどう使っていいか分からないなんて）昔のフレームワークと同じだよね」という話が上がってきた。昔のフレームワークとは、strutsの話らしい。
その時は、なるほど、知人の中では「フレームワーク」という言葉自体が、よく分からない枠組み技術みたいな概念になっているのだと思いました。

話を聞きながら「いわゆる分かりやすい昔ながらのフレームワークだったら、"分かりにくい"なんて感じもしないのになぁ」と心の中では思いました（上記のリンクの張ってあるフレームワークの実製品なんて、とても分かりやすい概念だとおもうけれど）。その知人は仕事ができる人なので、決してモノが分からない人ではないのに、やっぱりそれでもそういう認識になってしまうんだなぁ、と。

そして、しばらくして、そうか！って、気づいたけれど、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197297/7a3a1287-ec5a-6e55-fb43-c68a8e955ece.png)
もしかしたら、多くの人は、この下の方の具体的なものを指して「フレームワークとは...」って捉えているのか。
本当は、上の方の抽象的な概念・考えかた を指して「フレームワークとは...」って捉えるべきなのに。

そもそも、自分からしたら、フレームワークって自分で作成して、自分で使うもの、のイメージが強い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197297/47a6b1cb-3f29-0ed7-9c73-38561c9e996f.png)
こんな感じで、自分の開発している製品の「開発システムの骨組み」は、自分で作る。
これが、自分たちが使うフレームワーク。
フレームワークのホットスポットって、開発している自分たちのためにある（作る）んでしょう。だから、そのシステムが対応できるものごとのスコープを「ホットスポットで(2020.3.27追記)」広げることができる。

では、既存ツールの「フレームワーク」は使わずにフルスクラッチするのか、といえば、そんなことはないです。

自分のフレームワークを作る開発環境のライブラリとして、.NET Frameworkを、当然のように使っています。
けれど、.NET Frameworkのフレームを、自分たちのアプリケーションの骨組みにしようとは、さらさら思ってない。
ただの部品や道具です...。
だって、.NET Frameworkのホットスポットって言ったら、どんなアプリケーション開発者であっても当然のように使う部分しか
ないのだから、当たり前のフレームしかないのだから、C言語で画面描画までガリガリ書いていたころと比べれば、そりゃ、フレームだろうけど、今の開発者は、そんなところのフレームワークに、フレームワークとしてのうれしさは特に何もないよね。

皆さん、それぞれが使っているフレームワークって、「何の骨組み」なんでしょうね。
それによって、うれしさがあったり、実は、うれしさが無かったり、考えてみたら、コメントで教えてもらえると、良いのかも。

さて、話がだいぶ流れてしまったけれど、
そりゃまぁ、なんだか、この記事のView数が多いのも、頷けてきた。

フレームワークって、何のためのフレームワークか、ってことにしか、使えないに決まっている。当たり前すぎるけれど、、、。
DB向けのフレームワークって言って、DBをコントロールする部分だけのフレームワークだったりしたら、
そりゃ、それでアプリケーション構造まで助けてくれると思っていたら、助けてくれるわけないし、、、。

使うフレームワークが、どんな点で有効なのか、どんな有効なことを得るために用意されているフレームワークなのかを歴史的にしっかりと知って、その上で、それが自分の開発に使うべき形で使うと良いですね。

追記 2020/06/03 
あと、そもそもなのだけれど、オープンソースや販売されているフレームワークって、
基本的に、自分たちのフレームワークを作り上げる手段/ツールなのだから、
「自分たちが手段に使われる」や「自分たちがツールの上で転がされている」状態にならないよう、願っています。

#その他

どのように考えながらUMLモデリングしているかを声に出しながらモデリングする
モデリングライブを行いました。UMTPのホームページに動画が載っていますので、もしよろしければどうぞ。
https://umtp-japan.org/activity-report/10409

Qiitaに載せるには、ややフランクだったり、アイディアレベルの記事はこちら
https://ameblo.jp/azukizenzai8/

他にお役立ちそうなモデリングの記事
https://www.mamezou.com/techinfo/modeling_ddd/uml_miss_01