title: "2026夏インターンコーディング試験" date: 2026-05-28 tags: ["lineyahoo", "interview"] draft: true


エントリー

第1志望のポジション

LINEスタンプ・テーマ・絵文字に関する機能のバックエンド開発 SWE-6-53

志望理由(学びたい技術や経験とその理由、また求めるスキル等についてPRできることなどをご記入ください。

業務内容の中に複数のテーマやタスクの記載があるポジションは、特に興味関心が高いものやその理由も記載してください。)

多くのユーザーに直接価値を届ける開発に携わりたいことと大規模サービスのバックエンド開発を通じて技術力を高めたいからです。これまでの開発経験ではplatformエンジニアリング的な業務が中心で、自分の仕事がユーザーにどのように役立っているのかを実感する機会が限られていました。LINEスタンプは日常的に多くのユーザーが利用する機能であり、ユーザーの課題解決や利便性向上に直接貢献できる点に強い魅力を感じています。また、昨年のサマーインターンでサイバーエージェントのABEMAにおいて大規模サービス開発を経験し、その際に得た学びと面白さから、さらにこの環境で開発をしたいという思いが強くなりました。LINEという大きいプラットフォームで、高トラフィックやスケーラビリティといった技術的課題に向き合いながら、自身の開発力を次のレベルに引き上げたいと考えています。 また、普段のアルバイトでScala3で開発をしているのでJVM系の言語という要求スキルやグローバルな環境で働く意欲というのも自分に合っているのではと感じ応募しました。

第2志望のポジション

LINEヤフーの次世代のマーケティングサービスを支える自律型AIエージェントの開発 ポジションコード: SWE-MLE-4-45

志望理由(学びたい技術や経験とその理由、また求めるスキル等についてPRできることなどをご記入ください。 業務内容の中に複数のテーマやタスクの記載があるポジションは、特に興味関心が高いものやその理由も記載してください。)

昨年のABEMAでのインターンや普段の開発を通じて、大規模サービスにおける運用・自動化の重要性を実感しています。特に、複雑なマーケティング業務を自律型AIエージェントが担うことで、ビジネスのスピードと規模を劇的に変えられる点に強い魅力を感じています。これまでのバックエンド・プラットフォーム開発の経験とScalaなどJVM系言語の知見を活かし、AIエージェントの基盤開発や本番環境での安定運用に貢献したいと考えています。同時に、LLMを使った実装や評価基盤の構築など、AIとエンジニアリングの交差点での技術を深め、次世代のプロダクトを支える開発力を身につけたいです。

第3志望のポジション

広告配信のための大規模検索エンジンの開発・運用 ポジションコード: SWE-4-27

志望理由(学びたい技術や経験とその理由、また求めるスキル等についてPRできることなどをご記入ください。 業務内容の中に複数のテーマやタスクの記載があるポジションは、特に興味関心が高いものやその理由も記載してください。)

昨年のABEMAでの大規模サービス開発や普段のプラットフォーム業務を通じて、低レイテンシ・高スループットなシステムの設計・運用の重要性を実感しています。広告配信の検索エンジンは、ビジネスに直結する極めてクリティカルなインフラであり、ミリ秒単位の性能改善がそのまま収益に繋がる点に大きな興味があります。ScalaなどJVM系言語の経験や、高トラフィックな環境での開発知見を活かし、大規模検索エンジンのパフォーマンス最適化や安定運用に貢献したいと考えています。また、インデックス構造やランキングアルゴリズム、分散システムの設計など、データインテンシブな領域の技術を深め、検索品質とスケーラビリティの両立を追求する力を身につけたいです。

最近関心を持った機械学習論文について(最近興味を持った機械学習関連の論文と、その技術的面白さを解説してください)

tech interview

Q1. 変更に強いAPIの設計方針と互換性維持

出題内容: 既存の利用者が多いエンドポイントに項目を追加する予定がある。変更によって利用者側の障害が起きないよう、後方互換を保つための方針を整理せよ。バージョンの付け方、互換性のない変更を避けるための操作、非推奨と移行期間の扱い、返すべきエラーレスポンスの形式、変更が外部に伝わるようにする公開情報の整え方などを、将来の拡張を意識して文章で説明し、今回の項目追加で採るべき現実的な手順を短くまとめる。

回答概要

後方互換を保つAPI設計・運用方針

  1. バージョニング

    • URLパス(/v1/)またはヘッダーで明示的に管理
    • 既存バージョンは最低1年〜2年維持し、破壊的変更は新バージョンでリリース
  2. 互換性を壊さない操作

    • 新フィールドは追加のみ。既存フィールドの削除・型変更・意味変更を禁止
    • 新パラメータはデフォルト値を設定し、既存クライアント用にサーバー側で補完
    • 既存エンドポイントの挙動は変えない
  3. 非推奨(Deprecation)と移行期間

    • レスポンスヘッダー(Deprecation / Sunset)とドキュメントで事前告知
    • 移行期間は最低3〜6ヶ月(利用規模に応じて1年以上)
    • 利用統計を監視しながら段階的に縮小
  4. エラーレスポンス

    • RFC 7807(Problem Details)に準拠した固定フォーマット
    • 既存エラーコードは削除せず、新コードを追加する形で拡張
  5. 変更の公開情報

    • Changelog: 日付付きで「Added / Changed / Deprecated / Removed / Fixed / Security」を管理
    • リリースノート: 影響範囲と例示リクエスト/レスポンスを掲載
    • メール/ブログ/SNS等で複数チャネル告知

今回の項目追加における現実的な手順

  1. 追加フィールド名・型・デフォルト値を定義し、既存スキーマと衝突しないことを確認
  2. 新フィールドをオプショナルで追加し、未指定時は既存動作を維持
  3. 旧クライアントと新クライアントの両方で動作検証
  4. ChangelogとAPIリファレンスに追記
  5. 「後方互換のある追加であること」を明記して利用者に通知
  6. 必要に応じて数週間〜数ヶ月の猶予後、必須化などの次段階を検討

Q2. 保守しづらいコードへの指摘と改善の進め方

出題内容: 動くが保守しづらいコードに対し、指摘と改善の進め方を文章で示せ。循環参照が起きやすい構造や一つの関数に多くの責務が集中している状況を想定し、なぜ現在の形が将来の変更に弱いのかを簡潔に説明し、どの手順で分割していくのが安全かを示す。変更の安全網となる自動テストの整え方、依存方向を見直す考え方、命名の揺れを減らす工夫など、具体的な提案を含めること。

回答概要

指摘:なぜ将来の変更に弱いか

  • 単一責任の原則違反: 1関数が入出力・変換・永続化・通知など複数責務を担うため、仕様変更時に波及範囲が広く、影響予測が困難
  • 循環参照: モジュールA→B→Aのような依存は、個別テスト・単独デプロイを阻害し、修正時に連鎖的な破壊を生じやすい

改善手順(安全な分割の進め方)

  1. 挙動の固定化(安全網): 現コードの入出力を網羅的に自動テスト化し、リファクタ中の回帰を防ぐ
  2. 責務の切り出し: 関数内を「データ取得→変換→保存→副作用」などに分解し、純粋関数と副作用関数を分離
  3. 依存方向の整理: 上位(UseCase)→ 下位(Repository/Client)の一方向にし、DIで循環を解消
  4. 段階的移行: 一度に大きく書き換えず、切り出した単位を順次呼び出し、テストが通ることを確認しながら置き換え

具体的な提案

項目提案
自動テストリファクタ前に結合テストを網羅し、単体テストは切り出した純粋関数に対してパラメータライズドテストで網羅
依存方向実装詳細(DB/APIクライアント)がビジネスロジックを参照しないようにし、DIPで抽象に依存
命名process() handle() などの曖語を廃し、動詞+目的語(createOrder, validatePayment)で統一。モジュール間で同じ概念に異なる言葉を使わないよう用語集を明確化

Q3. 長時間稼働で増えるメモリ使用量の原因究明と対策

出題内容: 一定時間ごとに高い負荷がかかるWebアプリが、稼働から数日後に不安定になる。どのようなメトリクスを集めると原因が推測できるか、どのように条件を絞って再現しやすくするかを説明せよ。記録の取り方、保たれ続けている参照の見つけ方、使わなくなった情報を回収できるようにする考え方、必要であれば最大量の上限を設定する手段などを順序立てて説明し、完全な解決までの間に停止を避けるための暫定案を短く添える。

回答概要

1. 収集すべきメトリクス

  • 時系列メトリクス: ヒープ使用量、GC頻度/停止時間、リクエスト処理数、エラー率を Prometheus/Datadog等で可視化
  • オブジェクトプロファイル: ヒープダンプを定期的に取得し、クラス別インスタンス数・サイズの推移を比較
  • リクエスト単位の追跡: 高負荷処理の開始/終了時点でメモリ差分を計測し、特定機能と相関を取る

2. 再現条件の絞り込み

  • 負荷テスト: 実環境と同等の一定間隔バッチを k6 / JMeter / 自作スクリプトで再現させ、ヒープ増加が起きる最小の実行回数・データ量を特定
  • 絞り込み: キャッシュ機能・ファイル読み込み・外部APIレスポンスを個別に無効化し、増加が止まるポイントを特定

3. 記録の取り方

  • メトリクスは時系列DBに1分間隔で永続化
  • メモリダンプは処理前後またはアラート閾値突破時に自動取得
  • バージョン・デプロイ時刻・設定変更とメモリ推移を同じダッシュボードに重ねて表示

4. 保たれ続ける参照の発見

  • ヒープダンプ比較: 2時点間のダンプを MAT / VisualVM で差分解析し、生存数が増加しているクラスと到達可能な逆参照ツリーを特定
  • リーク疑いパターン: コレクションへの未削除登録、コールバック・リスナーの未解除、ThreadLocalの未クリア、キャッシュの無限増加を優先的に調査

5. 使わなくなった情報の回収

  • スコープの縮小: 大きなオブジェクトを長寿命なグローバル変数ではなく、処理単位のローカル変数に閉じ込める
  • 明示的な解放: コレクションの clear()、コールバックの removeListener()、タイマーの stop() を確実に呼び出す
  • 弱参照の活用: キャッシュには WeakHashMap / Caffeine(expireAfterWrite / maximumSize)を利用し、自動evictを有効にする

6. 上限設定の手段

  • リソース制限: コンテナ上でメモリ上限(memory.limit_in_bytes)を設定し、超過時に OOMKiller により異常検知
  • アプリケーション制限: 内部キャッシュに maxSize / maxWeight を設定し、エントリ数や総バイト数で自動破棄
  • フェイルセーフ: 閾値超過時にアラートを飛ばし、処理の受け入れ抑制(サーキットブレーカー)で事態の悪化を止める

暫定案(完全解決までの間)

  • 定期再起動: Cronやオーケストレータで数日ごとに無停止ローリング再起動を行い、メモリを明示的に解放
  • 負荷分散・スケールアウト: 単一インスタンスの負荷を下げ、メモリ増大の速度を遅らせる
  • 処理の段階的実行: 高負荷処理を連続実行せず、間に待機時間を設けてメモリ回収の余地を作る