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

はじめて関数型言語の機能に触れるエンジニア向けの学び方/教え方 / how-to-learn-...

Avatar for jsoizo jsoizo
June 15, 2025
680

はじめて関数型言語の機能に触れるエンジニア向けの学び方/教え方 / how-to-learn-or-teach-for-fp-beginner

Avatar for jsoizo

jsoizo

June 15, 2025
Tweet

Transcript

  1. 8 CONFIDENTIAL - © 2022 CoDMON Inc. 8 前提 :

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

    組織次第です... N=1のPHPエンジニア向けのサーバサイドKotlin学習を例として話します
  3. 10 CONFIDENTIAL - © 2022 CoDMON Inc. 10 関数型の機能を持った言語採用時の悩み 特にTypeScriptやScala,

    Kotlin等の実装時の選択肢が多い言語においては、 どの程度Functionalな実装を良しとする?かは組織によって異なる。     命令/OOP寄り FP寄り 副作用 (ロギングで例示) Loggerを直接呼ぶ DIで注入可能にする Effect切り出し エラー処理 例外を投げる Result等使いつつ 部分的に例外も併用 一切の例外を許さず すべて型で表現 中庸 ・・・ その他にも色々
  4. 11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 要はバランス... コドモンでは「ちょっと関数型エッセンス取り入れましたくらい」

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

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

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

    → 言語公式のドキュメントをフル活用するアプローチ はコスパがいい ※ 組織の規模やスタイルによるので正解ではない。最近ならAI活用なども良いかもしれない 思想や仕様は公式のドキュメントを読み込んで大枠で理解し、 それを前提とした問題を解くことで実装スキルを高めていく。 参考書を公式ドキュメントで代用し、章末問題を自分たちで用意する
  8. 16 CONFIDENTIAL - © 2022 CoDMON Inc. 16 どんなものになっている? このような章立て。必ず伝えたいことから順番に、徐々に難易度を上げる

    理解していないと開発できない系 できれば理解してほしい系 時間の都合でなかなか準備できてない...(;´Д`)
  9. 17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 どんなものになっている? 問題文

    & 実装するべき関数のシグネチャとテストを定義し、 それが通るようにコードを書いてもらう。
  10. 19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 どんなものになっている? 初めて触れるときに概念を定着させるのが難しいものは、

    ステップを設けて、問題を解くごとに表現力の引き出しを増やし、 実際のコーディング時の実装方針の背景を汲み取れるようにしていく。
  11. 25 CONFIDENTIAL - © 2022 CoDMON Inc. 25 sealedが使えるようになる ここまでの問題が解けるとsealedの利便性を理解できるハズ。

    sealedな型の値に対する パターンマッチでコンパイル時に 網羅性チェックできることを理解する
  12. 28 CONFIDENTIAL - © 2022 CoDMON Inc. 28 実際の業務だとEitherを使う ※

    ジェネリクスを学び、Either<A, B>が使える必要はある
  13. 30 CONFIDENTIAL - © 2022 CoDMON Inc. 30 どうすすめる?? 学ぶ側

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

    教える側 テストと実装を両方書いて投稿 改善すべき点を示す
  15. 33 CONFIDENTIAL - © 2022 CoDMON Inc. 33 フィードバックのポイント 関数型な言語機能を学ぶことの難しさは、

    概念を理解しながら実装方法をキャッチアップすることにある。 たとえばListのflatMapを使えるようになってほしいとして、 単純にflatMapの構文だけ教えても使えるようにはなりづらい。
  16. 34 CONFIDENTIAL - © 2022 CoDMON Inc. 34 アンラーニングの難しさ phpでflatMap相当をこう書いていたひとは多分すんなりflatMapが使える

    = 配列を作ってネストした構造を潰すということを理解しているから ※ array_mergeは与えたN件のarrayを結合する関数。   この例だと、可変長引数にarrayを展開している
  17. 35 CONFIDENTIAL - © 2022 CoDMON Inc. 35 アンラーニングの難しさ foreachでループをネストする処理を書く人は、

    手続き的 => 宣言的なコードを書く習慣へのアップデートが必要。
  18. 37 CONFIDENTIAL - © 2022 CoDMON Inc. 37 ペアプロはいいぞ ドキュメントやチャットの文言だけで説明するのは難易度が高く、

    直接対話しながらペアで取り組むのはポジティブな側面が多い。 • 教える側も表情や声色からわかることがある • 理解の曖昧なところにフィードバックが即座に受けられる • 試行回数の増加と心理的安全性の確保 ◦ うまくいかないときに詰まる時間がもったいない ◦ “わかった・できた” という感覚をより多く得やすい ※ ペアプロ自体に好みがあるのでこれもまた合う/合わないは人によります
  19. 38 CONFIDENTIAL - © 2022 CoDMON Inc. 38 ペアプロでわかる大事なこと 学んでいるひとが何がわかっていて何をわかっていないのかのすり合わせ

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

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

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

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