blog

DeNAのエンジニアが考えていることや、担当しているサービスについて情報発信しています

2023.12.28 インターンレポート

強いエンジニアとは何かを知ったインターン

by Sota Sato

#internship #go

はじめに

初めまして、2023年の9月から12月にかけて、DeNAの就業型インターンシップに参加した佐藤 創太です。 普段は、大学院でネットワークの研究をしたり、少数のチームで受託開発を行ったりしています。

突然ですが、学生の皆さまは以下のような点に悩んだことはありますでしょうか?

強いエンジニアになりたいけど、そもそも強いエンジニアとは何だろう?

私はインターンに参加する前、この点について悩み、どうやってエンジニアとして能力を高めていけば良いのかがわかりませんでした。 しかし、インターンで強いエンジニアたちと共に開発を行うことで、自分なりに進む方向性が見えてきました。

そこで、私と同じような悩みを抱える方に向けて、本記事では以下の内容についてお話ししたいと思います。

  1. インターンに応募した理由
  2. 業務の概要と働く環境
  3. インターンを通して感じた強いエンジニアとは

是非お付き合いいただければ幸いです。

インターンシップに応募した理由

私がプログラミングに触れたのは1年半ほど前です。 その後インターンを通じて、エンジニアとしての基礎力を身につけていきましたが、徐々にどの能力を伸ばしておけば良いのかがわからなくなってきました。

その理由として、過去のインターン経験が少人数での開発であり、プロダクトの規模が小さかったことが挙げられます。得られる経験が限定されていたため、より広範で大規模な開発プロジェクトに携わり、さまざまなスキルを磨く必要性を感じていました。

大人数での開発経験を積み、プロダクトの規模が大きい環境での経験を得るために、DeNAのインターンに応募することを決めました。

業務の概要と働く環境

DeNAのインターンでは、特定の部署のバックエンドチームに配属され、Golangを使用したAPIの新規開発に携わることになりました。始めに開発対象の業務知識やプロダクトの要件についてのキャッチアップを行い、その後実際の開発に入っていくという形式でした。 バックエンドチームは10人前後のエンジニアで構成され、これまで私が経験したチームよりも大規模でした。

また、バックエンドチームはチーム内の連携が非常に密でした。メンバー間で、slackのメッセージやハドルで頻繁にコミュニケーションが取られていたり、声をかけやすいようにチームリーダーの方がハドルに常駐して下さることもありました。 開発手法としてはスクラム開発が採用され、毎日のデイリースクラムで各々の進捗報告と相談・共有事項の報告が行われていました。 デイリースクラム前には10分ほどアイスブレイクが行われ、ワイワイしながら、コミュニケーションを取りやすい空気が醸成されていました。

また、インターン生は専用のタスクをこなすのではなく、実際のプロジェクトに参加し、社員と同様に開発をすることができました。 社員と同様に扱われると聞くと、チームから置いてきぼりになって学生のエンジニアが価値を発揮することは難しくなるイメージを受けるかもしれません。しかし、実際には、先に述べた現場での密なコミュニケーションに加え、部署のリーダーとの1on1が週2回ほど行われていたため、自己成長を遂げながらプロジェクトに貢献できる環境になっていました。

このような環境で、強いエンジニア達と大規模なチームで社員と同様に、APIの開発に取り組みました。

インターンを通じて感じた強いエンジニアとは

私はインターン通じて、濃い密度でプロダクトの開発に携わり、実際のプロダクト開発で求められるものを体感しました。

部署のリーダーとの1on1で知見を授けていただきながら、自己で経験したことを整理をしました。 そして、多岐に渡るプロダクト開発の業務は、以下の3つに大別され、これらは互いに相関関係にあると感じました。

  • 業務知識の分析と要件定義 (ビジネス寄り)
  • プロダクトの要求をコードに落とし込むための設計 (ビジネスとエンジニアリングの中間)
  • 技術を用いたアプリケーションの実装 (エンジニアリング寄り)

また、この相関する3つの領域に対して働きかけられるエンジニアが、「強いエンジニア」であると思いました。

(この考えの大元は、「 マルチパラダイムデザイン 」という書籍にあります。 ご興味がある方はお読み頂けると良いかもしれません。)

各領域に対して、詳細と、DeNAのインターンを通じて学べた理由について述べさせていただきます。

業務知識の分析と要件定義について

私は、強いエンジニアの能力と聞いて最初に浮かびやすいのは、技術的な部分だと思っています。しかし、エンジニアとしてプロジェクトを成功させるには、技術的なスキルだけではなく、ビジネスの要求を理解し、それを具体的なプロダクトに変える能力が必要不可欠です。そのためには、業務知識の分析と要件定義が重要な役割を果たします。 業界全体についての理解と、その業界が持つ課題、プロダクトの機能とユースケースを詳細に定義することが、プロダクト開発の出発点となります。 また、これらを具体的に明示したドキュメントは、エンジニア、ビジネス、デザイナー、QAチームなどプロダクト開発に関与するすべてのチームが共有するガイドラインとして機能します。実際に各チームはこのドキュメントを元に、議論や開発が進んでいました

正直、インターン前の自分は、業務分析と要件定義の重要性についての十分に理解していませんでした。 これらの重要性を認識できるのは、DeNAのような開発ノウハウが熟達している企業で、社員と同様に深くプロダクト開発に関わることができたからだと思います。 チームに加わり開発が本格的にスタートする前に、業務知識とプロダクトについてのキャッチアップ期間が設けられたことも理解の助けになりました。

プロダクトの要求をコードに落とし込むための設計

先述の要件定義を元に、アプリケーションを実装できる状態に落とし込むのがこの業務の目標になります。例として、バックエンドチームでは、業務知識に基づき、境界づけられたコンテキストを定義し、疎結合な状態にするために、各コンテキストごとにGolangのパッケージを分割していました。これは、業務知識分析を用いたマイクロサービスのサービス分割に似たアプローチであり、コンテキストの分割粒度や境界線の引き方に関する検討が必要でした。そのほかにも、各コンテキストのユースケースであるエンドポイントの定義も必要な作業として挙げられます。

設計においては、業務知識への理解はもちろん、拡張性・保守性を高めるための設計方法についての深い理解が求められます。特に、大規模かつ複雑な業務知識を扱う際には、この業務の重要性が増します。整備されているドキュメントを読み込んだり、実際に議論を交わすことで、個人開発や小規模な開発では得がたい、チームで大規模なプロダクトを開発するための知見を得ることができました。

技術を用いたアプリケーションの実装

設計を元にしたアプリケーションの実装と、技術的課題の解決がこの業務の中心になります。強いエンジニアを想像した時、ここが思い浮かびやすいでしょうし、技術的な部分の成長を求める学生の方も多いと思います。また、ソフトウェアの品質を高めることは、プロダクトの長期的に運用において重要な要素になります。

本記事ではあまり技術的な要素についてあまり焦点を当ててきませんでした。 しかし、インターンを通じて技術者としても成長を強く感じています。具体的には、拡張性・保守性を高めるための依存関係の整理、コードの抽象化やテスト方針から、Golangの効率的な書き方、DBのギャップロッグの防止やsnowflakeを用いたIDの生成まで、広範で深い知識と経験を得ることができました。 チーム内で整備されているコーディングガイドラインを読み込み議論をしたり、手厚くPRのレビューをもらうなど、強いエンジニアの方の知識を吸収する機会が多かったことが、技術的な成長の要因になっていると思います。

また、よりインフラ寄りの技術に興味がある方向けになりますが、DeNAには、IT基盤部という、事業を横断してシステム基盤を管理している部門があります。 DeNAの中でも技術的に突き抜けているエンジニア達が多いと聞きました。もし興味がありましたら覗いてみてください。

まとめ

DeNAのインターンでは、先に述べたこと以外にも多岐に渡る知識を得ることができました。(チーム開発での知見など) 成長機会が多かったのは、DeNAのインターンの特徴として以下の点があったからだと思います。

  • 様々な方向に強いエンジニアが複数いる
  • 実際のプロダクト開発に社員と同様に関わることができる
  • 第一線で活躍しているエンジニアと密にコミュニケーションをとることができる

特に上長の方に週2回ほど1on1の機会を設けていただき、その都度エンジニアリングに関する自分の価値観や視点がアップデートされました。 また、1on1で得た新しい知見を活かして実際の開発に携わることで、勉強と実践のサイクルを回すことができ、成長の大きな要因になったと思います。

インターンに参加したことで、エンジニアとして必要な能力を知り、目指すエンジニア像は明確になりました。 自分としては、「インターンを通じて感じた強いエンジニアとは」で述べた観点のうち、以下に重点を当てて日々努力していこうと思います。

  • プロダクトの要求をコードに落とし込むための設計 (ビジネスとエンジニアリングの中間)
  • 技術を用いたアプリケーションの実装 (エンジニアリング寄り)

プロダクト開発における技術以外の重要な要素の存在を認識しつつも、やはり技術的な部分に強みを持ちたいという気持ちがあります。

非常に学びの多いインターンでした。ご興味ある方は、是非DeNAのインターンに参加してみてください。

最後までお読み頂きありがとうございました。

最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。

recruit

DeNAでは、失敗を恐れず常に挑戦し続けるエンジニアを募集しています。