抽象化

二つの抽象化

抽象化、という言葉があります。また、「抽象度」という言葉がありますがこれは「抽象化の度合いの高さ」みたいな感じでしょうか。「抽象化する」「抽象度を上げる」「抽象度の高い」「抽象化された」といった使い方をします。

 

wikipediaによると、「抽象化」には2つのページがありました。

ひとつは哲学の概念で「思考における手法のひとつで、対象から注目すべき要素を重点的に抜き出して他は捨て去る方法」とあります。

 

ja.wikipedia.org

もう一つは、コンピュータ(計算機科学)の世界での用語で「詳細を捨象し、一度に注目すべき概念を減らすことおよびその仕組み」とあります。

 

ja.wikipedia.org

 

なんだかよく分からないというか、同じようなものに見えますね。

 

私の使い方

とりあえず定義はおいておいて、私の感覚として(私はこんなイメージで使ってます、ということなので異論はあるかと思いますし、間違ってるかもしれません)以下の2つの意味合いで使っています。

 

一つは、「物事の共通した性質などを見いだして、より概念化した形に近づける」という意味合いです。例えば「抽象度の高い議論を」とか「資料が概念的すぎて伝わらないからすこし抽象度を下げて具体例を」といった使い方です。以下、これを「抽象化A」とします。

 

もう一つはコンピュータ関連(計算機科学)の世界で「人間に分かりやすくする」というような意味合いです。例えば「低水準言語(アセンブラ)よりも高水準言語(C++Java)はより抽象度が高い」といった言い方です。以下、これを「抽象化B」とします。

 

同じ計算機科学の中でも例えばアルゴリズムを記載するときに、細かい言語による実装方法やシンタックスのことをおいておいて、「プログラムで書くとするとだいたいこんな感じ」と疑似言語で書いて抽象度の高い記述をする・・という場合は抽象化Aの「概念化した形に近づける」の意味合いのようですが「細かいシンタックスや実装方法というわかりにくさを避け、より人間に分かりやすい形にする」という抽象化Bとしての捉え方もあり得ますので、AもBも根本的には同じようなことを指しているけど私がうまく理解できてないだけなのかもしれません。

 

抽象化A

抽象化Aを行う利点は、物事の本質を捉えることができるため、例えば議論であれば些末にとらわれることなく本質的な議論ができます。

物事を理解する際にこれを行えば、より応用が利くようになります。例えばプログラミングの考え方であれば言語が変わってもすぐに対応して同じようにモノを作れるようになります。

 

欠点は、分かりにくくなるケースがあることです。「抽象的でよく分からない、実例を挙げて欲しい」というようなことになるんですね。

例えば数学の定義や形式記述言語での説明は非常に抽象度が高い表現なのですが、慣れていない人にはちょっと分かりにくいです。「要はXXとかYYのことだよね」と具体例を出して補足(抽象度を下げる)しないと分からないケースもあります。

 

そのため、人と議論したり伝えるときには、抽象度を上げて本質を捉えるとともに、分かりやすい実例で抽象度を下げてという作業を同時にやりながら(抽象度を上げたり下げたりしながら)進める必要があるのかなと思います。

 

抽象化B

これはある意味コンピュータの進化の歴史そのものと私は思っています。

高級言語の誕生もそうですし、GUIで直感的に使えるようになったといったUIの進化もそうですし、クラウドコンピューティングもその一面はあります。

 

この抽象化の欠点は、処理のオーバヘッドが増えるためどうしても速度が犠牲になるということです。そこをハード(ないしは実行環境)の速度向上という力業で解決したりするわけですが、逆にいうと、その速度向上があってこそソフトウェアの抽象度の向上がありえたとも言えるかと思います。

 

まとめ

このまま抽象化Bが進むと、最終的にはコンピュータを使っている/プログラミングをしているという意識すら不要になるため、我々エンジニアの仕事がどんどん少なくなる(少なくとも今のような形でプログラムを書いたりといった仕事は減る)と思われます。その時におまんまの食い上げにならないように、抽象化Aでの考え方に慣れ、より普遍的な知識と能力を付けるように注意しないといけないのかな・・・と、うまいこと2つの概念を盛り込んだ結論を書いてみました。しらんけど。

 

なお、本日は酔っ払った勢いで書いてるので、あまり真面目に「その捉え方は間違ってる」とか「例示がおかしい」とか「まとめでもなにもうまいこと言ってない」とかマサカリ投げるのはご容赦ください。だって日記ですし(酷い言い訳)