社内で行っているアルゴリズム勉強会について

どうも。Cacooチームのフロントエンド開発者のテリーです。ここ一年くらい社内でアルゴリズム勉強会という部活を週一で行ってきたのでその紹介をしたいと思います。

 

競技プログラミングへの気持ちの高まり

最近なのかよく分からないですが私の観測している限りでは競技プログラミングが流行ってる気がします。私もその一人でめちゃくちゃ下手くそですが、時間が許す限りアルゴリズムの問題に取り組んだり、アルゴリズムを学んだりしています。

さて競技プログラミングと言われると皆さんどんな想像をされますか?難しそうとか実務に役に立たなそうとか思われるかもしれません。というより私自身そう思っていてあんまり勉強に乗り気ではありませんでした。

しかし実際プログラミングの問題を解く能力は実務にもかなり生かされます。お題の要求を満たすようなロジックを考え、効率化しそして実装する。実務はもう少し複雑だとは思いますが、似ている部分があると考えています。

割と勉強している今でも競技プログラミング自体には未だにあんまり魅力を感じてないのですが、自分の持ってる知識を使って何かしらの問題を解くというところには非常に魅力を感じています。とはいえ結局コンテストなどでいい点数を取ろうと思うとアルゴリズムやデータ構造は覚えたり慣れていかないといけなくてそこで四苦八苦しています。競技を楽しんでる人たち全体から見ると私のレベルはかなり下の方だと思います。

 

アルゴリズム勉強会について

さてこの勉強会には競技プログラミングという名前はつけませんでした。理由はそのままですが競技プログラミングを学ぶ勉強会ではないからです。この勉強会ではなるべく前提知識がなくても頭を使って解けるような問題を出題するように心がけています。もしその場で回答者が分からないことがあれば出題者に質問できます。知らないと何も解けないではなくて知らないことでもヒントをもらいながら自分の頭で考えていくという過程を重視しています。分からないことを分からないと質問もうまくできないというのは実務でも同じではないでしょうか。

みんな普段は競技プログラミングをやってる人達じゃないので、問題のレベル感も高くないです。個人的にはあーできない、分からない、悔しい。でもみんなでやって楽しい!!みたいな体育会系の部活動みたいなところをモチベーションにしています。

 

勉強会の進め方

世界で戦うプログラミング力を鍛える本の中にあるコーディング面接の問題攻略ガイドを参考にしています。全くこの通りというのはちょっと難しかったのでロジック最適化までできたらコードを書いていく感じにしています。

英語ですがWebでも見ることができます。

https://www.slideshare.net/gayle2/cracking-the-interview-skills-coding-soft-skills-product-management-handouts

* 余談ですが、元々この勉強会はGoogleに転職できるくらいのスキルをつけようぜっていう感じで始まりました。

ホワイトボードをみんな(と言っても3-4人)で囲んで出題者一人が問題を出して回答者一人がホワイトボードに回答を書いていきます。実際企業で行われるホワイトボーディング面接ではホワイトボードにコードを書くこともあるようですが、消したり追加したりがめんどくさいのである程度ロジックが固まってきたら回答者のPCを大画面に写してみんなに見られながらコーディングしていくような流れになります。

人にコーディングしているところを見られるので最初はすごく緊張しましたが、最近はレベル低いって思われても、間違ってもいいやって開き直ってます。

 

どんな問題を出してるか

実際にどんな問題を出しているのでしょうか。

以下の問題は2019/08/07に私が出題した問題です。

https://github.com/1984weed/algorithm-study-group/blob/master/problems/20190807/README-ja.md

難しいと思われた方もいると思いますし、そもそもLinked listって何?って方もいると思います。簡単すぎるだろと思われた方はすみません。。。本当にこのレベルなんです。

さてこの問題出題者と回答者が会話しながら問題を解いていくと難しいというところは割となくなっていきます。本当に解けない場合は、ロジックは答えを教えてコーディングだけは自分で行うってパターンもあります。

私自身実際に全く解けずに何回も答えを教えてもらってます。

 

まとめ

この勉強会には始める前には気づかなかったことも含めいいところが何点かあることに気づきました。

  1. アルゴリズムの勉強のモチベーションになった
  2. 実際のプロダクトの実装するときに計算・メモリ効率を意識できるようになった
  3. 分からないことは分からないとチームメンバーに言っても恥ずかしいと思わなくなった
  4. 社内から問題を出題する人を呼べるので新しいコミュニケーションが生まれる

個人的には3が予測してなかった良い影響で勉強会中でも簡単な問題が解けないんですよね。それを答えを知ってる同僚にみられたり、私より早く他の同僚が解くわけですよ。それはもうつらいし恥ずかしい気持ちになるんですが、勉強会中は見栄を張る余地がないんです。こそっとググったりできないので。その経験はすごく自分のプラスになってます。

とりあえず一年続いたので、引き続き同僚と一緒に成長できたらなぁと思っています。

* 今までの問題のアーカイブは7月からですがGithub上で管理しています。

 

開発メンバー募集中

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる