エキサイト株式会社の就業型インターンシップに参加して

こんにちは! 2024年9月9日〜9月30日まで約1ヶ月程度、メディア事業部で就業型インターンシップに参加させて頂いた渡邉です。ここでは今回のインターンシップの内容やインターンを通して学んだことなどを書いていこうと思います。インターンを検討している方などの参考になれば幸いです!

自己紹介

私は情報学を専攻している修士1年生で、自然言語処理の研究室に所属しています。研究ではChatGPTなどの生成AIを使用してテキストベースの人狼ゲームをプレイすることが可能なエージェントの作成を行っているほか、作成したエージェントの精度を評価するために他の大学の人が作成した人狼エージェントと対戦を行うための大会の主催などをしています。

インターンについて

インターンの形式

ここでは自分が実際にインターンを行った形式について書こうと思います。あくまでも自分の場合なので参考程度にはなりますが、フルリモートでの勤務なのでとても働きやすく、就職後にリモートで働く場合の感覚を掴みやすかったです。インターンの開始期間については調整が利きやすく、私の場合は9月2日から参加することができましたが、他の用事があったため9月9日からの参加にさせて頂きました。勤務時間も調整が行いやすく、開始時間・終了時間の調整や中抜けなども自分の用事に合わせて行いやすかったです。

  • フルリモート
  • 期間: 9月9日〜9月30日
  • 勤務時間: 10:00〜18:30

インターンの業務内容

インターンの業務として、エキサイトブログで今後リリース予定であるPDFを発行する新機能の追加の業務に携わらせていただきました。

主にバックエンドを担当させて頂いたのですが、PDF作成のための技術調査から始まり、実際に調査した技術が使用できるかエンドポイント立てて確認、DBから値を取得してPDFに適応させることやPDF発行に伴い保存する必要のあるデータを保存するためのテーブルの作成などを行いました。 技術調査からapiの開発、DBのテーブル設計やコードレビューを受けるなど1つの機能開発の一連の流れを経験させて頂けてとても勉強になる1ヶ月間でした!

就業型インターンであるため実際のプロダクトの機能開発をすることができ、多くの人が使用する機能を自分で開発することができたのでとてもやりがいがありました。

インターンで使用した技術

研究やアルバイトでLaravelやJavaGitHubを使用したことはありましたが、それ以外のフレームワークや開発ツールはインターンで初めて使用しました。今まで触れたことのないフレームワークなどに初めは不安でしたが、分からない部分を丁寧に教えていただけたので特に問題はありませんでした。

インターン中のイベント

インターン期間中にオフラインで開催されるイベント「BeerBash」に招待して頂きました! 私は遠方から参加することもあり、有り難いことにイベント当日はオフィスで業務をさせて頂いてからイベントに参加する形になりました。BeerBashではカンファレンス参加レポや各事業部ごとにインターン生からの質問に答える対談があり、とても興味深いお話を聞くことができました。また、フリータイムには様々な方とお話しさせて頂くことができ、とても貴重な体験となりました。 私が参加した回のBeerBashについて記事が書かれているようなので、そちらを参考にして頂くとイメージしやすいかもしれません。

tech.excite.co.jp

学んだこと

クエリの発行は少なくすることを意識する

インターンを初めて間もない頃は処理を簡潔に書くことの意識はしていましたが、書いた後に無駄にクエリを発行していないかなどを確認する意識がなく、コードレビューを頂いて無駄にクエリを発行していたことに気がつきました。クエリの発行は多いほど負荷がかかり実行時間が遅くなってしまい良いことがないため、可能であれば減らした方が良いです。これはクエリの発行に限りませんが無駄な処理がある場合はコードも冗長になってしまうため、今後の読み手のためにも処理をまとめることはできないか考えることは重要であることを改めて学ぶことができました。

順番を意識して書く

先ほどの話と繋がりますが、これもコメントを頂いて意識しようと思った点です。PDFに必要なデータを取得するために既存のクエリにINNER JOINで新たにテーブルの結合をしようとしました。以下はその例ですが、新しくhogehogeテーブルを内部結合するためにFROM句の末尾にINNER JOIN hogehogeを追加したクエリを作成しました。

SELECT
   *
FROM
   hoge
   INNER JOIN fuga
      USING(id)
   LEFT OUTER JOIN piyo
      USING (id)
   INNER JOIN hogehoge
      USING(id)
   WHERE ...

今回私が行ったタスクの場合、クエリの順番としてはこれでも欲しい情報を得ることはできましたが、INNER JOINLEFT OUTER JOINが混ざってしまって読み手にとって理解しずらいクエリになってしまいました。既存のクエリに追加する場合に安易に末尾に追加するのではなく、以下の例のようにINNER JOINLEFT OUTER JOINを分けて書くことで理解しやすい形式にし、レビューなどをしやすいコードを書くことを意識したいと感じました。

SELECT
   *
FROM
   hoge
   INNER JOIN fuga
      USING(id)
   INNER JOIN hogehoge
      USING(id)
   LEFT OUTER JOIN piyo
      USING (id)
   WHERE ...

また、今回のタスクでは問題ありませんでしたが、内部結合や外部結合は順番によって結果が変わるのでしっかりと考えて変更を行うようにしようと思いました。

変数の値を追いやすくする

またしても可読性についてで、レビューを頂き意識しようと感じた点です。PDFに値を埋め込む際に、inputタグから値を取得できたかどうかで代入する値を変更する処理を書く場面があり、その際に私は以下のようなコードを書きました。

$value = [
    "id" => $_POST["id"],
    "name" => $_POST['input']
];

if(!isset(value["name"])){
    $value["name"] = $_POST['another_input'];
}

上記のコードは$value["name"]が色々な箇所で値が変更されていて、$value["name"]の値に注目したい場合にどこで変更されたのか追うためにコードをしっかり見る必要があり大変です。そのため、以下のコードのように三項演算子など使用して値を変更する箇所を1つの場所にまとめ、変数の値を追いやすいコードにしたいと思いました。

$name= isset($_POST['input']) ? $_POST['input'] : $_POST['another_input'];

$value = [
    "id" => $_POST["id"],
    "name" =>$name
];

ここで示した例はPHPでしたが、apiを実装したSpring Boot(Java)ではfinal修飾子が存在するため、値が変更されない場合はfinal修飾子をつけることで可読性を向上させることを自然に意識できるようにしたいと感じました。

DBのテーブルについて

エキサイトブログは長年続いていることもあり運用を行いやすくするための指針がとても興味深かったです。実際の例として、新たに記録したい情報が出てきた場合に安易に既存のテーブルにカラムを追加せずに新しいテーブルを作成する理由がとても勉強になりました。カラムを追加する方針を採用すると既存のデータはそのカラムにNULLなどの値を入れることとなり、無意味なデータを大量に保管する上にデータを追い辛くなることを実際に大量にNULLがあるテーブルを見て実感しました。

まとめ

約1ヶ月間のインターンシップの中で新機能の開発に一から携われるという非常に貴重な体験をすることができ、インターンを始める前よりも技術的にも成長することができたと感じています。開発を通し、チーム開発を行う上で気をつけるべき点などを学ぶことができたので、今後はこれを活かせるように意識して開発をしていきたいです!開発だけでなく、イベントを通してエキサイトの雰囲気を知ることができたので、非常に有意義な体験ができたと感じています。他ではなかなかできない貴重な経験ができるので、インターンに参加するか迷っている人には是非進むことをお勧めします。

最後に

初めて触る技術が多くチーム開発の経験も少ないので至らぬ点も多々あったと思いますが、メンターの方をはじめとする多くの方にサポート頂くことでインターンシップをやり切ることができました。この場を借りて感謝申し上げます。