で、次は何がくるの? - 第2回 TIS Matsuri

38
で、次は何がくるの で、次は何がくるの? kawasima

description

社内イベント向けのスライドです。Clojureモノノフを増やすために若干の他言語比較がありますが、ディスりの意図は決してございません。

Transcript of で、次は何がくるの? - 第2回 TIS Matsuri

Page 1: で、次は何がくるの? - 第2回 TIS Matsuri

で、次は何がくるので、次は何がくるの??

kawasima

Page 2: で、次は何がくるの? - 第2回 TIS Matsuri

TechnologyTrends

Page 3: で、次は何がくるの? - 第2回 TIS Matsuri

Post Javaの時代

Scala?

NodeJS?

Ruby?

Groovy?

Java8?

Kotlin?

Ceylon? Go?

Page 4: で、次は何がくるの? - 第2回 TIS Matsuri

Different cars, same road● 多重継承もMix-inもインタフェースも大した違

いなんてねーよ● 動的型付けだろうが、静的型付けだろうが、

ダメプログラマはゴミコードを書く● 文末セミコロンもインデントスタイルもブ

ロックも、個人の趣味でしかないって● クロージャもインナークラスも大差ないっ

て。Java8ラムダに何期待してんの?http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf

注) Rich Hickeyのスライドに大いに煽り成分を加えてあります。要は表面的な違いしかないってことです。

Page 5: で、次は何がくるの? - 第2回 TIS Matsuri

マルチコア と クラウド

たくさんあるコンピュータを

いかに使いこなすか?

Matz ( https://engineer.type.mag.jp/article/matz )

Page 6: で、次は何がくるの? - 第2回 TIS Matsuri

Concurrencyへの対応シンプルさにどれだけ配慮できているかが重要● レースコンディションは複雑さに起因して発

生するものである。● 状態とふるまいとアイデンティティと時間軸

が組み合わさる、現在のオブジェクト指向は暗黙的な複雑さの源泉である。

Page 7: で、次は何がくるの? - 第2回 TIS Matsuri

シンプルとは

One role

One task

One concept

One dimension

https://github.com/richhickey/slides/blob/master/simplicitymatters.pdf

Page 8: で、次は何がくるの? - 第2回 TIS Matsuri

シンプルとイージーは違う

イージーとは、「少ない手数でやりたいことを実現する」ということ。

– apt-get / yum– gem install

https://github.com/richhickey/slides/blob/master/simplicitymatters.pdf

Page 9: で、次は何がくるの? - 第2回 TIS Matsuri

時代はイミュータブル

Immutable Infrastructure

Concurrency and Parallelism

Immutable database

Versionable API Git

Page 10: で、次は何がくるの? - 第2回 TIS Matsuri

イミュータブル is シンプル

これがマルチコア / クラウド 時代には

最も重要な概念になってくる

Page 11: で、次は何がくるの? - 第2回 TIS Matsuri

イミュータブル時代のプログラミング言語

Page 12: で、次は何がくるの? - 第2回 TIS Matsuri

Clojure

Page 13: で、次は何がくるの? - 第2回 TIS Matsuri

Clojure is simple

Clojure Scalahttp://java.dzone.com/articles/my-scala-vs-clojure-impression

Page 14: で、次は何がくるの? - 第2回 TIS Matsuri

Clojure is LISP

シンプルさを追求したがゆえのLISPという選択肢

プログラム = データ(同図像性)

関数型で状態をもたない

Page 15: で、次は何がくるの? - 第2回 TIS Matsuri

LISP or Not Lisp

世の中の言語は2種類しかない。LISPか、LISPでないか

Page 16: で、次は何がくるの? - 第2回 TIS Matsuri

Clojure runs on JVM

(javax.swing.JOptionPane/showMessageDialog nil “Hello World”)

SIerが気にするJavaとの接続性

http://clojure.org/getting_started

Page 17: で、次は何がくるの? - 第2回 TIS Matsuri

Clojure is イミュータブル

コレクションもすべてイミュータブル

(def my-map {:fred “ethel”})

(assoc my-map :ricky “lucy”)=> {:ricky “lucy”, :fred “ethel”}

my-map=> {:fred “ethel”}

Page 18: で、次は何がくるの? - 第2回 TIS Matsuri

他言語のイミュータブルへの取組み

どっちもできるよ。 var ミュータブル val イミュータブル使う側が選べてほら便利!

freezeメソッド呼べばイミュータブルにできるからー

irb(main):001:0> map = {:a => 1, :b => {:c => 3}}.freeze=> {:a=>1, :b=>{:c=>3}}irb(main):002:0> map[:b][:c] = "A"=> "A"irb(main):003:0> map=> {:a=>1, :b=>{:c=>"A"}}

Page 19: で、次は何がくるの? - 第2回 TIS Matsuri

SIerで使いにくい多様なイミュータブル

非同期アクセスされる可能性のあるコレクションはイミュータブルな型を使うこと。イミュータブルなコレクションとは、List, Stream, Vector, Stack, Queue, Range, HashMap, TreeSet, TreeMap, …である。よくわからなければ、Vectorを使うこと。

こんなコーディング規約ができることが想像される。

Page 20: で、次は何がくるの? - 第2回 TIS Matsuri

思想のレベルでイミュータブル

そもそもイミュータブルな型しかない

ミュータブルな感じで使いたいときは、参照(ref)を作って、参照先の値を切り替える

Page 21: で、次は何がくるの? - 第2回 TIS Matsuri

イミュータブルなモデルアイデンティティと状態の分離

1984 2000

F F

2014

Identity

Value

State State State

Pure Function

Epochal Time Model

Pure Function

http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf

Page 22: で、次は何がくるの? - 第2回 TIS Matsuri

性能面での配慮

コレクションに要素追加するたび、新しいコレクションが作られていたら、メモリ喰うし遅いんじゃないの?

Page 23: で、次は何がくるの? - 第2回 TIS Matsuri

Bit-Partitioned Hash Tries変更のあった部分木だけ新たに作り、それ以外は共有する

変更も削除も検索もO(1)

0 1 2 3 4

7

4 5

5

6

http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf

Page 24: で、次は何がくるの? - 第2回 TIS Matsuri

Refsモデル状態はイミュータブルなデータへの参照として扱う

foo

:a “fred”

:b “ethel”

:c 42

:d 17

:e 6

@fooIdentity

value

http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf

Page 25: で、次は何がくるの? - 第2回 TIS Matsuri

STM参照の切り替えはロックなしに実行される

v0

V1'

v0

F

F

v1

v0

v1

v2

Transaction

v0でないのでCommit失敗

V1'F

value

Ref

Ref copy

V2'

Commit成功

Page 26: で、次は何がくるの? - 第2回 TIS Matsuri

Clojureのはじめかた

いま世界でもっともナウいエディタ

LightTable

Page 27: で、次は何がくるの? - 第2回 TIS Matsuri

イミュータブル時代のWebフレームワーク

Page 28: で、次は何がくるの? - 第2回 TIS Matsuri

Darzana

https://github.com/kawasima/darzana/

Page 29: で、次は何がくるの? - 第2回 TIS Matsuri

Webサイト運用の課題● Viewテンプレートを書き換えるだけなのに、サーバ再起動が必要になる。(Java)

● ちょっとした変更でも開発者の手が必要。● サイト運用者で変更可能にしたいけど、リテ

ラシー的にバージョン管理ができない問題

Page 30: で、次は何がくるの? - 第2回 TIS Matsuri

特長● ViewもControllerも再起動いらずのデプロイ

– それでいて性能はJavaと同等

● サイト運用者が簡単に安全にViewやControllerを編集できる– それでいて、熟練プログラマにもやさしい

● 変更は自動的にGitでバージョン管理される– それでいて、コマンドラインでのgit操作も可能

Page 31: で、次は何がくるの? - 第2回 TIS Matsuri

API First● データソースはWeb APIを前提とする。

– イミュータビリティが保ちやすい● 複数バージョンを使いわける

– ナウいから

Page 32: で、次は何がくるの? - 第2回 TIS Matsuri

Architecture

API ExecutorDarzana router

Ring

Redis

Jetty Tomcat HttpKit

Compojure Handlebars Template

API

Page 33: で、次は何がくるの? - 第2回 TIS Matsuri

Template● テンプレートにはHandlebarsテンプレートを

利用する。– 将来的にクライアントサイドでもレンダリングが

可能に!

Page 34: で、次は何がくるの? - 第2回 TIS Matsuri

Router● いわゆるコントローラ● URLに対応してコンポーネントブロックを呼び出す

– API実行 (非同期並列実行が可能)– テンプレートレンダリング– セッション格納– エラーハンドリング– A/B testing

Page 35: で、次は何がくるの? - 第2回 TIS Matsuri

Darzanaにおけるアプリケーションの変更

● 必ずブランチを作って編集– 当然ブラウザから操作可能

● 動作確認後、masterにマージする– 当然ブラウザから操作可能

Page 36: で、次は何がくるの? - 第2回 TIS Matsuri

Demo

Page 37: で、次は何がくるの? - 第2回 TIS Matsuri

試してみるには

Dockerのイメージあります– JavaもClojureもDarzanaもセットアップ済み– VMWareがあれば、会社のマシンでもすぐに試せ

る。– http://index.docker.io/ で「darzana」で検索!

Page 38: で、次は何がくるの? - 第2回 TIS Matsuri

さあ次世代の開発を体験してみよう!