夕学講座の時間を使って圏論勉強会を開催しました!
こんにちは!はじめましての方ははじめまして。ネクストビートエンジニアの溝上です。
弊社では金曜日の夕方17時〜19時の間、エンジニアリングを楽しみ勉強する場として夕学(せきがく)講座というものが作られています。夕学講座については過去紹介した記事がありますので、気になる方は読んでみてください。
業務時間内にエンジニア同士で学び合おう!「夕学講座」のご紹介
私はこの夕学講座を使って、10月〜12月の間、社内で圏論勉強会を開催しました。本記事では、勉強会で学んだことと感想を共有できればと思います。
はじめに
みなさん、圏論って知っていますか?名前だけ知っている方、数式がたくさん出てくるような難しそうな理論ですよね。知らない方、モナドやモノイド、ファンクターって聞いたことありませんか?その理論です。知っている方、恐れ入ります。
圏論は、幾何学や集合論、物理学、プログラム意味論など様々な分野において基礎となる理論です。ざっくりと言うと、あらゆるシステムを点と矢印という概念に抽象化するものです。
それって何の役に立つの?と思われるかもしれませんが、私は、関数プログラミングをはじめとするプログラミングにおいて、ある種のデザインパターンのようなものだと考えています。弊社が採用しているプログラミング言語である Scala や、Cats、Play Json そして Slick などのライブラリにも圏論は潜んでいます。よければ探してみてください。
圏論勉強会のアウトプット
まず、圏論勉強会のアウトプットがいくつかありますので、ご紹介します。
自作ライブラリ
圏論を勉強しながら、その概念を Scala のコードに落とし込んでみました。作成中ですが、Hamcat というライブラリです。
よく見るものとして、以下のクラスと型クラスを実装しています。
- Semigroup (亜群)
- Monoid (モノイド)
- Functor (共変自己関手)
- Const (定関手)
- Contravariant (反変自己関手)
- Writer (Writer モナド)
- Profunctor
- FunctionK (1st-order-kind 関数)
モナドや随伴といったコアな部分はまだできていないので、追加していきたいです。
※2021年3月6日、GPL-3.0 ライセンスの下 OSS として公開しました 🚀✨
演習用プロジェクト
勉強会の参加者の方にもコードを書いてもらいたいなと思ったときに、コードを書いて学べるプロジェクトを作りました。
Hamcat で作ったデータ型のうち、以下のクラスと型クラスのインスタンスを実装することができます。
- Semigroup
- Monoid
- Functor
- Writer
『Scala で始める圏論入門』の資料
今回使用した教材が英語だったので、教材を日本語訳しながら自分の言葉で資料をまとめました。使用した教材は Bartosz Milewski さんの Category Theory for Programmers — Scala Edition です 。この教材は、翻訳や頒布が自由のライセンスで公開されています。3部あるうちの1部を読みました。
資料は下記サイトにて公開しておりますので、よければご覧ください。
教材である Bartosz Milewski さんのブログ:
教材の PDF もとい Scala エディションのリポジトリ:
なぜ開催したか
どうして社内勉強会を開催したかと言うと、関数プログラミングをちゃんと勉強したいと思ったからです。そして、Scala 未経験、関数プログラミングが初めての方がいる中で、関数プログラミングの知見をちゃんと残していきたいと思いました。
私自身圏論に興味はあったので、圏論をある程度理解したら社内で圏論勉強会開きたい!と思っていました。それが2020年7月の私です。ですが、圏論の数学書は分厚く、概念が抽象的すぎて理解し難く、勉強は全く進みませんでした。そんな中 Milewski さんのプログラマー向けの資料を見つけました。「これなら勉強しやすいかも。圏は急げ(善は急げ)だ!」と思い、すぐ上長に「やり方を試行錯誤することにはなると思いますが、やってみたいです。」と Slack しました。快く承諾していただき、その週から勉強会を開催しました。
勉強会の目的と目標
私にとっても参加者の方にとっても有意義な時間にするために、勉強会の目的を以下のように設定しました。
- 関数プログラミングの基礎である圏論について学ぶことによって、関数プログラミング言語、特に Scala への理解を深めること
- 圏論に対しての敷居を下げること
- 関数プログラミングの理論に対して学習の土台を整えること
そして、勉強会の目標を以下のように設定しました。
- 圏、関手、自然変換について例を交えて説明できるようになろう(1部)
- モナドって何?と聞かれたときに答えられるようになろう(3部)
どんな形式で開催したか
私自身圏論を学ぶのは初めてだったので、勉強会と言ってもプレゼンターが一方的に紹介するわけでなく、輪読会のようなゆるい雰囲気でした。
圏論勉強会は、全8回に渡って開催されました(ちなみに、第8回はクリスマスでした)。1回で1章ずつ進める感じですね。
- 第1回 イントロダクション、1章 圏: 合成の本質
- 第2回 2章 型と関数、3章 いろいろな圏
- 第3回 4章 クライスリ圏
- 第4回 5章 積と余積、6章 代数的データ型
- 第5回 scala-category-exercise を使った演習
- 第6回 7章 関手
- 第7回 8章 関手性
- 第8回 10章 自然変換
第1回は準備の時間もなかったので、英語の資料を訳しながら進めていきました。かなり声が大きかったので、他の夕学講座を受けている方のご迷惑になっていた気がします。すみません!笑
第2回は事前に資料を読み込んで、補足だけ GitHub の資料にまとめました。英語の資料を訳しながら、わかりづらい部分や Tips は GitHub の資料を見る、という形式でした。
第3回からは日本語の資料を事前に作り、日本語の資料を読み進める形式になりました。やはり日本語の方が参加者の方も理解しやすく、突っ込んだ質問や議論が多くなっているように感じました。これくらいから参加者のみなさんが圏の定義をスラスラと言えるようになり、「圏と圏の間の対応ってのも考えられるのではないか?」「Scala の Product が積なのか」などアツイ議論を繰り広げていました。
ありがたいことに、チームのメンバーや個人でコンピュータサイエンスを学んでいる方など、多くの方に参加していただきました。このご時世ですので、リモートの方とは Google Meets で繋ぎ、ソーシャルディスタンスを保って大きな声で資料を読んでいました(マスクなのもあり、息切れ必須でした)。
開催してどうだったか
圏論勉強会を開催して、いくつか学んだことがあります。
- 圏論に興味がある人は一定数いて、数学の素養がなくてもイチから学べること
- 圏論を知っていると、ライブラリコードを理解するのに役立つこと
毎週資料を作りアウトプットする場があるというのはありがたかったですし、とても楽しかったです。圏論において登竜門と言われる米田の補題もまだ扱ってませんし、モナドも深いところまで学べていません。圏論勉強会2部と3部の開催も視野に入れて、これからも学んでいきたいです。
おわりに
本記事では、弊社の夕学講座という制度を使って開催した圏論勉強会についてご紹介しました。
今後も、関数プログラミングをはじめとする技術を楽しむ場を作っていければと思っています。
またお会いしましょう!👋
We are hiring!
「人口減少社会において必要とされるインターネット事業を創造し、ニッポンを元気にする。」
を理念に掲げ一緒に働く仲間を募集しております。
Scala を書きたい!関数プログラミングを学びながらプログラミングしたい!という前のめりな方、ご応募お待ちしております。