© Chatwork社内のメンバーに関数型プログラミングの学習・教育についていろいろ聞いてみたテックリード 加藤潤一(かとじゅん)2023/3/24Chatwork株式会社
View Slide
自己紹介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が明確(参照透明)● 式の合成で作られる関数はコードの品質が高い● 合成しやすい式を使ってコード部品を小さく作りやすい● 継承に頼らない設計が可能● 並行性に優れたプログラミングが可能● クロージャをうまく使えばはクラスと同等の使い方ができるさすがに有用性について否定的な人はいなかった笑
【私見】 有用性の一事例10mapは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 Programmingin 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おわり