プレイドインターン体験記: はじめての開発インターンを通じて得た学び

はじめに

こんにちは。calloc134 といいます。
情報工学系の学生で、普段は Web アプリケーション開発について学習しています。

今回、2024年2月から3月の5週間、プレイドでソフトウェアエンジニアとしてインターンシップを行いました。
この記事では、インターンシップの振り返りとともに、学んだことや感じたことをまとめていきたいと思います。

インターンシップ開始まで

当インターンシップは、知り合いから紹介をいただいたことがきっかけで始まりました。
自分は今までインターンシップを経験したことがなく、実務経験もありませんでした。
プレイドのインターンでは、任される開発業務に必要な範囲で、社員さんと同じ環境・同じシステムに対して開発・コーディングを行うことができるという特徴がありました。
この特徴は、実際の開発現場でどのように開発が進められているかを知りたい自分にとって、非常に魅力的でした。
そのほか、技術領域が自分の普段の学習と近いことや、エンジニアインターンではフルリモートでも勤務でき、都心住みでない自分でも働きやすいことなどが決め手となりました。

インターン開始前にカジュアル面談を行い、簡単な技術スタックと業務内容について説明を受けました。
プレイドでは、担当するプロダクトによって開発チームが分割されています。
自分はMessageチームに入ることになったので、そのチームでの業務内容について説明を受けました。

Message チームは KARTE Message というプロダクトを開発しています。
当プロダクトは、データを元にメールやプッシュ配信、LINE メッセージの送信をノーコードで行うことができるため、マーケターなどの非エンジニアの方でも簡単に大規模なコンテンツ配信が可能なマーケティングオートメーションツールとなっています。

技術スタック

Message チームの技術スタックについては、同じ Message チームの方が書かれたこちらのブログ記事が参考になると思います。

簡単に解説すると、下記のような技術スタックになっています。

  • フロントエンド
    • Vue(メイン)
    • React (一部メニュー)
  • バックエンド
    • サーバサイド Node.js / Express.js
    • Golang
    • Java
  • インフラ
    • MongoDB (データベース)
    • Redis
    • Cloud Pub/Sub
    • GKE (Google Kubernetes Engine)
      • ArgoCD (デプロイ)
  • DevOps
    • GitHub Actions
    • CircleCI
  • 監視
    • Sentry
    • Datadog

また、開発については、下記の技術を使用していました。

  • Git/ GitHub (コード管理)
  • Docker Compose (開発環境)
  • Kind (Kubernetes in Docker)

自分にとって、このインターンが初めてのエンジニアとしての実務経験となります。
そのため、技術レベルも含めて最初はインターンで活躍できるかすごく不安でした。

インターンの内容

最初の二日間

インターン開始してすぐの二日間は、自分の開発環境を整えることから始まりました。

まず開発環境セットアップの資料を確認してインストールを行ったのですが、リポジトリの更新や仕様の変更により、資料と異なる部分がありました。また、資料に存在しないような issue に遭遇することがしばしば起こりました。

そこでSlack に開発環境構築専用のチャンネルが存在したため、そこにスレッドを立てて技術チームに質問を行いながら、一つずつ課題を解決していきました。
フルリモートで意思疎通が難しくなるかもと心配していましたが、チームメンバーの皆さんが迅速に対応してくれたため、スムーズに進めることができました。
また、解決した課題は、times と呼ばれる自分専用のメモ書きチャンネルにまとめていくことで、後から振り返りが容易になるようにしました。

一通り開発環境の構築が完了した後、開発環境構築の手引きとして社内ドキュメントを執筆しました。新しく入ったインターン生が同じような問題に遭遇した際に、自分の経験が役立つことを願っています。

タスク

開発環境の構築が完了した後、実際に開発に取り組むことになりました。

5週間という比較短い期間の中でもさまざまなタスクに着手してきましたが、ここでは一番印象に残ったタスクをピックアップし、振り返りたいと思います。

LINEコンテンツのサムネイル生成機能

KARTE Messageでは、メール、プッシュ配信、またはLINEを用いてユーザにコンテンツを送信することができます。

コンテンツの保存時に自動的にコンテンツのサムネイル画像を生成し、プレビューすることができる機能が存在するのですが、この機能が実装されているのはメール配信とプッシュ配信のみであり、LINE には実装されていませんでした。

そこで、LINEコンテンツのサムネイル画像を生成する機能を実装することになりました。

Untitled(1).png

タスクに取り組むにあたり、はじめに現状のサムネイル生成機能を理解するところから始めました。

まず管理画面上でコンテンツが保存されたタイミングでpubsubのキューにHTML と CSS の情報がメッセージとして登録されます。
サムネイル生成用サービスがそのメッセージをsubscribeしており、メッセージの内容からサムネイル画像を生成する、というシンプルな構成でした。
具体的には、メッセージから取り出した HTML と CSS の情報をpuppeteerでレンダリングし、レンダリング結果のスクリーンショットを生成、S3のsignedURLを用いてS3に保存します。

Untitled(2).png

ではLINEコンテンツのサムネイル生成機能を実装するためにはどのような実装が必要なのでしょうか。

現状の構成では、サムネイル生成用サービスのインターフェースはHTMLとCSSとなっています。

一方で、管理画面で表示しているコンテンツのプレビューはReactやTailwind CSSといったフレームワークを用いて描画しているため、ここからなんとかして等価のHTMLやCSSを生成する必要があります。
あるいは、サムネイル生成用サービスを改修し、Reactコンポーネントを描画する方法もとりえます。
Untitled(3).png

上記に加え、さらにいくつか設計の選択肢をリストアップし、メリットとデメリットを比較してみました。
Untitled(4).png

まず、一番目と二番目の選択肢は実装が難しいと感じたため、採用を見送りました。

そこで三番目の選択肢で実装を進めていましたが、画像がロード中の表示のままサムネイル生成されてしまう可能性があるという問題が発生しました。

これはサーバサイドでのReactコンポーネントのレンダリングの場合、画像の描画に時間がかかってしまうことが原因でした。
従って、最終的に四番目の解決策である、クライアント側の React コンポーネントの HTML を取得してレンダリングする方法を採用しました。

クライアントサイドにおいて、React Componentの描画結果のHTMLはuseRefを利用することで簡単に取得できました。

 	const previewHTMLRef = useRef<HTMLDivElement>(null);
 	const previewHTML = previewHTMLRef.current?.innerHTML

  return (
    <>
      <LineEditorPreview controller={controller} previewHTMLRef={previewHTMLRef} />
    <>
  )

またスタイリングにはTailwindCSSを用いていたため、プレビューのコンポーネントで適用されているTailWindCSSのクラスをあらかじめビルドしておけば、プレビューに使われているCSS を生成することができます。

TailwindCSS は CLI での呼び出しに対応しており、構成ファイルを指定して手動コンパイルを行いました。

今回は、LINE プレビューに関連するコンポーネントを全て指定した構成ファイルを作成し、TailwindCSS CLI でビルドを行うことで、CSS を生成しました。

// 構成ファイル

/** @type {import('tailwindcss').Config} */
module.exports = {
  presets: [require('@plaidev/sour-react/tailwind')],
  content: [
    './src/page/template-edit/line-editor/preview.util.tsx',
    './src/page/template-edit/line-editor/preview.tsx',
  ],
  variants: {
    extend: {},
    animation: [],
  },
};
# TailwindCSS CLI
tailwind -o path/of/output -c path/to/config -m

最終的にあらかじめ生成しておいたCSSをサーバー側で保持しておき、クライアントサイドから送られてくるHTML情報と合わせてpubsubに登録することで、LINE コンテンツのサムネイル画像を生成することができました。

Untitled(5).png

インターンを振り返って

社員さんと同じ環境で開発を行っていくことで、自分の中における仕事に対する解像度が上がったと感じています。
これまでは個人的な開発しかしてこなかったため、自身のスキルが社会に出てから実際に活かすことができるのか不安でした。
しかしプレイドのインターンシップを通じて、今まで学習してきたスキルが仕事に活かせることを実感し、また必要なスキルをどのように向上させていけばよいのかを学ぶことができました。

インターンから得た学び

コーディングについての学び

一例としては、コードの可読性やコメントの重要性を学びました。
これまでの開発では自分がわかりやすいようなコメントや変数名を付けることが多かったのですが、プレイドではロジックの背景を意識したコメントや変数名を付けることが求められ、普段の開発でもこれらの意識を持って開発を行うようになりました。

ロジックの理解

また、ロジックを理解する大切さについても学習しました。
挙げられた issue に関して場当たり的な修正は簡単に見えても、その根本的な原因は別のところにあることが多く、ロジックを含めて全体を理解することが重要であると感じました。

issueの理解

タスクの内容を深く理解することも重要です。

タスクは基本的に ~ ができない のような課題形式で書かれているのですが、その解決には様々な方法が考えられます。その中でもどういった仕様が良いのかを正しく導くためには、既存ロジックの理解に加え、ドメインや顧客の理解も非常に重要となってきます。
プレイドでは仕様に関するディスカッションも頻繁に行われるため、こういった能力も養うことができました。
コーディングならAIでもできるようになってきている時代において、仕様設計はますます重要になると考えており、今後も磨いていきたいと思っています。

インターンの特徴

プレイドのインターンの特徴を以下にまとめました。

  • 実際のエンジニアと同じチームでプロダクト開発を行う
  • 社員と同じ一連の開発フロー(issue アサインと方針の整理、修正とデプロイ、動作確認まで)
  • 技術力に応じてコア開発に近いタスクへのアサインも可能

こんな人におすすめ

  • 実際の開発現場で、開発のサイクルを学びたい
  • 技術力を向上させたい・フルスタックで活躍したい
  • 課題解決力の向上・設計・実装・運用までの幅広い業務経験を積みたい

まとめ

自分にとって初めてのインターンでしたが、実際の開発を通して色々なことを指導していただき、無事やり遂げることができました。
お世話になった社員さん、インターン生の皆さん、本当にありがとうございました。
今後もこの経験を活かして、さらに活躍できるようなエンジニアを目指していきたいと思います。

プレイドの開発インターンに興味のある方はぜひ下記から応募してみてください。