Page 1
Overview of Scala ~Scalaひとめぐり~
2015年9月26日Hacker Tackle
id:daiksy
Page 2
本日の内容
• Scalaの周辺状況
• 採用事例(海外・国内)
• はてなインターンの様子
• Scalaの特徴
Page 3
粕谷 大輔 id:daiksy (@daiksy) 株式会社 はてな
Page 7
• スイス連邦工科大学 (EPFL)のMartin
Odersky(小田好)教授によって設計
• JVMで動作(古の時代は .net Frameworkでも動いた)
• オブジェクト指向と関数型言語のパラダイム
Page 8
daiksyのScala歴
• 2011年 くらいからちょっと触りだす
• 2012年 ~ 2014年 フリュー株式会社
• 2015年 ~ 現在 株式会社 はてな
Page 9
日本でも規模の大きな カンファレンス• 2013年 Scala Conference in Japan
• 2014年 ScalaMatsuri 2014
• 2015年 Scala関西Summit
Page 11
採用事例 (海外)
• Twitter 「Scalaで日本のバルスに耐えた」
(ScalaMatsuri2014にて)
• Linkedin
• Netflix (はてな京都でミートアップ開催)
Page 12
採用事例 (国内)
• ドワンゴ
• サイバーエージェント
• スマートニュース
• TIS (Typesafeとパートナー契約)
• LINE
• ヌーラボ
• はてな
Page 13
Scala != Better Java LLからの移行事例が増加
• チャットワーク PHP -> Scala
• はてなブックマーク Perl -> Scala
Page 14
利用できる主なフレームワーク
• Lift
• Play Framework
• Scalatra
• Skinny Framework
Page 15
はてなサマーインターン 2015
今年からScalaコースを新設
Page 16
はてなサマーインターン Scalaコースのカリキュラム• 1日目 Scalaの言語基礎 & 課題(講師 id:daiksy)
• 2日目 DB講義 & 課題(講師 id:mechairoi)
• 3日目 HTTP, WAF講義 & 課題(講師 id:Songmu)
• 最後の3週間 Mackerelチームでプロダクト開発
他にもJavaScriptやインフラの講義も
Page 17
Scalaの特徴
• JVM上で動作
• 静的な型付けと型推論
• オブジェクト指向
• 関数プログラミング
Page 21
多態性 (オブジェクト指向)
• trait を使って実現
• trait は複数mixinできる
• trait に実装することもできる
Page 22
関数プログラミング
• 関数が第一級オブジェクト
• 副作用を伴わない実装のための機能 • if 式 • for 式 • 抱負なコレクションメソッド
Page 24
副作用とは
• 変数の値を変更する
• オブジェクトのフィールドを変更する(JavaのsetterとかC# のプロパティとか)
• ファイルやデータベースなどに対する入出力
Page 25
副作用のない宣言(immutable)
Page 26
副作用のない宣言(immutable)
• var で宣言すると再代入できる
• val で宣言すると再代入できない
• Scalaはコードスタイルや状況に応じてmutable
とimmutableを使い分けられる
• いわゆる「非純粋関数型言語」
Page 30
コレクション
• List/Array/Map/Set いろいろある
• コレクションには便利なメソッドが山程ある • map/filter/flatMap/find/findAll/reduce • take/drop/exists/sort/sortBy/zip/partition • grouped/groupBy
Page 32
副作用のない実装まとめ
• val で宣言することで変数が再代入できなくなる
• if式 for式 コレクション操作 などを駆使すると、val だけでプログラミングできるようになる
• 慣れるとvar を使わざるを得ない局面で悔しみを感じる
Page 33
Scalaではnullも使わない
• 言語仕様的にはnullは存在する
• Scalaではnullを使わずOption型を使う
Page 34
Option型
• あるかないかわからない値を表現できる型
• Someの中身を使うには明示的に取り出す操作が必要 (ぬるぽに悩まずにすむ)
Page 35
Option型
• 値があるときはSomeでくるむ
• 値がないときはNone
Page 36
Option型
• Optionは型なので、そのまま使おうとするとコンパイルで怒られる
Page 37
Option型のいろいろな 取り出し方
Page 38
Option型
• 要素が0または1のコレクションとみなせる
• flatMap, foreachなどのコレクションのメソッドを持っている
Page 40
今日ご紹介しきれない いろいろな機能• case class
• 強力なパターンマッチ
• 暗黙の変換 (implicit)
Page 42
Scalaは難しい?
• 言語仕様が多いので学習コストは低くない
• 表現力が抱負なので、Better Javaとして書いてもよい (最初はvar使ってもいいのでは)
• 関数プログラミングが難しい? -> 新しいパラダイムの学習は難しい。オブジェクト指向もそれは一緒