Upgrade to Pro — share decks privately, control downloads, hide ads and more …

関数型を現場に持ち込むことはモダンなのか?

 関数型を現場に持ち込むことはモダンなのか?

オープンセミナー2016@広島でのLT資料です。
http://osh-web.github.io/2016

解説 http://blog.eiel.info/blog/2016/02/09/function-model-in-genba/

モダンかどうかはコンテキストに応じる。必要な場面は必ずあるけども、どこにでもというわけではないとおもう。けど、関数型はたしかにコードをシンプルにモジュラビリティをあげるはずだ。そんな話。

1a679952cdf455ecd6a15cbde7ae80d5?s=128

Tomohiko Himura

February 10, 2016
Tweet

Transcript

  1. ؔ਺ܕΛݱ৔ʹ࣋ͪࠐΉ͜ͱ͸ Ϟμϯͳͷ͔? 2016-02-06 Φʔϓϯηϛφʔ2016@޿ౡ

  2. ͻΉΒ ͱ΋ͻ͜ りあくてぃぶͳγεςϜΛߏங͍ͨ͠ ࠷ۙAkkaͰ༡ΜͰ͍Δ ͍͢͝޿ౡ / ϦΞΫςΟ෦ Confluence/JIRAͰ༡ΜͰ͍·͢

  3. 関数型はモダンなのか?

  4. モダンな機能を持っている

  5. 関数型言語に分類される言語は プログラミング言語の モダンとされる機能を持つことが多い ύλʔϯϚον஗ԆධՁߴ֊ܕܕΫϥε

  6. 関数型に限定される話ではない

  7. 関数型を現場に持ち込むことは モダンなのか?

  8. 別にそうでもない

  9. 関数型の魅力 • 並行 • 複数コアのCPUの性能を使い切れる • 分散 • スケールアップの限界を超える •

    高い抽象化 • 早いプロトタイピング • 理解の促進
  10. 関数型を取り入れると より良くなるかもしれないこと • 並行処理の簡略化 • スレッドは難しい • インフラコスト • マシン数を減らせる可能性

    • 複雑すぎるシステム • 体系化できる可能性
  11. オブジェクト指向でも できることばかり

  12. 少しやりやすいだけ

  13. 増大し続けるデータと 戦うために必要なもの

  14. 分散処理

  15. 分散処理 • 関数型のノウハウが役に立つこともある • 複雑な関数型の能力は求められない

  16. 必要なのは 分散システムを構築するための道具

  17. 関数型は 分散システムを考える 要素の1つにすぎない

  18. 現場に必要なもの

  19. 問題解決に必要な道具

  20. 関数型とどう付き合うべきか

  21. 関数型を正しく捉える

  22. 関数型がなんであるか • 状態が扱えなくなったオブジェクト指向 • 能力が制限された • 代わりに • 複雑なシステムと戦う能力を得られる

  23. 例 クロージャとクラスは同等 の表現力をもつ (要出展) • クラスがなくてもクロージャがあれば同 じことができる • プログラマとしての道具が増える •

    問題解決の手法を増やせる
  24. 例 合成

  25. 1 + 2

  26. ここに「1」があるじゃろ? ( ^ω^) ⊃1⊂

  27. これを「2」と合わせて… ( ^ω^) ≡⊃⊂≡

  28. ( ^ω^) ⊃3 ⊂ 出来上がりじゃ…

  29. ؔ਺ܕͰ͸ ؔ਺Λ஋ͱͯ͠࢖͑Δ

  30. ここに「f」があるじゃろ? ( ^ω^) ⊃f ⊂

  31. これを「g」と合わせて… ( ^ω^) ≡⊃⊂≡

  32. ( ^ω^) ⊃h ⊂ 出来上がりじゃ…

  33. f + g = h

  34. g . f = h

  35.    G H

  36.    G H I

  37. f と gをつかってhを作れる

  38.    G H I

  39. function h (x) { return g(f(x)); } ੩తʹಉ͜͡ͱ͸Ͱ͖Δ

  40. g + f ができれば。。。

  41. (f + g)(1); // => 6 var acc = f;

    for (var n in [g, f, g]) { acc = acc + n; } acc(1); // => 36 ಈతʹ૊Έସ͑Δ͜ͱ͕Ͱ͖Δ
  42. 関数型を学ぶ価値はある

  43. 本当に現場に欲しいもの

  44. あなたのチームによって違う

  45. まとめ

  46. 関数型どうなの?

  47. 先のことを考えるなら • 関数型は役に立つ • それよりも並行処理や分散処理を学ぶべき • 並行処理・分散処理に • 関数型の知識は役に立つ •

    オブジェクト指向でも利用可能
  48. 小さなシステムには 無くても良い

  49. 高い抽象度で考えたい • 数学のチカラをダイレクトに • パフォーマンスは期待できない • オブジェクト指向でもできる

  50. プログラマとしては成長できる