JavaScript勉強会

JavaScriptの学習日記

ハッカーと画家

最近、「関数型プログラミングを学ぶ場合、教材は何がいいのか?」と考えてました。

検討する中で、Lispを推奨していたポール・グレアム氏の「ハッカーと画家」という本を思い出しました。

 

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

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

 

 

以前読んだときは、あまりピンと来なかったけど、改めて読み直してみると、結構いいこと書いてあったんだな!と印象が変わりましたw

関数型プログラミングを学ぶときのモチベーションアップのために、本書を参考にしてみたいと思います。

 

英語原文と日本語訳

ハッカーと画家」は、英語の原文がネットで公開されてました。

日本語訳も一部が公開されてました。

本に掲載されてないエッセイ(英語原文)もたくさんあったので、備忘録としてメモ。

 

 

目次

第0章 メイド・イン・USA

アメリカ人が車を作るのが下手なのとソフトウェアを書くのが得意なのは、同じ理由による。だがアップルの存在は、両方を改善してゆけるヒントだ。

 

第1章 どうしてオタクはもてないか

彼らはゲームに乗っていない。

 

第2章 ハッカーと画家

ハッカーは、画家や建築家や作家と同じ、ものを創る人々だ。

 

第3章 口にできないこと

異端的な考えを思い巡らせ、それをどう使うか。

 

第4章 天邪鬼の価値

ハッカーはルールを破ることで勝つ。

 

第5章 もうひとつの未来への道

Webべースソフトウェアは、マイクロコンピュータの登場以来最大のチャンスだ。

 

第6章 富の創りかた

裕福になる最良の方法は富を生み出すことだ。そしてべンチャー企業はその最良の方法だ

 

第7章 格差を考える

収人の不均一な分布は、広く考えられているほど問題ではないのではないか。

 

第8章 スパムへの対策

最近まで、専門家の多くはスパムフィルタは成功しないと考えていた。この提案がそれを変えた。

 

第9章 ものつくりのセンス

素晴らしいものを創るにはどうすればよいか。

 

第10章 プログラミング言語入門

プログラミング言語とは何か。それはなぜ盛んに話題になるのか。

  • (日本語訳) なし
  • (英語原文) なし

※この章は、ポール・グレアム氏のWebサイトに、該当記事が見当たらないみたい? 

Paul Graham - Programming Languages Explained

What a programming language is and why they are a hot topic now.


第11章 百年の言語

百年後にはどういうふうにプログラミングをしているだろう。今からでもそれを始められないだろうか。

 

第12章 普通のやつらの上を行け

Webべースアプリケーションでは、自分の使いたい言語を使うことができる。ライバルも同様だ

 

第13章 オタク野郎の復讐

技術の分野では、「業界のべストプラクティス」は敗北へのレシピだ。

 

第14章 夢の言語

良いプログラミング言語とは、ハッカーがやりたいことをやれる言語だ。

 

第15章 デザインとリサーチ

研究は独自性が必要だ。デザインは良くなければならない。

 

第16章 素晴らしきハッカー

ほかより飛び抜けて優れたプログラマがいる。そんな素晴らしいハッカーたちはどういう人物なんだろう。

 

ポール・グレアム

ポール・グレアム - Wikipedia

ポール・グレアム(Paul Graham、1964年 - )は、米国のLispプログラマーでエッセイスト。『ANSI Common Lisp』や『ハッカーと画家』の著者としても知られている。

 

f:id:jsstudy:20181109080119j:plain

 

人物・来歴
コーネル大学哲学の学士号を取得し、ハーバード大学コンピュータサイエンスの分野の修士号(1988年)と博士号(1990年)を取得した。また、ロードアイランドデザインスクールとフィレンツェの美術学校で絵画を学んだ。

 

1995年にロバート・モリスと最初のASPであるViawebを創立。Common Lispで書かれたViawebソフトウェアでは、ユーザーがインターネットストアを作成することが出来た。1998年、ViawebはYahoo!の45万5000株(4960万ドル相当)と交換でYahoo!に買収され、同製品はYahoo!Storeとなった。

 

この頃から彼は自身のウェブサイトであるpaulgraham.comでエッセイを書き始めた。彼の書くエッセイは、Lispと他のプログラミング言語を比較した「普通のやつらの上を行け」から、高校でのオタクの生活を論じた「どうしてオタクはもてないか」まで至る。彼のエッセイは『ハッカーと画家(英語版)』としてまとめられて出版されている。Googleの英語サイトで「essays(エッセイ)」と検索すると、2010年4月7日現在では彼のエッセイのリストが最初に表示される。

 

2005年にハーバードコンピュータ協会で行った講演は、「スタートアップの始め方」として公開された。グレアムはトレバー・ブラックウェルとジェシカ・リビングストン、ロバート・モリスと共に、スタートアップ企業(特に若い人によって開始され、とりわけ技術志向の企業)へのシードファンディングを提供することを目的としたY Combinatorを創立した。Y Combinatorは現在38のスタートアップ企業への投資を行っている。投資先の企業の中で最も良く知られている企業はredditとlooptである。

 

ポール・グレアム氏は「Yコンビネーター」の創設者としても有名ですね。

 

Yコンビネータ (企業) - Wikipedia

YコンビネータLLC(Y Combinator LLC)は、カリフォルニア州マウンテンビューのベンチャーキャピタルである。主にスタートアップ企業に対し投資している。2005年にポール・グレアム、ロバート・T・モリス、トリヴァー・ブラックウェル、ジェシカ・リヴィングストンにより設立された。

他のスタートアップファンドと比較した場合、Yコンビネータは非常に少ないお金 (2万ドル前後) を提供するのが特徴である。3カ月にわたって集中的に指導し他のベンチャーキャピタルなどから投資を受けられる状態まで育てる。これはグレアムの哲学に依るものである。2011年までに約316社に投資を行っている。

 

出資した企業

 

www.ycombinator.com

 

Yコンビネーター シリコンバレー最強のスタートアップ養成スクール

Yコンビネーター シリコンバレー最強のスタートアップ養成スクール

 

 

Lispの教材

関数型プログラミング言語はいろいろあるけど、日本語の分かりやすい教材が揃っているものが学習しやすいですね?

  1. LispScheme、Racketなど派生言語も含む)
  2. OCaml
  3. Haskell

という順番で練習してみたら、スムーズにステップアップできるような気がします。

 

Lispは、「Common Lisp」が現在の標準ですが、言語仕様が巨大なので学習コストがデカいと思います。(学習教材としては不向き?)

Lispの方言(派生言語)だと、「Scheme」や「Racket」は言語仕様がコンパクトなので=最初に覚えるべきルールが少ないので、学習教材に向いてるかも?

 

Racket - Wikipedia

Racket (旧称 PLT Scheme) は、Schemeから派生したプログラミング言語である。

 

歴史

Racket を開発したPLT project は、1990年代中ごろに, Matthias Felleisenによってまず研究グループとして立ち上げられ、その後すぐに、プロジェクトは初心者プログラマ向けの教育用マテリアル(レクチャー、演習課題や自由課題、ソフトウェア)を製作するのに注力した。 1995年1月, グループは教育用途のプログラム環境を開発することにした。 Matthew Flatt はlibschemeのMrEdと、wxWidgets、およびいくつかのフリーなシステムをバンドルした。開発の決定から何年かかけて、Flatt, Robby Findler, Shriram Krishnamurthi, Cormac Flanaganら数多くの人々によるチームによって、 Scheme初心者向けプログラミング環境・ソフトタイピングの実験環境DrSchemeが作られた。

同時に, PLTのチームは高校教師向けのワークショップを行い、プログラムデザインと関数プログラミングを指導した。. この場での教師や生徒とのやりとりは、 開発の方向付けについて重要な手がかりを与えた。

数年に渡って、教育用言語, algebraic stepper, 透過的なREPL, constructor-based printer, など多くの改善点が DrSchemeに加わり、アプリケーションとして十分な質を備えた教育的プログラミング開発環境が完成した。2001年には, 中心的なチーム (Felleisen, Findler, Flatt, Krishnamurthi) により、プログラミング教育の思想に基づいて、彼らの初めて教科書How to Design Programsを出版した。

 

 

Realm of Racket: Learn to Program, One Game at a Time! (English Edition)

Realm of Racket: Learn to Program, One Game at a Time! (English Edition)

 

 

関数型プログラミング

関数型プログラミングは、一言でいうと「写像をつなげてプログラムを書くこと」だと思います。(「写像」=「関数」なので、単に言い換えただけ)

 

写像 - Wikipedia

写像(しゃぞう、mapping, map)とは、二つの集合が与えられたときに、一方の集合の各元に対し、他方の集合のただひとつの元を指定して結びつける対応のことである。

函数関数)、変換、作用素、射などが写像の同義語として用いられることもある。

 

f:id:jsstudy:20181109074152p:plain

 

手続型(構造化プログラミング)と関数型の仕組み/機能を対応させると、

  • 順次 → 合成
  • 反復 → 再帰
  • 分岐 → パターンマッチ

という具合に、同じ処理ができると分かります。

このうち、もっとも基本となる「関数の合成」は「写像の組合せ」であり、手続型でいうところの「メソッドチェーン」みたいなもんですね?

 

JavaScriptは、関数をデータとして扱えます。(=第一級オブジェクト)

JavaScriptでも、関数型プログラミングの書き方(合成、再帰、パターンマッチなど)ができます。

JavaScriptの関数型ライブラリーや関数型を使うフレームワークもあるので、活用する機会が増えそうですね?

 

JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ (impress top gear)

JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ (impress top gear)

 

 

ポール・グレアム氏のエッセイは「ハッカーと画家」以外にもたくさんあります。

Essays http://www.paulgraham.com/articles.html

 

他にも面白そうな記事があるので、時間があったら読んでみよう。

プログラミングやスタートアップに関する知的好奇心を刺激する示唆に富んでいるので、モチベーションアップの参考にしてみたいと思います。