見出し画像

ど文系の私がプログラミング的思考を考えてみる③(抽象化と一般化)

こんばんは。
あおはるです。

ど文系の私が、新しい概念を学びながらその過程を公開していくというコンセプトで始めてみた企画。
前回からの続きもので、プログラミング的思考についてです。

1回目ではプログラミング的思考の中でモデル化を。
2回目ではモデル化に必要な要素の中の分解について考えてみました。

今日は、以下のサムネイルにある抽象化と一般化を考えてみます。

最後まで読んで頂ければ幸いです。


抽象化と一般化とは?

これは言葉の印象から考えてしまうと、よくわからずに深みにハマります。
特に抽象化! こいつがクセ者!

抽象的=曖昧 ⇔ 反対語は具体的
一般的=世間に広く知られている状態

のような言葉のざっくり理解があるとして、でもここでいう抽象化とは曖昧にすることと理解してしまうとちょっと躓きます。

冒頭のベネッセさんのサイトでは、以下のように書かれています。
・抽象化:目的に応じて適切な側面・性質だけを取り出し、他の部分を捨てること。
・一般化:ものごとの類似性や関係性を見出すこと。さらにそれを別の場合でも利用できる内容にすること。

つまり、ここでいう抽象化とは曖昧にするということではなく、目的に対して必要な要素だけを取り出して言語化するということになります。
そうして共通項を見出し、置き換えられるようにすることが一般化。

具体例をもとに考えてみます。

カレーライスを抽象化してみる(超難問)

あなたは「今晩はカレーにしよう」とオーダーしたとします。
オーダーする時に脳裏にイメージするのはこんなカレーだったとします。

画像3


そして、食卓にはこんな感じのものが出てきたとします。

画像1

いや、これシチューやん、と。
おそらくツッコミをするでしょう。

翌日、再度「シチューもよいけどカレーがいいな」とオーダーしました。
そして、こんな感じのものが出てきました。

画像3

いやいや、確かに辛いけど、と。
え? わざとやってる? みたいに苛立ちを覚えるかもしれません。

しかし、ここで先に相手が怒り出しました。
「カレーってなんだよ!」

この問い、めっちゃ難しくないですか?

カレーってどんな要素が揃ってるとカレーなの?

味の切り口:辛い
え、じゃあ麻婆豆腐は何が違うの?

食材の切り口:にんじん、じゃがいも、たまねぎ……
え、じゃあシチューは何が違うの?

そうか、ルーだ! ルーだよ! スパイスがあって、ルーが特徴的なんだ!
そうですか、じゃあ――

画像4

お、おう。みたいな。
頑張ったね……みたいな。

回りくどい説明になりましたが、これが抽象化の概念です。

>目的に応じて適切な側面・性質だけを取り出し、他の部分を捨てること。

シチューではなく、麻婆豆腐ではなく、カレーにあるものは何かを考えていくことになります。

ここで大切なのが目的に応じてという部分。

プログラミングの話に戻してみる

プログラミングも要件定義というものがあります。

先ほどの例でいうと、カレー作ってというオーダーだけで始めてしまうと、多くの場合、クライアント(依頼者)と認識齟齬が発生します。

例えば、電卓プログラムを作ってというオーダーを受けたとします。

電卓プログラムにはどんな要件が必要そうでしょうか。
ここで重要なのが、電卓プログラムを作ってほしいというオーダーの目的です。

経理処理に対応している必要があるかもしれません。
四則演算だけができればよいだけかもしれません。
ただし、桁数表示は100桁まで出してほしいかもしれません。

使う目的がわからないと、何をどこまで作ればよいかが曖昧になってしまいます。
そこで重要なのが抽象化。
ある目的を叶えるためには、要素として、これとこれとこれがあればよいですよね、と握ることでゴールイメージが明確になります。

さらに一般化

電卓を作る過程で作った機能は、電卓にしか使えないのでしょうか。

例えば、四則演算をする機能。
これは電卓だけに限らず、他にも流用ができそうです。

シチューとカレーも食材の段階ではだいたい同じです。
調理工程もだいたい同じです。
最後にルーの違いによって別の料理になります。

つまり、カレーを作れる人はシチューも作れることになります。
コンソメいれたらポトフになるかもしれません。

この食材類をこういう調理をすれば美味しい食事になるという概念。

>ものごとの類似性や関係性を見出すこと。さらにそれを別の場合でも利用できる内容にすること。

これが一般化の概念です。

言われてみるとそりゃそうだ、なんですが、プログラム作る時にいちいち計算プログラムをゼロから作ったりしないんですよね。
ある機能が一般化されていることで、他の人もその機能を使って効率的に開発を進めることができます。

まとめ

というわけで今回はプログラミング的思考における抽象化と一般化でした。

・抽象化:目的に応じて適切な側面・性質だけを取り出し、他の部分を捨てること。
・一般化:ものごとの類似性や関係性を見出すこと。さらにそれを別の場合でも利用できる内容にすること。

ど文系の私は、抽象化がうまくなると、写真で一言がうまくなりそうだなんて感想を抱きました。
写真で一言も、要素を抽出して、共通点のある意外なものに置き換えることで笑いが生まれます。

優れた芸人さんはやっぱり頭が良い!


次回は組み合わせを考えてみます。

以上、最後まで読んでいただきありがとうございました。


続きはこちら

今回のような内容はこちらにまとめています。

また、他にもビジネス系についても書いています。
よければあわせて読んでいただければ幸いです。


この記事が参加している募集

おうち時間を工夫で楽しく

この記事が気に入ったらサポートをしてみませんか?