将棋ライターの松本博文さんがcakesにSeleneの開発者の西海枝さんについての記事を書かれています。
【 第10回】Selene開発者、西海枝昌彦
https://cakes.mu/posts/8728
連載、第10回から西海枝さんの話が続きます。(現在、最新記事である第14回まで西海枝さんの話)
私が電王トーナメントの終了後、西海枝さんとわずかですが話したのでその内容を書いておきます。
私「Selene、npsいくらぐらいですか?」
西海枝「XXXですけど、遅いですか?」
私「(Stockfish系だとしたら)何か、(プログラミング上のミスを)いくつかやらかしてるとしか思えない遅さですね。評価関数の差分計算で38要素化やってないとか?」
西海枝「38要素化とは何ですか?」
私「ぎょ。」
ちなみに38要素化とは以下の記事の手法で、上位のソフト開発者の間ではかなり有名な手法であったので、まさかご存知ないとは思わなかったわけですが(そもそも私がブログに詳しく書いているわけで…)、cakesの記事を読んでいると西海枝さんは他の開発者のブログ・ソフト等をあまり参考にしない方針だそうで、であるならご存じなかったことにも頷けます。
Bonanzaのmake_listの38要素化
http://d.hatena.ne.jp/LS3600/20141024
また、西海枝さんは、社会人になってからプログラムを覚え、GPS将棋のソースコードを勉強したとのことです。
GPS将棋のソースコードはそこそこ難解で、将棋ソフト開発者のなかでGPS将棋のソースコードの全貌を理解しているのは、GPS開発チームを除けば私を含めた数名しかいないと言われています。
社会人になってからプログラミングを始めて、そしてGPS将棋のソースコードを理解したのだから、それについては驚嘆に値します。
そもそも、社会人になってからプログラミングを始めて、プログラミングが出来るようになるものなのでしょうか?
例えば、社会人になってから音楽を始めて作曲家になれますか?社会人になってから、英語を始めてしゃべれるようになりますか?社会人になってから、絵を描き始めて漫画家になれますか?社会人になってから、数学を始めて数学者になれますか?
なれる人はなれるだろうし、なれない人はどれだけ頑張っても無理だと思うのです。子供のころに始めれば、誰でもある程度のレベルで出来るようになるんでしょうけど、大人になってからだと頭の柔軟性が失われていて、子供のころにその基礎となる概念を習得していない限り、こなせるようにはなりません。(あるいは習得のために桁違いに時間を要します。)
例えば、社会人にプログラミングを教えようとしたとき、簡単な代入文すら理解してもらえないことがあります。
a = b;
bの値をaに代入しています。このときbの値は変化しません。値はコピーされます。aにはbと同じ値になります。その後、bの値が変化してもaの値には影響しません。これがプログラミング言語における「代入」という概念です。
実生活においてこのような「コピー」なんて概念が出てくるでしょうか?
お金は使ったらなくなります。ものは使ったら消費します。代入のように右辺に対する副作用なしに値が放り込まれ、そして、値がコピーされたあとは、そのあと右辺とは切り離された別個の変数として扱われます。
a = b + 1;
こう書いたときはbに1足した値がaに代入されます。bの値は変化しません。まるで、これが実行されたときの右辺のスナップショットを撮って、その結果をaに放り込んでいるかのようです。そうです。代入において、右辺は実行されます。これをプログラミング用語では「右辺が評価(evaluate)される」と言います。
このように、簡単な代入文ひとつとっても、「コピー」「(式の)評価」「変数」「副作用」などの概念に支えられていることがわかります。これらの概念は、実生活ではあまり馴染みのない概念なので、子供のころにこれらの概念を獲得していないと社会人になってからでは獲得しにくいのです。
大人になってからプログラミングをしてきちんと覚えられる人というのは、こういう概念を子供のころにきちんと獲得しています。そういう人は大人になってからプログラミングを始めても十分間に合います。
私は東大や京大の数学科の人に、プログラミングを教えたことがあるのですが、翌日には自分の書いたレイトレーシングのプログラムを見せてくれたりして、驚かされたことがあります。
そういう意味では、数学をあるレベルまでやってからプログラミングを勉強するのはそれほど回り道ではないと思うんですよね…。
話が少しそれましたが、西海枝さんが社会人になってからプログラミングを覚えてGPS将棋のソースコードを読んで理解したというのは、私からすると「まあ、(レアケースではあるけど)十分ありえるやろ」ぐらいの感覚ではありますが、社会人になってからプログラミングを覚えようにも「代入文」や「ポインター」の概念すら理解できない人は多数いますから、彼らと西海枝さんとの差はどこにあるのかというのは興味の尽きないところであります。
わたしの中では ファミコン戦士サイカイシャーとなって谷間を跳んでいるイメージが沸いてきたんだぜ☆ Cakesの記事の影響で☆
きふわらべの人も、棋譜戦士ワラベンチャーとして活躍してくだされ…。
私見ですが、、、
・幼少の頃から何らかの形で「コンピュータ」に親しんだ経験(ハードウェア、ソフトウェア、ソースコードなど問わず)
・少なくとも高校までの数学の知識全般
この2つの有無が大きな分かれ道になるのではと、自分の経験も踏まえて思います。
前者が無いと、コンピュータというもの自体がブラックボックスに見えて、入力や出力といった「コンピュータでやっていること」を直感では理解できないでしょうし、
後者が無いと、ソースコードで何をしているのか(if分岐とか配列とか関数とか)が飲み込めないように思います。
そこからポインタのようなハードウェア指向の概念や、アルゴリズム等の理解へと繋がっていくように感じます。
今回の電王戦を通じて、子供の頃に挫折した将棋もはじめてみたのですが、
合わせて大学時代に挫折してほこりをかぶっているC言語の本をもう一度取り出して読み直し、
やねさんがアップされたソースコード解析の記事を読めるようになれればと思います。
このような機会を授けていただいたことに深く感謝します。
数学の出来る人のプログラミングやれば出来る率は正直、すごいと思います。プログラミングが数学的概念に支えられているのか、数学的な概念を習得することで抽象的な操作が出来るようになるのかは私にはよくわかりませんが。かと言って、数学の出来ない人はプログラミングが出来ないというわけではないので、数学が出来なくとも諦める必要はないと思います。中学生のときには理解できなかった概念が、大人になってから理解できることも多々ありますし…。
むしろ学校で習わなかったから 飽きなかったんじゃないか☆www?
案外、「カルネージハート」が色々教えてくれたんじゃないかと予想するぜ☆www!
う~む、やねブラ王の隣に カルネージハートのプログラムを組んで遊べる部分だけ置いてあれば遊んでみたいんだぜ☆wwww Wikipediaの概要の図が面白そうだし☆
学校で習うと教師の教え方が悪いと、全部つまんない学問のように思えますしね。
自分数学できないですけど、小4位から始めたBASICのおかげでC言語を読むくらいはできます。
それはそれでめんどくさい道のりでしたがやってよかったと思います。
恩恵として変人になりましたし。
読めないものが読めるようになる快感って特殊ですよね。
でも、プログラムは半分は数学、半分はゲーム理論で構築されるべきだと思ってます。
自分にはその資格がないのですが、やねさんは完全にその人で素晴らしいと思いますよ。
自分の場合は算数とゲーム理論で構築してます。数学怖い。
まあ、プログラミングも分野によっては算数すら要りませんしね…。数学(算数?)が必須ってこともないのでは。
少し気が休まります。
数学の何がすごいって最適化するときにすごいエネルギーを発揮するんですよね。
O(1)とかO(N)のアルゴリズムは数学わからないと出てこないですから。
自分は何をするにもモンテカルロするのでちょっと遅いんですよね。
でも、今から数学を取得するには歳を食い過ぎてしまいました。
うん。数学怖いです。Orz
数学以外の要素だとゲームとかの攻略を真剣にやってたりする人は素養が高い気がしますね。
仮想的な仕組みを現実的な問題として考えられる感覚が身についているのではないかと思います。
私は関数型言語を受け入れられる人とそうでない人の差が気になります。
> 私は関数型言語を受け入れられる人とそうでない人の差が気になります。
C++を同じように教えても自力で参照透過性の概念を発見する人と、そうでない人とがいますね。自力で発見できるような人は、関数型言語を教えると結構すんなり覚えてくれるので、まあ、そのへんの素地の差というのはあるんだろうなと思います。
> 概念を獲得
興味深いですよね。Googleに500億円で買収されたDeepMindはゲームを学習する人工知能を作りましたが、あれは何か概念のようなものを獲得しているのでしょうか?
> 概念のようなものを獲得
「玉の8近傍に金がいる」というのも一つの概念で、それは、KPの特殊な配置例でありまして、結局、一般化されたKPみたいなのに対して、具体例の集合は、「一つの概念」なのであります。
なのでニューラルネットワークはもともと概念を学習することが出来るのです。ただ、入力の数がすごく大きくなったときに学習しにくくなるので、その改良のために色々テクニックを開発しているのが現状なのです。
今更なのですが、数学というよりは論理学が身に染みついているかという話のような気がします。
あと、同調圧力が無効化される「空気が読めない」という体質をプラスするといい感じです。
そうですね。わりとプログラマーとしての適性ってそのへんだと私も思います。
今更ですがこの記事を読みました。
Seleneの開発者西海枝さんって電王戦観戦記でスーパープログラマーと書かれてた記憶がありましたが、電王戦第2局の佇まいと対応、最後のインタビューも含めて、まさにその通りだなぁと改めて思いなおしました。
古い記事へのコメントですが失礼します。