Slide 1

Slide 1 text

はじめて関数型言語の機能に触れる エンジニア向けの学び方/教え方 2025年06月15日 関数型まつり2025 関根 純 @jsoizo

Slide 2

Slide 2 text

2 経歴 この会場内で本カンファレンスに最も最適な名前の自信ある。 関数型プログラミングは正直そんなに得意じゃないです。 自己紹介 関根 純 せきね じゅん 2023.01 コドモンに開発エンジニアとして入社 2024.01 育児休業(6ヶ月) 様々な副作用と向き合う 2025.01 新規プロダクトや基盤開発に従事

Slide 3

Slide 3 text

3 今日話すこと PHP => Kotlinで利用言語を変えるときの

Slide 4

Slide 4 text

4 今日話すこと 関数型な機能のトレーニングについて

Slide 5

Slide 5 text

5 今日話すこと やや教える側の立場に寄ってお話します🙇💦

Slide 6

Slide 6 text

6 今日話すこと 関数型言語を学ぶ入口の定め方 具体的なトレーニングの資料 学ぶ・教えるうえで大事なこと 1 2 3

Slide 7

Slide 7 text

7 今日話すこと 関数型言語を学ぶ入口の定め方 具体的なトレーニングの資料 学ぶ・教えるうえで大事なこと 1 2 3

Slide 8

Slide 8 text

8 CONFIDENTIAL - © 2022 CoDMON Inc. 8 前提 : 令和のWebアプリケーション開発 モダンなWebアプリケーション開発の現場において、大抵の言語で ● イミュータブルな値の宣言 ● mapやreduceで高階関数を渡して処理 くらいは当たり前にできるし、 && WebフロントにおいてはReactやVue等のFunctionalな思想で 作られたライブラリを利用することも多いため、 「関数型言語のテクニックに一切触れたことがない」という人は少ない。

Slide 9

Slide 9 text

9 CONFIDENTIAL - © 2022 CoDMON Inc. 9 本題:何を関数型プログラミングの入口とするか? ケースバイケースで、 組織次第です... N=1のPHPエンジニア向けのサーバサイドKotlin学習を例として話します

Slide 10

Slide 10 text

10 CONFIDENTIAL - © 2022 CoDMON Inc. 10 関数型の機能を持った言語採用時の悩み 特にTypeScriptやScala, Kotlin等の実装時の選択肢が多い言語においては、 どの程度Functionalな実装を良しとする?かは組織によって異なる。     命令/OOP寄り FP寄り 副作用 (ロギングで例示) Loggerを直接呼ぶ DIで注入可能にする Effect切り出し エラー処理 例外を投げる Result等使いつつ 部分的に例外も併用 一切の例外を許さず すべて型で表現 中庸 ・・・ その他にも色々

Slide 11

Slide 11 text

11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 要はバランス... コドモンでは「ちょっと関数型エッセンス取り入れましたくらい」 が好ましいのでは?という大まかな認識でコーディングすることが多い。 ● アプリ設計はOOPかつClean Architectureの良くあるパターンで ● よほどの理由がない限りイミュータブルにする ● 言語標準のデータ型を利用し、一部便利なライブラリ(Arrow)を採用 ● 代数的データ型等を利用してコンパイル時チェックを心がける ● 関数の純粋性は求めないが、IO関係はクラスに対してDIで注入する 言語(Kotlin)としての引き出しもちょうど同じくらいである。

Slide 12

Slide 12 text

12 CONFIDENTIAL - © 2022 CoDMON Inc. 12 なにから学ぶか/教えるか PHP => Kotlin のケースだと 主だった言語機能の差分にたいして集中的にトレーニングしている。 ※ 発展編としてEither(Arrow-kt)の使い方も学ぶ必要がある どういうことを PHP => Kotlinの差分で知るべきこと 極力イミュータブル、文ではなく式 ifやwhenなどが値を返せること nullの扱いやJavaコードの呼び出し 関数の値の返し方の作法の違い flatMap等のコレクション操作関数 豊富にあるので目的ごとに使い分けること 代数的データ型の活用 コンパイルで極力防ぐ努力をすること

Slide 13

Slide 13 text

13 CONFIDENTIAL - © 2022 CoDMON Inc. 13 どう学ぶか/教えるか 基本的にはOJTがメイン。 異動や転職には不安がつきもの。理論はさておき実際の開発タスク において貢献できるようになることのほうが心理的に安全。 一方でOJTは「業務タスクを遂行すること」に主眼が置かれることが多く、 忙しさなどの理由から知識を正しくつけることはないがしろにされがち。 「あまりわかっていないけどこう書けばいい」で止まってしまう可能性。 → 自習的なアプローチによって補っていくのが有用

Slide 14

Slide 14 text

14 CONFIDENTIAL - © 2022 CoDMON Inc. 14 +αとしての自習をどうするか 教科書的なものを作ることをしてもよいが、更新し続けるコストが高い... → 言語公式のドキュメントをフル活用するアプローチ はコスパがいい ※ 組織の規模やスタイルによるので正解ではない。最近ならAI活用なども良いかもしれない 思想や仕様は公式のドキュメントを読み込んで大枠で理解し、 それを前提とした問題を解くことで実装スキルを高めていく。 参考書を公式ドキュメントで代用し、章末問題を自分たちで用意する

Slide 15

Slide 15 text

15 今日話すこと 関数型言語を学ぶ入口の定め方 具体的なトレーニングの資料 学ぶ・教えるうえで大事なこと 2 1 3

Slide 16

Slide 16 text

16 CONFIDENTIAL - © 2022 CoDMON Inc. 16 どんなものになっている? このような章立て。必ず伝えたいことから順番に、徐々に難易度を上げる 理解していないと開発できない系 できれば理解してほしい系 時間の都合でなかなか準備できてない...(;´Д`)

Slide 17

Slide 17 text

17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 どんなものになっている? 問題文 & 実装するべき関数のシグネチャとテストを定義し、 それが通るようにコードを書いてもらう。

Slide 18

Slide 18 text

18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 想定している解答 こういう解答ができるとよさそう。 模範解答はテキスト内には残していない

Slide 19

Slide 19 text

19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 どんなものになっている? 初めて触れるときに概念を定着させるのが難しいものは、 ステップを設けて、問題を解くごとに表現力の引き出しを増やし、 実際のコーディング時の実装方針の背景を汲み取れるようにしていく。

Slide 20

Slide 20 text

20 CONFIDENTIAL - © 2022 CoDMON Inc. 20 どんなものになっている?

Slide 21

Slide 21 text

21 CONFIDENTIAL - © 2022 CoDMON Inc. 21 限りなく小さいステップを踏んでいく とりあえず知っていることから だれでも理解しているEnumをサクッと抑える

Slide 22

Slide 22 text

22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 どんなものになっている?

Slide 23

Slide 23 text

23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 限りなく小さいステップを踏んでいく sealed でより複雑な仕様を実装する

Slide 24

Slide 24 text

24 CONFIDENTIAL - © 2022 CoDMON Inc. 24 どんなものになっている?

Slide 25

Slide 25 text

25 CONFIDENTIAL - © 2022 CoDMON Inc. 25 sealedが使えるようになる ここまでの問題が解けるとsealedの利便性を理解できるハズ。 sealedな型の値に対する パターンマッチでコンパイル時に 網羅性チェックできることを理解する

Slide 26

Slide 26 text

26 CONFIDENTIAL - © 2022 CoDMON Inc. 26 どんなものになっている?

Slide 27

Slide 27 text

27 CONFIDENTIAL - © 2022 CoDMON Inc. 27 関数の戻り値として使えるようになる 抽象度を下げたEitherを作って使う実践

Slide 28

Slide 28 text

28 CONFIDENTIAL - © 2022 CoDMON Inc. 28 実際の業務だとEitherを使う ※ ジェネリクスを学び、Eitherが使える必要はある

Slide 29

Slide 29 text

29 今日話すこと 関数型言語を学ぶ入口の定め方 具体的なトレーニングの資料 学ぶ・教えるうえで大事なこと 3 1 2

Slide 30

Slide 30 text

30 CONFIDENTIAL - © 2022 CoDMON Inc. 30 どうすすめる?? 学ぶ側 ● 先述の通りOJTが基本なので任意で箸休め程度に取り組む ● 個人ごとのslack #times_xxx チャンネルに書き出す 教える側 ● timesチャンネルに潜り込んでレスをする形でフィードバック ● 理想的にはOJTしている人などがフィードバックできると良い ● コドモンでは僕が嗅ぎつけてフィードバックすることが多め ● 1on1等の場を用いる場合もある

Slide 31

Slide 31 text

31 CONFIDENTIAL - © 2022 CoDMON Inc. 31 実際にはどんな感じ Setを使って欲しいという意図のお題

Slide 32

Slide 32 text

32 CONFIDENTIAL - © 2022 CoDMON Inc. 32 実際にはどんな感じ 学ぶ側 教える側 テストと実装を両方書いて投稿 改善すべき点を示す

Slide 33

Slide 33 text

33 CONFIDENTIAL - © 2022 CoDMON Inc. 33 フィードバックのポイント 関数型な言語機能を学ぶことの難しさは、 概念を理解しながら実装方法をキャッチアップすることにある。 たとえばListのflatMapを使えるようになってほしいとして、 単純にflatMapの構文だけ教えても使えるようにはなりづらい。

Slide 34

Slide 34 text

34 CONFIDENTIAL - © 2022 CoDMON Inc. 34 アンラーニングの難しさ phpでflatMap相当をこう書いていたひとは多分すんなりflatMapが使える = 配列を作ってネストした構造を潰すということを理解しているから ※ array_mergeは与えたN件のarrayを結合する関数。   この例だと、可変長引数にarrayを展開している

Slide 35

Slide 35 text

35 CONFIDENTIAL - © 2022 CoDMON Inc. 35 アンラーニングの難しさ foreachでループをネストする処理を書く人は、 手続き的 => 宣言的なコードを書く習慣へのアップデートが必要。

Slide 36

Slide 36 text

36 CONFIDENTIAL - © 2022 CoDMON Inc. 36 図解が結局一番伝わる たとえばflatMapならmapとflattenのパイプと説明する ※ これEitherのflatMapとかになると説明が難しくなるんだよね...

Slide 37

Slide 37 text

37 CONFIDENTIAL - © 2022 CoDMON Inc. 37 ペアプロはいいぞ ドキュメントやチャットの文言だけで説明するのは難易度が高く、 直接対話しながらペアで取り組むのはポジティブな側面が多い。 ● 教える側も表情や声色からわかることがある ● 理解の曖昧なところにフィードバックが即座に受けられる ● 試行回数の増加と心理的安全性の確保 ○ うまくいかないときに詰まる時間がもったいない ○ “わかった・できた” という感覚をより多く得やすい ※ ペアプロ自体に好みがあるのでこれもまた合う/合わないは人によります

Slide 38

Slide 38 text

38 CONFIDENTIAL - © 2022 CoDMON Inc. 38 ペアプロでわかる大事なこと 学んでいるひとが何がわかっていて何をわかっていないのかのすり合わせ ができていると学習効果が高まっていく。 学ぶ側は:  思考過程や苦しんだこと、拙くてもいいので言語化すること    = 理解を言葉に出すことで何がわかっていないか自己認識する(テディベア効果) 教える側は: 相手は自分ではなく、詰まるところも人によって異なると理解したうえで 何がわかっていないかを汲み取り、わかる言葉や図で助けること   

Slide 39

Slide 39 text

39 CONFIDENTIAL - © 2022 CoDMON Inc. 39 まとめ 1. 関数型な機能を持った言語を学ぶ/教えるために、まず 以前の言語との機能差分を抽出して頻出パターンから取り組む 2. 求められる書き方に至るまでの知識の獲得ステップがあるはず なのでそれをトレーニングの資料等に落とし込むとスムーズ 3. 関数型な機能に対する理解度合いは人により異なので、 学ぶ・教える際に対話を重視しペアで取り組むと詰まりづらい

Slide 40

Slide 40 text

40 CONFIDENTIAL - © 2022 CoDMON Inc. 40 まとめ 1. 関数型な機能を持った言語を学ぶ/教えるために、まず 以前の言語との機能差分を抽出して頻出パターンから取り組む 2. 求められる書き方に至るまでの知識の獲得ステップがあるはず なのでそれをトレーニングの資料等に落とし込むとスムーズ 3. 関数型な機能に対する理解度合いは人により異なので、 学ぶ・教える際に対話を重視しペアで取り組むと詰まりづらい

Slide 41

Slide 41 text

41 CONFIDENTIAL - © 2022 CoDMON Inc. 41 まとめ 1. 関数型な機能を持った言語を学ぶ/教えるために、 以前の言語との機能差分を抽出して頻出パターンから取り組む 2. 求められる書き方に至るまでの知識の獲得ステップがあるはず なのでそれをトレーニングの資料等に落とし込むとスムーズ 3. 関数型な機能に対する理解度合いは人により異なので、 学ぶ・教える際に対話を重視しペアで取り組むと詰まりづらい

Slide 42

Slide 42 text

42 ご清聴ありがとうございました!

Slide 43

Slide 43 text

43 コドモン採用ページ 開発ブログ コドモンでは一緒に働きたい仲間を募集しています!

Slide 44

Slide 44 text

No content