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
社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた
Search
かとじゅん
March 24, 2023
Programming
2.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた
かとじゅん
March 24, 2023
More Decks by かとじゅん
See All by かとじゅん
TAKTでAI駆動開発の品質を設計する
j5ik2o
9
2k
終盤で崩壊させないAI駆動開発
j5ik2o
5
3.3k
CQRS/ESになぜアクターモデルが必要なのか
j5ik2o
0
2.3k
メッセージ駆動が可能にする結合の最適化
j5ik2o
11
7.2k
曖昧なプロンプトでも正しいコードが書ける理由
j5ik2o
0
540
AIコーディングエージェントの現実と設計品質の重要性
j5ik2o
0
160
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
17
8.4k
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
8
1.7k
メッセージとイベントを中核に置いたシステム設計の有用性について
j5ik2o
12
4.5k
Other Decks in Programming
See All in Programming
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
150
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
220
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
480
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
220
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.9k
React本体のコードリーディング
high_g_engineer
1
140
テーブルをDELETEした
yuzneri
0
140
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
180
Go 1.27 における memory allocation の高速化
andpad
0
100
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
350
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
380
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
67k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
590
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
240
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
KATA
mclloyd
PRO
35
15k
Making Projects Easy
brettharned
120
6.7k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
890
GraphQLとの向き合い方2022年版
quramy
50
15k
Music & Morning Musume
bryan
47
7.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Transcript
© Chatwork 社内のメンバーに 関数型プログラミングの学習・教育 についていろいろ聞いてみた テックリード 加藤潤一(かとじゅん) 2023/3/24 Chatwork株式会社
自己紹介 2 • twitter, github ともに j5ik2o • Chatworkで働いてます ◦
チーム横断的にいろんなことやって ます • よく使うプログラミング言語 ◦ Scala(仕事) ◦ Rust(趣味) • テスラ モデルY パフォーマンスというガ ジェットを買いました • WEB+DB PRESS vol132 「オブジェクト 指向神話からの脱却」のレビュー 最近、明治維新の人?と言われたりします
発表の目的 3 • Scala導入初期(2014年ぐらい)から関数型プログラミングは積極的に採用しており、 座学で教育するというよりはモブやペアで実践的に取り組んできた経緯があります • 今回は、みなさんがどのように学んできたのかを把握するために、Scalaや TypeScriptなどで関数型プログラミングを日常的に使っている人たちにアンケート を採ってみた。そのアンケート結果をみながら私見を挟みつつ、ゆるく発表してみ ようという企画です
• 僕らの現状を把握してみたという感じで「こうやるといいよ」みたいな提案はあま りないです…。サンプルがn=7なのでこの資料を鵜呑みにしないでください… • イベントを盛り上げるアイスブレイク的な発表です。お酒でも飲みながら、ゆるく 聞いてください
会社概要 4 会社名 Chatwork株式会社 代表取締役CEO 山本 正喜 従業員数 267名(2022年3月末日時点) 所在地
東京、大阪、ベトナム、台湾 設立 2004年11月11日
Chatworkとは 5 ※Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(
MAU:Monthly Active User)調査。※調査対象は Chatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスを Chatwork株式会社にて選定。 効率的に情報共有できる グループチャット 仕事の見える化ができる タスク管理 見落としがなくなる ファイル管理 いつでも会議ができる ビデオ/音声通話
Chatworkは利用者数No.1*のビジネスチャット 6 * Nielsen NetView 及びNielsen Mobile NetView 2021年4月度調べ月次利用者(MAU:Monthly Active User)調査
3月 リリース 10万社 突破! 20万社 突破! 30万社 突破! 導入社数 35万4000社以上! (2021年12月末日時点)
早速 本題に(おそらくgdります…)
アジェンダ:アンケートの質問一覧&あいだに私見をはさみます 8 • Q1. 関数型プログラミングが有用だと感じる理由は? • Q2. どのように関数型プログラミングを学びましたか(複数可)? • Q3.
関数型プログラミングの学習難易度はどのくらいか? • Q4. 関数型プログラミングの教育難易度はどのくらいですか? • Q5. 関数型プログラミングを教えるならどの言語がよいか? • Q6. Q5のプログラミング言語をおすすめする理由は? • Q7. 関数型プログラミングを学ぶ人へのアドバイスはありますか?
Q1. 関数型プログラミングが有用だと感じる理由は? 9 • テストがしやすい • 副作用を排除したIN/OUTが明確(参照透明) • 式の合成で作られる関数はコードの品質が高い •
合成しやすい式を使ってコード部品を小さく作りやすい • 継承に頼らない設計が可能 • 並行性に優れたプログラミングが可能 • クロージャをうまく使えばはクラスと 同等の使い方ができる さすがに有用性について否定 的な人はいなかった笑
【私見】 有用性の一事例 10 mapはflatMapと succeedで、optはmap とsucceedでつくられ る。副作用がないため 関数の挙動が掴みやす い
Q2. どのように関数型プログラミングを学びましたか(複数可)? 11 • 書籍 ◦ 『Scala 関数型デザイン &プログラミング』 ◦
『Scalaスケーラブルプログラミング』 ◦ 『すごいHaskellたのしく学ぼう!』 ◦ 『Real World Haskell』 ◦ 『プログラミングElixir』 • 公式ドキュメント類 ◦ Hoogle x Hackage 身のみ蓋もないが、良書を使った自 学習が基本。昔に比べたらだいぶ高 速道路だと思う
【私見】『Scala 関数型デザイン &プログラミング』は開眼する本 12 • すこしScalaに慣れたらこの本がお勧め。 • 関数型プログラミングのよさをいかした設計を学ぶ意味で、こ の本はすごくよい •
この本は読むというより「エクササイズ」を実際に解き、コー ドを書く本 ◦ ChatworkでScala採用初期のころList型を実装する課題 で盛り上がった • よい本だけど、絶版…。 ◦ MANNINGなら買えます。『Functional Programming in Scala』現在Scala3対応のセカンドエディションあり • 他の言語でも、考え方をある程度適用可能 ◦ 本書で紹介されるParserコンビネータライブラリ、 Property-based testingライブラリをRustで実装した
Q3. 関数型プログラミングの学習難易度はどのぐらいですか? 13 難易度は比較的高め?
Q3. 関数型プログラミングの学習難易度はどのくらいか? 14 • 学習目的: 関数型プログラミングの理解度や求めるスキルレベルによって、難易度が変わりま す。現場で実践に必要なレベルであれば習得は可能で、慣れるまでに2〜3ヶ月かかるとの意見 があります。 • 既存のプログラミング経験:
ある程度のプログラミング経験があり、別のパラダイムを学ぶ場 合、先入観が邪魔して難易度が上がることがあるとの意見があります。ただし、関数型プログラ ミングを早い段階で学ぶことで、既存のパラダイムへの過学習が少なく、理解が容易になるとい う意見もあります • 純粋関数型言語とマルチパラダイム言語: 純粋関数型言語でのプログラミングは難しいとの意見 がありますが、多くの現代のプログラミング言語が関数型プログラミングの機能を備えているた め、基本的な概念の学習は難しくないとされています。 • 数学的な知識: 関数型プログラミングを理解し、困難な問題を解決するためには、数学的な知識 や理解がある程度必要となるとの意見があります。 基本的な概念の習得は、多くのプログラミング言語が関数型プログラミングの機能を備えているた め、難しくないとされています。しかし、純粋関数型プログラミングを追求したり、複雑な問題を解 決するために関数型プログラミングを活用する場合、数学的な知識や理解が求められるため、難易度 が上がることがあります。
Q4. 関数型プログラミングの教育難易度はどのくらいですか? 15 • どう教えるかによる? • 数学の得意不得意が大きく影響すると思うので、一概に言えないので、真ん中に。 • これも何をどこまで教えるか次第かなと... 「何を学ぶか」に依存するので
答えるのは難しい・・・ 具体的な回答は得られなかっ た
Q5. 関数型プログラミングを教えるならどの言語がよいか? 16
Q6. Q5のプログラミング言語をおすすめする理由は? 17 • Haskell: 書籍との対応が取りやすく、他のパラダイムでの記述が難しく、関数型プログラミング のエッセンスを学ぶのに適しています。特にバックエンド開発者に適しているとの意見がありま す。 • Elm:
見た目が動くものを作れるため直感的に理解しやすく、他のパラダイムでの記述が難しいた め、関数型プログラミングのエッセンスを学ぶのに適しています。特にフロントエンド開発者に 適しているとの意見があります。 • Rust: 手続き型プログラミングを書くことができ、徐々に関数型プログラミングに移行できると いう特徴があります。このアプローチは、関数型プログラミングに徐々に慣れていくのに役立つ でしょう。 • 軽量で実行環境が得られやすい言語: 学習者がすぐに実行できる言語を選ぶことで、関数型プログ ラミングの学習が容易になるとの意見があります。 教える言語は学習者の背景や目的、そして言語の特性によって異なります。実用性が高く、関数型プロ グラミングのエッセンスを学ぶのに適した言語を選ぶことが重要です。HaskellやElmは、関数型プロ グラミングの原理を学ぶには適しており、バックエンド開発者やフロントエンド開発者にそれぞれ推奨 されています。Rustは徐々に関数型プログラミングに移行するアプローチをとることができる点で、一 部の学習者にとって適しているかもしれません。
【蛇足】関数型プログラミングが怖いと感じられる理由と対処法 18 関数型プログラミングが「怖い」と感じられる理由は人それぞれですが、一般的には以下のような要素 が考えられます。 • 未知のものへの恐れ: 関数型プログラミングは、命令型プログラミングとは異なるパラダイムであ り、初めて学ぶ人にとっては未知のものです。そのため、学習の難しさや新しい概念に対する恐 れから、「怖い」と感じることがあります。 •
理解が難しい概念: 関数型プログラミングには、高階関数や純粋関数、カリー化、モナドなど、独 自の概念が多く存在します。これらの概念を理解することが難しく感じるため、「怖い」と感じ ることがあるでしょう。 • 学習曲線: 関数型プログラミングをマスターするためには、従来の命令型プログラミングとは異な る思考方法やアプローチが必要です。そのため、学習曲線が急であり、習得が難しいと感じるこ とがあります。 • 利用される言語: 関数型プログラミング言語(HaskellやScalaなど)は、一般的なプログラミング 言語(PythonやJavaなど)とは異なる構文や特性を持っています。これらの言語に慣れるまでに は時間がかかり「怖い」と感じることがあるでしょう。 ただし、アンケート回答者たちが「怖くない」と言っているように、関数型プログラミングは十分に学 べるものです。適切な学習方法を見つけ、継続的に学ぶことで、関数型プログラミングの恩恵を享受で きるようになります。未知のものへの恐れは自然なことですが、挑戦することで克服できるはずです。
Q7. 関数型プログラミングを学ぶ人へのアドバイスはありますか? 19 • パラダイムや設計の指向を学ぶことは、ソフトウェア開発の視野を広げることにつながりま す。関数型プログラミングもその一つであり、取り組みをラフに捉えることで、怖さやプレッ シャーを減らすことができます。 • 関数型プログラミングの学習は、恐れることはありません。ポジティブな態度で取り組むこと で、学習の難しさを軽減できるでしょう。
• 学習の目的を明確に持っておくことが重要です。興味や好奇心から学ぶのか、解決したい課題 があるのかによって、学習の進め方や焦点が変わるためです。 関数型プログラミングを学ぶ際には、柔軟な態度で取り組み、学習の目的を明確に持つことが重要で す。パラダイムや設計指向を学ぶことで、ソフトウェア開発の視野が広がり、新たなアイデアやアプ ローチが見えてくるでしょう。学習過程で恐れず、ポジティブな態度で関数型プログラミングに取り 組むことで、より効果的にスキルを習得し、問題解決能力を向上させることができます。最終的に は、関数型プログラミングが提供するエッセンスを、自分の開発スキルに活かすことが大切です。
© Chatwork おわり
None