Interview/

Kenjiro Nogawa

自己紹介をお願いします
2019年4月に新卒エンジニアとして入社した野川賢二郎です。

学生時代、大学と大学院でコンピュータサイエンスを学びながら、自動車のあいのりマッチングサービスのアプリ開発をインターンとして手伝ったり、香水のサブスクリプションサービスの開発をサービス立ち上げから携わる経験をしました。小規模のB2Cのサービス開発に関わっていく中で、より大規模なサービスの開発ノウハウを学びながら、コードを通じて多くのユーザーに価値を提供できる環境に身を置きたいという気持ちが強くなり、LINEを含む規模の大きいIT企業を志望して就職活動をしました。

最初に内定をもらったのがLINEで、内定者アルバイトをすることになりました。LINE LIVEチームのサーバーサイドエンジニアとして働いていたのですが、アルバイトの意見でも積極的に取り入れてくれて、フラットに一人ひとりのエンジニアが尊重される社風が気に入って、LINEへの入社を決めました。

LINE LIVEのサーバーサイド担当に配属されたのは、自分の希望によるものでした。動画サービスの需要の高まりを個人的に感じていて、多くの新規開発ができるのではないかと思ったのと、多くのトラフィックを捌くという性質上技術的な課題が多くおもしろそうだと思ったからです。自分の意志で内定者アルバイトの業務が選べたことも、入社を決める後押しになった気がします。

入社後もLINE LIVEの開発を行いながら、LINE MUSIC関連の仕事も任されるようになり、そのまま掛け持ちという形で今は両方の開発を兼任しています。
業務内容や具体的な流れを教えて下さい
サーバーサイドエンジニアとして、LINE LIVEの新機能の開発やパフォーマンス改善や、LINE MUSICで楽曲を配信しているパートナー向けの新システムの開発に取り組んでいます。

LINE LIVEは、ローンチから5年が経過しようとしているサービスです。そのため日々の改善によって積み重なった技術的負債を解消しながら、隔週で新機能リリースを行うなど、非常にスピーディな開発に取り組めていると思います。LINE LIVEでは、大型案件の配信があると瞬間的な大規模トラフィックが発生し、1日のAPIリクエスト数は数億になることもあります。それらを安定的に捌くためのパフォーマンス改善をしながら、新機能の開発を並行して進めるのは非常にチャレンジングでおもしろいですね。LINE MUSICでは、新規開発案件のためアーキテクチャ設計、ミドルウェア選定から実装までを担っています。今、新卒2年目になるのですが、取り組めている業務の質も幅も満足していて、貴重な経験が積めていると思います。

もう少し業務の詳細をお話ししますね。自身の仕事は大きく分けると、新機能の開発と、既に動いているサーバーアプリケーションの改修・改善に分けられます。


新機能開発の場合、基本的には企画担当者が機能の企画を提案することから始まります。多くの場合、一つのタスクにつきサーバーサイドエンジニアが一人アサインされます。メンバーのアサインは本人の希望やスケジュール、必要とされる能力など様々な要因によって決まりますが、インパクトのある大きなタスクでも無理のない範囲で新人に積極的に任せていく雰囲気があります。適度な無茶振りという感じでしょうか(笑)。アサインされたエンジニアは、企画チームが企画書としてまとめたwikiに対して技術的観点、またはユーザー目線でコメントを行い、デザイナーやQA担当などを含めた多くの人と議論を重ねます。決められたものを作るのではなく、企画段階から関与することが求められます。仕様レビューが進む中で、サーバーサイドエンジニアは並行してテーブル設計や機能のおおまかな設計をすることが多いですね。

例えば、先日私が担当し、リリースしたLINE LIVE-VIEWINGという、ライブ配信のチケットを販売サイトで販売し、購入者がLINE LIVE上で配信を視聴できる新サービスの開発で具体的な流れを紹介します。
チケット販売サイトでは、チケットの枚数制限をかけることができるという仕様があるため、チケット販売直後にスパイクアクセスが来ることが想定されます。そのためトップページから購入までの流れの中で、データベースへのアクセスを減らすためのRedisによるキャッシュに関する設計などを行いました。また、チケットを所有したユーザーは配信開始とほぼ同時のタイミングで視聴を開始することが予想されるのですが、このタイミングでデータベースに対してチケットの所有チェックのクエリを発行していると、データベースに負担がかかり最悪視聴ができないといったことも起こりかねません。そのため、配信開始のタイミングでチケットの所有者とチケットIDの組み合わせをRedisに載せるようにし、配信中はRedisを、アーカイブ配信の視聴の際はMySQLを参照するようにすることで、視聴開始時の負荷を軽減するという設計にしました。

これらの設計はテックリードを含めた開発チーム内にドキュメントとして共有し、フィードバックをもらってブラッシュアップをします。ただチーム内で閉じた議論をするだけでなく、他の専門チームともコミュニケーションを取ります。先ほどのRedisの例だと、LINEにはDBAというデータベースを専門に扱うチームがあるため、想定トラフィックとRedisのスキーマ設計に関して議論を行いました。

仕様と設計が揃った段階で実装をし、チーム内でのコードレビューを行います。コードレビューが無事終了したあとはQAチームによるアプリケーションの品質テストが行われます。このフェーズでバグが発覚した場合は、修正して再度コードレビューに戻り、QAによるテストが通過するまで繰り返します。LINE LIVE-VIEWINGの開発では、QAチームによる機能面のテストの他にも開発チームでの負荷試験を行いました。LINE LIVEは既にリリース済みのサービスのため、本番環境に人為的な負荷をかけるのはリスクがあるため、負荷テスト用の環境を用意しました。負荷をかける際は、各APIを個別にテストするだけでなく、実際にユーザーから送られてくるリクエストを想定した負荷シナリオを作成して負荷をかけることで、本番での負荷との乖離が少なくなります。LINEでは、扱うサービスのリリース直後に大量のトラフィックが来るといったことも珍しくないです。リリース前のパフォーマンスチェックはしっかり行われていますし、知見も多いので大きなサービス開発ならではの学びがあります。これらの工程を経て機能をリリースし、本番環境での負荷・エラーのモニタリングやそれに基づく改善点を洗い出し、開発を進めていきます。
仕事を進める上で、意識していることはありますか
大きくは2つで、「積極的に強い人に聞くこと」と「ユーザー目線と開発者目線のちょうど良いバランスを保つこと」です。

「積極的に強い人に聞くこと」というのは、例えばLINEにはJavaのガベージコレクションのスペシャリストやKafkaのコミッターなど、各方面のスペシャリストが本当にたくさんいます。何か問題があったとき、インターネットなどの外部リソースを活用するだけでなく、内部のスペシャリストの意見を聞くことでスピーディかつ効果的に課題を解決できますし、自身が吸収できる知見も多いと思います。もちろん、「〜がわからない」といった漠然とした聞き方は技術者としてNGだと思っているので、自分で可能な限り調べた上で「ここはこうだと思っているんですが、詳しいあなたから見るとどう思いますか?」といった意見交換のような形として聞くことが大切です。迅速にフィードバックをもらえますし、今後も意見をもらいやすい関係ができる。自分にとっても表層的な理解ではなく本質的な解決につながるので、積極的に考えて相談するようにしています。あと、LINEは個人や部署の知見をオープンにする文化があるので、こういったやり方の相性が良いんだと思います。

もう一つの「ユーザー目線と開発者目線のちょうど良いバランスを保つこと」というのは、正解のないバランスを追求することが大事だと思っています。自分はサーバーサイドエンジニアとしてパフォーマンスの高いソフトウェアをスピード感を持ってリリースする責務があります。なので、「この仕様のほうが負荷が低くなるし、開発も楽だな」という考えをするのですが、一方でサービス開発者としてユーザーに提供する価値を優先しなければならない。パフォーマンスやスピードを優先するとUXがちょっと悪くなるという問題があれば、高いUXを保つことを優先したまま仕様を変えられないか考えたり、設計を工夫することで解決できないか考えます。どうしても全てを最高にするということは現実的ではないので、ここの妥協点は本当に難しくて常に探り探りでやっています。ただ、ここを追求するのがエンジニアリングのおもしろさだと思うので、今後も悩み続けていきたいですね。
おもしろいことや難しいことなど、働く中でこれまでに得た感触を教えて下さい
おもしろいと感じることは、たとえ小さなパフォーマンス改善でも多くのユーザーに良い影響を与えることができることです。サービスのユーザーが多いと、自分の周囲で使われていて生の感想を聞くことも多くなり、やりがいを直接的に感じることができます。新機能の開発でも、ただ動けば良いということはなくて、数十万人が同時にアクセスしてきた場合どうなるかなどの小規模なサービス開発では考えないような要件を踏まえながら設計の最適化を行うのは楽しいです。あとは、新卒1年目であっても与えられた仕事だけでなく積極的に課題を探して解決していく裁量を与えれられるのも良いところだと思います。

難しい部分は、先ほど触れたユーザー目線と開発者目線のバランス。大きなサービスならではと言いますか、完全に一つの視点に振り切ることはできないので、バランス感覚は高いレベルで求められています。また、新機能の開発とパフォーマンス改善を並行して進める必要があることも難しいことの1つですね。例えば2週間かかる新機能開発の最中、その時間を全て新機能開発に使えることはあまりなく、トラフィックの分析や負荷テストによるパフォーマンス計測など、すでに動いているシステムの改善が必要になります。両者共にサービスにとって重要なことなので時間の使い方であったり、業務自体をどう効率よく進めるかを工夫する必要があり、難しいです。しかし、ここはエンジニアとしての腕の見せ所でもあり、大規模サービス開発の面白い点でもあるので、今後も挑戦していきたいです。

自分が成長したと感じていることは、プログラミング能力だけでなくスケーラブルなWebサービスの設計能力です。一人で自分のためのツールを書くときは、愚直に思いついた実装をしていくことが多いですが、大規模サービス開発で性能のボトルネックになるような部分の設計をするときは、複数のパターンを考えてそれぞれの利点・欠点を挙げ、最適なものを検討することが必要です。これは、周囲のシニアエンジニアの設計フィードバックなどを経て、設計と自身の設計力をブラッシュアップできていると感じています。あと、チームで開発するスキルも身についてきていると思います。サービスの開発はチームで継続的に行うものなので、自身がやったことを共有したり、複数人で議論することで質を高めていけることを実感しています。コードレビューやドキュメント作成をはじめ、チーム開発に必要なステップは多くありますが、一通りの経験は早い段階できて、それらのステップをちゃんと活かせるようになっていると思います。

サーバーサイド含むいわゆる開発エンジニアにとって必要な素養としては、コンピュータサイエンスの基礎の部分。そして、自身が知らないことへの興味を持ち続ける姿勢が大事だと思います。逆にそれ以外は入社後に吸収できるかなと。
LINEに入社して良かったと感じることはなんですか
繰り返しになりますが、年齢や立場などに関係なく、良い提案や改善は受け入れられることです。whoより、howやwhatが当たり前に重要視される文化があります。あとは、自分が関わるサービスがリリースするとすぐに多くの人の反応を得られる点や尊敬できるエンジニアが多くいる点。このあたりは、共感いただけるエンジニアが多いのではないでしょうか。エンジニアが求める環境・要素の多くがあると思いますので、LINEに入社してよかったと感じます。
最後にメッセージを
LINEには様々なサービスがありますが、そのそれぞれは多くのユーザーに利用していただいていて、それによって生じる難しく解決しがいのある課題が山積みです。さらに、新卒1年目からでも裁量を持って課題に取り組める環境・文化もあります。そのため、エンジニアとして早く成長したい方には良い環境だと思います。少しでも魅力を感じていただけたら、ぜひエントリーしてもらえると嬉しいです。