抽象化について

抽象化っていうのは「細かいことは忘れちゃって，問題を解くのに都合が良いように考えましょう」っていうこと．数学的もクソもない．

型っていうのは，「この値にはどういう操作が可能なんだろうか?」っていうことをいちいち考えたくないから，導入された概念．ある操作が可能な集合を型として抽象化することによって，この疑問は「ある値がある型に所属しているかどうかを判定する問題」になる．こっちの問題の方が簡単であれば，抽象化したものの勝ち．

抽象化には訓練が必要で，誰にでもできるってわけじゃない．自明な抽象化はできるかもしれないけれど．でも，難しい問題っていうのは，抽象化が難しいから難しいんだということが良くある．でも，ちゃんと訓練をつめば，よっぽど脳の構造がこういう分野に向いていない人を除けば，誰でもそれなりにできるようになる．本当に難しい問題には歯がたたないかもしれないけど，本当に難しいわけではない問題が大部分というのは，どの世界でも一緒だと思う．

あと，こういうことは瑣末な問題でもある．数学で重要なのは「どの問題を解けば数学の進歩に貢献できるか」ということだし，プログラミングでも「どういうプログラムを書けばビジネスが成功するか」ということが大切．

普通にイメージされるところの数学が，プログラミングとどういうふうに関係するのかというのはちょっとイメージしにくいのかもしれない．そういう数学からは「定評のある抽象化を学ぶ」ことができる．プログラミングで言うなら「綺麗に抽象化されたライブラリの使いかたを学ぶ」ということかもしれない．そういう勉強から「どういう抽象化が優れているか」ということを，言葉で表現できるだけきっちり学ぶことは困難だろうけど，でも「どういうのが優れた抽象化なのか」ということを感覚として身につけることはできる．ついでに「良く出てくる問題」の解きかたも知ることができる．

あーでも，数学的な抽象化って言いたくなる場面もある．例えば，「ほげほげのアルゴリズムはAPTIME完全だけど，典型的な入力に対しては実用的な時間で処理できる」と言うときには，APTIME完全を指して「数学的な抽象化」だと言いたくなるといえばなる．この場合でも，数学的な抽象化と数学的じゃない抽象化があるわけではなくって．この「数学的な」は非限定的な形容という言えば良いんだろうか．