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

社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた

 社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた

かとじゅん
PRO

March 24, 2023
Tweet

More Decks by かとじゅん

Other Decks in Programming

Transcript

  1.       
    © Chatwork
    社内のメンバーに
    関数型プログラミングの学習・教育
    についていろいろ聞いてみた
    テックリード 加藤潤一(かとじゅん)
    2023/3/24
    Chatwork株式会社

    View Slide

  2. 自己紹介
    2
    ● twitter, github ともに j5ik2o
    ● Chatworkで働いてます
    ○ チーム横断的にいろんなことやって
    ます
    ● よく使うプログラミング言語
    ○ Scala(仕事)
    ○ Rust(趣味)
    ● テスラ モデルY パフォーマンスというガ
    ジェットを買いました
    ● WEB+DB PRESS vol132 「オブジェクト
    指向神話からの脱却」のレビュー
    最近、明治維新の人?と言われたりします

    View Slide

  3. 発表の目的
    3
    ● Scala導入初期(2014年ぐらい)から関数型プログラミングは積極的に採用しており、
    座学で教育するというよりはモブやペアで実践的に取り組んできた経緯があります
    ● 今回は、みなさんがどのように学んできたのかを把握するために、Scalaや
    TypeScriptなどで関数型プログラミングを日常的に使っている人たちにアンケート
    を採ってみた。そのアンケート結果をみながら私見を挟みつつ、ゆるく発表してみ
    ようという企画です
    ● 僕らの現状を把握してみたという感じで「こうやるといいよ」みたいな提案はあま
    りないです…。サンプルがn=7なのでこの資料を鵜呑みにしないでください…
    ● イベントを盛り上げるアイスブレイク的な発表です。お酒でも飲みながら、ゆるく
    聞いてください

    View Slide

  4. 会社概要
    4
    会社名
    Chatwork株式会社
    代表取締役CEO
    山本 正喜
    従業員数
    267名(2022年3月末日時点)
    所在地
    東京、大阪、ベトナム、台湾
    設立
    2004年11月11日

    View Slide

  5. Chatworkとは
    5
    ※Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(
    MAU:Monthly Active User)調査。※調査対象は
    Chatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスを
    Chatwork株式会社にて選定。
    効率的に情報共有できる
    グループチャット
    仕事の見える化ができる
    タスク管理
    見落としがなくなる
    ファイル管理
    いつでも会議ができる
    ビデオ/音声通話

    View Slide

  6. Chatworkは利用者数No.1*のビジネスチャット
    6
    * Nielsen NetView 及びNielsen Mobile NetView 2021年4月度調べ月次利用者(MAU:Monthly Active User)調査
    3月
    リリース
    10万社
    突破!
    20万社
    突破!
    30万社
    突破!
    導入社数
    35万4000社以上!
    (2021年12月末日時点)

    View Slide

  7. 早速 本題に(おそらくgdります…)

    View Slide

  8. アジェンダ:アンケートの質問一覧&あいだに私見をはさみます
    8
    ● Q1. 関数型プログラミングが有用だと感じる理由は?
    ● Q2. どのように関数型プログラミングを学びましたか(複数可)?
    ● Q3. 関数型プログラミングの学習難易度はどのくらいか?
    ● Q4. 関数型プログラミングの教育難易度はどのくらいですか?
    ● Q5. 関数型プログラミングを教えるならどの言語がよいか?
    ● Q6. Q5のプログラミング言語をおすすめする理由は?
    ● Q7. 関数型プログラミングを学ぶ人へのアドバイスはありますか?

    View Slide

  9. Q1. 関数型プログラミングが有用だと感じる理由は?
    9
    ● テストがしやすい
    ● 副作用を排除したIN/OUTが明確(参照透明)
    ● 式の合成で作られる関数はコードの品質が高い
    ● 合成しやすい式を使ってコード部品を小さく作りやすい
    ● 継承に頼らない設計が可能
    ● 並行性に優れたプログラミングが可能
    ● クロージャをうまく使えばはクラスと
    同等の使い方ができる
    さすがに有用性について否定
    的な人はいなかった笑

    View Slide

  10. 【私見】 有用性の一事例
    10
    mapはflatMapと
    succeedで、optはmap
    とsucceedでつくられ
    る。副作用がないため
    関数の挙動が掴みやす

    View Slide

  11. Q2. どのように関数型プログラミングを学びましたか(複数可)?
    11
    ● 書籍
    ○ 『Scala 関数型デザイン &プログラミング』
    ○ 『Scalaスケーラブルプログラミング』
    ○ 『すごいHaskellたのしく学ぼう!』
    ○ 『Real World Haskell』
    ○ 『プログラミングElixir』
    ● 公式ドキュメント類
    ○ Hoogle x Hackage
    身のみ蓋もないが、良書を使った自
    学習が基本。昔に比べたらだいぶ高
    速道路だと思う

    View Slide

  12. 【私見】『Scala 関数型デザイン &プログラミング』は開眼する本
    12
    ● すこしScalaに慣れたらこの本がお勧め。
    ● 関数型プログラミングのよさをいかした設計を学ぶ意味で、こ
    の本はすごくよい
    ● この本は読むというより「エクササイズ」を実際に解き、コー
    ドを書く本
    ○ ChatworkでScala採用初期のころList型を実装する課題
    で盛り上がった
    ● よい本だけど、絶版…。
    ○ MANNINGなら買えます。『Functional Programming
    in Scala』現在Scala3対応のセカンドエディションあり
    ● 他の言語でも、考え方をある程度適用可能
    ○ 本書で紹介されるParserコンビネータライブラリ、
    Property-based testingライブラリをRustで実装した

    View Slide

  13. Q3. 関数型プログラミングの学習難易度はどのぐらいですか?
    13
    難易度は比較的高め?

    View Slide

  14. Q3. 関数型プログラミングの学習難易度はどのくらいか?
    14
    ● 学習目的: 関数型プログラミングの理解度や求めるスキルレベルによって、難易度が変わりま
    す。現場で実践に必要なレベルであれば習得は可能で、慣れるまでに2〜3ヶ月かかるとの意見
    があります。
    ● 既存のプログラミング経験: ある程度のプログラミング経験があり、別のパラダイムを学ぶ場
    合、先入観が邪魔して難易度が上がることがあるとの意見があります。ただし、関数型プログラ
    ミングを早い段階で学ぶことで、既存のパラダイムへの過学習が少なく、理解が容易になるとい
    う意見もあります
    ● 純粋関数型言語とマルチパラダイム言語: 純粋関数型言語でのプログラミングは難しいとの意見
    がありますが、多くの現代のプログラミング言語が関数型プログラミングの機能を備えているた
    め、基本的な概念の学習は難しくないとされています。
    ● 数学的な知識: 関数型プログラミングを理解し、困難な問題を解決するためには、数学的な知識
    や理解がある程度必要となるとの意見があります。
    基本的な概念の習得は、多くのプログラミング言語が関数型プログラミングの機能を備えているた
    め、難しくないとされています。しかし、純粋関数型プログラミングを追求したり、複雑な問題を解
    決するために関数型プログラミングを活用する場合、数学的な知識や理解が求められるため、難易度
    が上がることがあります。

    View Slide

  15. Q4. 関数型プログラミングの教育難易度はどのくらいですか?
    15
    ● どう教えるかによる?
    ● 数学の得意不得意が大きく影響すると思うので、一概に言えないので、真ん中に。
    ● これも何をどこまで教えるか次第かなと...
    「何を学ぶか」に依存するので
    答えるのは難しい・・・
    具体的な回答は得られなかっ

    View Slide

  16. Q5. 関数型プログラミングを教えるならどの言語がよいか?
    16

    View Slide

  17. Q6. Q5のプログラミング言語をおすすめする理由は?
    17
    ● Haskell: 書籍との対応が取りやすく、他のパラダイムでの記述が難しく、関数型プログラミング
    のエッセンスを学ぶのに適しています。特にバックエンド開発者に適しているとの意見がありま
    す。
    ● Elm: 見た目が動くものを作れるため直感的に理解しやすく、他のパラダイムでの記述が難しいた
    め、関数型プログラミングのエッセンスを学ぶのに適しています。特にフロントエンド開発者に
    適しているとの意見があります。
    ● Rust: 手続き型プログラミングを書くことができ、徐々に関数型プログラミングに移行できると
    いう特徴があります。このアプローチは、関数型プログラミングに徐々に慣れていくのに役立つ
    でしょう。
    ● 軽量で実行環境が得られやすい言語: 学習者がすぐに実行できる言語を選ぶことで、関数型プログ
    ラミングの学習が容易になるとの意見があります。
    教える言語は学習者の背景や目的、そして言語の特性によって異なります。実用性が高く、関数型プロ
    グラミングのエッセンスを学ぶのに適した言語を選ぶことが重要です。HaskellやElmは、関数型プロ
    グラミングの原理を学ぶには適しており、バックエンド開発者やフロントエンド開発者にそれぞれ推奨
    されています。Rustは徐々に関数型プログラミングに移行するアプローチをとることができる点で、一
    部の学習者にとって適しているかもしれません。

    View Slide

  18. 【蛇足】関数型プログラミングが怖いと感じられる理由と対処法
    18
    関数型プログラミングが「怖い」と感じられる理由は人それぞれですが、一般的には以下のような要素
    が考えられます。
    ● 未知のものへの恐れ: 関数型プログラミングは、命令型プログラミングとは異なるパラダイムであ
    り、初めて学ぶ人にとっては未知のものです。そのため、学習の難しさや新しい概念に対する恐
    れから、「怖い」と感じることがあります。
    ● 理解が難しい概念: 関数型プログラミングには、高階関数や純粋関数、カリー化、モナドなど、独
    自の概念が多く存在します。これらの概念を理解することが難しく感じるため、「怖い」と感じ
    ることがあるでしょう。
    ● 学習曲線: 関数型プログラミングをマスターするためには、従来の命令型プログラミングとは異な
    る思考方法やアプローチが必要です。そのため、学習曲線が急であり、習得が難しいと感じるこ
    とがあります。
    ● 利用される言語: 関数型プログラミング言語(HaskellやScalaなど)は、一般的なプログラミング
    言語(PythonやJavaなど)とは異なる構文や特性を持っています。これらの言語に慣れるまでに
    は時間がかかり「怖い」と感じることがあるでしょう。
    ただし、アンケート回答者たちが「怖くない」と言っているように、関数型プログラミングは十分に学
    べるものです。適切な学習方法を見つけ、継続的に学ぶことで、関数型プログラミングの恩恵を享受で
    きるようになります。未知のものへの恐れは自然なことですが、挑戦することで克服できるはずです。

    View Slide

  19. Q7. 関数型プログラミングを学ぶ人へのアドバイスはありますか?
    19
    ● パラダイムや設計の指向を学ぶことは、ソフトウェア開発の視野を広げることにつながりま
    す。関数型プログラミングもその一つであり、取り組みをラフに捉えることで、怖さやプレッ
    シャーを減らすことができます。
    ● 関数型プログラミングの学習は、恐れることはありません。ポジティブな態度で取り組むこと
    で、学習の難しさを軽減できるでしょう。
    ● 学習の目的を明確に持っておくことが重要です。興味や好奇心から学ぶのか、解決したい課題
    があるのかによって、学習の進め方や焦点が変わるためです。
    関数型プログラミングを学ぶ際には、柔軟な態度で取り組み、学習の目的を明確に持つことが重要で
    す。パラダイムや設計指向を学ぶことで、ソフトウェア開発の視野が広がり、新たなアイデアやアプ
    ローチが見えてくるでしょう。学習過程で恐れず、ポジティブな態度で関数型プログラミングに取り
    組むことで、より効果的にスキルを習得し、問題解決能力を向上させることができます。最終的に
    は、関数型プログラミングが提供するエッセンスを、自分の開発スキルに活かすことが大切です。

    View Slide

  20. © Chatwork
    おわり

    View Slide

  21. View Slide