最近話題になっていた関数型プログラミングに目覚めた! IQ145の女子高校生の先輩から受けた特訓5日間という本を読んだ。
内容について
内容は関数型プログラミング+JavaScriptライブラリ+哲学史+ラノベ。
関数型プログラミングとJavaScriptライブラリはわかるがなぜ哲学史?と思われるかもしれないが著者のあとがきなどによると読者に「ものごとの考え方を変える」重要性に触れてもらいたいため哲学史を追加したそうだ。
またラノベパートについては「ライトノベルというパッケージを入れ、天才美少女にならばダサい考え方を変えなさいとダメ出しされても受け入れられるのではないか?」とそのように考えたため加筆したそうだ。
しかし、ラノベパートは本筋とは関係がない箇所の話が非常につまらなかったので削ってほしかった。(コナミスポーツクラブやスタバに行くなど)
あと400ページとかなりボリュームがあるので重く、文字数が多めなので平均的な技術書よりも読むのに時間がかかる。(なぜ電子書籍で売られていないのだろう)
目次について
目次は以下のようになっている。
Day1 それは「関数型プログラミング」という新しい世界の幕開けだった
- ラブ・ストーリーは突然に
- 0から9までの数をすべて足すコードを書け
- フローは複雑でバグの元凶
- フローは不要
- フローを書かず論理をそのままコードに書き写せ
- 『神の眼』のスキル レベル0
- 『神の眼』を得るための唯一の方法
- 関数 / function という論理操作
- 関数は論理の最小単位の部品として最上の扱いを受ける
- 問題の論理には結果など含まれていない
- 手順を分割するな、論理を分割せよ
- 『まとまり』は美しい単一の論理構造
- 『まとまり』をまるごと処理ができる関数
- 他の関数を取り扱う能力をもつ関数
- 高階関数の柔軟性
- 論理の最小単位としての関数のちから
- これからの数日間
Day2 『論理世界』と『物質世界』の狭間を見据える 『神の眼』レベル1
- カメレオンガール
- 『関数型プログラミング』のおさらいをする
- 0から9までの数をすべて足すコードを書け
- 0から999までの数をすべて足すコードを書け
- 『神の眼』のスキル レベル0の限界に到達
- 『神の眼』を得るための唯一の方法 もういちど
- 電卓(Calculator)という電子計算機=コンピュータ
- 計算の手順を並べるコード 命令型プログラミングのコード
- 命令型プログラミングのコードは『マシン操作手順書』であり『フローは不要』のフローそのもの
- 計算の命令ではなく論理を並べるコード
- 『フローのない論理の宣言書』である宣言型のコード『宣言型プログラミング』
- 関数型プログラミングをやっていけば自動的に宣言型プログラミングになっていく
- 『神の眼』のコードは宣言型のコード
- 論理と計算の関係への疑問 ソクラテスの『無知の知』
- 『論理』と『計算』は別物 『論理』は人間とは関係なくただそこにある存在、それを人間が明らかにする行為が『計算』
- 『計算』とは『論理』の物質化、ハードウェアモード
- 『論理世界』と『物質世界』を見据える 『神の眼』
- 『物質世界』密着型の命令型プログラミングという原始的パラダイム
- 『論理世界』密着型の宣言型プログラミング
- 命令型のコードでしか動かせないはずのハードウェアが、なぜ宣言型のコードで動くのか?
- 『車輪の再発明』をするな
- プログラミング言語の進化
- JavaScriptが関数型プログラミング言語である理由と再評価された経緯
- プログラミングの未来
- 技術的特異点 『シンギュラリティ』
- 紅茶の時間
- 今から『車輪の再発明』をしよう Back to ハードウェアモード
- 0から9までの数をすべて足すコードを書け reduceの再発明
- 偶数10個を求めよ mapの再発明
- 関数を合成してみる
- 合成関数を生成する関数 composeの再発明
- 『まとまり』生成関数 rangeの再発明
- 0から9までの数をすべて足すコードを書け
- 0から999までの数をすべて足すコードを書け
- 『神の眼』のスキル レベル1
- 『まとまり』という論理構造をまるごと操作する関数ライブラリは、『神の眼』が見透す、宣言型のコードを書くために必須の関数@ハードウェアモード大全集
- 大事なことなのでレベル1の内容をまとめておく
- 『明日』という輝く未来
Day3 論理を世界の中心に据える世界観 世界のすべてを見透す 『神の眼』レベル2
- イパネマの娘
- 三種の神器
- JavaScriptのサーバサイド技術 Node.js (io.js)
- io.js
- 『神の眼』レベル1のおさらい
- 命令型のコードは『フロー』で駆動する『フロー駆動』
- 宣言型のコードは『イベント』で駆動する『イベント駆動』
- 『イベント』とは時間軸上の、ある時間における出来事(イベント)
- 時間のフロー(流れ)が宣言型のコードを駆動する イベント駆動は、時間フロー駆動
- 0から9まで1ずつ増える数をすべて表示せよ
- 『インクリメント』は『計算』であって『論理』ではない
- 宣言型のコードは問題の論理のみを扱い、計算結果は扱わない 問題の論理には結果など含まれていない
- 論理を破壊する代入『破壊的代入』
- 命令型プログラミングのコードの上下左右に、同じ変数が異なる時間をもって異なる値で存在している混乱
- 宣言型プログラミングは参照透過である
- 破壊的代入する命令は、関数にする
- 命令前後の時間で値を変化させていくのではなく、同時に値の複数バージョンをもつ『まとまり』の論理構造を宣言し、まとめて操作する
- 計算や入出力の命令というハードウェアモードのマシン操作は論理の物質化だが、関数でラッピングしてふたたび論理化せよ
- 関数による『副作用』とは?
- 『副作用』NGなのは、関数がもはや自由自在にとりまわせる独立した部品ではなくなると同時に外界を変化させ参照透過でなくすから
- 『参照透過』と一緒に覚えておきたいワード『イミュータブル』
- 『神の眼』が見透す、限りなく透明でクリアな世界 宣言型のコードはイミュータブルで見透しが良い参照透過な論理の世界
- 論理≠計算『必要な時に必要な分だけ計算する方法』
- 論理=計算『手当たり次第の計算方法』
- JavaScriptの計算方法=『手当たり次第の計算方法』+『必要な時に必要な分だけ計算する方法』
- JavaScript は根本では、『論理』と『計算』が一緒くたになった『手当たり次第の計算方法』
- もしもJavaScriptが『必要な時に必要な分だけ計算する方法』で全部やる言語であったならば?『論理』と『計算』の完全なる分離
- 十分な休息と栄養が必要
- 今日のこれまでの復習
- 0から9までの数をすべて足すコードを書け
- 『手当たり次第の計算方法』は『必要な時に必要な分だけ計算する方法』より考え方に大きな制限がある
- 『神の眼』のスキル レベル1の限界に到達
- 『物質世界』は『論理世界』の影のような存在にすぎない
- ソクラテスの弟子プラトンによる『イデア論』
- ピタゴラス学派『論理』が万物の根源であり世界の中心である 『イデア』
- 『ない』と『無限』というイデアは特殊
- 『物質世界』密着型の命令型プログラミングの『手当たり次第の計算方法』では、コードにすべての『イデア』は表現できない
- 『論理世界』密着型の宣言型プログラミングの『必要な時に必要な分だけ計算する方法』では、コードにすべての『イデア』が表現できる
- JavaScriptで『関数』のみならず、『まとまり』にも『必要な時に必要な分だけ計算する方法』を適用してやる
- Facebook発の関数ライブラリ Immutable.js
- AtomエディタとNode.jsでやってみる
- 自然数という無限数列をつくる
- フィボナッチ数列という無限数列をつくる 黄金比の数列
- 『必要な時に必要な分だけ計算する方法』で使うメモ化
- 自分で自分自身を抱え込む関数 再帰関数
- 再帰関数をメモ化する
- 『神の眼』のスキル レベル2
- 7月のプラネタリウム
- ピタゴラス学派の『地動説』
- アリストテレスの『天動説』
- ガリレオ・ガリレイは、アリストテレスの『天動説』をひっくり返そうとした
- 『美しい未来』への招待
Day4 神はあまねく存在する 『神の眼』レベル3【最終レベル】
- ブレーメンの音楽隊
- 『神の眼』レベル2のおさらい
- バウムクーヘンと『地動説』と『天動説』
- ピタゴラス学派の『地動説』
- アリストテレスの『天動説』
- 『考え方』『ものの見方』を重視した偉人、アラン・ケイとスティーブ・ジョブズ
- 『ユーザ』を重要視し『グラフィカルユーザインターフェース』を発明した、パーソナルコンピューティングの父 アラン・ケイ
- 『Think different』 稀代のビジョナリー スティーブ・ジョブズ
- 『Think different』『ものの見方を変える事はIQ80ポイントに匹敵する。』
- デスクトップ上のアイコンは『オブジェクト』という『物質』であり『計算機』
- アラン・ケイによるオブジェクト指向『論理は物質の手足である』メッセージング
- アラン・ケイの宇宙観 『自由意志』が宇宙に命令する
- 超合理的に疑い続けた結果、『精神世界』を発見したデカルト 『精神』『物質』『論理』の三元論
- 『精神』『物質』『論理』の3つを『論理』へ一元化し『自由意志』を否定したスピノザの決定論的宇宙 神はあまねく存在する『汎神論』
- 自由意志と決定論的宇宙『神はサイコロを振らない』 アインシュタイン
- スピノザの『汎神論』と仏教の『空の思想』
- 『神の眼』のスキルの『神』は『スピノザの神』
- 『必要な時に必要な分だけ計算する方法』で『状態を保持しない』『参照透過』な『論理が物質を支配する』『論理中心主義』の関数型プログラミング
- 『あらかじめ計算して物質化したまま状態を保持する方法』で『論理は物質の手足である』『物質中心主義』のオブジェクト指向
- オブジェクト指向の三元論であるMVC
- アラン・ケイという権威とオブジェクト指向、MVCモデルというドグマ(教条)
- 『神の眼』のスキル レベル2の限界に到達 最終レベル・パラダイムシフトへ
- 部活動は一旦休憩にしてランチ
- 『フロー』の分離『スレッド』
- マルチスレッドと問題点
- 関数型プログラミング、宣言のコードはシングルスレッド
- シングルスレッドのイベント駆動のサーバサイド技術 Node.js (io.js)
- Node.jsサーバの『車輪の再発明』
- 非同期処理とは、宣言型のイベント駆動
- 同期処理とは、命令型のフロー駆動
- 関数型クラウドコンピューティング AmazonWebService Lambda 次世代クラウドコンピューティングの新しい潮流
- 関数型プログラミングとUI(ユーザインターフェイス)
- 『論理世界』に『物質世界』のUIが追随するアプリは身近にある! 表計算アプリ
- 『物質世界』全部まるごとひとつの『まとまり』にしてバージョンナンバーをつけたら?それは『時刻』になる
- 表計算アプリのA1…..B1…..は、すべて同じ『時刻』という世界のバージョンナンバーを共有しているイミュータブルなデータ
- あなたもわたしも世界の一部だから『時刻』という世界のバージョンナンバーを共有している
- コードを観る眼の世界観
- 『あなたの意識』も『時間フロー』で一緒に時間軸上で遷移していくから、時計が動いて見える
- 『今』という『意識』とセットの時間軸上のイミュータブルなデータ 世界のすべてはイミュータブル
- 時間軸上の『まとまり』についてまとめて操作する関数のほんとうの正体
- 『神の眼』の視点で俯瞰する、静止した『物質世界』と『精神世界』
- 『論理中心主義』の世界観で表計算アプリを書く
- 表計算アプリ index.html
- 表計算アプリ index.js
- 『神の眼』のスキル 全能レベル 関数型リアクティブ・プログラミング(FRP)
- ティーポットが空
- 必要な時に必要な分だけ計算される『まとまり』や『部品』のことを『コンポーネント』と呼ぶ
- オブジェクト=あらかじめ計算して物質化した『状態』を保持し、外部に命令するミュータブルな計算機 命令型
- コンポーネント=必要な時に必要な分だけ計算されるイミュータブルな論理構造 宣言型
- FRPのUI設計は、『オブジェクト』で命令するのではなく、『コンポーネント』で論理的に宣言し、合成して組み上げる
- Webページのドキュメントを記述するHTMLのツリー構造
- DOMというWeb世界標準のAPI これまでWebは、命令型の『オブジェクト』をUIの標準モデルとしてきた
- UI『オブジェクト』モデルの『コンポーネント』化する技術、仮想DOM(Virtual DOM)
- 次世代Web世界標準 Facebook-React
- Why React? なんでそんなことをFacebookが試みたのか?
- Facebookの技術者はMVCというオブジェクト三元論のモデルを否定し、DOMという『物質』を、コンポーネントという『論理』の影に追いやり、『論理』への一元化を試みた
- 5分くらいは考えろ Give It Five Minutes
- Reactの方針を公式サイトで確認する
- jQueryはもう使わない
- Hello John A Simple Component
- Reactでは、HTML/XMLタグがJavaScriptコードに混在する
- 複数のコンポーネントを合成(compose)して使う
- 時間軸上でイミュータブルなReactのタイマー
- render
- componentDidMount
- tickのsetState 時間軸上のイミュータブルなバージョン操作
- getInitialState
- componentWillUnmount
- FRPはGUIだけではない
- 『物質世界』で時間遷移する『まとまり』のバージョンナンバーは『時刻』である
- Reactは、時間軸上に偏在する『コンポーネント』のあらゆるバージョンの内たったひとつのBeforeAfterの論理関係のみを宣言している
- 『過去』『現在』『未来』、時間軸上の『全部』のバージョンを扱う
- timecomponent タイムコンポーネントで時間軸上の全部のバージョンを扱う
- timecomponent タイムコンポーネントでFRP
- timecomponent タイムコンポーネントで過去にアクセスし、1秒前の過去をリアルタイム再生する
- timecomponent タイムコンポーネントの合成 イベントの合成 マウスドラッグのイベント
- 『神の眼』のスキル
- メキシカン
- 明日は学校
Day5 『今』が大事
- Sunchyme(サンシャイム)
- 関数型プログラミングとオブジェクト指向プログラミングの関係性
- 関数型プログラミングに『マルチパラダイム』みたいなものは存在しない
- 関数型プログラミングでオブジェクトを作る仕組み クロージャ
- FRPの関数ライブラリ
- Atom Shellでデスクトップアプリ
- 海へ行こう
目次を見てもわかるとおりこの本は関数型プログラミング以外のことも書かれている。
そのため関数型プログラミングの内容が少なく関数型プログラミングに目覚めたい!という人には向かない。
読者が求める内容と一致しないことが多いせいかAmazonカスタマーレビューの星評価は全体的に低くなっている。
reduce関数を使用する際の注意
本書では論理操作の組み合わせの設計だけのredece関数を使用したほうがforを使用するのと比べて状態変数がないためバグが発生しづらく、手順ではなく論理を分割したほうがクールだと書かれている。
この点においては異論はないがreduce関数はIE8以下では使用できないためPCサイトで使用する際は注意が必要だ。
var plus = function(a, b) { return a + b; }; var s = [1,2,3,4].reduce(plus); console.log(s); // => 10 (IE8以下では表示されない)
本書にはreduce関数を自前で作成する方法も記載されている。こちらの関数であればIE8以下でも使用できる。
var plus = function(a, b) { return a + b; }; var reduce = function(array, f) { for (var i = 0; i < array.length; i++) { if(i === 0) { m = array[0]; } else { m = f(m, array[i]); } } return m; }; var s = reduce([1,2,3,4], plus); console.log(s); // => 10 (IE8以下でも表示される)
さらにUnderscore.jsにはreduceが用意されていてこちらもIE8以下で使用できる。車輪の再発明にならないようUnderscore.jsを読み込んでいる場合はこちらを使用するのが望ましい。
var plus = function(a, b) { return a + b; }; var s = _.reduce([1,2,3,4], plus); console.log(s); // => 10 (IE8以下でも表示される)
第1章が勘違いを加速させる
著者の岡部健氏のブログに本書のDay1(第1章)が無料で公開されている。Day1はreduce関数などを使用して関数型プログラミングの基礎を中心に書かれている。
これを読んだ人はDay2以降も関数型プログラミングがたくさん出てきて後半には応用まで学べると思ってしまう。
しかし、実際はDay2までは関数型プログラミングを中心に学ぶことになるがDay3からは主人公が先輩とスポーツジムなどに行くという関数型プログラミングとは関係のない話が11ページ続く。(しかも内容がつまらない)
またDay3以降は哲学史がたびたび関数型プログラミングの合間に入ってくるのでここは好き嫌いが分かれそうだ。
総評
1300円と技術書にしては安いし関数型プログラミング(基礎)+JavaScriptライブラリ+哲学史の本として見れば決して悪くない本。星1つというのは明らかに過小評価。個人的にはおもしろかったです。
しかし、関数型プログラミングだけを学びたい人には絶対におすすめできない。
関数型プログラミングの本に関してはすでにオライリーからJavaScriptで学ぶ関数型プログラミングという本が出版されているのでこちらを読んだほうが良い。
2015年5月 とあるスターバックスにて
エクストラコーヒー・ノンホイップ・ダーク・モカ・チップ・フラペチーノのトールサイズを飲みながら投稿