blog

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

2025.05.08 インターンレポート

Clineを味方につけてDeNAの裏側を冒険してきた

by 尾形 拓夢

#internship #ai #cline #workstyle

はじめに

はじめまして!2025年3月に2週間の内定承諾前の学生向け短期就業型インターンに参加した、26卒の尾形 拓夢と申します。

このブログでは以下のような内容を中心にお伝えしていきます。

  • 2週間のインターンでClineを駆使してタスクに取り組んだ話
  • 実際に働いてみて感じたリアル

「DeNAって優秀な人ばっかりで、うまくやっていけないんじゃないか」「DeNAがどんな働き方してるのか全くわからない」といった不安を抱えた方(インターン参加前の自分)の参考になれば幸いです!

自己紹介

改めまして、尾形 拓夢( @hirodesu )と申します。

現在は筑波大学情報学群に在学中で、研究室では人工生命(Alife)に関する研究を行なっています。

大学生になってからパソコンを触り始め、そこからプログラミングに興味を持ちました。 複数企業のインターンやハッカソンへの参加を通して、Railsを用いたWeb開発を中心にプログラミングスキルを身につけてきました。

インターン概要

参加経緯

私は1月に内定をいただきました。 それまでDeNAのインターン等に参加経験がなかった私はDeNAに対してわからない、知らない部分が多く、漠然とDeNAに対して不安を抱いていました。 その気持ちを正直に人事の方にお伝えしたところ、「インターンに参加してみないか?」とのお誘いをいただき、今に至ります。

配属先

ヒューマンリソース本部エンジニアリング室にて2週間お世話になりました。 エンジニアリング室では「エンジニアが働きやすく、成果につながる環境づくりをする」というミッションのもと幅広い業務を行なっています。

DeNAでは新卒研修で社内で実際に使われるためのプロダクトの作成を行なっており、 エンジニアリング室では研修で作成されたプロダクトの中で実際に運用されているプロダクトを 引き継いで管理を行なっています。

担当タスク

社内プロダクト dandan

私はインターン期間中にエンジニアリング室が管理する「dandan」というプロダクトの改善タスクに取り組みました。

dandanは社内のさまざまな作業依頼を一元管理するリマインドツールです。 SlackやGmailなど複数のプラットフォームを通して行われていた作業依頼をdandanで全て一元管理することで、依頼者も作業者も効率的に依頼を管理することができます。

Cline をプロジェクトに導入する

インターン期間中に私が取り組んだもう一つのタスクはdandanに Cline を導入することでした。

私がインターンに参加した時点ではエンジニアリング室においてClineを開発に用いることがあまり浸透していませんでした。 そこで今回のインターン期間中に私が試験的にClineを積極的に活用し、dandanの機能改善を行いました。

今後エンジニアリング室が他のプロダクトの開発においても、Clineを用いて効率的に開発を進めていくための一つのサンプルとなるように、 今回のインターンではClineを強力なお供として、二人三脚でインターンに取り組んできました!

タスク完了までの道のり

Cline を導入

Clineを用いて開発することが、担当タスクの一つの主軸だったので、私のインターンはClineを導入するところからスタートしました。

まずはClineの初期設定から

Clineは使い始めるだけであれば、特段難しいことはありません。 基本的に ここの内容 に従って初期設定を行います。 私の場合は使用するモデルの設定で、用意してもらったOpenAI Compatibleなプロバイダーを使用しました。

ここからClineを効率的に使えるようにするために追加で設定を行なっていきます。

メモリバンクを使って、Cline をより賢く

Clineを用いた開発を更に効率的にするために、ClineのMemory Bankの設定を行いました。 より詳細な説明は ここ にあるので適宜見てみてください。

すごく簡単に説明すると、Memory BankはClineの記憶のようなものです。 Clineはタスクごとに記憶がリセットされてしまいますが、Memory Bankとしてマークダウン形式で情報を体系的にまとめておくことで、 Clineに必要な情報を与えた上でタスクをスタートできます。 プロジェクトの背景や目的、構成などの情報をMemory Bankに残しておくことでClineがより賢く動いてくれることを期待できます。

ではMemory Bankをどのように利用するかについてですが、基本的にClineが主導して必要なファイルを作成してくれます。 なので、以下のようなステップでMemory Bankを簡単に導入できます。

  1. Clineの設定から、Custom Instructionsに Memory Bank用のCustom Instructions をコピペする。
  2. プロジェクトのルートに memory-bankというフォルダを作成する。
  3. Clineに「Custom Instructionsに従ってください」と指示を出す。
    1. すると、プロジェクトを把握するためにREADME.mdなどのファイルを調査し始める。
  4. 一連の調査が終了後、Clineに「メモリバンクを初期化してください」と指示を出す。
    1. memory-bankフォルダ内に、projectbrief.mdなどのファイルが作成され、中身も書いてくれる。

上記の非常に簡単なMemory Bankの初期設定にあたって、私が時間を浪費してしまった点があります。 それは、使っているモデルが「Claude 3.7 Sonnet」ではなかったという点です。 私の場合、インターン開始して数日間は準備が整っていない関係で、モデルとして「GPT-4o」を利用していました。 しかしこの状態で上記手順に従っていくと、ステップ4の作業でファイル作成とテンプレ作成で止まってしまい、肝心な中身を自分で全て書く必要がありました。(私はこの作業で数時間溶かしました、、、。) もしも記載の通りやっているのに上手くいかないと悩んでいる方は Memory Bankの初期設定にはできるだけ良いモデルを使ってあげてください!

Clineと開発しよう!

Clineの諸々の設定が完了したので、いざClineと一緒に開発に入っていきます。

Clineを用いた開発のやり方に関して、絶対的にこれが正解みたいなものはあまりないように思えます。 そこで、あくまで一例として私がClineを使う際に行なっていたことを2つ紹介しようと思います。

タスクを始める際にCustom Instructionsに従うように指示する

こちらはタイトルの通りです。 タスクを始める際に「Custom Instructionsに従ってください」と指示を最初に出すようにしていました。 Custom InstructionsにはMemory Bankに関連する内容が書かれているため、この指示を出すと確実にmemory-bankフォルダの内容を把握してくれます。 ただし、この方法は以下に述べるようなメリット、デメリットがあると感じているので、必要に応じて使ってみてください。

  • メリット
    • Clineがプロジェクトの概要を把握した状態で作業ができる
    • Custom Instructionsの内容に忠実に従ってくれるようになる
  • デメリット
    • タスクの最初にMemory Bank分のContext Windowが消費される
    • Memory Bankを把握するためのAPIコストもかかる
タスクが終わったタイミングでメモリバンクの更新を行う

memory-bankフォルダの中にはactiveContext.mdprogress.mdといったファイルが含まれています。 これらのファイルはプロジェクトの残タスクの管理や直近の変更内容等を管理しています。 つまりMemory Bankの内容は開発が進むのに合わせて更新されていくべきです。

Memory Bankの更新ももちろんClineがやってくれます。 タスクが終わったら、最後に「メモリバンクを更新してください」とClineに指示を出します。 すると、今回行った作業を踏まえてmemory-bankフォルダ内のファイルを勝手に更新していってくれるので、 更新された内容を確認して、問題なければそのままコミットします。

現在のプロジェクトの状態とMemory Bankの状態をきちんと同期することでClineに正しい情報を与えられるようにしていました。

dandan 機能改善

私がインターン期間中に取り組んだタスクは主に以下の3つになります。

  • コードリーディングも兼ねたPRのレビュー
  • 依頼の管理を共同管理をメインに変更する(メインタスク)
  • CSVアップロード機能の説明を追加する

コードリーディングも兼ねたPRのレビュー

タスク概要

Clineの諸々の設定を終え、まずはじめに他のインターン生の方のPRをレビューするタスクに取り掛かりました。 「いきなりレビューするんですか?」みたいな気持ちに私もなりましたが、蓋を開けてみると変更内容自体は非常に簡単なものでした。 どちらかというと、 レビューよりもdandanのコードを理解することが目的のタスク だったと思います。

PRの内容

PRは 「下書き状態の依頼をリマインド対象外にする」 という内容でした。 dandanで作成された作業依頼には状態として、下書き、オープン、アーカイブ済みの3種類のステータス存在しています。 また、dandanには依頼者が作業を完了していない依頼を対象にリマインダーを自動で送信する機能が存在しています。 自動リマインダー機能に関して、 まだ下書き状態の作業依頼に関してもリマインダーが送信されてしまう というバグが報告されていました。 このバグを修正するのがPRの目的であり、変更内容のレビューを私が担当しました。

PRの変更箇所

変更箇所はバックエンドで実装されているデータベースからデータを取得する関数の部分です。 dandanのバックエンドにはGoが採用されており、データベース操作にはGormというORMを利用しています。 バックエンドにはリマインド対象となるタスクを取得するために TaskRepository.ListByDateメソッドが実装されています。 具体的な変更内容としては、このメソッドのデータクエリに Where("status = ?", entity.Open) という1行が追加されているだけでした。 結構自明に正しい変更ではありそうなのですが、それを確かめるために影響範囲の調査を行いました。

影響範囲調査

影響範囲の調査において、早速Clineが大活躍してくれました。 Clineに対して「TaskRepository.ListByDateメソッドがどのように利用されているか教えてください」と指示を出してみます。 すると、この指示一つでClineは以下の調査結果を出力してくれました。

  1. TaskRepository.ListByDate メソッドは、指定された期間内の締切日を持つタスクを取得するためのメソッドです。
  2. このメソッドは、TaskUsecaseの ExecuteListByDate メソッドを通じて使用されています。
  3. TaskHandlerの GetTasksByDateGetSoonTasks ハンドラーがこのメソッドを呼び出しています。
  4. これらのハンドラーは、それぞれ/api/private/remind/api/private/remind/soon というAPIエンドポイントに紐づけられています。
  5. Slackサーバーの get_should_remind_tasks 関数が /api/private/remind/soon エンドポイントを呼び出して、今日と明日が締切のタスクを取得しています。
  6. 取得したタスクは、morning_remind_jobnight_remind_job という2つのジョブで使用され、ユーザーにリマインド通知を送信するために使用されています。

Clineの調査結果によって TaskRepository.ListByDate メソッドが最終的にどのように自動リマインド機能に利用されているのかの全体感を順序立てて理解することができました。 Clineの調査結果を念頭に置きながら、自分でも確認を行った結果、今回の変更内容は問題なさそうだと判断することができました。 1から自分で調査するのに比べてはるかに効率的にコードリーティングが行うことができた と感じています。

依頼の管理を共同管理をメインに変更する

タスク概要

今回のインターン期間中にメインで取り組んだタスクです。 dandanには依頼の共同管理機能が存在します。これは作業を依頼する人が依頼作成時に依頼を自分と一緒の権限で管理する人を追加できる機能です。 依頼の共同管理機能によって 作業依頼の管理を個人の仕事としてではなく、チームの仕事として管理する ことが可能になります。 しかし、修正前のdandanでは個人での作業依頼の管理をメインとした実装になっていました。 そこで今回のタスクでは dandanの依頼管理を共同管理をメインとするような実装に変更する ことに取り組みました。

具体的な変更内容

では共同管理をメインにするためにどこを変更したのかについては以下のようにまとめられます。

  • 自分が作成した依頼と共同管理者になっている依頼を同一ページで区別なく表示できるようにする
    • 元々は依頼一覧ページと共同管理依頼一覧ページに分かれていた
  • 下書き一覧ページに自分が共同管理者になっている作業依頼も表示されるようにする
    • 元々は自分が作成した下書きしか表示されなかった
いざ実装

変更内容はぱっと見そんなに重く見えません。 しかし、dandanはバックエンドにGin(Go)、フロントエンドにReact(TypeScript)、APIの記述にOpenAPIが用いられています。 今回はこれらを横断的に変更する必要があり、それぞれの技術スタックを少しくらいなら触れる(OpenAPIははじめまして)くらいの私の技術力ではインターン期間中に終えられるかだいぶ怪しかったです。 そんな私が結果的に余裕を持ってタスクを完了できたのは、やはりClineを積極的に活用したからだと感じています。

まずはどのように実装していくか決定していく必要があります。 統一後のページのUIをどうするか、下書き削除の権限を共同管理者に付与するか等のdandanが提供する機能の方針はメンターの方と相談しながら決めていきます。 提供したい機能が定まり、それをどう実装していくかの部分に関してはClineと相談して決めていきます。

Clineには Planモードという実装を行わずに計画を立てるためのモード が存在します。 このモードでClineとやりとりし、実装方法や実装順序の詳細まで決定したのちにActモードに切り替えて実装に移るという手順で進めました。 Planモードの時点で実装方針をしっかりとすり合わせておくと、ActモードではApproveボタンをポチポチしているだけでコードがどんどん生成されていきます。

実装内容を全て説明すると膨大な量になるので箇条書きで簡単に変更箇所の全体像を示しておきます。 ここで示した変更箇所にそれぞれに対して、Planモードで計画を立て、Actモードで実装を行いました。

  • バックエンド
    • 自身が作成した依頼と自身が共同管理者になっている依頼を取得する関数の変数名をわかりやすいように変更する
    • 下書き状態の依頼を取得する際に取得する依頼のステータスをパラメータで渡せるようにする
    • 下書き削除を共同管理者でも行えるように認可の設定を変更する
    • テストの作成
  • フロントエンド
    • 自身が作成した依頼一覧と共同管理者になっている依頼一覧ページを統合する
    • 自身が作成した依頼一覧だけに絞り込むためのフィルタリング機能の実装
    • 下書き一覧ページに共同管理者の依頼も表示するように変更する
  • OpenAPI
    • バックエンドの変更に合わせて記述を修正
実装結果

最終的に共同管理依頼をメインとした実装に変更した結果は以下のような形になりました。

依頼一覧ページ 下書き一覧ページ
alt text alt text
alt text alt text

CSVアップロード機能の説明を追加する

タスク概要

メインタスクの実装を終え、少し時間があったので追加でタスクに取り組みました。 このタスクは 実際に私がユーザー視点でdandanを初めて使っていた時に分からなかった点を解消するためのタスク です。 dandanでは作業依頼を作成する際に、作業者をCSVファイルからインポートしてくる機能が存在します。 私が初見でこの機能を見た際に、どういったCSVファイルをインポートすればいいのかがわかりませんでした。 そこで「ここを初見でも分かるように改善したい」と提案させていただきました。

全部Clineにやらせてみる

私はこのタスクに関しては ほとんど全てをClineにお任せ してみることにしました。 私がやったこととしては以下の指示を出した後に少しコードを修正するだけでした。 実装にかかった所用時間は30分いかないくらいだと思います。凄まじいですね。

  1. 「依頼作成画面の対象者をCSVでインポートする機能の実装を調査して、どのようなCSVファイルをアップロードするべきか調査してください」と指示を出す
  2. 「リンクを用意し、アップロードするべきCSVの具体例がポップアップで表示されるというような実装を行ってください」と指示を出す
  3. 最後に少しだけコードを修正する
実装結果

全てClineにやらせてみた結果がこちらになります。文句なしです。

alt text

私が体験した DeNA のリアル

実際にインターンで感じたDeNAのリアルをせっかくなので体験談ベースで綴っていこうと思います。

人が良い

良い人が多いというのがDeNAのインターンで感じた一番の印象 です。 良い人というと抽象度が高いかも知れませんが、めちゃめちゃ優秀な上でとっても優しい人が多いと感じました。 少なくともインターン中に私が関わった方々は皆さんすごく良い人たちでした。

私は内定承諾前なので進路に悩んでいる状態でインターンに参加させていただきましたが、 そんな私のために社員の方々が人を集めてランチを開催してくださりました。 ランチを食べながら、意思決定についての悩みを相談すると、すごく親身になって相談に乗ってくださり、非常に嬉しかったです。 また、26卒の内定承諾済みの方と交流する機会もあったのですが、向こうの方から「何か聞いておきたいこととかありますか?」と声をかけてくださり、 意思決定についてざっくばらんに相談することができ、とてもありがたかったです。

言ってしまえば、私の進路なんぞ社員の方々からすればどうでもいいと言えばどうでもいい問題だと思います。 にもかかわらず、皆さん本当に真剣に私の相談に乗ってくださりました。 本選考の際に、面接官の方々が皆さん口を揃えて「DeNAは人が良い」とおっしゃっていたのですが、 実際に中で働いてみることで「これのことか!」と実感することができました。

自由さ

インターンを通して、DeNAは 会社の規模の割にすごく自由に働いているんだな と感じました。

まず私がインターンで担当したタスクですが、メインタスク以外は全て私の方から提案して取り組ませていただきました。 「Clineの設定について色々やってみたい」「CSVの説明がわかりづらかったから追加したい」等の私の提案をメンターの方が全て肯定してくださり、 すごく自分のやりたいようにタスクに取り組ませていただきました。 また、メインのタスクに関してもdandan以外の候補も沢山列挙しておいてくださり、その中から好きなのを選ぶという方式でした。 結果的にインターン期間中はずっと自分のやりたいことをやらせてもらった印象があり、非常に楽しく取り組むことができました。

また、社員さんとの面談でお話を聞いていると、どの社員の方も 自分がやりたいと声を上げたことができている ように感じました。 新規事業をやりたいという社員さんが実際に新規事業に関わっていたり、バックエンドの技術的に難しい課題に取り組みたい社員さんが実際にそういった部署に配属されていたり、 ここまで自分のやりたいことにマッチしたことが実現できている状況には驚きました。 また、社内での部署異動のようなこともしやすかったり、自分に適した場所でやりたいことに打ち込める環境があるんだなと感じました。

成長環境

最後に成長環境についてですが、先に挙げたような自由さがあるので、 やりたいことが明確にあって、積極的に手が挙げられるような人 はどんどん成長していけそうだなと個人的には感じました。 自分がこういうキャリアを歩んでいきたいという思いに寄り添ってくれる会社だと思います。 また、どの分野においても大抵プロフェッショナルみたいな方がいらっしゃって、そういった方に気軽に話を聞きにいける点もすごく心強いと思います。

全然違う観点ですが、 勉強するためのリソースが社内に溢れているのが魅力的 に感じました。 技術的な話題に対してSlack上でのコミュニケーションが活発に行われていますし、特定の分野の勉強会などのほぼ毎日開かれていました。 さらにdandanと同じくエンジニアリング室が管理しているプロダクトの中にMIRUCAというプロダクトがあります。 MIRUCAは社内版youtubeのようなもので、社内で開かれている勉強会などの動画のアーカイブが残っています。 これを利用すると勉強会や新卒研修の内容等をいつでも見返すことができます。

おわりに

今回の短期就業型インターンでは、2週間という限られた期間ではありましたが、とても貴重な経験をさせていただきました。 インターンが始まる前は不安な気持ちでいっぱいでしたが、振り返ってみると、参加して本当に良かったと思える充実した時間を過ごせました。

急なお願いにも関わらず快くインターンを受け入れてくださったメンターをはじめ、私をサポートしてくださった多くの方々には、心から感謝しています。 この場を借りて、深くお礼申し上げます。本当にありがとうございました。

最後までお読みいただき、ありがとうございます。このブログが少しでも皆様の参考となれば嬉しいです。

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

recruit

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