パスワードを忘れた? アカウント作成
14359841 journal
日記

dotkuwaの日記: タチの良い関数 20

日記 by dotkuwa

この文書では、「タチの良い関数」とは、
・それまでの行きがかりからの、暗黙の使用制限など無い。常に使える。
・引数のみから結果が得られる。他の通信は無い。
・ユニットテストのみで、内容をテストし切れる。
関数をいう事にします。
それ以外に、「タチの悪い関数」として、
・それまでの行きがかりからの、暗黙の使用制限が有る。
 制限範囲外はテストしない。
・引数以外にも通信があり、結果が変わる。
・ユニットテストをしても、無駄になることが多い。
”関数”をいう事にします。

前者は「関数」で、後者は違うでは無いか? と思われるかと
思いますが、自分もそう思います。
 
プログラム言語には、たいてい「関数」の様なものが存在します。
そして、その「関数」の様なものは、必ず「タチの悪い関数」と
なります。タチの悪さこそが、プログラム言語をそう為さしめて
いる本質です。
「タチの良い関数」は、
・自動で動かない
・暗黙の使用制限による、情報圧縮が無い為、大規模に出来ない。
 (全てをテストしなければならなくなるから)
から、それだけではプログラムでは無くなります。
 
ただ「関数型」とか、関数をことさらに強調した場合、
よく知っている人であればあるだけ、「タチの良い関数」を
思い浮かべるでしょう。
しかし、プログラム言語にある、「関数」の様なものは、
「タチの悪い関数」に過ぎません。
 
また、
うまくいっているシステムのある「関数」と、別のうまくいっている
システムのある「関数」を(タチが良いと思い込んで)
抜き出して、くっつけても、
プログラミングの範囲では、行きがかりからの、暗黙の使用制限
に抵触するのが普通です。
 
プログラミングの分野でことさらに「関数」を強調したがる人間は、
何を考えているのでしょうか?
本質的にタチの悪いのを、タチが良いと誤認させ、自分らは
良い宣託をしたことで、評価(お金など)をもらえるというのは
良いことなのでしょうか?
オブジェクト指向などで「メソッド」とかぼやかして言っているのは、
この致命的な誤解を避ける為では無いのでは無いでしょうか!!!
 
たしかにオブジェクト型でも、関数型でも、最終的には同等の表現力
なのかも知れませんが、
***社会学的に言って***後者は前者より劣る(本質的に誤解されやすい)
のでは無いでしょうか?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by hig (25417) on 2020年09月18日 20時29分 (#3891713) 日記

    かなしい

    • by dotkuwa (9387) on 2020年09月18日 20時37分 (#3891715) 日記

      Lispだって、環境変数とか有って、引数のみから結果が出る訳では無いし、
      read-lineとか有って、引数のみから結果が出る訳では無いし、
      すぐ、apply errorとか出るし(呼び方が決まっている)、
      あれの「関数」をタチの良い関数だとは、絶対に言えないはずです!!!
       
      断じて否定では無いです。Lispがタチの悪さを持ち込んだ元祖(≡プログラム
      の元祖)だとすら思っています。

      親コメント
      • by hig (25417) on 2020年09月18日 20時56分 (#3891726) 日記

        アレはとてもタチの悪いものです。
        えぇ、身に染みてわかっています。
        それでもなお「かなしい」のですよ。
        かつてLispをかじったものとしては。
        アレはパラダイムシフトさせるものなんです。
        #大抵はうまくはいかないけれど。

        親コメント
        • 汚れつちまつた悲しみに
          いたいたしくも怖気づき
          汚れつちまつた悲しみに
          なすところもなく日は暮れる……

          こんな目にあいました。
          あなたの言う通りなのかもしれません。

          親コメント
          • 海にゐるのは、 あれは人魚ではないのです。
            海にゐるのは、 あれは、浪ばかり。

            とか?
            #犀歩め 歩め犀

            親コメント
            • ((((((((((((
                  (((((((((
                        ))))))))
                  ))))))))))))

              浪のようにも見えますねぇ。。。
              #そしてエラー。。。

              #嘘をつきました。それくらいはちゃんとエディターが事前チェックしてくれました。

              親コメント
              • by dotkuwa (9387) on 2020年09月20日 8時17分 (#3892430) 日記

                まぁ、長男だからとか言うのは、現時点でも
                かろうじて、表現の中で使ってもなんとかなった
                のかも知れません。
                 
                しかし、それが性別だったり、国籍だったりしたら
                炎上間違いなしでしょう。
                 
                一番最近のバブルは、開闢以来といっても良いと
                思います(二度と無いという意味で)。
                お金の力で、日本スゲーを実現していました。
                関数型というのも、それだったのでは無いでしょうか?
                お金が有り余る日本人からの要望で、
                より良いものを提供する必要が有ったのです。
                「日本人だから、より進んだものを享受出来て当然」
                ということです。
                 
                しかし、プログラミングに関してのバブル期の「進歩」
                はまやかしでした。
                当時のプログラマー(自分も含む)のみは日本人では
                無く鬼扱いされ、
                関数型がより良く無いのは、お前らのせいだと
                言われるだけでした。
                 
                その関数型の余波は時代が進んで日本人全体を
                蝕む様になりました。それらを享受していた日本人が
                システム構築の主導権を得るにいたるに十分な年月
                でした。
                うまくいっているシステムの一部を抜き出して良い
                などという発想が、なんの理由もなく群発する
                訳がありません。
                 
                鬼はもちろん、人魚も居ず、ただ波ばかり
                でした。

                親コメント
              • きっとヒトの手にはアマルしろものだったのでしょう。
                人工知能が自己プログラミングして自己拡張、発達していくとかの礎にはなるのではないでしょうか?
                Lispなら「リスト プロセッサー」としてマルチ言語プログラミングを表現出来そうですね。
                とてもタチが悪そうですけど。

                親コメント
              • ガイアプロセッサーが億年かけて作ったものの真似をするのは
                大変では?
                普通のプロセッサだと電気も100W単位でかかるでしょうし。
                 
                だいたい、Lispでプログラム自体を扱う場合、最新のものでも、
                マクロ(パターンに合ったリストを規則により置き換える)程度しか
                無く、Lispだから良いという優位性は一つもない様に思えます。
                単なるデータならJSONの方が優秀ですし。
                 
                その意味で、ヒトの手には、なのかもしれませんが。。。

                親コメント
              • 真似ではなく。
                ヒトの得意とするやり方ではなく、奴等の得意とするやり方で発達させるのです。
                散々言いふるされた戯言ですけどね。

                親コメント
        • by dotkuwa (9387) on 2020年09月19日 4時11分 (#3891849) 日記

          Lispでのパラダイムシフトというと、
          1.関数呼び出し全体がカッコでおおわれる事になり、
            文の元となった。
            f(x) ⇨ (f x)
          2.defineとlambdaが合体し、defunが出来、関数定義と
            名前づけが一体となった。画期的!
          3.setqとかが出来、関数の結果を一時的に置ける変数の元となった。
          4.prognとかが出来、文を集めるブロックの元となった。
          とか
          では無いですかね?
          多分、
          嘘を言っているかも知れない(歴史的因果関係を逆に覚えている
          かも知れない)ですが、
           
          それでも、
          時代が時代ですし、その頃の支配的なパラダイムは、
          ・数式は関数のみ
          で、そこからダイナミックな動きをする要素が
          (プログラミング、関数的にはタチが悪い)、次々に現れ、
          それこそが『シフト』といってよいムーブメントだった
          と思います。

          親コメント
          • by dotkuwa (9387) on 2020年09月21日 11時27分 (#3892817) 日記

            魔王の名前が違っていたり、
            眼の種類の分類が違っていたり、
            紋章の種類の分類が違っていたり
            して、
            過去から転生してきて、とまどっている
            主人公の気分です。
             
            Lispが手続き型⇨関数型の一類型だと認識されていたとは
            ぶったまげました。
            自分は、
            数式表記に関数しかなかった頃、関数表記を変化させて、
            手続き型の萌芽となった、最古の手続き型言語
            (表記は関数表記)だと思っていました。
            1950年代とかそれ以前とかの話ですよね?
             
            歴史改変の主(敵役)はだれなのでしょうか?

            親コメント
  • 「関数型」とは、
    ・実際はタチの悪い関数を扱っているにもかかわらず、
     普通の人にはタチの良い関数を扱っていると誤認させ、
    ・優良誤認させる
    錯覚が議論の本質だったのでは無いでしょうか?
     
    もちろん関数型が「成立する」やり方だというのは
    確かです。しかし、「より良い」と期待させた本質は、
    単なる上記の誤認だったのでは無いでしょうか?
     
    関数型のプログラミングも、タチの悪い関数を扱います。
    これは、プログラミングであれば、タチが悪くなるから
    必然です。

    この点も一般の人は誤認していると思います。
     
    もちろん、エレメントの様な、
    ・一時的で、
    ・静的な
    対象はタチの良い関数と見なす事も可能でしょうけれど、
    これは何型のプログラミングでも一緒です。
     
    いっぽう、コンポーネントの様な、一定の役目をはたす
    対象は、*****必ず*****
    タチが悪くなります。「一定の役目をはたす」時点で
    普遍性は失われ、タチが悪くなるのです。
    これも、何型でも一緒で、関数型もそうです。
     
    そして、普通の人の期待を裏切る事になった、
    関数型など知らない無辜のプログラマーが糾弾されたのです。

    • by Anonymous Coward

      タチの悪い部分をどんどん狭めて隠蔽していった結果が関数型ではないですかね。
      基礎からきちんと勉強した人はそのことが分かっているから上手く使えるし誤認もない。
      一方で関数型(プログラミング)は素晴らしいと表面だけ理解していきなり利用しようとした人は優良誤認すると。

      • タチの悪い部分をどんどん狭めて隠蔽していった結果
        が、テストに関する(教条主義といっていいくらいの厳密さの)
        しろしろ言う流れです。
        タチの悪い部分を隠蔽してなにか良い事があるのでしょうか?
         
        それに、関数型をほめる人間の言い方からすれば、
        表面だけ理解していきなり利用しようとするのが当然の結果です。
        タチの良さ悪さ構わず、関数だというのですから、
        大抵の大多数の大部分の人間は、表面的でいきなりになって
        当然です。

        親コメント
        • by Anonymous Coward

          タチの悪い部分を隠蔽してなにか良い事があるのでしょうか?

          タチの悪い部分が最低限になれば、その部分のみをタチの良い擬態関数に置き換えることでテストの影響範囲が小さくなる。

          それに、関数型をほめる人間の言い方からすれば、
          表面だけ理解していきなり利用しようとするのが当然の結果です。

          例えば組み込み機器(しかもリアルタイム)のプログラミングでオブジェクト指向プログラミングだの関数型プログラミングでゴリゴリやるのは間違ってる。
          実装できないで文句言うのは勝手だが、それでオブジェクト指向プログラミングや関数型プログラミングが出来損ないというのはやはり間違いだし
          それでどうしたらいいか思考放棄するのも間違い。
          改善したいな

          • 基本的に「関数型プログラミング」を褒める人たちの言い方は、
            ・全ての良さが、全ての場面で手に入る
            様に誤解させる言い方です。実際には、
            ・ある良さは、ある場面でしか手に入らず、別の良さは別の場面
            でしかありません。
            関数型プログラミングの「優位性」とは、説明の仕方による、
            一般人の誤解が全てで、実際には完全に有りません。

             
            #3895114さんのおっしゃる、
            >>タチの悪い部分を隠蔽してなにか良い事が
            >タチの悪い部分が最低限になれば
            という言い方もそれです。自分はタチの悪い部分の隠蔽について
            申していましたが、#3895114さんは、タチの悪い部分が最低限
            になることに置き換えています。
            これにより、
            タチの悪い部分が最低限になることの良さ(確かにこれは良い)
            で、タチの悪い部分の隠蔽の悪さを「隠蔽」する説明をしています。
             
            なんとなれば、
            タチの良い部分こそ隠蔽に適していますが、タチの悪い部分は、
            本当に悪く
            ・隠蔽しても、すぐに変更しなければならなくなり、
            ・隠蔽されているとテストしづらい
            ・変更しないといけなくならなくなる様に、いろいろ、こんな
             こともあろうかとの機能を追加すると、テストが大変に
             なる。使っていない機能は、使いだすと、すぐに変更しなけ
             ればならなくなり、
            ・隠蔽されているとテストしづらい
            ・どうタチが悪いのかは、プログラムを変更する全員に周知する
             方が有利。
            という問題があります。
            これも関数型プログラミングを褒める人の「独特の」説明の仕方で、
            タチの良い部分に良いこと(隠蔽)がタチの悪い部分でも手に
            入るとの印象操作に過ぎません。
             
            >>表面だけ理解していきなり利用しようとするのが
            これは、
            ・「一般人が」(表面的に)利用する
            という意図でした。その様な文脈だったと思います。
            一般人が関数型プログラミングに非常に過度の期待をし、
            それがプログラマーに実害を与えた(有りもしない期待に
            答えられないのは、プログラマーの責任だと)歴史より
            発言しました。
            >それでどうしたらいいか思考放棄する
            のは一般人の常で、そこまで規定しないといけないので
            あるならば、関数型プログラミングは実用的では有りません。
            特定の規定(定義された合理性とか)を一般人全員に
            周知させないといけないなら、それは関数型プログラミングの
            「説明の仕方」に決定的かつ、根源的な瑕疵が存在することを
            意味します。
             
            >タチの悪い関数が含まれるならそれは関数型プログラミングではない。
            はい! これは我が意でもあります。
            是非この様に説明して下さい。
            (実際の説明は違います。後述。)
            >関数型プログラミングでタチの悪い関数を含むというのは
            ここでまた、特有の説明の仕方が出ています。「ではない」と言った上で、
            「含むと言うのは」と言う説明の仕方では、まるで関数型プログラミング
            で、「タチの悪い関数」の「良さ(変な言い方ですが、タチの悪い方が
            表現力は上です。)」が、全ての場面で得られると誤解させる
            説明の仕方です。
            万事です。全く万事です。

            親コメント
            • by Anonymous Coward

              隠蔽というのはブラックボックス化するということです。

              タチの悪い部分というのは、アプリケーションとしての必要悪であります。
              アプリケーションを関数型プログラミングで作っていくというのはタチの悪い部分を狭めていくことであり、
              最終的にはどうしても置換できないタチの悪い部分を隠蔽することになります。
              妥協の結果はアプリケーションとして何の意味もないものになりますから、隠蔽の範囲や結果は最低限にしなければなりません。

              隠蔽されているとテストしづらいとありますが、そのタチの悪い部分は関数型プログラミングとして隠蔽されているだけであり
              その部分単体でテストする分には公開されています。
              タチの良い部分をテストす

              • 広義だと、ユニットテストで万事完了とか、
                関数型で得られると喧伝されていた事が全部なくなると思います。
                最もプリミティブな場面でのみ(MAP関数でテスト不要とか)で得られる
                ことを、もっと実用的な場面でも得られると誤解させる説明です。
                 
                自分はそれ(説明の仕方)に抗議しているだけです。
                 
                自分は、COBOL85をやって、VB6をやってから関数型に接しましたので、
                初めから眉に唾をつけていました。
                深刻(残酷)なのは今の40代の一部だと思います。
                関数型にコミットすることを誓い、それ一本でやってきて、賃金を得て、
                そのまま、一番上になってしまったからです。
                そちらを哀れむべきです。哀れみたまえです。

                親コメント
  • 「タチの良い」プログラムを手軽に体験するには、
    ・最近のパッケージソフト(大規模なカスタマイズをしない)
    を導入するのが一番だと思います。
     
    有料・無料にかかわらず、
    ・出来ること

    ・出来ないこと
    に分かれると思います。この「出来ること」こそ、
    「タチの良い」部分に相当します。
     
    最近、自分も、勤怠に関して、よく基盤として使われる
    SFAのソフト(クラウド)を導入して、組織内外で
    分け隔てなく利用できる様にしようとしていたのを、
    見た事がありますが、
    昔の記憶・杵柄
    (フルスクラッチの開発で、ごねればタチの悪い
    部分の修正もあり得た)から、
    そのソフト(クラウド)でも同じごねも効くと思い込み、
    いろいろ働きかけたみたいですが、ダメだった様です。
     
    そりゃ、パッケージソフトの社会的影響から考えて、
    タチの悪い部分の、個別の改修など出来っこ無いです。
     
    良い部分(パッケージソフト、堅牢で安価)と、別の
    良い部分(フルスクラッチソフト、タチの悪い部分の改修
    もあり得る)を両取りしようとする所は、
    関数型プログラミングの説明と一緒で、単なるプログラマー
    としては、ほーんとしか思えませんでしたが、
    興味深い話だと思います。

typodupeerror

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

読み込み中...