Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

関数型 プログラミング LT

26 views

Published on

関数型プログラミングの布教を目的とした社内向けLTの発表資料

Published in: Technology
  • Be the first to comment

  • Be the first to like this

関数型 プログラミング LT

  1. 1. 関数型プログラミング ~ 楽しそうにJavaJavaしてる社員を強引に関数型の闇に引き摺り込むLT ~
  2. 2. 最初に
  3. 3. このLTの目的 ▪ 普段Java(オブジェクト指向)で仕事してる社員に関数型への興味を植え付ける ▪ 関数型の雰囲気を感じてもらう ▪ あわよくばScalaに手を出してもらう ▪ もっとあわよくば自分らのScala現場に来て助けてもらう (<切実)
  4. 4. このLTの目的 ▪ 普段Java(オブジェクト指向)で仕事してる社員に関数型への興味を植え付ける ▪ 関数型の雰囲気を感じてもらう ▪ あわよくばScalaに手を出してもらう ▪ もっとあわよくば自分らのScala現場に来て助けてもらう (<切実) ▪ (+自分のトーク練習) =ただ言いたいこと言うだけ 上から「社内にScala広めて」と言われたので
  5. 5. スタンス ▪理解 => 求めません ▪共感 => どうでもいい ▪疑問 => これが目的 ▪反感 => どうぞどうぞ ▪指摘 => 大歓迎 (LT後に)
  6. 6. エンジニアたるもの・・・ まずは自分も他人も 疑ってかかりましょう
  7. 7. 本題
  8. 8. 関数型プログラミングとは ▪ Java8:ラムダ式、Stream API ▪ 関数をオブジェクトとして扱える(第一級関数) ▪ 高階関数 => ただの前提機能 or ツール Javaの人からよく上がるのは・・・
  9. 9. 関数型プログラミングとは (極力) 副作用を排除した 純粋関数のみで処理を構築していく プログラミングスタイル (手法/ルール/考え方)
  10. 10. 純粋関数とは => ▪ 副作用のない関数 副作用とは => ▪ 引数から戻り値を算出する処理以外のすべての作用
  11. 11. 副作用の例 ▪ 変数の値を変更する ▪ データ構造を直接変更する ▪ オブジェクトのフィールドを設定する ▪ 例外をスローする、エラーで停止する ▪ 画面に描画する ▪ ファイルを読み取る、ファイルに書き込む ▪ コンソールに出力する、ユーザー入力を読み取る => 既存データの変更 => I/O 処理 => 結果(戻り値)を返さない
  12. 12. 純粋関数 ≒ 数学の関数のようなイメージ? @数学:関数f(x)に1を代入したら… ↓ ふざけんな!ヽ(#`Д´)ノ 『前の問題の答え勝手に変えました』
  13. 13. 純粋関数 ≒ 数学の関数のようなイメージ? @数学:関数f(x)の式を計算しなさい … ↓ わけがわからないよ・・・ ( ◕‿ ‿ ◕ ) 『応答が返ってきません』
  14. 14. 純粋関数 ≒ 数学の関数のようなイメージ? @数学:参考書読んでたらいきなり … ↓ ログってなに・・・?(^ω^;) 『ここでこの値をログに出力します』
  15. 15. 純粋関数とは => ▪引数から結果を返す以外には何もしない関数 ▪同一の引数を渡すと必ず同一の結果が返される (≒ 参照透過性を満たす関数)
  16. 16. 純粋関数だと何がうれしい? ▪関数式全体をその評価結果と置き換え可能 プログラムを単純化して論証出来る
  17. 17. 純粋関数だと何がうれしい? ▪原因と結果の論証を局所化できる 単体テストが書きやすい
  18. 18. 純粋関数だと何がうれしい? ▪自然と処理のモジュール化が進む 保守性/再利用性が高まる
  19. 19. 純粋関数だと何がうれしい? ▪状態管理をその他のロジックから切り離せる 並行/並列処理が書きやすい バグを抑えられる
  20. 20. 関数型プログラミング= プログラムから出来る限り 不確定性を取り除いて コードの品質を良くしていこう とする考え方
  21. 21. 関数型へのアプローチ
  22. 22. 具体的には ▪ 変数の値を変更する ▪ データ構造を直接変更する ▪ オブジェクトのフィールドを設定する ▪ 例外をスローする、エラーで停止する ▪ 画面に描画する ▪ ファイルを読み取る、ファイルに書き込む ▪ コンソールに出力する、ユーザー入力を読み取る これらを 管理対象の コードから 排除していく
  23. 23. Lv.1 ▪ 変数の値を変更する ▪ データ構造を直接変更する ▪ オブジェクトのフィールドを設定する ▪ 例外をスローする、エラーで停止する ▪ 画面に描画する ▪ ファイルを読み取る、ファイルに書き込む ▪ コンソールに出力する、ユーザー入力を読み取る => 既存データの変更
  24. 24. Lv.1: 一度生成したデータを変更しない ▪変数は再代入しない ▪イミュータブル(不変)なデータ構造を使用 ▪Setter?なにそれおいしいの?
  25. 25. Lv.2 ▪ 変数の値を変更する ▪ データ構造を直接変更する ▪ オブジェクトのフィールドを設定する ▪ 例外をスローする、エラーで停止する ▪ 画面に描画する ▪ ファイルを読み取る、ファイルに書き込む ▪ コンソールに出力する、ユーザー入力を読み取る => 結果(戻り値)を返さない
  26. 26. Lv.2: 例外はスローしない、させない ▪失敗を考慮したプログラムを組む ▪エラーを戻り値で表現する ▪処理が例外を吐く場合は失敗を表す型で ラップして返す ▪型によって例外処理をルール化する
  27. 27. Lv.3? ▪ 変数の値を変更する ▪ データ構造を直接変更する ▪ オブジェクトのフィールドを設定する ▪ 例外をスローする、エラーで停止する ▪ 画面に描画する ▪ ファイルを読み取る、ファイルに書き込む ▪ コンソールに出力する、ユーザー入力を読み取る => I/O 処理
  28. 28. Lv.?: 純粋関数型でのI/O処理 ▪「命令をデータとして表現する」という考え方 をするらしい ▪プログラムはランタイムに「実行手順書」のよ うなモノを返す (Freeモナドとか?) ▪正直まだ理解し切れてません;
  29. 29. Lv.3: I/O 処理は局所化する (妥協版) ▪ほぼ「I/O処理以外には何もしない関数」に なるまで処理を細分化・抽出する ▪その部分のみ副作用前提のテストを組む ▪F/Wやライブラリ、コンピュータに任せられる 部分は任せる
  30. 30. 関数型にするべき?
  31. 31. Q1. 関数型を学ぶべきか? (for プログラマ) YES !!
  32. 32. プログラミング界隈の動向 ▪世の中はもう分散処理が当たり前 ▪ 並列/並行プログラムを素早くかつ正確に ▪ テスト・保守運用も効率化、コスト削減必須
  33. 33. ▪仕様を満たしていないシステム ▪バグだらけで運用に堪えないシステム ▪性能が足りなくて使い物にならないシステム ただの開発者の自己満足
  34. 34. ▪処理速度 ▪タイミング ▪状態変化 並行・並列プログラムのバグ => 原因特定が難しい
  35. 35. コーディング段階で 如何にバグを減らせるかが重要 開発スピードを上げるには 関数型である程度リスクを減らせる
  36. 36. Javaでも関数型の素養が有用 ▪ Java8の関数インターフェースは使えて当然 ▪ Spring5(WebFlux) ▪RxJava2、ReactiveStream採用 ▪ノンブロッキングAPI ▪ イベント駆動、非同期ストリーム処理などへの理解
  37. 37. 関数型(の考え方)は 今後絶対役に立つ!
  38. 38. Q2. PJで採用すべきか? (for PM/アーキテクト) => 関数型言語をメインとするには ある程度 覚悟が必要
  39. 39. 『関数型言語』を採用するには Need ... より良いコードを追い求める文化
  40. 40. 関数型採用に必要なもの ▪メンバーのスキル、意識、考え方を 啓蒙していく覚悟 ▪コーディングルールやレビューの文化を キッチリ育てて運用していく覚悟
  41. 41. 関数型のデメリット ▪人口が少ない(補充人員が見つからない) ▪情報が少ない(<人が少ないから) ▪学習コストが高い ▪理解が得られにくい、説明しにくい ▪小規模システムではオーバーエンジニアリング?
  42. 42. 関数型(ていうかScala)の向き不向き ▪スタートアップなどには向かない (人が育ってれば別) ▪ウォーターフォールでのSI案件にも向いてない ▪製造・テストフェーズだけ人を集めるのは無茶 ▪複雑なシステムを少人数でキレイに作るのに 向いている
  43. 43. 言語選択
  44. 44. パラダイム 型付け オブジェクト 指向 マルチパラダイム (純粋) 関数型 静的 動的(or型なし) Scala~ Java7 Java8 ~ JavaScript Python Haskell LISP Ruby ML Clojure OCaml Lazy K CleanKotlin F# Erlang Javaから関数型 => 静的型付け & マルチパラダイム言語がオススメ ※個人の独断と偏見で分類してます FP寄り >< OOP寄り 言語選択
  45. 45. パラダイム 型付け オブジェクト 指向 マルチパラダイム (純粋) 関数型 静的 動的(or型なし) Scala~ Java7 Java8 ~ JavaScript Python Haskell LISP Ruby ML Clojure OCaml Lazy K CleanKotlin F# Erlang Javaから関数型 => 静的型付け & マルチパラダイム言語がオススメ 『型はコメントよりよほど雄弁である』 ※個人の独断と偏見で分類してます FP寄り >< OOP寄り 言語選択
  46. 46. これから関数型始める方へ
  47. 47. 関数型入門・・・の前に そもそもJava等で非同期処理の経験がない方・・・ まずマルチスレッドの勉強から
  48. 48. 言語の基礎文法を把握する 特に・・・ 関数型を扱うための構文、 シンタックスシュガーなどを調べておく 例)ラムダ式、for 内包表記 など
  49. 49. 書籍で体系的に学ぶ 選んだ言語で関数型を 解説してる本を探す
  50. 50. 関数型を学ぶ際の留意点 ▪とにかくコードを読む&書く ▪ライブラリやF/Wのコードはやはり参考になる ▪理解できないところはいったん飛ばす ▪モナドとかちゃんと理解できなくても徐々に使えるよう にはなってくる ▪コード書けるようになってから解説読み直すと理解が 進むことも
  51. 51. 関数型に興味持ってくれた方・・・ 是非一緒にScalaやりましょう!

×