Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
はじめて関数型言語の機能に触れるエンジニア向けの学び方/教え方 / how-to-learn-...
Search
jsoizo
June 15, 2025
1.5k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
はじめて関数型言語の機能に触れるエンジニア向けの学び方/教え方 / how-to-learn-or-teach-for-fp-beginner
jsoizo
June 15, 2025
More Decks by jsoizo
See All by jsoizo
小さくはじめるPeoperty Based Testing
jsoizo
1
1.1k
kotlinxライブラリの歩き方 〜 Kotlin公式エコシステムを使いこなす〜
jsoizo
1
260
よくつかっているIterableの自作extensionを紹介します
jsoizo
0
130
HARD THINGS in Ad-Tech Engineering
jsoizo
1
1k
“エンジニア35才定年説に挑戦する” 開発チームのマネジメント
jsoizo
41
16k
drone.ioを使って docker build & push自動化
jsoizo
0
2.5k
Featured
See All Featured
From π to Pie charts
rasagy
0
220
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
400
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
170
Scaling GitHub
holman
464
140k
The World Runs on Bad Software
bkeepers
PRO
72
12k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
My Coaching Mixtape
mlcsv
0
160
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
180
Transcript
はじめて関数型言語の機能に触れる エンジニア向けの学び方/教え方 2025年06月15日 関数型まつり2025 関根 純 @jsoizo
2 経歴 この会場内で本カンファレンスに最も最適な名前の自信ある。 関数型プログラミングは正直そんなに得意じゃないです。 自己紹介 関根 純 せきね じゅん 2023.01 コドモンに開発エンジニアとして入社
2024.01 育児休業(6ヶ月) 様々な副作用と向き合う 2025.01 新規プロダクトや基盤開発に従事
3 今日話すこと PHP => Kotlinで利用言語を変えるときの
4 今日話すこと 関数型な機能のトレーニングについて
5 今日話すこと やや教える側の立場に寄ってお話します🙇💦
6 今日話すこと 関数型言語を学ぶ入口の定め方 具体的なトレーニングの資料 学ぶ・教えるうえで大事なこと 1 2 3
7 今日話すこと 関数型言語を学ぶ入口の定め方 具体的なトレーニングの資料 学ぶ・教えるうえで大事なこと 1 2 3
8 CONFIDENTIAL - © 2022 CoDMON Inc. 8 前提 :
令和のWebアプリケーション開発 モダンなWebアプリケーション開発の現場において、大抵の言語で • イミュータブルな値の宣言 • mapやreduceで高階関数を渡して処理 くらいは当たり前にできるし、 && WebフロントにおいてはReactやVue等のFunctionalな思想で 作られたライブラリを利用することも多いため、 「関数型言語のテクニックに一切触れたことがない」という人は少ない。
9 CONFIDENTIAL - © 2022 CoDMON Inc. 9 本題:何を関数型プログラミングの入口とするか? ケースバイケースで、
組織次第です... N=1のPHPエンジニア向けのサーバサイドKotlin学習を例として話します
10 CONFIDENTIAL - © 2022 CoDMON Inc. 10 関数型の機能を持った言語採用時の悩み 特にTypeScriptやScala,
Kotlin等の実装時の選択肢が多い言語においては、 どの程度Functionalな実装を良しとする?かは組織によって異なる。 命令/OOP寄り FP寄り 副作用 (ロギングで例示) Loggerを直接呼ぶ DIで注入可能にする Effect切り出し エラー処理 例外を投げる Result等使いつつ 部分的に例外も併用 一切の例外を許さず すべて型で表現 中庸 ・・・ その他にも色々
11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 要はバランス... コドモンでは「ちょっと関数型エッセンス取り入れましたくらい」
が好ましいのでは?という大まかな認識でコーディングすることが多い。 • アプリ設計はOOPかつClean Architectureの良くあるパターンで • よほどの理由がない限りイミュータブルにする • 言語標準のデータ型を利用し、一部便利なライブラリ(Arrow)を採用 • 代数的データ型等を利用してコンパイル時チェックを心がける • 関数の純粋性は求めないが、IO関係はクラスに対してDIで注入する 言語(Kotlin)としての引き出しもちょうど同じくらいである。
12 CONFIDENTIAL - © 2022 CoDMON Inc. 12 なにから学ぶか/教えるか PHP
=> Kotlin のケースだと 主だった言語機能の差分にたいして集中的にトレーニングしている。 ※ 発展編としてEither(Arrow-kt)の使い方も学ぶ必要がある どういうことを PHP => Kotlinの差分で知るべきこと 極力イミュータブル、文ではなく式 ifやwhenなどが値を返せること nullの扱いやJavaコードの呼び出し 関数の値の返し方の作法の違い flatMap等のコレクション操作関数 豊富にあるので目的ごとに使い分けること 代数的データ型の活用 コンパイルで極力防ぐ努力をすること
13 CONFIDENTIAL - © 2022 CoDMON Inc. 13 どう学ぶか/教えるか 基本的にはOJTがメイン。
異動や転職には不安がつきもの。理論はさておき実際の開発タスク において貢献できるようになることのほうが心理的に安全。 一方でOJTは「業務タスクを遂行すること」に主眼が置かれることが多く、 忙しさなどの理由から知識を正しくつけることはないがしろにされがち。 「あまりわかっていないけどこう書けばいい」で止まってしまう可能性。 → 自習的なアプローチによって補っていくのが有用
14 CONFIDENTIAL - © 2022 CoDMON Inc. 14 +αとしての自習をどうするか 教科書的なものを作ることをしてもよいが、更新し続けるコストが高い...
→ 言語公式のドキュメントをフル活用するアプローチ はコスパがいい ※ 組織の規模やスタイルによるので正解ではない。最近ならAI活用なども良いかもしれない 思想や仕様は公式のドキュメントを読み込んで大枠で理解し、 それを前提とした問題を解くことで実装スキルを高めていく。 参考書を公式ドキュメントで代用し、章末問題を自分たちで用意する
15 今日話すこと 関数型言語を学ぶ入口の定め方 具体的なトレーニングの資料 学ぶ・教えるうえで大事なこと 2 1 3
16 CONFIDENTIAL - © 2022 CoDMON Inc. 16 どんなものになっている? このような章立て。必ず伝えたいことから順番に、徐々に難易度を上げる
理解していないと開発できない系 できれば理解してほしい系 時間の都合でなかなか準備できてない...(;´Д`)
17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 どんなものになっている? 問題文
& 実装するべき関数のシグネチャとテストを定義し、 それが通るようにコードを書いてもらう。
18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 想定している解答 こういう解答ができるとよさそう。
模範解答はテキスト内には残していない
19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 どんなものになっている? 初めて触れるときに概念を定着させるのが難しいものは、
ステップを設けて、問題を解くごとに表現力の引き出しを増やし、 実際のコーディング時の実装方針の背景を汲み取れるようにしていく。
20 CONFIDENTIAL - © 2022 CoDMON Inc. 20 どんなものになっている?
21 CONFIDENTIAL - © 2022 CoDMON Inc. 21 限りなく小さいステップを踏んでいく とりあえず知っていることから
だれでも理解しているEnumをサクッと抑える
22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 どんなものになっている?
23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 限りなく小さいステップを踏んでいく sealed
でより複雑な仕様を実装する
24 CONFIDENTIAL - © 2022 CoDMON Inc. 24 どんなものになっている?
25 CONFIDENTIAL - © 2022 CoDMON Inc. 25 sealedが使えるようになる ここまでの問題が解けるとsealedの利便性を理解できるハズ。
sealedな型の値に対する パターンマッチでコンパイル時に 網羅性チェックできることを理解する
26 CONFIDENTIAL - © 2022 CoDMON Inc. 26 どんなものになっている?
27 CONFIDENTIAL - © 2022 CoDMON Inc. 27 関数の戻り値として使えるようになる 抽象度を下げたEitherを作って使う実践
28 CONFIDENTIAL - © 2022 CoDMON Inc. 28 実際の業務だとEitherを使う ※
ジェネリクスを学び、Either<A, B>が使える必要はある
29 今日話すこと 関数型言語を学ぶ入口の定め方 具体的なトレーニングの資料 学ぶ・教えるうえで大事なこと 3 1 2
30 CONFIDENTIAL - © 2022 CoDMON Inc. 30 どうすすめる?? 学ぶ側
• 先述の通りOJTが基本なので任意で箸休め程度に取り組む • 個人ごとのslack #times_xxx チャンネルに書き出す 教える側 • timesチャンネルに潜り込んでレスをする形でフィードバック • 理想的にはOJTしている人などがフィードバックできると良い • コドモンでは僕が嗅ぎつけてフィードバックすることが多め • 1on1等の場を用いる場合もある
31 CONFIDENTIAL - © 2022 CoDMON Inc. 31 実際にはどんな感じ Set<T>を使って欲しいという意図のお題
32 CONFIDENTIAL - © 2022 CoDMON Inc. 32 実際にはどんな感じ 学ぶ側
教える側 テストと実装を両方書いて投稿 改善すべき点を示す
33 CONFIDENTIAL - © 2022 CoDMON Inc. 33 フィードバックのポイント 関数型な言語機能を学ぶことの難しさは、
概念を理解しながら実装方法をキャッチアップすることにある。 たとえばListのflatMapを使えるようになってほしいとして、 単純にflatMapの構文だけ教えても使えるようにはなりづらい。
34 CONFIDENTIAL - © 2022 CoDMON Inc. 34 アンラーニングの難しさ phpでflatMap相当をこう書いていたひとは多分すんなりflatMapが使える
= 配列を作ってネストした構造を潰すということを理解しているから ※ array_mergeは与えたN件のarrayを結合する関数。 この例だと、可変長引数にarrayを展開している
35 CONFIDENTIAL - © 2022 CoDMON Inc. 35 アンラーニングの難しさ foreachでループをネストする処理を書く人は、
手続き的 => 宣言的なコードを書く習慣へのアップデートが必要。
36 CONFIDENTIAL - © 2022 CoDMON Inc. 36 図解が結局一番伝わる たとえばflatMapならmapとflattenのパイプと説明する
※ これEitherのflatMapとかになると説明が難しくなるんだよね...
37 CONFIDENTIAL - © 2022 CoDMON Inc. 37 ペアプロはいいぞ ドキュメントやチャットの文言だけで説明するのは難易度が高く、
直接対話しながらペアで取り組むのはポジティブな側面が多い。 • 教える側も表情や声色からわかることがある • 理解の曖昧なところにフィードバックが即座に受けられる • 試行回数の増加と心理的安全性の確保 ◦ うまくいかないときに詰まる時間がもったいない ◦ “わかった・できた” という感覚をより多く得やすい ※ ペアプロ自体に好みがあるのでこれもまた合う/合わないは人によります
38 CONFIDENTIAL - © 2022 CoDMON Inc. 38 ペアプロでわかる大事なこと 学んでいるひとが何がわかっていて何をわかっていないのかのすり合わせ
ができていると学習効果が高まっていく。 学ぶ側は: 思考過程や苦しんだこと、拙くてもいいので言語化すること = 理解を言葉に出すことで何がわかっていないか自己認識する(テディベア効果) 教える側は: 相手は自分ではなく、詰まるところも人によって異なると理解したうえで 何がわかっていないかを汲み取り、わかる言葉や図で助けること
39 CONFIDENTIAL - © 2022 CoDMON Inc. 39 まとめ 1.
関数型な機能を持った言語を学ぶ/教えるために、まず 以前の言語との機能差分を抽出して頻出パターンから取り組む 2. 求められる書き方に至るまでの知識の獲得ステップがあるはず なのでそれをトレーニングの資料等に落とし込むとスムーズ 3. 関数型な機能に対する理解度合いは人により異なので、 学ぶ・教える際に対話を重視しペアで取り組むと詰まりづらい
40 CONFIDENTIAL - © 2022 CoDMON Inc. 40 まとめ 1.
関数型な機能を持った言語を学ぶ/教えるために、まず 以前の言語との機能差分を抽出して頻出パターンから取り組む 2. 求められる書き方に至るまでの知識の獲得ステップがあるはず なのでそれをトレーニングの資料等に落とし込むとスムーズ 3. 関数型な機能に対する理解度合いは人により異なので、 学ぶ・教える際に対話を重視しペアで取り組むと詰まりづらい
41 CONFIDENTIAL - © 2022 CoDMON Inc. 41 まとめ 1.
関数型な機能を持った言語を学ぶ/教えるために、 以前の言語との機能差分を抽出して頻出パターンから取り組む 2. 求められる書き方に至るまでの知識の獲得ステップがあるはず なのでそれをトレーニングの資料等に落とし込むとスムーズ 3. 関数型な機能に対する理解度合いは人により異なので、 学ぶ・教える際に対話を重視しペアで取り組むと詰まりづらい
42 ご清聴ありがとうございました!
43 コドモン採用ページ 開発ブログ コドモンでは一緒に働きたい仲間を募集しています!
None