星田さんの記事に対してのコメント。
僕はなんて飲み込みが悪いんだ・・
いや、全然。
むしろ飲み込みが早い方なんじゃないかな・・・・・・。
もし、「飲み込みが悪い」って自責するとしたら、それは星田さんのせいじゃなくってLispのせいです。
Lispを学ぶ以上、ある意味コンピュータ・サイエンスの概念と付き合わざるを得ない。
要するに、単純にPythonをやり続けても到達出来ない事柄を学ばざるを得ないんですよ。そしてそれらはVBとかVBAをやってても到達出来ない範疇の話でもある(C言語でさえ実際は怪しい・※1)。
むしろ、・・・多分二個目か三個目(往年のBASICを含めれば)のプログラミング言語学習で、しかも自習範疇でコンピュータ・サイエンス系の概念と付き合わないとならない、ってのはむしろお気の毒様、ですよね。
フツーにプログラミングやる分には全く学ぶ必要がない概念を今学んでるわけですから。
余談だけど、次の二つの命題があります。
- Lispは初学者に易しい
- Lispは初学者には難しい
実はこの二つは両方成り立ってる。
確かにLispは最初、覚える事が異様に少ないです。構文規則、と言うか文法には例外がないし(バカの一つ覚えで前置記法だし)、単純な四則演算を超えるとリスト操作しかない。C言語で初めて「配列」を学ぶ時の億劫さを鑑みると異様な単純さです。consしてcarしてcdrするだけだし!
だからLispは実は導入では敷居が低い。PAIP(実用Common Lisp)の冒頭たった三章でANSI Common Lispの「機能」に付いて説明可能なのはそれのせいです。単純に・・・Python的な意味で「使い方」を教えるならこのように少ないページ数で説明が可能だ。例外はない。
ところが、Lispを使っていくと、いきなり「コンピュータ・サイエンス」的な事柄に初期状態でツッコんで行かざるを得ないんですよね・・・・・・つまり、途中から学習曲線の勾配が無茶苦茶上がっていく。C言語での学習曲線が一次関数的だとすると、Lispの学習曲線の勾配は指数関数的です。言い換えると、大学のカリキュラムで2年時の修了時辺りで要求される知識にLispだと半年もせずに突入する可能性がある。そうなると「なんでこんなの勉強してんだろ?」ってなる可能性が高い(笑)。
要するに、例えば「C言語の基礎をやっとこさ学んでデータ構造とアルゴリズムを勉強して、さぁ、ポインタと構造体使って二分木でも書いてみようか」って範疇にLispだと学びはじめてから3週間くらいで突入出来る可能性がある(笑・※2)。そしてC言語で大学の課題的に作るような関数はLispだと全部ビルトインです。余計な事をする余地もない。
また余談なんだけど、「やさしいLisp入門」って本があって。
この本の象徴的なトコは、そもそも目標が「C言語的な初歩的なデータ構造とアルゴリズム紹介をANSI Common Lispを用いてやってみよう」だったと思うんだけど、結果やることがゼロなんですよ(笑)。何故なら「C言語的な初歩的なデータ構造とアルゴリズム」程度なら全部ANSI Common Lispにはビルトインだから。
結局、関数の仕様の紹介で殆ど終わってる、と言う・・・・・・ある意味、辞書的なトコでは役立つ本になってる(と言うかならざるを得なかった、と言うか)んですが、「さぁ、Lispを勉強するぞ!」って意味ではクソつまらん本となっています(笑)。
やっぱり定義とかをちゃんと理解して定着させる習慣が無いからだろうなぁ・・改めよう!と、これまた何回も決意してることなんですけど(^_^;)
う〜ん・・・・・・気にせんでエエんちゃうかな。
何故なら学校じゃないから。自習だから。
っつーのもね。学校教育とかで建前的には一発で「定義とかちゃんと理解して定着」せなアカン、ってのは
- 1(教育者)対多(学生)と言う枠組みで教えないとならないから
- 学習には期限が切られているから
って理由があるから、ですよね。もっと言っちゃえば学習側の都合じゃなくて教育側の都合なのです。決して一発で「定義とかちゃんと理解して定着」するのが学習者側の負担にならないから、と言う理由ではない。
だから自習が前提だったら曖昧なまま進んで、「何度も同じトコで指摘される」方がラクなんじゃないかしらん。定着、で考えるのならそっちの方が脳に負担は少ねぇんじゃないかなぁ。本来学習って螺旋的に行きつ戻りつ同じトコを何度も確認していって徐々に上昇していった方がいいと思う。
学校みたいに「テストで一発合格」なんつーのもねぇわけだし。
むしろ「同じ事を何度も浅い段階から深い段階にかけて」確認してった方がラクなんじゃないかしらん。
大体、初学者が一体何が重要概念なのか、って判別付かないわけでしょ?先生がいるわけじゃないし、場合によっては覚えなくて良い事もあるわけだし。
だから自習者が失敗する最大の理由ってのは初回に全部完璧に「定義とかちゃんと理解して定着」させようとするから、だと思う。
曖昧でいいんですよ。曖昧でも何度も同じ事を繰り返して深みを付けてく事を厭わない方が大事なんじゃないかしらん。
なお、それでもなるたけ「定義とかちゃんと理解して定着」させたい、ってぇのなら、予算が許すなら同じ系統の本を複数購入する、って手があります。何故なら本当に最重要事項は複数の本に同じ事が書いてある筈だから、です。
Aって本を読んでBって本を読む。「あ、Aにも書いてあったな」と思えたらそれが重要事項なのです。言い換えると片方に書いてて片方に書いてないのなら少なくとも最優先で覚えなアカン事ではない。
まぁ三度目の正直、って言葉もあるし、もう一回借りる可能性を先に潰しても良いたぁ思いますが、ぶっちゃけ四度目があるなら買った方がいい、ってのは間違いないでしょう。
そしてPAIP(実用Common Lisp)とLOLで、両方同じ事が書いてる場合はそれが覚えなければならない最優先最重要事項です。間違いない。
んで、ゲームと探索、ってテーマを考えてみた時、LOLはオセロしかないPAIPの良い補完資料となってくれるでしょう。
どうせなら検索でテニスとかの記事に引っかからないような特殊な単語にして欲しかったところ
これはマジでそうなんだよな(苦笑)。
テニスラケットの通販サイトばっか見てもこちとらしょーがない、と言う(笑)。
オススメされてたこの人の記事も読んでみよう。それにしても・・これはいかにも普通の人ではないという感じの頭の形ですねぇ・・賢そう
この人がStack OverFlowと言うプログラミング版「教えて!goo」みたいなシステムの開発者です。
元々プログラミングのキャリアは中学校一年生辺りでIBM-PCでPascalを学ぶ事からスタートしてて、言い換えると「C言語命」の人でもなく、あらゆる言語に対してフラットな立場ですね。登場初期のC#に対しても危機感があった人です(今だとC#ユーザーみたいですが)。
また、ソフトウェア開発用言語としてのLispや、あるいはRubyに対してもダメ出ししています。
なお、この人の述懐に拠ると、やっぱビル・ゲイツはすげぇ人らしいです。皆、故スティーヴ・ジョブスを持ち上げてるけど、ビル・ゲイツは「経営者」以前にプログラマとしてやっぱ優れている模様(=> BillGレビューの話が面白い・※3)。
Lambdaを奪われた感・・ありますねぇ
まぁ、Excelに於いては、ですね。
ただ、今のC#にはラムダ式が導入されてるし、Microsoft言語には関数型言語であるF#ってのがあります。C#に比べると人気はないけど。
F#はザックリ言うとフランスで開発されたOCamlの方言です。
つまり、Microsoftは、関数型言語ブームにより関数型言語も提供せなアカン、ってなった時点で、LispでもなくHaskellでもなく、OCamlをベースに選んだ。
多分「それなりの理由」をMicrosoftは見つけたんでしょう(Microsoftはこのテの事ではリサーチが万全であり、Appleのように決して「不明な事は」しないから失敗しない)。
当然、OCamlはHaskellよりSchemeに近い、「不純な」関数型言語であり、そして概念的な事を言うと、Scheme等のLispを学んだ後、F#を学ぶのはさして難しくないでしょう。
かつ、朗報としては、要するに、Windowsプラットフォームで、関数型言語でWindowsアプリが作れる、と言う事です。原理的にはC#で使えるモノは全部F#でも使用可能である、って事なんで。
そしてF#/OCamlでもラムダ式は当然使いまくれます。
まぁ、もっとも、将来的には、現在「Pythonの父」であるグイド(※4)がMicrosoftに勤めているので、P#が登場する可能性がなきにも非ず、ですけどね(※5)。
※1: 何度も繰り返すが「C言語を学んでも」コンピュータの基礎は学べない。ハッキリ言っちゃえば、それは、例えば大学のカリキュラム次第、ってな話であって、全てをC言語が基礎、と言うのは端的に言うと間違ってる。大間違いだ。
「皆がそう言うから」それを諳んじてる、ってのは何も考えてない、ってのと同義である。
※2: 何度も指摘してるが、Land of Lispと言う本の主要なトピックは、「ゲーム制作」を隠れ蓑とした「探索技術」にまつわる事柄で、探索が関わる以上、「木構造」を扱ってる。しかもそれを「プログラミング初心者」に向けて解説しているのだ。
言い換えると、Land of Lispは早い段階でテキストアドベンチャーゲームエンジンの作り方を扱ってるが、こんなゲームは大学でC言語を学び始めた層ではとてもじゃないけど「作れない」。「データ構造とアルゴリズム」を学んだ層じゃないと手も足も出ない題材を扱ってる辺りで、実はプログラミング初心者に対しては「Lispらしい」無茶振りを行ってるのである。
ちなみに、既に星田さんは「近所のアタマの良いプログラマの女の子」と、場合によっては大学2回生〜駆け出しプログラマとしての会話が可能になってる可能性がある。Lispの無茶振り、とはそういう事であって、「副作用って良く分からなくって」とか「コンパイラに於ける木構造ってどうなってるの?」とか言う「素人とは思えない」発言をする事が可能である。
※3: 1990年代、アメリカの大学でプログラミングを学ぶ学生の最大目標は、Microsoftに勤める事、だった。Googleが出来る遥か前の話である。
あらゆる優秀な卒業生しかMicrosoftに入社出来なかったので、そういう意味で考えてみてもジョエル・スポルスキは当時の(一つ前の?)世代としてはダントツの、メチャクチャ優秀なプログラマだったのである。
※4: Pythonの父、グイド・ヴァンロッサムはGoogleを退職してDropboxに移り、一旦プログラマとして引退を表明した後、復活してMicrosoftに所属している。
※5: .NETで動くPythonの実装でIronPythonと言うモノがあるが、これは有志に拠るある種実験実装であり、当然Microsoft公認ではない。
また、スタンダードなPythonよりも実装が「遅れてる」ので、現時点でもコンパティビリティはPython2.7系ターゲットであり、既に3.0系が主流になってるので、「イマイチ」の実装である。
グイド・ヴァンロッサムとMicrosoftの合流により.NETで動く「正式の」Pythonが登場したとしたら、驚くべき話となるだろう。