ドワンゴ21新卒がフルリモートでの入社から機能をリリースするまで
はじめに
2021年新卒エンジニアのHikamayoです。
先日、僕が入社して初めて開発に関わった機能がリリースされました。
ニコニコ動画で、自分の投稿動画の再生数・コメント数が伸びている際にお知らせが届くようになりました。https://blog.nicovideo.jp/niconews/157710.html
「ニコニコの"お知らせ"について」はこちらをご覧ください。
入社して半年が経過して、機能のリリースまで体験できたこの機会に、せっかくなのでここまでの僕のドワンゴ生活についてお話してみようかなと思います。
この記事では、以下のようなことをお話しします。
- 入社してから配属までの新卒エンジニア研修
- 配属されてからの配属後研修
- 実際のプロダクトを作成してリリースするまでのOJT
- ドワンゴでの働き方
入社から配属までの新卒エンジニア研修
入社してから3ヶ月ほどは新卒エンジニア全体研修がありました。
この期間から、配属先の先輩が新卒全員にそれぞれ1名メンターとしてついてくれて、 わからないところなどがあればすぐに相談できました。 僕についてくれたメンターはうたもくさん(@utam0k)です。
新卒エンジニア研修の内容について詳細はここでは触れませんが、以下のような三本立ての研修でした。
- 基礎学習: 課題図書とN予備校でエンジニアの基礎を学ぶ
- 個人課題: ブログサービスを作ってみる
- チーム課題: ニコニコ動画っぽいサービスを作ってみる
僕はWeb開発の経験が全くない状態で入社しましたが、この研修のおかげで最低限の知識は身についた気がします。 実際、チーム課題での同期たちと開発では、ある程度知識レベルも揃っていて、スムーズに進みました。
ちなみになんですが、僕が個人課題で作っていたブログは、先輩方にたくさんイタズラされました。
もっというとSlackでどうやって僕のブログにイタズラするかを話し合ってる人もいました。
配属されてからの配属後研修
新卒エンジニア全体研修が終わるといざ配属です。 リリースされた機能が示す通りですが、僕は通知開発のチームに配属されました。
「フルリモートの状態で、知らない先輩たちとどう打ち解けるものか」といったような心配は特になかったです。 というのも、全体研修のときからメンターが配属先の他の先輩方との交流の機会をセッティングしていてくれたからです。 なので、配属されたときには既にチームの先輩方とは割と喋ったことがあるという状態でした。
配属されて、ここでも「すぐ開発スタート!」というわけではなく、1ヶ月間は勉強期間をいただきました。 内容としては、チームで使っている Scala と Ansible を学ぶというものでした。 通知開発チームのプロダクトの多くはScalaで書かれていたわけですが、 僕はScalaを触ったことがありませんでしたし、 Web開発の経験が全くなかったので当然デプロイという工程すら馴染みがありませんでした。 なので、この期間を用意していただけたのは本当にありがたい限りでした。
Scala研修
というわけで、まず3週間はScalaの研修期間でした。 Scalaの研修期間は、大きく入門編と実践編に分けられる内容でした。
入門編では、2週間かけてScala研修テキストと『Scalaスケーラブルプログラミング』(通称コップ本)で学習しました。
ちなみに、このScala研修テキストはドワンゴが作成したもので、現在は日本のScalaコミュニティに寄贈されています。 このことは実は学生時代になんとなく知っていて、僕の中には”ドワンゴといえばScala”というイメージがありました。
実際ドワンゴでScalaを学ぶことには大きな強みがあったように思います。 というのも、先の画像にあるように、ドワンゴはSlackコミュニケーションがかなり活発で、 その中には特定のプログラミング言語について話すチャンネルもあるからです。 僕はこの期間、#scala というチャンネルに大変お世話になりました。 Scalaを長年使ってきた先輩たちに質問ができたり、アドバイスをいただけたりするのはかなりありがたい環境でした。
実践編では、1週間で指定されたプログラムを書いてみるという内容に取り組みました。 題材としては、メンターと相談して、「電卓プログラムを作ってみよう」ということになりました。 そして、実際にいただいた課題は以下のような感じです。
- 目標
- Scalaを書いてみる
- Futureを積極的に使ってみる
- UI/UXにこだわった良い電卓を作るわけではない(あくまでもScalaを頑張ってほしいため)
- 電卓の要件
- Pull Request を出して開発を進めてゆく
- 逆ポーランド記法を取り扱う
- 四則演算を行うことができる
- オプショナル課題(やってみたい順でよし)
- ユニットテストがある
- 中置記法で受け取れる
- Content-Type: application/json を取り扱うようにする
- gRPC をつかって通信を行う
- 履歴をDBに保存する(ScalikeJDBC)
- listとかhistoryとかで履歴一覧を持ってこれるくらい
「ただ計算をするプログラムを作るだけなら、大した練習にはならないのでは?」と思われるかもしれませんが、 わざとらしくでもチームでの開発で使う技術を積極的に盛り込むという点が、とてもいい練習になりました。
たとえば、基本的な部分でいうとgitで管理することやテストコードを用意すること、 応用的な部分でいうとDependency Injectionを活用したり、gRPCで計算式を受け取り、結果を返すなど、 電卓はあくまで題材でしかなくて、その中でいかに実践的な技術を使うかをアシストしてもらえた気がします。
Ansible研修
Scala研修のあとは、一週間のAnsible研修があったわけですが、 最初に言っておくと、僕は Ansibleって何? という状態からのスタートでした。 答えを知っている今では、調べたらすぐに出てくる 「構成管理ツールである」 で納得できますが、最初は「???」でした。
結局「何をするツールなのか?」というのを念のため書いておくと、 ざっくりと サーバーにツールをインストールしたり、ファイルを配置したりという必要な作業をあらかじめ設定ファイルに書き出しておいて、自動化するツール です。 配属先のチームでは、Dockerコンテナを起動する設定を書いて、デプロイに利用していたりもしました。
Ansibleを全く知らない状態から始まった研修ですが、実は一週間も経つと手に馴染むツールになっていました。 というのも、メンターが僕のために入門資料を用意してくれていたからです。 これが本当にありがたくて、2日程度でAnsibleについてざっくりと理解して、使い慣れることができました。 この入門資料は、もし気になる方がいらっしゃるようであればまた別の機会に何らかの形で公開できればと思います。
そして、2日でこれらの研修を終えたあと何をしたのかというと、ここでも実践編がありました。 内容としては、新卒エンジニア研修で取り組んだ
チーム課題: ニコニコ動画っぽいサービスを作ってみる
をAnsibleを使ってローカルのVMにデプロイできるようにするというものでした。
新卒エンジニア研修のときには、サーバーに入って手動で設定ファイルを書いたりコンテナを起動したりしていて、デプロイにはかなり苦労していました。 それが、Ansibleの力で一発で起動したときには、正直感動しました。 この時期には新卒エンジニア研修で使っていたサーバー環境はシャットダウンされていたので、久しぶりに自分たちが作ったものを見れたという意味でも、感動がありました。
Slackの新卒エンジニア研修チャンネルで復活の呪文が完成したことを報告しましたが、 手元で動かしてこの感動を分かちあってくれた人がいるかは定かではありません。 ちなみにこのテレビのようなものは、僕たちが作ったニヤニヤ動画のキャラクターです。
実際のプロダクトを作成してリリースするまでのOJT
最初に僕が把握しないといけないのは、そもそもニコニコのお知らせってどういう流れで届いているの? という部分でした。 ひとまず、僕が最初にメンターから説明されたときの図は、以下のような感じです。 先に言っておくと、何のこっちゃだと思うのでここでは理解しなくて大丈夫です。
端的に言うと思ったより複雑で難しそうなことをしているなと思いましたし、 正直 「これ全部わからないといけないのか…?」 とかなり身構えました。
ですが、やっていくと全部わかる必要なんてないということがわかりました。 実際、上の図に出てくる各機能は全てが自チームのプロダクトというわけではなく、全然違うチームが開発・運用しているものもあります。 それぞれの部分が綺麗に役割を分担していて、他の部分の中身については意識しなくても開発を進めることができました。 最初こそ「複雑で難しそうなことをしているな」という印象でしたが、終わってみると「よくできているな」に変わりました。
では実際どこの部分を作ったかというと、主に赤枠で囲った部分です。
「お知らせを作って欲しい」というイベントを受け取って、 そのお知らせを作るのに必要な情報を集めて、 それを実際にお知らせとして届けてくれるサービスに送りつける という処理を実装しました。
「既にお知らせを送る仕組みはあるのだから、追加の実装はいらないのでは?」と思われるかもしれません。 前述のようにこのアーキテクチャでは綺麗に役割を分担していて、 お知らせを作るために必要な情報を集める役割は、今回実装した部分が担っています。
例えば、ニコニコ動画で「このユーザーのこの動画についてお知らせを送りたい」というイベントが発生したとします。 そのイベントを受け取ったときに、ユーザーのアイコンや動画のサムネイルを取得して、実際のお知らせを作る材料を用意するのがこの部分です。 ニコニコ動画やニコニコ生放送などのお知らせを送りたいサービスは、全ての情報を用意する必要はなく、 最低限の情報だけ用意してイベントを送ってくれればよいわけです。
お知らせの種類によって、そのお知らせを作るために集めないといけない情報は異なります。 なので、新しいお知らせを追加する際は、都度それ専用のものを実装する必要があります。
やりたいことは単純そうに見えるのですが、 初めてプロダクトコードに触れる僕にとってはなかなか難しく感じました。 既存のプロダクトの設計に従ってそこに実装を追加していくというのは初めての経験でしたし、 社内に存在するAPIについても知る必要がありました。 「Scalaでコードを書く」だけではない難しさがあって、勉強にもなりましたし、何より楽しかったです。
「テストを書いて、機能を実装して、検証して、デプロイする」という一通りの流れをここで初めて経験し、 それが今ニコニコで動いているわけですから、僕にとっては面白いこと尽くしです。
実際に届いたお知らせを見たときはテンションがあがって、即先輩たちに報告しました。
ドワンゴでの働き方
これまでの半年を通じて僕の感じたドワンゴでの働き方についてお話しします。
ドワンゴではかなり自由な働き方ができる、というのは事前に何となく聞いていた通りでした。 とはいえ、入社後半年程度の僕にはこれについて語るに足るほどの経験がないと思われるので、ここでは取り上げません。 ここでは、実際に半年間で十分に感じたドワンゴらしさである、 完全テレワークであること と、その中での 新卒エンジニアとしての学び方 についてお話ししようと思います。
完全テレワークでの働き方
前述の通り、ドワンゴの働き方として、最も大きな特徴だと感じているのは完全テレワークであることです。
僕が入社したときには既に完全テレワーク化がされていて、 少なくともこの半年間で必要に駆られて出社したことは一度もありません。 とはいえ数回出社はしたんですが、それは単に綺麗なオフィスが気になるから行ってみたかっただけです。 テレワークでもいいし、気が向いたらオフィスで仕事ができるというのはかなり快適な環境だと思います。
余談ですが、ドワンゴのオフィスは銀座にあります。銀座ランチは出社の際の最高の楽しみです。
何度か触れたようにドワンゴでは Slack のコミュニケーションがとても活発なので、 むしろ僕の想像していたオフィスでの仕事のイメージよりも多くの会話が飛び交っています。 Slack の活用として、個人的にはtimes の文化がとても好みです。 多くの人が自分のチャンネルを作って、 Twitter のように使ったり、仕事を実況したり、雑談をしていたりしていて面白いです。 ちなみにtimes_hikamayoは頻繁に運試し会場にされます。
Slackのテキストコミュニケーションに限らず、他にもコミュニケーションの機会は多くあります。 何かあれば気軽にSlackのハドルミーティングをつないで音声通話をすることもありますし、 コミュニケーション促進のためのイベントも頻繁に行われています。
ちなみに、僕の配属された通知開発チームでは、 任意参加の ティータイム という時間が毎日1時間設けられていて、 紅茶やコーヒーを嗜みながら通話をつないで、作業や雑談をしています。 リラックスになるのはもちろんですが、この場で出た話題が、思わぬところで仕事の詰まりを解消することもあったりして、個人的にはとても好きな時間です。
こういった自由な文化の背景には、究極の裁量労働制(主観を大いに含む)があるのかなと思っています。
ドワンゴでは、入社直後からフレックス勤務で、11:00〜15:00頃のコアタイムを除けば出退勤時間に特に制限はありません。 さらに、しばらくすると裁量労働制になり、コアタイムすらなくなります。 働きたい時間に働けることで、自分が一番パフォーマンスを出せる時間に仕事ができるので、のびのびと仕事ができています。
余談ですが、この制度の一番わかりやすいメリットは 早起きしなくていい ことだと思います。 そして、実際多くの方がそのメリットを享受していると思います。 一方で、 早くから出勤してもいい と解釈している人もいます。 他でもなく、僕のメンターのうたもくさんのことです。 うたもくさんは、7:00くらいには出勤して、お昼前から3時間ほど休憩をとって、午後に戻ってきて夕方早めに退勤していきます。 休憩中はOSS活動や昼寝をしているそうです。 身近で見ていて、本当に自由な働き方ができる会社だな…としみじみ感じます。
加えて、前述のような人事制度的な側面に限らず、自由にしていても、みんな仕事はしっかりやる という信頼がある環境だと思います。 この「信頼されてる感」は僕も感じていて、自由さを満喫しつつも、それによって仕事が終わらなくなるというようなことはなく、楽しく働けています。
新人エンジニアとしての学び方
ドワンゴに新人エンジニアとして入社して、一番思うのはかなり手厚いサポートを受けられている、ということです。
ここまでに書いた通り、新卒エンジニア研修で体系的に基礎を学べることや、Slackで気軽に先輩に質問ができること、 メンターが入門資料を作ってくれたことなど、これだけでも十分手厚いと言えるんですが、実はもっと手厚さを感じるポイントが大きく2点ありました。 1on1 と 毎日1時間のペアプログラミング です。
先に言っておくと、これら全てをドワンゴとしてサポートしているわけではありません。 僕のメンターやチームの先輩方が特に手厚くやってくれていたという側面もあるので、あくまで一例としてですが、僕の例をお話しします。
1on1は、定期的に開催される 何を話してもいい30分間のミーティングです。 僕は3名の先輩にそれぞれ定期的に開催してもらっています。 メンターとは毎日、チームのリーダーとは毎週、部署のマネージャーとは隔週です。 その日の仕事でわからなかったことを聞くこともありますし、会社の気になっていることを質問することもありますし、ゲームやご飯の話をすることもあります。 これの何がありがたいかというと、わざわざ連絡するほどでもないけど…というくらいの内容を気軽に話せることです。 さらに言うと、これのおかげで 先輩たちに何でも話せる・相談できる関係を築けている と思っています。
ペアプログラミングは、1on1とは別にメンターと1時間通話をつなぎながら一緒に仕事をする時間としてとってもらっています。 VS Codeの「Live Share」や、IntelliJ IDEAの「Code with Me」を活用して、実際に同時にプログラムを書ける環境で行っています。 テレワークでは、オフィスで一緒にいるよりもコードについて近くにいる人に気軽に相談するのが難しいですが、 僕はこの時間のおかげで特に不便は感じていません。 この時間があることによって、もちろん実装上の悩みなどを先輩に聞けるという単純なメリットもありますが、 毎日時間をとってもらえることで、最長でも1日以上仕事のことで悩むことがない というメリットを大きく感じています。
テレワークでは、ついつい「もう少し考えればわかるかも…」と一人で仕事を長引かせてしまうことがあります。 このペアプログラミングがあることで、それが最長でも1日で抑えられているのは大きなメリットだと思います。 もちろん、答えをすぐ教えてもらうというだけではなく、答えへのたどり着き方をアシストしてもらうことが多く、僕にとってはこれも手厚さを感じるポイントです。
おわりに
僕がドワンゴに新卒エンジニアとして入社して、初めて実装した機能がリリースされるまでの期間についてと、 ドワンゴでの働き方について僕の感じたことを書いてみました。
僕は学生時代に開発経験もなく、正直入社前は「エンジニアとしてちゃんとやっていけるのか?」という不安もありましたが、 研修・OJTがとても手厚かったこともあり、今では不安もなく新しい仕事にもワクワクしながら取り組めています。
テレワークについても、特に不便なこともなく、楽しく仕事ができています。 むしろ、テレワークならではの自由な働き方ができるという意味では、ポジティブな側面が多いように感じます。 もちろん、テレワークでどうしても進めにくい仕事があるのなら、オフィスに行けば良いだけです。 僕も何度か行きましたが、とても綺麗で快適なオフィスだったのでたまに行きたくなります。
結論として、ドワンゴはとても自由に楽しく仕事ができる会社です。
先日、2023年度の新卒採用が始まりました。 もしドワンゴに興味があるけど迷っている方がいれば、気軽に応募してみてください。 ニコニコで自分の作った機能が動いているという快感を一緒に感じていきましょう。