JavaScript勉強会

JavaScriptの学習日記

プログラミングの仕組みを理解する方法

この記事は、プログラミングの専門教育(大学のコンピューターサイエンスなど)を受けておらず、独学でプログラミングを学習している方へ贈るアドバイスです。

f:id:jsstudy:20190917010207p:plain

タイムマシンがあったら、過去の自分に会いに行って教えたい話です。

(自分で自分に話しかけるつもりで書いてみますw)

 

プログラミング言語はひとつマスターすれば他もできる? - t-hom’s diary

プログラミングパラダイムは(1)命令型(チューリングマシン)、(2)宣言型(ラムダ計算)に大別される。両方理解したら全部カバーできる。言語は開発の背景(動機、歴史)を知るとなじみやすい。例:JSはScheme+Selfで誕生

2019/09/16 06:49

b.hatena.ne.jp

 

はてなブックマークでこの記事が目にとまりました。

なるほどと思いつつ、自分なりに考えてみたことをメモ。

 

 

勉強のコツ

プログラミングの学習に限ったことじゃないけど、勉強にはコツがある。

要領が良い人の勉強方法を分析して、いい所取りをしていこう!

 

1.順番が大事

何か新しい知識やスキルを習得するとき、「順番」に気を付けよう!

 

数学を例に挙げると、

  1. 小学校で習う算数(足し算、引き算など)を土台にする。
  2. 中学・高校の数学(代数、幾何など)で「論理」を学ぶ。
  3. 大学の数学(集合論圏論など)で思考の道具を整理する。

という順番でやった方がいいよね。

順番を逆にして、足し算や引き算を学ばずにいきなり微分積分を学ぼうとしても無理でしょ?

=「俺は頭が良いから難しいことでもすぐにマスターできるはず!」という思い込みやプライドは、役に立たないからいったん脇に置いておこうw

 

  • 基本を疎かにすると、応用で苦戦する。
  • いきなり難しいことにチャレンジするのではなく、簡単な基本をみっちり叩き込んでから、段階的に進むこと。

 

基本を習得できていれば応用に入ってからスピードが出せるから焦りは禁物だ!

 

大学数学ほんとうに必要なのは「集合」 (BERET SCIENCE)

大学数学ほんとうに必要なのは「集合」 (BERET SCIENCE)

 

 

2.なぜ、順番があるのか?

ある事柄を理解するためには、その前提となる理解が必要になっているから。

 

逆に言うと、

「何かが理解できていない状態」

とは、

「前提知識が不足している状態」

だとも言えるよね?

 

(参考)理解不足の仕組みについて、「解釈学的循環」っていう考え方もあるよ。

 

www.google.com

 

ja.wikipedia.org

 

ディルタイは、その解釈学において、「全体の理解は部分の理解に依存し、部分の理解は全体の理解に依存する」ということを指摘し、何かを解釈する際には、全体の理解と部分の理解が、どちらが先でどちらが後であるとは言えない、循環的な関係にあることを問題にした。

ハイデッガーは主著『存在と時間』で、この循環を時間性として捉え、先行理解(先入見 Vorurteil)と新たな理解との間の循環は必要不可欠である、と考えた。

 

  • 「全体」は「部分」から成る。
  • 部分の理解がないと、理解の範囲を拡張できない。全体を俯瞰できない。

 

jsstudy.hatenablog.com

 

3.定義(用語の意味)を一番最初に確認しよう

学習の初期に必要となる前提知識には、用語の「定義」があるね。

(厳密にいえば、さらに「定義」の前提となる「公理」の確認も必要なんだけど、プログラミングの場合はあんまり気にしなくてもOK。)

 

プログラミングの学習で、説明に登場する「用語」の意味を最初に押さえておくことが重要だ!!!

 

知らない用語がズラズラ出てくると、チンプンカンプンになる。

しかもコンピューターの用語は英語が多いから、英語も真面目に勉強しておこうw

 

プログラミング言語には、誰かがまとめてくれた「チートシート」(カンニングペーパー、用語などの一覧表)がよくあるから、印刷して目の前に貼っておこう。

 

d.hatena.ne.jp

 

(プログラミングの本を検討するとき、巻末にある索引を見て、索引がしっかりしていれば、編集部が手抜きをしていない良い本だろうと予想できます。)

 

4.先行オーガナイザーを活用する

新しいことを学ぶとき、既に知っていることと結びつけると理解が早い。

既に知っていることがまだ少ない場合は、

  • 学習内容の「まとめ」(概要)
  • 例え話(比喩)

が役に立つよ。

これから学習することの補助になる(少量の)予備知識を「先行オーガナイザー」(Advance Organizer)って言うんだよ。

 

www.google.com

 

先行オーガナイザーとは 人材育成・社員教育用語集

先行オーガナイザーとは、学習者がこれから記憶しようとするものの全体像(枠組み)のこと。

全体像を学習者があらかじめ把握していれば、その後に続く内容は、より意味のあるものとして記憶される可能性が高くなる。 

 

www.con3.com

 

既有知識と学習内容を何かしら橋渡しをするものが必要になります。

橋渡しをするものを心理学の世界では「先行オーガナイザー」と呼んでいて,新たな学習内容に関する枠組みとなるもの(ヒントや例え話も含む)を先に示しておくことで,学習内容を既有知識と結びつけた理解が進むとされています。こういうものを「有意味受容学習」と呼びます。

佐伯胖氏が『「わかる」ということの意味』(岩波書店)という本で「「わかる」ということは、実は「わかっていること同士が結びつく」ということにほかならない、ということです。」(新版153頁)と書いているように「知識の関連付け」は学習の重要要素であるといえます。

 

f:id:jsstudy:20190916075437j:plain

 

「わかる」ということの意味 新版 (子どもと教育)

「わかる」ということの意味 新版 (子どもと教育)

 

 

受験参考書みたいなつくりの本なら、各章の始めに「学ぶ内容」が3行程度でまとめてあると思います。これが「先行オーガナイザー」の役目を果たします。

もし、それがない本の場合は、新規の学習項目をなるべく自分で知っていることに寄せて、自分なりに要約を作ってみることが役に立つと思います。

 

5.学習の3要素を揃える

何かを勉強するとき、いろいろな条件があるけど、以下の3要素が必要なんだ。

 

  1. 興味
  2. 時間
  3. 教材

 

jsstudy.hatenablog.com

 

勉強は、

  • 興味
  • 教材
  • 時間

の3つが揃えば、誰でも一定の成果を出すことができます。

ちょうど、植物の種が育つためには、土や水、空気、適切な温度、日光が必要なように、勉強も条件を揃えないと、スキルの獲得が難しいでしょう。

 

この中で一番重要なのが「興味」だと思います。

どんなに記憶力が良い人がいたとしても、学ぶ対象に全く関心がなければ、いくら本を読ませても、なかなか頭の中に入って来ないでしょう。

つまり、興味=好奇心=関心は、対象に近付いて観察し、自分と一体化=習得する力になっています。

 

以下の質問の答えをノートに書いてみて。

  1. なぜ、プログラミングを習得したいのか?
  2. プログラミングを習得して、作りたいアプリやサービスは何か?
  3. 作ったアプリやサービスによって、どんな利益が得られるのか?
  4. 利益を得る前と得た後を比べて(想像して)、ハッピーになれるか?

 

要するに、プログラミング学習の理由=動機付け=興味=やる気がどうなっているのか?の確認だよ。

 

  • 動機付けが曖昧でぐらついていると、学習の途上で難しい局面にぶち当たったとき、挫折しやすいんだ。
  • 動機付けがハッキリしていると、困難を突破する力になるよ!

 

 :

(ここから独り言ではなく、普通の口調に戻します)

 :

 

上記の質問の答えは、人それぞれなので、正解が1つだけということはありません。

 

学校でプログラミングの授業を受けたとか、まだ自主的に勉強したい理由がない人もいるでしょう。

しかし、プログラミングで上達したいなら、上記2の質問「何を作りたいのか?」は考えた方が良いです。

作りたいものが何もない場合、プログラミングが楽しくならないからです。

 

以上で、勉強の注意点(順番など)や、自分の動機付けを確認できましたね?

次は、カリキュラムや教材の選定について考えていきましょう。

 

カリキュラム

学校でプログラミングを学んでいる学生の方なら、とりあえず教科書の順番に沿って勉強するのも一手です。

ここでは、学校を卒業してしまった社会人の方を対象にして、プログラミング学習のカリキュラムを考えてみたいと思います。

 

数学はお好きですか?

そもそもですが、コンピューターとは「電子計算機」です。

電気仕掛けで高速に計算する機械がコンピューターであり、計算の内容を指定することがプログラミングです。

「計算」という以上、その前提には「数学」があります。

 

Webアプリを作るなど簡単なプログラミングなら、必ずしも数学の知識は必要ありませんが、AIなど複雑な処理を作ろうと思ったら、数学の知識が必要になってきますね?

 

  • 数学が得意か否か?
  • どれぐらい数学を勉強しているか?

によって、プログラミング学習の順番を変えてみましょう。

プログラミング手法の難易度には、様々な分類方法が考えられますが、ここでは数学の学習進度に応じたプログラミングの難易度を考えてみます。

まず、プログラミングのパラダイム(考え方、仕組み)の分類についてご紹介します。

 

プログラミング・パラダイム

jsstudy.hatenablog.com

 

  1. 命令型パラダイム手続き型言語
  2. 宣言型パラダイム:非手続き型言語関数型言語、問合型言語、論理型言語)

 

プログラミング言語の種類

プログラミング言語の種類は、(分類方法にもよりますが)ざっくりと4種類あります。

(参考)「日経ソフトウエア」2008年3月号

分類 基礎となる計算モデル 事例
手続き型言語 チューリングマシン C, Java
問い合わせ言語 (非手続き型言語 関係モデル SQL
関数型言語 ラムダ計算 Lisp, Haskell
論理型言語 一階述語言語 Prolog

 

※個人の感想になりますが、以下のような順番で難易度が変わってきます。

 

  1. 命令型:簡単 → 小学生レベルの算数が理解できればOK。
  2. 宣言型:難しい → 中学生レベルの数学が欲しいところ。

 

従って、全くプログラミングをやったことがない方の場合、

「命令型」から始めて、次に「宣言型」へ進むという順番が良いと思います。

 

宣言型のプログラミングを学ぶ場合、

  1. 問合型:簡単 → 中学:集合の話(ベン図など)が理解できればOK。
  2. 関数型:普通 → 高校:数列の話(帰納法など)が理解できればOK。
  3. 論理型:難しい → 大学:述語論理の話(論理学)が理解できればOK。

という順番でやれば、数学的知識の必要性が徐々に増えてくるので、挫折しづらいはずです。

 

設計手法

プログラミングのパラダイムや各言語の文法学習と並行して、プログラムの「設計」に関する知識も学ぶと良いでしょう。

現代では、CUIよりもGUIのアプリやサービスが多いので、特にGUIの設計方法について理解しておくと役立ちます。

 

教材

それでは教材について検討してみましょう。

  • 動画
  • 学習サイト

など、様々な媒体がありますね?

(予算に応じて)使えるものは何でも使いましょう。

 

本を読む場合、大切なことは本屋や図書館などで実際に本の内容を確かめてみて、自分にとって分かりやすい説明だと思える本を選ぶことです。

 

jsstudy.hatenablog.com

 

いろいろな説明方法があった場合、

「自分にとって一番分かりやすい説明」

の本を選ぶのが無難です。

 

手続型(命令型)の教材

今の時点では、

  1. Scratch (1カ月程度)
  2. Python (3カ月程度)

の順番で学習することをおすすめします。

共通点は、どれも教材が充実しているという点です。

 

  • まず最初にPythonをやってみます。
  • Pythonが難しいと感じたら、Scratchに戻ります。
  • Pythonが理解できたら、他の言語も使ってみましょう。

 

理由を以下に説明します。

 

Scratchを選ぶ理由
  • 最低限の命令型の基本=構造化定理(順次、反復、分岐)を学べる。
  • ヴィジュアル的なタイルプログラミングなので、コードを書かなくてもOK。

 

ja.wikipedia.org

 

scratch.mit.edu

 

今だと幼児向けにScratchの教材がたくさんありますが、Scratchを日本に普及させた立役者である阿部和弘先生の本が、とりあえず無難かと思われます。

 

小学生からはじめるわくわくプログラミング2 Scratch 3.0版

小学生からはじめるわくわくプログラミング2 Scratch 3.0版

 

 

NHKのScratch講座(子供向け)もあります。

 

www.nhk.or.jp

 

www.youtube.com

 

注意点としては、子供向けに簡単なように見せていても、実はそれなりに難しいことを扱っている場合もある、ということです。

もしも、Scratchを勉強してみて、すぐに理解できない内容があったとしても、自分を卑下しないでください。

 

Scratchは簡単なゲームをつくるオモチャだと思って、まずは「楽しむこと」が大切です。

自分で何か(ゲームなど)を作ることを通じて、「プログラミング=楽しいこと」という認識を培いましょう。これが後々モチベーションの低下を防ぐ力となりますよ!

 

Pythonを選ぶ理由
  • 手軽に利用できるインタープリター言語だから。
  • 今どきのAI開発でもよく使われており、実用性も高い。

 

ja.wikipedia.org

 

www.python.org

 

Pythonの入門書はたくさん出ています。

 

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

 

↑これは、Pythonの解説書というよりも、プログラミング全般について説明してある本です。人気がありますね。

 

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

 

↑これは、Python作者がPythonについて説明した本ですが、あまり読みやすくないかも!?

Python チュートリアル」で検索すれば(同様の内容を)ネットで読めます。

 

www.google.com

 

他の手続型言語を後回しにする理由
  • C/C++ → ポインタの使い方は後でもOK
  • Java → OOPの教材としてはOKだが、書き方が冗長で面倒。
  • C# → JavaのMS版。Windowsアプリを作らないなら不要。
  • PHPPerlRuby → Webアプリを作らないなら出番が少ない。
  • JavaScript → HTMLやCSSなどの知識が必要になりがち=最初は余計?

 

すぐに使いたい言語がある場合は、それを選べばOKだと思います。

 

問合せ型(宣言型)の教材

問合せ型言語の代表例として「SQL」があります。

SQLはリレーショナル・データベースで使われる言語です。

データベースはよく使うツールなので、早いうちにSQLを学んでおいて損はしないよ!

 

ja.wikipedia.org

 

SQLの解説本はたくさんあるけど、ミックさんが書いた本が分かりやすいと思います。

 

www.amazon.co.jp

 

SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

 

 

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

 

 

他にも、分かりやすいSQLの解説本もあります。

 

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

 

 

ミックさんのサイトも要チェック!

 

mickindex.sakura.ne.jp

 

ぶっちゃけ、ここら辺までの内容は、あまり数学の知識は必要ないです。

数学が不得意でも、使い方をマスターするだけなら行けます。

 

しかし、次の「関数型」や「論理型」は、文法を学び、使い方をマスターするだけなら行けますが、なぜそうするのか?という疑問を調べ始めたら、途端に数学の壁が立ちはだかります。

 

関数型(宣言型)の教材

関数型を学ぶ前に読んで欲しい本

手続型と問合せ型をマスターしたら、たいていのプログラムを作るのに困らないと思う。

だけど、もっと上達したかったら関数型も学んだ方がいい。

その必要性を知るために、「ハッカーと画家」というベストセラーを読んで欲しい。

 

jsstudy.hatenablog.com

 

最初にこの本を読んだときは、正直ピンと来なかったw

プログラマーのこだわりみたいなのが書いてあるだけに感じて、別にそれが面白いとか、素晴らしいとまでは思わなかった。

だけど、関数型プログラミングを勉強した後に、何気に再読してみたら、ポール・グレアム関数型言語を押していた意味が分かったような気がしました。

 

ハッカーと画家 コンピュータ時代の創造者たち

ハッカーと画家 コンピュータ時代の創造者たち

 

 

時間がなければ、「普通のやつらの上を行け」という話だけ読めばOK。

 

practical-scheme.net

 

もしも、「ハッカーと画家」を読んでみて、面白くないと感じても気にしなくていい。

関数型(宣言型)を使うメリットは様々だから、ポール・グレアムの意見に共感できなくてもOK

 

関数型の分類

関数型言語は、副作用(状態の変化)の扱い方によって、

に分けられます。

 

順番は、

  1. 最初は、副作用を許容している不純な関数型言語を練習してみて、
  2. 次に、副作用を許容しない純粋な関数型言語を練習してみたら良いと思います。

 

今の時点では、

  1. Lisp (1カ月程度)
  2. Haskell (3カ月程度)

の順番で学習することをおすすめします。

英語に問題がない場合は、Lispの代わりにRacketもおすすめします。

 

Lispを選ぶ理由
  • Lispは昔からある古い言語なので、参考情報もたくさん蓄積されている。
  • Lispは動的型付け言語なので、使い方が簡単。
  • Lispのマクロを使えば、今でも実用性が高い。

 

Lispは、関数型プログラミングの仕組みを学ぶ教材程度に考えておけばOKです。

Lispを使ってアプリやサービスを作らなくてもOK。

 

ja.wikipedia.org

 

Lispの教材

Windowsを使っている場合、「xyzzy」というエディターを使えば、手軽にLispを練習できます。(Emacsよりも簡単?)

 

ja.wikipedia.org

 

xyzzy-022.github.io

 

www.nct9.ne.jp

 

xyzzyの解説本もありますが、読まなくても使えるようになると思います。

入門xyzzy

入門xyzzy

 

 

xyzzyを使ってLispの基本を勉強する本です。ラムダ計算(後述)の説明もあります。

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算

 

 

・手続型と比較しながら、関数型の仕組みを勉強する本もあります。

 

構造化定理→関数型の対比を意識すれば、スッキリと理解できます。

  • 順次 → (関数の)合成
  • 反復 → 再帰
  • 分岐 → パターンマッチ

 

Lispが面白いと感じたら、深掘りしてみたら良いと思います。

 

Lispの入門書

Land of Lisp

Land of Lisp

 

 

Lispハッカーポール・グレアムの解説本

On Lisp

On Lisp

 

 

(オンラインで公開されているので、無料でも読めます。)

www.asahi-net.or.jp

 

Lispの実用性が理解できます。

実践Common Lisp

実践Common Lisp

 

 

プログラミング学習の目的なら、Lisp自体を深掘りする必要はありませんが、時間的に余力があれば「ラムダ計算」という考え方も学んでおきましょう。(詳細は後述)

 

Racketの教材

もしも、あなたが英語の読み書きに問題がなければ、関数型の入門教材として、Lispの代わりにRacketを使っても良いでしょう。

Racketは、Lispの方言の1つであり、LispSchemeの仲間です。

Lispに比べるとRacketは日本語情報が少ないので、Racketは補欠にしました。

 

ja.wikipedia.org

 

racket-lang.org

 

riptutorial.com

 

Realm of Racket: Learn to Program, One Game at a Time!

Realm of Racket: Learn to Program, One Game at a Time!

  • 作者: Matthias Felleisen,Conrad Barski,David Van Horn,Eight Students of Northeastern University
  • 出版社/メーカー: No Starch Press
  • 発売日: 2013/06/13
  • メディア: ペーパーバック
  • この商品を含むブログを見る
 

 

英語の教材

コンピューターやプログラミングは欧米が発祥なので、本格的に学び始めたら、どうしても英語の説明は避けられないでしょう。

英語が得意でなければ、ついでに英語も勉強しておくと良いです。

 

jsstudy.hatenablog.com

 

YouTubeの字幕で英語の勉強

今どきなら、YouTubeの英語動画も良い教材になります。

YouTubeの動画には「字幕」機能があります。

字幕の自動生成で、英語から日本語を設定すると、英語の会話が自動的に日本語の字幕として表示されます。

 

f:id:jsstudy:20190916175305p:plain

 

  1. 最初は、日本語の字幕を表示させつつ、ヒアリングする。
  2. 次に、英語の字幕を表示させつつ、ヒアリングする。
  3. 最後に、字幕なしで聞いてみる。

 

英語のプログラミング解説動画がYouTubeにたくさんあります。

これなら、英語とプログラミングを同時に勉強できて、一石二鳥ですね!

 

www.howtonote.jp

 

とりあえず、文法は適当でもOK。

英語のYouTube動画を字幕付きで見てれば、だいたい分かるようになる。

細けえことは気にすんな!

 

Lispで関数型の基本に慣れたら、次はHaskellをやってみましょう。

 

Haskellを選ぶ理由
  • Haskellは純粋な関数型言語
  • 副作用を分離して管理する方法を学ぶ教材として最適。

 

ja.wikipedia.org

 

www.haskell.org

 

ハッキリ言って、Haskellは使いづらい言語です。

Haskellを勧めておいていきなり批判するのもなんですが(笑)一応理由があります。

 

Haskellは他の関数型言語と比べて、副作用の扱い方に厳しい縛りがあります。

その縛りの中で「いかに副作用を分離して扱えばいいのか?」という練習にHaskellは向いてるわけです。

 

jsstudy.hatenablog.com

 

純粋な関数は引数に応じて結果を返すことに徹しています。

f:id:jsstudy:20190831213746p:plain

 

純粋でない関数は、返す結果が状態に依存したり、状態を変更したりします。

f:id:jsstudy:20190831213804p:plain

 

ここで言う「状態」は単なる変数などではなく、関数の外部にある、変わりうる情報すべてを指しています。

例えば、ユーザのキー入力、ファイルIO、DBアクセス、socket通信、画面表示などは、すべて状態への依存や状態の変更とみなします。

 

そういうわけなので、マゾでもなければ実用でHaskellを使う機会は少ないでしょう。

実用でML系言語を使うなら、HaskellよりもOCamlの方が便利だと思いますが、ここでは学習が目的なので実用性は問わないことにしておきましょう。

もちろん、Haskellを学習してみて気に入ったら、普段使いも「あり」です!

 

Haskellの教材

Haskellは、他の関数型言語と比べて特別に難しいわけではありませんが、データの入出力の処理がちょっとだけ特殊です。

ファンクター、アプリカティブ、モナドなどの説明が、自分にとって分かりやすいと思える本を探してみましょう。

 

qiita.com

 

Haskellの本で定番。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

 

 

この本はイラストが多くて一見分かりやすそうに見えますが、実際にはヘビーです。(自分にとっては分かりやすい本だとは思えなかったw)

 

この本は、

  1. ファンクター
  2. アプリカティブ
  3. モナド

の順番で入出力の仕組みが説明されているので、分かりやすいと言われています。

今なら、他にもHaskell本がたくさんあるので一番にはお勧めしないかな?

 

Haskellのお勧め本

Lispなど他の関数型言語で基本を理解した後にHaskellを学ぶなら、以下の本がおすすめです。 

入門Haskellプログラミング

入門Haskellプログラミング

 

 

最初は、関数型プログラミング全般の話から始まって、徐々にHaskell固有の話に進んでいきます。

最後は、Haskellを使った実用的なアプリを作成するので、「勉強して終わり」という虚しさも少ないでしょうw

LESSONが42もあって、内容が細分化されています。読むのに時間がかかりますが、丁寧な説明なので、Haskellの使い方は理解できるようになるはずです。

 

他のHaskell本についても、ちょっとコメント。

 

プログラミングHaskell 第2版

プログラミングHaskell 第2版

 

「プログラミングHaskell」(第2版)も、分かりやすい本だと思いました。

特に前半の基本の説明は分かりやすいですが、後半の応用の説明はちょっと難しい話が多いと感じました。

「入門Haskellプログラミング」とどちらを推薦するか?迷いましたが、次点の候補としておきます。

 

この本は、説明の仕方が受験参考書みたいだと思いました。

網羅的に内容をカバーしてありますが、最初に読む入門書としてはちょっとかたいような気がします。(読みづらい?)

Haskellの本を数冊読んだ後に、要点のまとめ・確認用として利用するなら「あり」だと思います。

 

ネットの解説記事でもHaskellの良い教材がたくさんあります。

 

www.google.com

 

wiki.haskell.jp

 

lotz84.github.io

 

walk.northcol.org

 

capm-network.com

 

www.nct9.ne.jp

 

Haskellを勉強したら、せっかくなのでHaskellでWebサイトでも作ってみましょう。

 

HaskellCMS「HAKYLL」

www.staticgen.com

 

Haskellの軽量Webフレームワーク「Scotty」

hackage.haskell.org

 

HaskellのWebフレームワーク「Spock」

www.spock.li

 

論理型(宣言型)の教材

論理型言語の代表は、Prologです。

関数型言語Erlangは、Prologに影響を受けている言語です。

PrologErlangErlangをベースにしたElixirなどを使う機会があれば、勉強してみたら良いと思います。

 

ja.wikipedia.org

 

ja.wikipedia.org

 

ja.wikipedia.org

 

Lispを勉強した後であれば、LispPrologの処理系を実装できます。

(「On Lisp」という本で紹介されています。)

 

www.asahi-net.or.jp

 

Prologの教材
Prolog(プロログ)を学ぶ―文化とその実践

Prolog(プロログ)を学ぶ―文化とその実践

 

 

Logic Programming with Prolog

Logic Programming with Prolog

 

 

www.nct9.ne.jp

 

bach.istc.kobe-u.ac.jp

 

nw.tsuda.ac.jp

 

Prologを使う必要性、興味があれば論理型も深く勉強してみたら良いと思いますが、特段の事情がなければ、別の勉強に時間を使いましょう。

 

プログラミングの理解を深めるための数学

先にも説明した通り、コンピューターは計算機です。

そのため、プログラミングの出発点には数学があります。

 

プログラミングに関係している数学の分野はいろいろありますが、

  1. ラムダ計算
  2. 圏論

の二つは、独学でも勉強したら、プログラミングに対する理解が深まって良いと思います。

数学は理解に時間がかかるものなので、時間があるときにじっくり取り組み、複雑なパズルを解くつもりで楽しんでください。

 

ラムダ計算

ja.wikipedia.org

 

ラムダ計算(ラムダけいさん、lambda calculus)は、計算模型のひとつで、計算の実行を関数への引数の評価(evaluation)と適用(application)としてモデル化・抽象化した計算体系である。

 

ラムダ計算の仕組み自体はシンプルなので、順を追って丁寧に説明されたら、中学生レベルの代数の知識でも何とか理解できます。

 

nowokay.hatenablog.com

 

language-and-engineering.hatenablog.jp

 

ラムダ計算の教材

Rubyでラムダ計算を説明してる本

 

・本格的なラムダ計算の教科書

計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)

計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)

 

 

・ラムダ計算の入門

www.youtube.com

 

関数型プログラミングは、ラムダ計算が基礎になっていることが理解できればOKです。

 

圏論

Haskellを勉強したとき、「ファンクター」や「モナド」という仕組みが出てきましたね。

これは、背景に「圏論」という考え方があります。

 

ja.wikipedia.org

 

圏論(けんろん、category theory)は、数学的構造とその間の関係を抽象的に扱う数学理論の 1 つである。

考えている種類の「構造」を持った対象とその構造を反映するような対象間の射の集まりからなる圏が基本的な考察の対象になる。

 

Haskell圏論の対応

  • 型 → 対象
  • 関数 → 射

 

圏論(というか数学自体)は、抽象的な話で、分かりづらいです。

圏論の理論を学んだら、具体的な応用事例としてプログラミングに当てはめてみると理解が深まります。

圏論を適用した具体例として、Haskellの他にデータベース理論もあります。

 

qiita.com

 

m-hiyama.hatenablog.com

 

圏論の教材

圏論の教材を紹介しているまとめ記事

qiita.com

 

圏論の基本(用語や概念)が簡潔に紹介してある入門書

圏論の道案内 ~矢印でえがく数学の世界~ (数学への招待シリーズ)

圏論の道案内 ~矢印でえがく数学の世界~ (数学への招待シリーズ)

 

 

圏論創始者による解説本(難しい)

圏論の基礎

圏論の基礎

 

 

圏論の概要を紹介した動画

www.youtube.com

 

モナドの説明動画

www.youtube.com

 

圏論の講座(日本語)

www.youtube.com

 

圏論の講座(英語)

www.youtube.com

 

・「射」「関手」「自然変換」を3種類の矢印で表した分かりやすい説明

http://www.phys.cs.is.nagoya-u.ac.jp/~tanimura/lectures/tanimura-category.pdf

 

Haskellを例にした圏論の説明。(Haskellを勉強した後だと分かりやすいかも)

プログラマーのための圏論(上) - bitterharvest’s diary

プログラマーのための圏論(中) - bitterharvest’s diary

プログラマーのための圏論(下) - bitterharvest’s diary

 

・本格的な圏論の説明 

alg-d.com

 

まとめ

  • プログラミング学習は、攻略の順番を考える。
  • 最初は「命令型」を攻略する。
  • 次に「宣言型」を攻略する。
  • 宣言型は、「問合せ型」「関数型」「論理型」の順番で攻略する。(論理型は省いてもOK)
  • 「命令型」と「宣言型」を学んだら、背景にある数学の理論も学んでみる。
  • 「ラムダ計算」、「圏論」を学べば、プログラミングの仕組みがよく理解できるようになる。

f:id:jsstudy:20190917010207p:plain

関数型以降の勉強は徐々に複雑になっていきますが、プログラミングの理解を深めたいと思うなら、学んで損はないと思います。

数学も学ぶと、最近流行のブロックチェーンやAIなども、よく理解できるようになります。

 

大切なことは、まず最初に興味を持って、楽しく勉強することです。

どんな勉強でもそうですが、対象に興味が持てないなら、つまらない時間になってしまう可能性があるのでご注意ください。

 

(記事が長くなったので、設計に関する話は別の機会に譲りたいと思います。)