アルゴリズムとデータ構造の輪講をした話

# はじめに

謎の有志団体であるchallenge_club（技術チャレンジ部）の活動の一環で、2022年にアルゴリズムとデータ構造を学ぶために社内の希望者を募って輪講をしました。
私は昨年まで競技プログラミングも未経験でしたが、競技プログラミングに参加し、輪講を開催してみました。私含めて数名のメンバーで運営しましたが、私個人の備忘録もかねて、私の目線で記事にさせていただきます。

- 題材：[問題解決力を鍛える!アルゴリズムとデータ構造](https://www.amazon.co.jp/%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87/dp/4065128447/ref=sr_1_1?adgrpid=59027707171&gclid=Cj0KCQiAm5ycBhCXARIsAPldzoUquH7lSZF6ZpPpqjqm7SOMuHYvxQrV19_QHdUD-87fRhvfggVMDTgaAk4yEALw_wcB&hvadid=618552970215&hvdev=c&hvlocphy=1009341&hvnetw=g&hvqmt=e&hvrand=18388915996363590078&hvtargid=kwd-332424084896&hydadcr=27265_14598048&jp-ad-ap=0&keywords=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&qid=1669815270&qu=eyJxc2MiOiI0LjA0IiwicXNhIjoiMy40NiIsInFzcCI6IjMuNjAifQ%3D%3D&sr=8-1)
けんちょんさんこと大槻兼資氏の書籍です。
[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/24bd42fb-71f3-d96e-9e37-e6621051485e.png" width="500">](https://www.amazon.co.jp/%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87/dp/4065128447/ref=sr_1_1?adgrpid=59027707171&gclid=Cj0KCQiAm5ycBhCXARIsAPldzoUquH7lSZF6ZpPpqjqm7SOMuHYvxQrV19_QHdUD-87fRhvfggVMDTgaAk4yEALw_wcB&hvadid=618552970215&hvdev=c&hvlocphy=1009341&hvnetw=g&hvqmt=e&hvrand=18388915996363590078&hvtargid=kwd-332424084896&hydadcr=27265_14598048&jp-ad-ap=0&keywords=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&qid=1669815270&qu=eyJxc2MiOiI0LjA0IiwicXNhIjoiMy40NiIsInFzcCI6IjMuNjAifQ%3D%3D&sr=8-1)

---

# 自己紹介

- 名前：kiwsdiv
- 会社：従業員多めのメーカー
- 仕事：先行開発部隊で信号処理開発や解析、評価など
    プログラミングはするけど業務でのソフト開発は未経験
- 1年前まで競技プログラミングも未経験
    輪講しながら問題解くようになってようやく平均3~4完くらいになりました。
    まだ茶色ですがもうすぐ緑になって色変記事を書きます(願望)
- 大学では電気や物理学を学ぶ研究室に在籍
---
# なぜ輪講をやってみたのか？

- 信号処理や解析用にコーディングをする中で、アルゴリズムやデータ構造の基本的な知識や実装スキルが必要性を感じた。
- 有識者(競プロ経験者)勧めていただき、有志メンバーでAtCoderのコンテストに挑戦し始めた。
- オススメの本として、けんちょんさんの本が話題になった。
- 個人的にもけんちょんさんのQiita記事や[アルゴ式](https://algo-method.com/)に大変お世話になった。
- 組織間の技術情報共有や人の交流がない職場だったので、輪講をきっかけに交流する機会を作りたかった。(他にも月一でのLT開催、ノウハウ記事サイトの運営など仕掛けました。)

    **→ アルゴリズムとデータ構造で輪講してみよう！**
---
# 活動の様子

## 時期
- 第1期：1月~3月
    8名を2グループに分けて活動していただく。
    「本の前半を学びましょう」と呼びかけたので、当時灰色や茶色レベルの方に集まっていただいた。

- 第2期：7月~10月
    8名を2グループに分け、内容もグループによって調整。
    - 前半グループでは2期から参加した人は第1期と同じ範囲を勉強していただいた。
    - 後半グループには第1期から継続している方に加えて、中・上級者にも参加いただき、前回輪講の続きから、本の後半を学んだ。
    後半から参加される方は競プロ経験者の方もおられました。茶色の私が最も経験値が低く、中・上級者は水色～青くらいのレベル感でした。

---
## 募集～輪講をはじめるまで
1. 有志メンバーで競技プログラミングにチャレンジ開始。
    （30人くらいで頑張ってます。別途記事にするかもしれません。）
1. 社内SNS(Yammer)に申込フォームを投稿。
    申込フォームには、大体のレベル感、参加可能な曜日、その他特記事項などの解答欄を準備。
    5~600人が閲覧するコミュニティに投稿し、技術チャレンジ部メンバーを中心に各回8名の申込があった。
    
1. 参加希望者のレベルや参加可能な曜日など、なるべく希望に沿ってグループ分け。
    4人一組でグループに分け、各グループに話を進めてくれる方に入っていただいた。
    
    ※ 画像は2回目の輪講時のグループ分けのスライド。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/5b40cfb5-15e1-e184-1e93-58199e311d50.png" width="800">
1. みんなで初回の説明会（キックオフ）実施。
    - 輪講の進め方、グループ、実施内容などを説明。
    - グループに分かれて担当やスケジュールを決める。
1. グループに分かれて活動スタート。

---
## 進め方
- 輪講は毎週1時間程度。
    - 最初の20分程度で内容について担当者が説明
    - 残りの時間で議論したり例題を解いたりする
    - 最後10分でまとめ＋次回の確認
- 例題や演習問題を交えて、理解して使えることを目指しました。
- 発表者以外のファシリテータを決めて時間管理をする。
- 資料はみんなが見ることができる形であればOK。
    結局、PowerPoint、Marpスライド、Googleスライドの3パターンでした。
- 資料は可能な限り、社内の勉強会資料置き場サイト（作った）に共有する。

--- 
## 実施内容
### 前半グループ（第1期）

|実施回|章|内容|
| ---  |-- |---   |
|1回目| 1, 2| 計算量とオーダー記法|
|2回目| 3 |設計技法(1)：全探索|
|3回目| 4 |設計技法(2)：再帰と分割統治法|
|4回目| 6 |設計技法(4)：二分探索法 |
|5回目| 7 |設計技法(5)：貪欲法 |
|6回目| 8 |配列、連結リスト |
|7回目| 8 |ハッシュテーブル |
|8回目| 5 |動的計画法|

### 後半グループ（第2期）

|実施回|章|内容|
|---|---|---|
|1回目|5 |動的計画法|
|2回目|9 |スタックとキュー|
|3回目|10 |グラフと木|
|4回目|11 |Union-Find|
|5回目|13 |グラフ探索|
|6回目|14 |最短路問題(1)|
|7回目|14 |最短路問題(2)※|
|8回目|15 |最小全域木|
|9回目|16 |ネットワークフロー|

※ 13章グラフ探索はボリュームが多くて詰め込み気味になったので、14章は2週に分けてみた。次やるなら最初から13章も2回に分けた方がよさそう。

---
## インフラ

- 業務外活動なので業務用PCを使わず、基本はDiscordでコミュニケーションする。
- 会議は基本Discordのボイスチャット、問題があるときはGoogle MeetやZoomなどを使用。
    業務PCを使う必要がある人、業務PCが使えない人など、人によって状況が異なるためいろいろ試してます。

    - Microsoft Teams：業務外なので業務PCを使用できないときに使いにくい。みんなが業務PCを使える時は問題なし。初回の説明会や第1期の輪講はTemasで実施した。
    - Discord：業務用PCでの使用を禁止されているので、業務PCを使うときはNG。画面共有時に遅くなることがあり、別の会議システムで改善することがあった。
    - Zoom: 無料アカウントだと40分しか会議できない。有料アカウントがあれば問題なし。
    - Google Meet: 特に問題なし。強いて言えば、社用PCでGoogleアカウントにアクセスしたくない。

※ 結局は、参加メンバーによって使いやすいものを使えばOK。

---
# 重要だと思ったこと

- 業務外なので、楽しむことが大事。みんなで楽しく活動すること！
- 無理のないスケジュールで組むこと。
- 人数は4~5名くらいがちょうどよさそう。
    人数が多すぎると予定が合わせられないし脱落者が出る可能性あり。
    4名でも日程調整が大変な時期があり、スキップすることも多かった。

- 本の内容をそのまま紹介するのではなく、具体例や問題を自分で作って説明すること。
    **具体化と抽象化を繰り返すことで理解が深まる！**
    よく理解している人ほど、いい例題や例え話を持ってきていただいた。
       （私は本の内容そのまま説明しがちだった。）

---
# 社内の反響
社内の反響も少しだけありました。第2期の参加者募集の社内SNS（Yammer）投稿に対して役員から、

「いい活動ですね。アルゴリズムとデータ構造は幅広く業務に役に立つ内容です。勉強会の資料も楽しく拝見させていただきました。」

という旨のポジティブなコメントがありました。業務外で（コソコソ）やってましたが、上司や会社の理解を得て活動できる可能性も感じました。

---
# さいごに

[問題解決力を鍛える!アルゴリズムとデータ構造](https://www.amazon.co.jp/%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87/dp/4065128447/ref=sr_1_1?adgrpid=59027707171&gclid=Cj0KCQiAm5ycBhCXARIsAPldzoUquH7lSZF6ZpPpqjqm7SOMuHYvxQrV19_QHdUD-87fRhvfggVMDTgaAk4yEALw_wcB&hvadid=618552970215&hvdev=c&hvlocphy=1009341&hvnetw=g&hvqmt=e&hvrand=18388915996363590078&hvtargid=kwd-332424084896&hydadcr=27265_14598048&jp-ad-ap=0&keywords=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&qid=1669815270&qu=eyJxc2MiOiI0LjA0IiwicXNhIjoiMy40NiIsInFzcCI6IjMuNjAifQ%3D%3D&sr=8-1)をほぼ1冊読み終えて、アルゴリズムやデータ構造の基本的な知識を得ることができました。ただ、まだ知っているだけで、使えるレベルになっていません。残っている章末問題を解いたり、競技プログラミングや業務で使ったりしながら、少しずつ自分の知識として定着させていきたいです。

社会人になって輪講したのは初めてでしたが、一人では継続できない私でも、継続して勉強するいい機会になりました。今後も勉強したいコンテンツがあったときには、継続して勉強する仕組みとして「同志を募って輪講する」という選択肢が自分の中に増えました。

また、今回の輪講で初めましての方も多くいらっしゃいました。同じような目標を持つ方々と、毎週（WEB会議ですが）顔を合わせて勉強できたことも、個人的にはよかったことだと思っています。

皆さんお仕事やご家庭の都合などでお忙しい中、一人も脱落することなく学ぶことができたことは、輪講を運営する立場としても嬉しい体験でした。