Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
takezoe
PDF, PPTX
9,070 views
Non-Functional Programming in Scala
Scala Kansai Summit 2017 #scala_ks
Software
◦
Read more
6
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 57
2
/ 57
3
/ 57
4
/ 57
5
/ 57
6
/ 57
7
/ 57
8
/ 57
9
/ 57
10
/ 57
11
/ 57
12
/ 57
13
/ 57
14
/ 57
15
/ 57
16
/ 57
17
/ 57
18
/ 57
19
/ 57
20
/ 57
21
/ 57
22
/ 57
23
/ 57
24
/ 57
25
/ 57
26
/ 57
27
/ 57
28
/ 57
29
/ 57
30
/ 57
31
/ 57
32
/ 57
33
/ 57
34
/ 57
35
/ 57
36
/ 57
37
/ 57
38
/ 57
39
/ 57
40
/ 57
41
/ 57
42
/ 57
43
/ 57
44
/ 57
45
/ 57
46
/ 57
47
/ 57
48
/ 57
49
/ 57
50
/ 57
51
/ 57
52
/ 57
53
/ 57
54
/ 57
55
/ 57
56
/ 57
57
/ 57
More Related Content
PDF
頑張りすぎないScala
by
takezoe
PPTX
元インフラエンジニアが Scalaを触ってつまづいたところ。
by
takako onoue
PPTX
ScalaでASICやFPGA用の回路を設計するChisel
by
Kei Nakazawa
PDF
Scala界隈の近況
by
takezoe
PDF
[事例紹介]Scalaで物流倉庫システム作ったよ
by
Tomokazu Matsushita
PDF
Scala製機械学習サーバ「Apache PredictionIO」
by
takezoe
PDF
Scala警察のすすめ
by
takezoe
PDF
BigDLでScala × DeepLearning に入門した話
by
hirotakanosato
頑張りすぎないScala
by
takezoe
元インフラエンジニアが Scalaを触ってつまづいたところ。
by
takako onoue
ScalaでASICやFPGA用の回路を設計するChisel
by
Kei Nakazawa
Scala界隈の近況
by
takezoe
[事例紹介]Scalaで物流倉庫システム作ったよ
by
Tomokazu Matsushita
Scala製機械学習サーバ「Apache PredictionIO」
by
takezoe
Scala警察のすすめ
by
takezoe
BigDLでScala × DeepLearning に入門した話
by
hirotakanosato
What's hot
PDF
ユーザーデータ基盤を1からScalaでつくった話し
by
Hideaki Tarumi
PPTX
iOSエンジニアのためのScala入門
by
Masaya Dake
PDF
Scala Daysに行ってみて - あるいはスイス旅行記 -
by
Kota Mizushima
PDF
Scala Performance Tuning Tips
by
Kota Mizushima
PDF
株式会社ドワンゴにおけるScala教育の現状
by
Kota Mizushima
KEY
PlayFramework1.x基礎編
by
Asami Abe
PDF
SIerでScalaを使うために私がしたこと
by
takezoe
PPTX
プロダクトにおけるScala
by
Yuto Suzuki
PPTX
Scala採用の背景とその後 @ hitomedia night #5
by
Jiro Hiraiwa
PDF
JavaからScalaへ
by
takezoe
PDF
Scala.js触ってみた
by
Asami Abe
PDF
足を地に着け落ち着いて考える
by
Ryuji Tamagawa
PDF
[Scalamatsuri2016]あ、社内コミュニティ
by
hirotakanosato
PDF
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
by
Asami Abe
KEY
Scalaはじめました!
by
Asami Abe
PPTX
アドテク企業のScala導入について振り返るlt
by
Jiro Hiraiwa
PDF
Fun tech#14 AlibabaCloud - EDAS(Enterprise Distributed Application Service)
by
Takuya Mihara
PDF
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」開発エンジニア
by
Isamu Suzuki
PDF
ネタじゃないScala.js
by
takezoe
PPTX
Do you like scala
by
Yuto Suzuki
ユーザーデータ基盤を1からScalaでつくった話し
by
Hideaki Tarumi
iOSエンジニアのためのScala入門
by
Masaya Dake
Scala Daysに行ってみて - あるいはスイス旅行記 -
by
Kota Mizushima
Scala Performance Tuning Tips
by
Kota Mizushima
株式会社ドワンゴにおけるScala教育の現状
by
Kota Mizushima
PlayFramework1.x基礎編
by
Asami Abe
SIerでScalaを使うために私がしたこと
by
takezoe
プロダクトにおけるScala
by
Yuto Suzuki
Scala採用の背景とその後 @ hitomedia night #5
by
Jiro Hiraiwa
JavaからScalaへ
by
takezoe
Scala.js触ってみた
by
Asami Abe
足を地に着け落ち着いて考える
by
Ryuji Tamagawa
[Scalamatsuri2016]あ、社内コミュニティ
by
hirotakanosato
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
by
Asami Abe
Scalaはじめました!
by
Asami Abe
アドテク企業のScala導入について振り返るlt
by
Jiro Hiraiwa
Fun tech#14 AlibabaCloud - EDAS(Enterprise Distributed Application Service)
by
Takuya Mihara
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」開発エンジニア
by
Isamu Suzuki
ネタじゃないScala.js
by
takezoe
Do you like scala
by
Yuto Suzuki
Viewers also liked
PDF
Scala の関数型プログラミングを支える技術
by
Naoki Aoyama
PPTX
AtCoderで始めるテスト駆動開発
by
YujiSoftware
PPTX
Javaでマサカリ投げてみた
by
YujiSoftware
PDF
MP in Clojure
by
Kent Ohashi
PDF
Clojure web dev history
by
Ikuru Kanuma
PDF
The best of AltJava is Xtend
by
takezoe
Scala の関数型プログラミングを支える技術
by
Naoki Aoyama
AtCoderで始めるテスト駆動開発
by
YujiSoftware
Javaでマサカリ投げてみた
by
YujiSoftware
MP in Clojure
by
Kent Ohashi
Clojure web dev history
by
Ikuru Kanuma
The best of AltJava is Xtend
by
takezoe
More from takezoe
PDF
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
by
takezoe
PDF
Scala Warrior and type-safe front-end development with Scala.js
by
takezoe
PDF
Excel方眼紙を支えるJava技術 2015
by
takezoe
PDF
Play2実践tips集
by
takezoe
PDF
GitBucket: The perfect Github clone by Scala
by
takezoe
PDF
GitBucket: Open source self-hosting Git server built by Scala
by
takezoe
PDF
そんなトランザクションマネージャで大丈夫か?
by
takezoe
PDF
markedj: The best of markdown processor on JVM
by
takezoe
PDF
Tracing Microservices with Zipkin
by
takezoe
PDF
Type-safe front-end development with Scala
by
takezoe
PDF
Scala Frustrations
by
takezoe
PDF
How to keep maintainability of long life Scala applications
by
takezoe
PDF
Java9 and Project Jigsaw
by
takezoe
PDF
Reactive database access with Slick3
by
takezoe
PDF
Testing Distributed Query Engine as a Service
by
takezoe
PDF
Scala Frameworks for Web Application 2016
by
takezoe
PDF
Revisit Dependency Injection in scala
by
takezoe
PDF
Macro in Scala
by
takezoe
PDF
GitBucket: Git Centric Software Development Platform by Scala
by
takezoe
PDF
Journey of Migrating Millions of Queries on The Cloud
by
takezoe
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
by
takezoe
Scala Warrior and type-safe front-end development with Scala.js
by
takezoe
Excel方眼紙を支えるJava技術 2015
by
takezoe
Play2実践tips集
by
takezoe
GitBucket: The perfect Github clone by Scala
by
takezoe
GitBucket: Open source self-hosting Git server built by Scala
by
takezoe
そんなトランザクションマネージャで大丈夫か?
by
takezoe
markedj: The best of markdown processor on JVM
by
takezoe
Tracing Microservices with Zipkin
by
takezoe
Type-safe front-end development with Scala
by
takezoe
Scala Frustrations
by
takezoe
How to keep maintainability of long life Scala applications
by
takezoe
Java9 and Project Jigsaw
by
takezoe
Reactive database access with Slick3
by
takezoe
Testing Distributed Query Engine as a Service
by
takezoe
Scala Frameworks for Web Application 2016
by
takezoe
Revisit Dependency Injection in scala
by
takezoe
Macro in Scala
by
takezoe
GitBucket: Git Centric Software Development Platform by Scala
by
takezoe
Journey of Migrating Millions of Queries on The Cloud
by
takezoe
Recently uploaded
PPTX
JavaScript/TypeScript実力強化書 2章のアップデート Forkwell Library
by
Yoshiki Shibukawa
PDF
20251122_OWASPNagoya_takei_ITU-T,X.1060,security
by
OWASP Nagoya
PDF
「EspressReport ES(Enterprise Server)」は、エンタープライズ向けの強力で一元化されたビジネスインテリジェンス(BI)レポ...
by
株式会社クライム
PDF
Gluesync:RDBMS、NoSQL,データレイク間のリアルタイム・データレプリケーション
by
株式会社クライム
PDF
最高峰のストレージとバックアップ:ARTESCA+Veeam:統合型ソフトウェア
by
株式会社クライム
PDF
Veeam&WasabiでトリプルV: クラウドへのランサムウエア対策の決定コンビ
by
株式会社クライム
PDF
N2WS Backup & Recovery と Veeam Backup for AWS
by
株式会社クライム
PDF
StarWind VTL: テープ機能でコスト効率の良いバックアップを実現するVirtual Tape Library
by
株式会社クライム
JavaScript/TypeScript実力強化書 2章のアップデート Forkwell Library
by
Yoshiki Shibukawa
20251122_OWASPNagoya_takei_ITU-T,X.1060,security
by
OWASP Nagoya
「EspressReport ES(Enterprise Server)」は、エンタープライズ向けの強力で一元化されたビジネスインテリジェンス(BI)レポ...
by
株式会社クライム
Gluesync:RDBMS、NoSQL,データレイク間のリアルタイム・データレプリケーション
by
株式会社クライム
最高峰のストレージとバックアップ:ARTESCA+Veeam:統合型ソフトウェア
by
株式会社クライム
Veeam&WasabiでトリプルV: クラウドへのランサムウエア対策の決定コンビ
by
株式会社クライム
N2WS Backup & Recovery と Veeam Backup for AWS
by
株式会社クライム
StarWind VTL: テープ機能でコスト効率の良いバックアップを実現するVirtual Tape Library
by
株式会社クライム
Non-Functional Programming in Scala
1.
Non-Functional Programming in Scala Naoki
Takezoe @takezoen BizReach, Inc
2.
自己紹介 竹添 直樹: @takezoen ビズリーチという会社でScalaを書いてます OSS開発や技術書の執筆などもしています
3.
主題 Scalaがもっと普及して欲しい そうしないと自分が失業してしまう(重要!!) そのためにはどうすればいいのか?
4.
いままでやってきたこと Scalaの本を書いたり、翻訳したりした SI企業で業務システム開発の事例を作った Scalaでオープンソースプロダクトを開発 Scala関連イベントのサポート Webサービス企業でそれなりの規模でScalaを採用した
5.
突き当たった壁
6.
関数型プログラミング
7.
関数型プログラミング in Scala 基本的には副作用を使った手続き型プログラミング言語 関数型言語由来の様々な機能を備えている for内包表記、暗黙的なモナド Scalaz、Cats、Slickなどの関数型ライブラリ どこまで関数型に寄せるか?という選択を迫られる プログラミングスタイルだけでなく、ライブラリやフレームワークの 選定から考慮しなくてはならない
8.
振り返ってみる 業務での開発で起きたこと OSS開発で起きたこと
9.
業務での開発で起きたこと 時間 Scala力
10.
業務での開発で起きたこと 最初はみんな 初心者 時間 Scala力
11.
業務での開発で起きたこと Scala力アップ!! 最初はみんな 初心者 時間 Scala力
12.
業務での開発で起きたこと Scala力アップ!! 最初はみんな 初心者 後から入ってくる 人つらい!! 時間 Scala力 ハードルの高さ
13.
こうあって欲しい(気持ちは理解できる) 時間 Java力
14.
業務での開発で起きたこと 最初はみんなScala初心者だった 初期のメンバーが少しずつレベルアップしてくる 関数型プログラミングが取り入れられてくる 時代によってコードの傾向が違う 後から入ってくる人ほどつらくなってしまう
15.
振り返り Scalaはプログラマの成長にあわせてスタイルを変えられる 長期間、固定のチームで開発するのであればチームの成長にあ わせて変化していくことができる メンバーの増加・入れ替わりが激しい場合は変化が大きいとどん どんハードルが上がっていってしまう
16.
OSS開発で起きたこと Elasticsearch-Hadoop、Apache PredictionIOなど 手続き型バリバリのプログラミングスタイル varやmutableコレクション、whileループ、returnや例外なども多 用されている
17.
OSS開発で起きたこと コミッターのスキルが低いのか?そんなことはない バックグラウンド、モチベーションの違い SparkのためにScalaを使っている
18.
振り返り 言語としてではなくプロダクトとしてのニーズが存在する ○○を使えば□□ができる、というフックは増やしていくべき
19.
関数型プログラミングへのモチベーションが 低い状況でどうScalaを使うか?
20.
方針 そもそもScalaは副作用のある手続き型プログラミング言語であ り、モナドを意識せずに使えるように設計されている Scalaの便利な機能を使いつつ、関数型プログラミングに寄せす ぎないようにする
21.
使うべきか?使わないべきか? ● var、while ● mutableコレクション ●
return ● 例外 ● null ● Option.get ● for内包表記 ● 型クラス
22.
考えてみよう!!
23.
var、while
24.
var、while ループ処理などでフラグやアキュムレータなどに使いがち takeWhileやfoldLeftなどで代用可能だが取っつきづらい var line =
reader.readLine() while(line != null) { ... line = reader.readLine() }
25.
var、while ループ処理などでフラグやアキュムレータなどに使いがち takeWhileやfoldLeftなどで代用可能だが取っつきづらい var line =
reader.readLine() while(line != null) { ... line = reader.readLine() }
26.
var、while メソッド内での利用であれば許容する valはJavaでfinalをつけるかどうかくらいの感覚で使い分けるの がよさそう
27.
mutableコレクション
28.
mutableコレクション ループしながら詰め替えるような処理で使いがち val list =
... val map = mutable.Map("some" -> 0, "none" -> 0) list.foreach { x => if (x.nonEmpty) { map.put("some", map("some") + 1) } else { map.put("none", map("none") + 1) } }
29.
mutableコレクション ループしながら詰め替えるような処理で使いがち val list =
... val map = mutable.Map("some" -> 0, "none" -> 0) list.foreach { x => if (x.nonEmpty) { map.put("some", map("some") + 1) } else { map.put("none", map("none") + 1) } }
30.
mutableコレクション メソッド内での利用であれば許容する 戻り値として返す際にimmutableなコレクションに変換する 使わなくても済むものはimmutableなコレクションを使うように啓 蒙していく val map =
list.groupBy(_.nonEmpty) .map { case (nonEmpty, values) => if(nonEmpty) "some" -> values.size else "none" -> values.size }
31.
return
32.
return Ealry returnやループ処理中からのreturnなどが使われがち def hello(names:
Seq[String]): String = { if(name.isEmpty) return "" ... } 戻り値の型を明記しないといけなくなる コンパイル後に例外(ControlThrowable)で実現されるケースが ある
33.
return Ealry returnやループ処理中からのreturnなどが使われがち def hello(names:
Seq[String]): String = { if(name.isEmpty) return "" ... } 戻り値の型を明記しないといけなくなる コンパイル後に例外(ControlThrowable)で実現されるケースが ある
34.
return 実際に問題になるケースは少ないので許容してもよいのでは そもそも例外をThrowableでキャッチしない try { ... } catch
{ case NonFatal(t) => ... }
35.
例外
36.
例外 エラーを戻り値で返すか?Eitherなどで返すか? def findUser(): Either[Exception,
User] = { try { val user: User = ... Right(user) } catch { case e: Exception => Left(e) } }
37.
例外 エラーを戻り値で返すか?Eitherなどで返すか? def findUser(): Either[Exception,
User] = { try { val user: User = ... Right(user) } catch { case e: Exception => Left(e) } }
38.
例外 Eitherで返そうとすると 例外の発生は防げないので変換が必要になる for内包表記やEitherTなどが登場してしまう 通常は積極的に例外に倒してしまってもよいのでは? ただし非同期処理の場合は別
39.
null
40.
null
41.
null 使うべき理由がまるでない がくぞー先生に消されてしまう Optionを使う Javaライブラリを使う部分は仕方ない
42.
Option.get
43.
Option.get 値が必ず入っているはずだと直接getしがち Noneチェックしてからgetしがち val opt: Option[String]
= ... if(opt.isDefined){ val str = opt.get ... }
44.
Option.get 値が必ず入っているはずだと直接getしがち Noneチェックしてからgetしがち val opt: Option[String]
= ... if(opt.isDefined){ val str = opt.get ... }
45.
Option.get opt.getOrElse("") などとする人が出現 getして明示的にエラーになる方がマシではある mapやforeachなどを使うよう啓蒙していく
46.
for内包表記
47.
for内包表記 モナモナするときに使う for { project <-
findProject(projectId) user <- findUser(userId) } yield { registerComment(project, user, comment) }
48.
for内包表記 モナモナするときに使う for { project <-
findProject(projectId) user <- findUser(userId) } yield { registerComment(project, user, comment) }
49.
for内包表記 無理して使わない コレクション操作やFutureのチェーンをシンプルに記述するため に使う その場合もmapやflatMapのシンタックスシュガーという認識があ ればよい 「モナド」って言わない
50.
型クラス
51.
型クラス implicitの使い方の一種 implicit val userInfoReads
= Json.reads[UserInfoInfo] r.body.validate[UserInfo].fold( error => ..., form => ... ) sealed trait JsValue extends JsReadable { def validate[A](implicit rds: Reads[A]): JsResult[A] }
52.
型クラス implicitの使い方の一種 implicit val userInfoReads
= Json.reads[UserInfoInfo] r.body.validate[UserInfo].fold( error => ..., form => ... ) sealed trait JsValue extends JsReadable { def validate[A](implicit rds: Reads[A]): JsResult[A] }
53.
型クラス フレームワークやライブラリで使っているケースが多い 使うだけであれば意識する必要はない(CanBuildFromを意識し なくてもScalaのコレクションは使える) play-jsonのReads/Writesのように自分で実装しないといけない ケースもあるが、そこまで躓くことはない印象(面倒なのはさてお き...) 「型クラス」って言わない
54.
結果 ● var、while ● mutableコレクション ●
return ● 例外 ● null ● Option.get ● for内包表記 ● 型クラス
55.
最終的にはケースバイケース これはあくまでも判断の一例 プロダクトの方向性、今後のチーム運営も考えて決める チームのスキルが一様であればそれにあわせればよい
56.
Scalaを使う人がもっと増えて欲しい 最初はみんな初心者だった Scalaで楽しくプログラミングをして欲しい 関数型プログラミングに興味のある人だけでなく、 それ以外の人たちにもScalaを使って欲しい Scalaを使っているのにというジレンマを感じることもある いろんな使い方ができるのもScalaの良いところ Scalaユーザが増えることで自分たちの選択肢も広がる
57.
ご静聴ありがとうございました
Download