はてなキーワード: 圏論とは
うぜえ。
計算可能性の理論やラムダ計算がLispを産んだように、プログラム意味論や圏論はHaskellを産んだ。
プログラム意味論では変数の型が議論の最小単位で、関数やプログラムはある型の変数を別の型の変数へ変換する変換器として記述される。
だから本質的に、型が無いとプログラムという概念が存在できないことになる。
で、このアカデミックな議論が普段書くコードにどう影響を与えるかというと、実はほとんど影響がない。
もちろん知っていた方がよりエレガントなコードを書けるだろうが、必須ではない。
「関数型プログラマ」ってのになるとキモくなる、と言うのがよく分かる例か。
圏論とか言い出す当たりも典型的というかなんというか。。。バカは黙って体張って仕事してろ、と言いたくなる良い例ですな。でももやしっこなんだろうな。。。
関数本と称したデタラメ本なんかどれだけ高く平積みしたところで、どうでもいいと思ってるよ。間違って買っちゃった初心者は右往左往するだろうが、きっといつかは正しい知識に戻ってくるだろうし、それで諦めちゃう人はどのみち辞める定めなんだろう。たとえQiitaとかで議論を吹っかけられようと、話し合いが成立しないと判った時点で席を立てばいい。煽られようとワザワザ付き合ってやる必要はない。でも実際のお前らは腹を立て、戦い、傷ついてPTSDになって、数スレを消費した。そんなナイーブなお前らが、今回の事件は何故かスルーできた。
悪意のカタマリだろうと、他愛のない道化はむしろ放置でいいと思うんだよ。色んな奴がもっと好き勝手に書くべきだ。ちゅーんさんはモナド本を書いていいし、漫画で解説する関数型があっていいし、遅延評価の解説本は望まれている。市井のプログラマーは素人技術本を書いていいんだ。関数型プログラミングの繁栄はそういう態度の先にあると思う。選択肢は多い方がいい。その中で、何が本当に重要かは読者が決める。ヘンテコリンな奴をありのまま受け入れる寛容さは必要だと思うんだ。
でも今回のはそれに収まらない。重要さのレベルが違うだろ。どこぞの馬の骨じゃない。あの子は日本Haskellコミュニティの若手ホープじゃないか。今は女性関係で腹を立てているだけかもしれないが、将来トップに立った彼に「あなたのライブラリは負の価値しか持ちません」っつって包丁画像突きつけられたらどうする。Slackでは「勉強会に参加する学生が少ない」とか嘆かれてたけど、俺が学生なら、もはや頼まれても行きたくない。彼女に言及しなければ安全? 俺はそんな風には全然思えないし、正直不安だよ。
…いや、だからどうしろって言う意見はない。どうすればいいかは判らない。お前らの冷静さにビックリしたというのが感想だ。他人が頭ごなしに言っても伝わらないだろうし、本当に必要なのは排斥することじゃなくて、自分の考えを親身になって聞いてくれる仲間だと思う。ただ正論でねじ伏せるのでなく、それでいて「単なる腰抜け」じゃない誰か。
彼はスレ民でもあった筈だが、ム板のこのスレはそういう話に適さないだろう。俺たちが場を提供することはできない。勝手だが身内に期待したい。圏論の話ならいつでも歓迎です。
以上、スレ汚し済まなかった。コードをポイントフリーにする作業(たのしい)に戻ります…
--------------------------
この文章は当初2ちゃんねるプログラム板Haskellスレに投げる予定だったが、スレ汚しになると判っていて書くのもどうかと思い、失礼してこちらに置きました。あとリツーイータビリティ。(この記事はリンクフリーです)
すごい今更だけど、1に対してだけ少し。
基本的に、まだ発展途上にあるものほど、理論面が強調されがちなんだと思う。
今の関数型言語は、まだデザインパターンが、色々発案されだしているけど、確立しきっていなかった頃のJavaやオブジェクト指向の時代、みたいな感じ。
Javaで言うデザパタは、関数型言語では大体、モナドとしてまとめられるわけだけれど、そのモナドを色々発明するために、圏論をしっておくに越したことはない、みたいな感じなんじゃないかと。
もっとも、そろそろすでに出てきているデザパタ≒モナドを利用するだけの、純粋な学習者も増え始めている頃合だから、気になりだしては来るタイミングなんだろうけど。
なんだか話題になってるから書く。
やっと初心者を脱して中級者になりかけてるプログラミング学習者が関数型言語に何を感じているかを書こうと思う。
Haskellが短いコードでプログラムを書けるというのは分かる。
それでやりたい処理のほぼ全てがまかなえるということも実感している。
副作用のない小さな関数を合成して大きな関数を作る利点も分かる。
再利用性も上がるし、どこからどう影響を受けているかが簡単に分かるからバグも出にくい。
ただ、Haskellの基礎になってる圏論が何の役に立つのかは、まったく分からない。
むしろ邪魔なんじゃないかと思う。
ファンクターやモナドの概念が圏論で扱われているのは分かるけど、圏論なんて名前だけ知ってればコードを書くのに不都合はないだろう。
圏論が必要なのは、Haskellを設計する人であって、使う人ではないと思う。
なのに、やれクライスリ圏だ自己関手の圏だのと、うるさいったらありゃしない。
Linux上で開発環境整えるのにカーネルのコードを読めって言うぐらい的外れだと思う。
いや、知識として持っとくのはいいだろうけど、役に立たんだろ。
Rubyが羊の皮をかぶったLispとはよく言われることだけど、関数型言語もオブジェクト指向言語とそこまで違いがあるような気がしない。
純粋な言語ではできないけど、クロージャに内部状態を保持してもらって無名オブジェクトみたいな使い方をすることはあると思う。
その無名オブジェクトにもっとあれこれデータや関数詰め込めば、いつの間にか普通にJavaやC#で使うようなクラスのできあがり。
その間はなめらかにつながっていて、不連続に切れるようなもんじゃない。
関数プログラミングと言いつつ、オブジェクト指向の考え方は利用できる。
上級者はデザインパターンをdisるのが好きかもしれないけど、逆の考え方をするべきだと思う。
デザインパターンはオブジェクト指向言語の欠点を補うための苦肉の策じゃないよ。
関数プログラミングの基礎的なパーツだと思う。
だからちょっと見た目がすっきりするだけで、結局やることはオブジェクトプログラミングと変わりはないと思う。
関数プログラミングコミュニティの人って、業務でクソコードメンテさせられて、その現実逃避に美しいコードに擦り寄っているように見える。
もちろん、美しいコードを書けるなら書いた方がいいし、現代的な言語を使えるなら使ったほうがいいと思う。
けど、適材適所というか、オブジェクト指向言語でも、やってやれないことはないわけで。
役に立たない圏論をありがたがる所とか、どうもイキがってるように見える。
一人で勝手にイタイならいいけど、いい加減我慢も限界でなんとかしたい。
そいつは圏論に裏付けられた静的型付け言語のスバラシサを布教しないと気がすまないらしく、事あるごとに純粋でないオブジェクト指向言語をdisる。
曰く、静的型付け言語だと型を合わせてコンパイラが通るようにするだけで実行時エラーを絶対起こさないコードが書けるらしい。
ああまた始まったと思ってたら、そいつが熱弁する後ろから同僚が近づいて「ヒープ足んねぇ」って書かれたメモを背中に貼っつけてたのは笑った。
お前が書いたn3アルゴリズム(!!!!)も型さえ合えばコンパイラがnlognに書き換えてくれんのかね。
いやそれ、動いてるって言わないから。
型チェックぐらいで取れるバグなんて、せいぜいスタックかキューみたいなもんだろ。
お前の怪しい動的計画法のバグをチェックできるコンパイラなんて存在しないぞ。
圏論なんてやってる時間があるならダイクストラ法でも復習しとけってんだ。
どちらにせよ設計においてはオブジェクト指向が使われるのだから、ほとんど違いなどない。
せいぜい数倍コードが短くなる程度の話に学習コストをかける価値は無い。
彼ら全員が理解しない限り、関数型言語で開発などできるわけがない。
そのコストと、純粋関数型言語によって得られるメリットを差し引きすると、正直何の魅力も感じないのだ。
関数型にかぶれている奴は、プロジェクト全体を見通す力、マクロ的な視野なく、自分の狭い世界だけで騒いでいるだけだ。
ま、厨二病みたいなもんさ。
あ、まず前提として、
はたして貴女を幸福にするかどうか、それはまた別問題だけれど。
IT系の超かしこい男なども多く、
多くっつーかIT系でないのにプログラミング大好き男っていうのは超かしこい学生(まぁこれは有望株)か研究者系なんか、
あとはまったくかしこくもないクセに頭いいつもりして「Lispやってます(キリッ ハローワールドくらいですが」とか言っちゃうアホしかいないわけで、
したがって、釣り師たる女たちにとっては、
なかなかあなどれない釣り場です。
では、プログラミング大好き男に「どの言語が好き?」と訊ねられたとき、
まず最初に、その男がCOBOLのようなタイプのレガシーコードと
あとはC/C++、そして(TechEdに参加するほどではないけれど)VisualBasicが大好きな、
貴女はかれの目を見て、微笑みとともに質問など無視して、こう言いましょう、
「わたしが、仕様書を作ってあげる♪」
これこそまさに必殺の答えです。
そこでプログラミング大好き男が、えへへ、とやにさがったならば、
貴女は、ひそかに、「コピペ量産しやすい技術的ポイントを抑えた仕様書」あたりを
ひそかに練習しておきましょう。これで成功まちがいなしです。
しかし、ここでは、もう少しハイブロウな(?)いわゆるプログラミング好きの男の
落とし方をお伝えしましょう。
「わたしは、JVM上のScalaが好き。
型推論もあるしラムダ式やクロージャもスクリプト言語みたいに書けるの、豊富な組み込みのコレクションメソッドはいつも便利だし、
XMLリテラルもCaseクラスによるパターンマッチもTraitベースのMixi-inも、大好き♪」
もしも貴女がそう答えたならば、
かれの貴女への恋心は、
20%増量になるでしょう。
なぜって、Scalaは、
コンパイルは遅いながらも、そこがまた
ちょっぴりメモリを多く積めばいい富豪プログラミングみたいなふんいきをかもしだしていて。
質高くふるまっていて、なおかつ、
JVM上で動くくせにJavaが「やるやる」と言ったまま実装してなかったラムダ式と仮想拡張メソッド、型推論を実装した功績もあって。
したがってScalaこそは、
本来なんの接点もないまったく縁もゆかりもない別々の世界に生きている、
インタプリタ言語大好きな綺麗系OLと、玉もあれば石も混じっている、そんなプログラミング大好き男たちが、
この世界で唯一(いいえ、JVM系列のJRuby、Clojure と並んで唯三)遭遇しうる場所です。
●
では、参考までに、危険な回答を挙げておきましょう。
プログラミング大好き男に「どの言語が好き?」と訊ねられたとき、
「MicrosoftのVisual Basic for Applicationが好き♪ 週3回は Excelでコーディングするの。」
特にOfficeは平凡ながら、ま、無難にまとめてあるものの、
しかし、「新UIのリボンUI!」「メトロUI対応!」とかなんとか無意味な自慢を吹聴し、
VBAはさらにプログラミングについての謬見を撒き散らした罪がありますから、プログラミング大好き男にとっては天敵なんです。
ティーガー戦車乗りのオットー・カリウスは「ティーガー乗りなら誰でも片側の履帯がはずれ僚車に牽引されて帰ってきた経験を持つはずだ」 って言ったけど
社内SEかSIerなら誰でもクソみたいな前任者が書いたクソみたいなExcel-VBAコードを直した経験があるはずなんです。
また、もしも貴女が「PHPが大好き♪ あたしが書いたPHPのWebサイトが、さくらサーバに7件あるよ♪」
と答えたとしても、同様の効果をもたらすでしょう、
なぜって、PHPは、1990年代にはWeb系を目指す人にとっては簡単で要件を満たすWebサイトが簡単に作れる輝きの道だったものの、
しかし2000年代そうそうから、セキュリティ関係の問題で転落し、
いまや、あの貧弱な言語能力では、Rubyの魅力に遥かに及びません。
(注1)
「わたし、.NET FrameworkのC#が好き、フォームアプリでも書くけど、
最高に好きなのはASP.net♪ SQLServer連携も、ajax control toolkitもすっごくおいしいの。」
と、答えたとしたらどうでしょう?
なるほど、貴女の趣味は高く、
たしかに.NET Frameworkは、C# が cool であるのみならず、
.NET Framework上で動く F# や IronPythonやIronRuby、マネージJScriptも最高においしいんですけれど、
しかし、貴女の答えを聞いて、プログラミング大好き男はきっとおもうでしょう、
(なんだよ、MS信者な女だな、カネかかりそう)って。
(注2)
貴女が、プログラミングが大好きで、言語の名を挙げるにしても、
たとえば、JavaScript(node.js)ならば安心でしょう、
なぜならば、JavaScriptは、かけだしのプログラミング初心者にもマニアにもともに愛されるめずらしい言語で、
貴女がその名前を挙げても必ずしも、(jQueryがやっとの初心者と思われることはあっても)あなたがプログラミング言語おた宣言をしているとは受け取られないでしょう。
むしろ「へぇ。ちゃんとprototypeは使ってる?」と聞かれたら「当たり前じゃない。むしろnode.jsでいいMVCフレームワークが分からないんだけど…」と話を振ってみましょう。
男は嬉々として、30個くらいのnode.jsのフレームワークを教えてくれることでしょう。(まぁどれもどれで帯に短し襷に長しなんですが)
あるいはRighno上で動かしたコードをnodeへ移植する話とか、CoffeeScript、甚だしきはClojureScriptを振ってみてもいいかもしれません。
しかし、たとえば、世界が(つーか竹内先生とポール・グレアムが)誇る超絶関数型言語の名作、Common Lispにせよ、
selfと書きまくることと海外で使われてることに定評のあるPythonにせよ、
バージョンアップごとに言語仕様が変わり、かなり素敵なものではあるもののobsolatedな罠にはまりやすいRubyにせよ、
まったく読めない$_だらけで頭悪い仕様をリセットしてPerl6にする(そしてまた全く読めない)Perlにせよ、
気さくなクジラ飛行机さんがふるまう素敵においしい日本語プログラミング言語のひまわり・なでしこにせよ、
基地外トリッキー言語の代表BrainFxck・Glass・Missa・WhiteSpaceにせよ、
ましてや貴女が、「Haskellが大好き♪ わたし、プロジェクト・オイラーの問題もうほとんどHaskellで、解いちゃった♪」
と答えたならば、どうでしょう?
これはかなり博打な答え方で、
なるほど、Haskellは、純粋関数型でありつつも副作用のある操作が行える超絶名言語ゆえ、
あなたがそう答えた瞬間、プログラミング大好き男がいきなり超笑顔になって、
「へぇ、やっぱりHaskellなら大抵の問題は4行以内くらいで解いちゃった?」とか言いながら
鼻の下がだら~んと伸びちゃう可能性もあるにはありますが、
しかし、逆に、(なんだよ、この女、プログラミングおたくかよ)とおもわれて、どん引きされる可能性もまた大です、
なぜって、必ずしもプログラミング大好き男がプログラミング大好き女を好きになるとは、限らないですから。
男たちは、女を導き高みへ引き上げてあげることが大好きゆえ、
もしも貴女が、「Haskellが大好き♪」なんて言ってしまうと、
そこにはもはや、男が貴女に圏論のモナドを教育する余地がまったく残されていません、
したがって貴女のその答えは、
プログラミング大好き男の貴女への夢を潰してしまうことに他なりません。
ま、ざっとそんな感じです、貴女の目にはプログラマーたちはバカでスケベで鈍感に見えるでしょうが、
しかし、ああ見せて、プログラマーはプログラマーで繊細で、おざなりに扱われると傷つきやすく、ローカル変数の名前一つにも気を使い、女と自分の将来に夢を持っています、
貴女の答え方ひとつで、プログラマーの貴女への夢は大きくふくらみもすれば、
一瞬で、しぼんでしまいもするでしょう。
●
では、スキットを繰り返しましょう。
「わたしは、JVM上のScalaが好き。
型推論もあるしラムダ式やクロージャもスクリプト言語みたいに書けるの、豊富な組み込みのコレクションメソッドはいつも便利だし、
XMLリテラルもCaseクラスによるパターンマッチもTraitベースのMixi-inも、大好き♪」
そして、その瞬間、プログラミング大好き男の目がらんらんと輝いたなら、
貴女はこう重ねましょう、
「それからね、いま、わたしが使ってみたいWebアーキテクチャは、
Play Framework、素敵なリアルタイム嗜好のアーキテクチャって噂を聞いたから。
あなたのお暇なときがあったら、わたしをPlayへ連れてって♪」
これでもう完璧です。
PlayFrameworkと、Play(遊ぶ・じゃれる)のダブルミーニングでかれの股間も刺激しちゃえます。
そうなったらこっちのもの、
デートの日には、ペアプロ用に Happy Hacking Keyboard をばっちり決めて、かわいい下着をつけて(注3)、
github.comの通販で売ってるoctcatのTシャツか、facebookの「いいね!」ボタンがムネのところにあるTシャツ、 あるいは初音ミク(ないし彼のお気に入りのアニメキャラ。北米ならMyLittlePonyで鉄板なんだけど)のコスプレを着てゆきましょう。
その日から、プログラミング大好き男は貴女の虜になるでしょう。
注1:
(と、書いたもののPHPの現状をよく知りません。グローバル変数だらけになるのとか旧ASPみたいなもんなのかなぁ。count($array); とか書くのアホと思うがpythonも同じだった)
(あと、マジで単機能とかTwitter連携とか診断メーカー的なのでもPHPで7つも作ってる女子居たら付き合いたい)
注2:
もっとも。objective-Cなんていう言語をやることに比べれば個人で行う程度なら金のかからない手法もなくはないのですが。
注3:
プログラマーにとっての「かわいい下着」と、女性にとっての「かわいい下着」の定義にずれがあるので注意。
半数くらいのプログラマーはしましまぱんつが可愛いと思ってる気がするので、妙齢の女性が着用するには抵抗あると思うが、ボーダー柄のコットンショーツ(ただしキャラ絵のは除く)とか、
過度でないていどにフリルがついたものがオススメ。また、色は、レッドだとプログラミング大好き男は引いてしまう(だってそれはコンパイルエラーのときの色だ)ので、薄ピンクかホワイト、薄ブルー、せめて黒(に差し色でピンクとか)あたりに留めたい。
補記:
元ネタ: http://tabelog.com/tokyo/A1301/A130101/13002457/dtlrvwlst/3464106/
補記2:
「プログラマー」か「プログラマ」かの問題については、特に意味は無いが前者を採用した。
補記3:
言うまでも無いけど、ネタです。
http://anond.hatelabo.jp/20130325172822 の続き
言語はJava7を想定。(Java8が迫っていますが、Lambdaなど関数型は、まだ早いと言うことで)
選定理由は、C++と比較して学べるところが大きく、安全でシンプルな言語だから。
※いきなりJavascriptはやめとけ、PHPは論外。
Ruby・Scalaでないのは、筆者が初心者には適切には教えられないから。
おもちゃ・ToyとしてjQueryで遊ぶのは、悪くは無いと思う。
これ以降は名著の紹介や学習方法の紹介が主体となります。名著のコンポジションという形が時間的限界ですね。
量については「初級になるなら、専門書を計3,000ページは修得することは覚悟してね」なんて言ったりしています。
Javaで初級のわかりやすい指標ですと、[amazon:Effective Java]とGoFまでの修得。
初級になるまでに登竜門への挑戦期間を含めて、3~4年はかかっても仕方が無いとも思います。
※逆に「一山いくらのコーダー」というのは、Effctive JavaやGoFが達成している技術も知らずに「自分がJavaプログラマー」だと誤解してしまっているような人達です。
そういったコーダーは何年経とうとも初級プログラマーにすら敵いません。
初級を目指して、プログラミングを楽しんでください。
ただ、学ぶべきことはべらぼうですが、「各分野毎に、エレガントな方法がある。だから探して修得する」ということが大切です。
※「一を聞いて十を知る」ような優秀な人に、50冊くらいドーンと本を置いてあげて、各本の目次を読ませるだけで、
底の見え無さを悟ってくれたりすると、嬉しくなってしまいます。
※余談ですが、その底の見え無さは数学という学問そのものですね。例えば、関数型言語の底流に「圏論」というここ100年の最新の数学があります。
また中級くらいで、Liskovの置換原則などが載っている本を紹介しますが、
そのLiskovの置換原則の周辺で出てくるcovariant(共変)って、圏論という数学の概念だったりします。
数学畑出身としては、数学が現実に活かされている嬉しい事例です。
「速く正確に大量の出力」という能力は、プログラミングをする上でも、ドキュメントを書く上でも、何より「つまらん仕事」の時間圧縮ができるようになるため、重要です。
スローガンとしては「思考のスピードで出力することを目指そう」です。
紹介するエディターはemacsやvimやExcelです。ついでにIMEとしてATOKを使用しているため、ATOKの操作をEmacsライクにする話も紹介します。
ExcelはWindows環境でMeadowすら入れさせてくれない場合の最後の砦という扱いです。
コマンドラインは、「コマンドラインというものがある」「時として非常に強力である」程度の紹介です。
※筆者はzshは全然使えません。使いこなしている方々と接する度に「勉強しなきゃな~、でも、あっちの方を先にやりたい・・・」とグズグズして、はや何年・・・
正規表現は置換を用いて、テキストの一括編集が重要です。後、遭遇したくない事態ですが、スパゲッティコードの解析をする上での最後の砦です。
※遭遇したくない例
ん?何か変なところで副作用のある処理があるようだなぁ(消沈)、SQLのInsertかUpdateか一応Mergeも使っているところから逆算して原因箇所を探すか・・・(諦念)
この糞コードがっ!!こんなところに書くんじゃねぇ!!(憤怒激高)
(ここで、他にやらかしていそうな似たようなコードを正規表現でgrep検索。改行コード込みにすれば複数文検索も可能)
わはは、予想通り共通化すべきロジックのメソッドがそこら中にある・・・
入門編で一つLinkedListというアルゴリズムを学びました。
少なくとも一つ本を読みながら自力でアルゴリズムを学べる人なら、大成できる可能性があります。
前に紹介した[amazon:C++実践プログラミング]には、LikedListやStackなど基本的なアルゴリズムが載っておりますが、
これに加えて、初級になるためにはこれくらいは知っておいて欲しいというものを紹介します。
※後、最初から必ずしも手を出さなくても良い上限も紹介いたします。
プログラムは、データを入力して、加工して出力・保存する処理の繰り返しです。
つまり、各一連の繰り返し毎に、「正しい入力」「正しい出力」を定式化する必要があります。
それを人間の手では無くコンピューターにやらせられるように、つまり自動テストできるようにテストをプログラミングします。
そこで処理の進捗を確認するためにロギングし、処理が想定通りであるかをアサーションでチェックし、
不正な入力・不正な出力=例外が起きたら、対処策をプログラミングします。
(ex 途中で処理を中断して、入力者に適切な入力のメッセージを伝えてあげる。入力の自動補正などもあり得る)
で、ここら辺をまとめてどうあるべきかとして「契約プログラミング」があります。
※余談。定式化・テストに際して、数学畑の人間としては、Javaだとequalsのオーバーライドでも必要になるし、同値関係・同値分割だけでなく、集合論・群論から学んで欲しい・・・(ここいらは数学科の学部1~2年の学習内容)
名著は英語で読みましょう。名著が名著たる由縁は、度々引用されることにあります。
つまり最新の技術書を読むときに、引用された名著のフレーズが、新旧のリンクをなし、理解の助けになります。
壁打ちといって、独り言で思考補助をするよりも遙かに有益です。
※素晴らしい師匠を探すなら、大学行くのが一番ですが、見聞を広げていく中で出会いを待つしかないとも思います。
マルチスレッドが難しいのは「バグを起こしにくいプログラミング」を求められるから。
つまりTry and Errorからの決別が求められ、今後の仕様変更・拡張も踏まえて慎重に慎重にデザインする必要があります。
できる限りステータス変数を持たずに安全に、でもマルチスレッドにするのだから、効率を追求しなければ本末転倒。
でも効率のためにはメモ化に代表されるキャッシングは必須と、アンビバレンツな要素のバランス取りが難しい。
このために、リエントラントな実装・抽象と実装の分離など様々なエッセンスを駆使することが必要です。
というよりも孔子曰く、知っているよりも好きであること。好きであることよりも楽しめることのほうが強く、
気づいたら日々時間が許す限りプログラミングをしてしまうのが理想です。
※仕事として嫌々スキルを磨かなきゃということが、これほど不幸な職業も無いですね。
学習の達成度を測るには、簡単すぎる不適切な問題ですね。
写経は数学の証明問題を、教科書のテンプレ通りに、数値や名称だけ変えて記述することしか出来ない人の発想。
つまり「矛盾無く一貫した論理モデル」の構築が自由に出来ず、テンプレの微修正しか出来ない人の発想。
また、外部の「矛盾無く一貫した論理モデル」の吸収が不自由で、アルゴリズムを「手順」としてしか捉えられないように見受けられる。
「連続」であること確かめるための「ε-Δ論法」(数学科の学部1年の学習内容)
事前知識無く、このモデルを理解できる人は、十分に「矛盾無く一貫した論理モデル」を構築できる人。
私は、流行りのSNSとやらをわりとぞんざいに使っているので、
誰であろうと基本的には全て承認するようにしている。
そのせいか、タイムライン上にいつの間にかへんちくりんな人間がいることも多い。
今日はその一例をここに記したいと思う。
彼はプログラミングに精通しているようで、どうやら情報系の学校に通う学生らしい。
彼はよく、流行りらしい関数型言語(Haskell?)やらアセンブル言語等の話題を取り上げ、
これがああなってこうで・・・等と、恐らく的確なのであろうコメントを発する。
最近の学生は勉強熱心であり意識も高いのだな、と思わせるには十分であった。
仕事をほんの少し楽にする為のこまいスクリプト程度なら書くこともある程度での知識を持つ人間である。
そんな彼の観察を時偶に続けていたところ、
彼がとあるウェブ上のプログラミングコンテストに挑戦した、という旨の発言が目に入った。
いつも難しいアルゴリズムや先進的なコーディングについて語る彼のことだから、
さぞかし優秀な成績なのだろう、と期待してコンテストのウェブサイトにアクセスし、彼の固有名で検索にかけた。
コンテストは4つの問題が出題される形式であり、それぞれ難度に差がつけられている。
1つは中学生でもコードの書き方さえ知っていれば解けるであろう問題。
1つはFizzBuzzを基本とし、それに些細な応用を付与した問題。
1つは前述のエイトクイーン問題から更に発展させた上で、高度な数学的思考を求める問題。
彼の結果は、初問正解のみであった。
提出されたコードは、会期を過ぎると誰でも閲覧が可能になる為、
彼のコードを覗いてみることにした私は、そこで更におかしな笑いがこみ上げた。
彼は、FizzBuzzがほぼ全く書けていなかった。
それどころか、基本的なループ処理や、型の扱いが出来ておらず、
素人の私から見ても、これがちんぷんかんぷんなコードであることは一目瞭然であった。
以前、彼はHaskellの話題に言及する中で逆FizzBuzz問題についても述べていた気がする。
確かに、私もそんな事が要求される場面があれば悩むだろうな、とその記事を読み感想を覚えたが、
彼は逆FizzBuzzどころかFizzBuzzすらマトモに記述できないのである。
「圏論が出来ないヤツは将来、プログラマーとしても技術者としても失格」
「構造体同士の四則演算は全メンバに同一の演算子を適用するのかな?」
彼は、一体何なのだ?
ふえぇ・・・これの話ですよぅ
「変数に型がないということの利点について考える」
http://d.hatena.ne.jp/perlcodesample/20130227/1361928810
この記事の内容についてはですね、多くのなーどの皆さんが、「何言ってんだこいつ」の気持ちを抑えきれずにいたんですけどね。
特に話題が「型」なものですから、関数型もひかんの皆さんが我慢できずに、「ひゃっはー汚物は消毒だー」とばかりに集まって大騒ぎする事になってしまったわけです。(ほとんどTwitterから来たんじゃないですかね・・・)
そりゃぁ、ガタイのいいお兄様達が火炎放射器構えながら、端正込めて書いた記事を炎上させれば、主様の頭に血が登るのも当たり前の話ですか。
わざわざ、こんなブログを定期的に更新する主様の事ですから、きっとプログラムが好きなのでしょう。でもきっと、「プログラム」が好きという点については、もひかんさん達負けてません。負ける気がしません。だからもひかんさん達も、自分達の足りない脳みそ使って、勉強してるんです。
『「静的型付け言語」と「動的型付け言語」ではどっちのほうが良いんだろう。そもそも「静的型付け」「動的型付け」ってどういう事なんだろう、っていうか第一「型」って一体何ものなんだろう・・・?』
答えを求めて、勉強してるんです。
僕もそんなもひかんさんの一人です。低い知能で出せるだけのぱわーを出して、それなりの勉強をしてきてます。だから言うんですよ。
「お願いだから、間違った事を間違ったまま広めないで」って。
これはね、別に「間違っている」事を責めているのでは無いのです。そんなもの、記事の冒頭に「僕が間違ってましたふひひさーせんw」って一言付け加えたなら、皆納得するんです。
そうじゃなくて、明らかに間違った事を間違っていると指摘しているのに、「いや、僕は間違っていない」と言い続けている事に問題があるのです。
そうです、件の記事の内容は、残念ながら・・・誠に残念ながら、その多くが間違っているんです。
具体的な間違いの内容は、コメント欄や多のブログ記事で散々指摘されいるので、僕が今更蒸し返すのは野暮でしょう・・・ただ、困ったことに主様はそれが「実感」として得られないので、何が間違っているか解らないのでしょう。
解らない事は恥ずかしいことではありません。ツーステップ以上登った先にある事を実感するのはとっても労力がいるものです。僕だって今、圏論とHaskellのモナドの関係についての厳密な説明を求められたら、泣いて謝るしか無いのです。
では、主様が今、件の記事の指摘の内容を実感するためには、どうすれば良いのでしょう?僕からは、ふたつ、提案する事ができます。
ひとつは・・・僕が散々言っているように、「お勉強」しましょう。僕はHaskell大好きなので、型を学びたいのであれば迷わずこの言語を学ぶことをお勧めします。多分、実用に耐えうる言語の中では最も型がしっかりした言語じゃないかなって、思うんです。
そしてね、お伝えしておきたいのはこの言語、ParlやRuby使いさんがビックリするくらい柔軟で簡潔なんですよ。静的型付け言語は無駄が多いなんて、とんでもない事です。
うーん、僕は、OCaml良くわからないですが、Scalaは直積型を再現するのが面倒な印象ありますです・・・
もう一つは・・・言語は何でも良いです、何か静的型付け言語を使って、それなりに大規模なものを・・・できれば二人以上で実装してみてください。それが終わったら、もし動的型付け言語で同じ事をしたらどうなっていたか、想像して見てください。きっと主様は、件の記事を上げたことを、後悔する事でしょう。
「型」ナメんなヴォケが(# ゚Д゚)
って事なんです。
プログラミングの型は、プログラマが間違いを犯さないために、プログラミング言語がわざわざ用意してくれているものです。そしてその基礎になっている理論は、コンピュータが真空管だった時代から、今にかけて、ずーっと研究され続けているテーマなんです。だから安易に「型がないことによって、たくさんの面倒から解放されるからです。」なんて、すっとぼけた話が通用するほど簡単な世界じゃないのです。
型は、主様が考えているよりも、もっと強力で、もっと柔軟で、僕や、主様や、なんとなくこの日記を除いた誰かさんのプログラミングを大いに手助けしてくれる凄いものなんです。それが動的型付けの言語だって、型の考え方は実装の指針を示してくれます。どうです?もっと型の事を知りたくなって来ませんか?
最後に、「本物のプログラマはHaskellを使う」から、いくつか引用して終わります。ばーいばい。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080108/290605/?ST=develop&P=1
型がテスト自動化の道具であるという概念は、最初は理解しにくいかもしれません。しかし、Haskellのような強い静的型付けの言語に慣れるにつれて、こうした考え方を自然なものととらえられるようになります。
型のわずらわしさを克服し、型での静的なテストに慣れて型検査のメリットを実感するにつれて、「型を考えること自体がプログラミングである」と理解し、「型によってバグを防ぐためのテスト・コード」を当たり前のように書けるようになります。こうした感覚を身に付ければ、一人前のHaskellerになったと言えるでしょう。
さらに叩いておこう。
LLなんかで喜んでるような人たちは東大卒とかのように
計算の本質にまでたどり着いている人たちにはかなわない。
Googleのような正面突破はオブジェクト指向を1日で理解し、
CPUを0から作れる能力を持ち、それでいてグラフ理論や圏論など
そもそも何の役に立つのかわからないことも一生懸命考えていたような
人たち(つまり大学)からしか生まれないからだ。
件の夏の人の意見は完全に正しいわけだ。
と言うことなんだけど。
技術力の問題ではないのに、どれに対しても
完全敗北しているよね、つまらないからだよ。
優れたソフトウェアだなんてことは1秒で理解できるはず。
面白いものってのはさ…