nikkie-ftnextの日記

イベントレポートや読書メモを発信

nikkieと「ほげ言語」のパラドックス 〜"Pythonで考えていた"からインターフェースの理解が難しかった説〜

はじめに

にゃんにゃんにゃ〜ん!nikkieです。

先日のPHPカンファレンス「ほげ言語」のパラドックスを知りました。
自分の経験が「ほげ言語」のパラドックスと呼べるものだったんじゃないかと気づき、その思考ログを記事に残します。

目次

「ほげ言語」のパラドックス

「ほげ言語にあってPHPにない機能」(PHPカンファレンス関西2024)

知ったきっかけは、PHPカンファレンス関西のひさてるさんのトークです。

いろいろな言語の言語機能のうち、PHPにまだないものを挙げます。
で、ないのはしょうがないので、どうするかと考えていきます。

ポール・グレアム「普通のやつらの上を行け」

より詳しく知りたく、検索したところ以下が見つかりました。
http://practical-scheme.net/trans/beating-the-averages-j.html
「ほげ言語」のパラドックス

「ほげ」よりも力の弱い言語は、 明らかに力が弱い。彼が慣れ親しんだ機能が無いからだ。

しかし、このプログラマ氏が反対の方向に目を転じた時、彼は自分が見上げているのだということに 気付かないのだ。彼が目にするのは、変てこりんな言語ばかり。

「ほげ」プログラマは「ほげ」より力の強い言語の力の強さが認識できないわけです。
へんてこりん、おまけがついている言語という認識になってしまう。

彼にとっては「ほげ」で十分なのだ。何故なら彼は「ほげ」で考えているから。

パラドックスの部分は以下です:

帰納的に、全てのプログラミング言語の力の違いを見分けることが出来るのは、 最もパワフルな言語を理解するプログラマのみであるということになる

この「ほげ」のパラドックスのために、他の人の意見は参考にならない。

パラドックスの例:Pythonでインターフェースが分からなかった

ポール・グレアムまであたって、「ほげ言語」のパラドックス、私も経験していたことに気づきました。
それは、インターフェースという概念の理解です。

Pythonでのインターフェース(の1つのやり方)は、抽象基底クラスを定義して継承  

Pythonの文法にインターフェースはありません
この点に対して『エキスパートPythonプログラミング 改訂3版』では2つの解決策を示しています(17.3.1)1

後者の1案が抽象基底クラスです。
標準ライブラリのabcで提供されます。
https://github.com/asciidwango/ExpertPython3_Source/blob/887b151bc5f20b6b6e742eff1f18d4ab6e86d872/chapter17/interfaces_abc.py

from abc import (
    ABCMeta,
    abstractmethod
)


class IRectangle(metaclass=ABCMeta):
    @abstractmethod
    def area(self):
        """ 長方形の面積を返す
        """

IRectangleというインターフェース(実体はクラス)を継承して、インターフェースを実装します

class Rectangle(IRectangle):
    def __init__(self, width, height):
        self._width = width
        self._height = height
    
    def area(self):
        return self._width * self._height

インターフェースという概念を長らくつかめてこなかった

このように抽象基底クラスをインターフェースとして使うことをやってきたわけですが、振り返るとインターフェースを全然理解できていなかったと感じます。
書いているのはクラスの継承なので、クラスの継承として考えがちでした。
どこまでいってもインターフェースをクラスから切り離せない感覚です。

転機が訪れたのは、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)です。
3章や5章を読んで、インターフェースという概念がようやく飲み込めました。

3章では、インターフェース(抽象)をまず作ることで、具象があることにできているという効果を学びます。

そして5章では、SOLIDのI(インターフェース分離原則)でインターフェースは利用時の概念と学びます。
どう使えるかを表すだけで、どんな仕組みで提供されるかはインターフェースを実装する具象任せ

ちょうぜつ本によるブレイクスルーは大きくて、インターフェースという概念を押さえたことで、抽象基底クラスをインターフェースとして正しく使ったり、typing.Protocolを試したりと素振りが捗っています。

インターフェースが言語仕様にないPythonで考えているために、インターフェースの理解を深められていなかったんじゃないかな〜

言語(道具)がもたらすバイアス

「ほげ言語」のパラドックスの全文、また私が経験した例から、プログラミング言語がもたらすバイアスのようなものがあるように思われます。

「ほげ言語」のパラドックス(普通のやつらの上を行け)より

誰であれ、プログラムについて考える時には 自分が使うことになった言語に思考が支配されているから、その言語に満足してしまうんだ。

ひさてるさんの発表にはこんなスライドもありました。

前後左右といった相対的な向きを表す単語を持たない言語の部族もいる。
彼らの生き方には相対方向の概念が登場しない。

思うに、プログラミング言語が仕様としてサポートしない機能は、その言語を使う限り概念として理解するのが難しいのだと思います。
再度引きましょう

彼にとっては「ほげ」で十分なのだ。何故なら彼は「ほげ」で考えているから。

毎年言語を1つ学ぶ(『達人プログラマー』)

ここまで考えて、『達人プログラマー』の教えは的を射ているなと思い出しました。

毎年少なくとも言語を1つ学習する。(第2版 Kindle版 p.67)

これは知識ポートフォリオを充実させる方法の1つとして提案されます。

いつも使っている言語とは別の言語を学ぶことで、「ほげ言語」で考えるを相対化できるんじゃないかと私は期待しています。
例えば先日のYAPCでは伊藤直也さんから関数型プログラミングと型の話を聞き、非常に興味深かったです。

興味ベースでいいと思うので、「ほげ」以外にも他の言語も知っておくと、「ほげ」自体を相対化できて(=優れた点も限界も認識できて)、より使いこなせそうですよね。

終わりに

「ほげ言語」のパラドックスについて思索を展開してきました。

  • 「ほげ言語」のパラドックスは、プログラミング言語について他の人の意見は参考にならないというもの(と理解)
  • 「ほげ言語」を使っていると、「ほげ」で考えてしまい「ほげ」で十分(他の言語のパワフルさを認識できない)
    • 道具(言語)がもたらすバイアス
  • 過去の私がインターフェースという概念が理解できなかったのは、インターフェースが言語仕様にないPythonで考えていたからではないか
  • 「ほげ言語」(がもたらすバイアス)を相対化していきたい:例えば、新しい言語を学ぶ

今回の施策を通じて、ポール・グレアムから『達人プログラマー』までつながり、新しい言語を学ぶって大事なことだなと再確認できました。

思索のきっかけツイート


  1. 最新は改訂4版です。目次だけ見たところ、構成は大きく変わってそう!