はじめに
こんにちは!9月初旬から1ヶ月の間、エキサイト株式会社のLife&Wellness事業部で、就業型インターンシップ「Booost!!!」に参加させていただいた須藤です。今回は、インターンシップでの取り組みや学んだことを紹介します。
自己紹介
私は大学院で、異常検知分野の研究を行っています。これまでWebアプリケーションの開発の経験は、趣味の範囲で簡単なものを作成した程度であり、Webアプリの本格的な開発や保守運用の経験はなく、今回のインターンシップが初めての挑戦となりました。このインターンシップに参加した目標は、就業型の実務インターンを通して、チーム開発の経験を積み、キャリアイメージや、エンジニアとして働く解像度を上げることです。その中で技術的な知識も加え、エンジニアとして求められることを学びたいと考えていました。
インターンシップの業務内容
Life&Wellness事業部は、「エキサイト電話占い」という占いサービスを提供しています。私は、「エキサイト電話占い」で使用されているPHPフレームワークBEAR.Saturdayを、最近の主流フレームワークであるLaravelに移植する業務に取り組みました。その中で、アンケートページやそのアンケート回答の感謝を表示するページの移植を行いました。私は、Ruby on Railsの経験が少しあったものの、PHPやLaravelには今回初めて触れました。そのため、最初はロジックを含まない静的なページの表示から始めさせていただき、徐々に段階を踏みながら、より複雑なタスクを割り振っていただきました。また、毎回朝会で、進捗の報告や今日の目標の確認をする時間があり、タスク目標を明確にすることができました。さらに、業務の過程で、丁寧なPRレビューやアドバイスに加え、どのようにサービスが動いているのかというような詳細な補足説明もいただき、全体像を掴みながら、順調に慣れることができました。
学んだこと
このインターンを通して、数多くのことを学ぶことができましたが、その中でも特に印象に残ったことや、実務でのチーム開発を経験したからこそ得られた知見を、コーディング面とチーム開発/コミュニケーション面でまとめようと思います。
コーディング
データ処理の流れを理解する
このインターンで初めて、PHPやLaravelに触れたということもあり、アーキテクチャの理解が大変でした。その中でも、アンケートの回答データをAPIを使用して送信をするまでに、データ処理のプロセスを把握することが一苦労でした。ディレクトリ構成が決められていて、回答データに関するファイルがたくさんあるということもあり、まずはsampleファイルを参照しながら、データがどのように処理されていくのかを、以下のように自然言語で簡単に書き出してみました。
- ルールに基づいてバリデーションチェックを行う(postForm)
- チェックがOKだった場合:入力されたデータをUseCaseで処理する
書き出してみたことで、データ処理の流れを自分の中で明確にでき、開発がスムーズに進められた気がします。とりあえずコードを書き進めてみるのではなく、方針や全体像を把握することの重要性に気づきました。
テストケースの作成
私の中でかなり躓いたところが、テストケースの作成でした。テストケースを作成するにあたり、モックの理解が非常に重要でした。 例えば以下のコードは、URLのパラメータにidがセットされている場合に、idを保存するuseCaseのhandle処理が呼び出されているかどうかを検証するテストです。
public function test_パラメータにidが指定されているときに、idの保存処理handleが呼び出されていること(): void { // 1.準備 $id = 'test_id'; $this->mockAuthentication(dummyUserId: self::TEST_USER_ID); $this->mock(EnqueteIndexGetUseCaseInterface::class, function ($mock) use ($id) { //3. 検証 $mock->shouldReceive('handle') ->once() ->with($id); }); //2. 実行 $response = $this->withUnencryptedCookies([ApiConstant::COOKIE_KEY => 'test_value'])->get( uri: route(EnqueteIndexGetController::ROUTE_NAME, [EnqueteIndexGetController::GET_PARAMETER__ID => $id]), ); }
ここで、shouldReceive('handle')は、「handle()が呼び出されることを期待する」ということを定義します。同様に、once()は、「handle()が1回呼び出されることを期待する」ということを表しています。本来は、useCaseをモックして、どのような動作が望ましいのかを定義してから、URLのGETメソッドを実行します。このようにすることで、実行時(2.実行)にuseCaseが呼び出され、検証が行われます。*1
私は最初、URLをGETしてから、モックしていました。(//3.検証と//2.実行の順番を反対にしていました。)これでは、最初にURLのGETが実行され、このタイミングでuseCaseも呼び出されますが、この時点ではまだモックしていない(期待することを定義していない)ので、その後にモックをしてテストをしても、1回もhandle()が呼び出されないという判定になってしまいます。プロセスの順序の意味や、内部でどのような処理が行われているかを意識しながらコードを書くことの重要性を、改めて実感しました。
チーム開発/コミュニケーション
コーディング規則
部署内ではコーディング規則があり、linterやformatterにより、保守運用等を伴う変更容易性や可読性を担保しています。加えて、フレームワーク移行のプロジェクトでは、ディレクトリ構成も決められていました。例えば、ビジネスロジックを処理するクラスが明確に分けられていることで、Laravelにも依存しない設計になっていました。また、Bladeファイル(テンプレートエンジン)においてViewModelを活用することで、HTMLで利用可能な変数を渡し、Bladeファイルの修正が必要になるケースを抑えることができることを学びました。実際にPRの修正等で、コードを直す場面がたくさんありましたが、このようなコーディング規則やディレクトリ構成により、変更の容易性を実感しました。
チーム開発する上での細かな注意点
例えば、
// TODO: 以下はサンプルのため移植前に削除する $this->app->singleton(SampleUseCaseInterface::class, SampleUseCase::class);
新たなコードをこのコメント文の下に追加すると、新たに追加した箇所も削除対象扱いされかねません。チーム開発をする上では、このような箇所にも注意する必要があるということを学びました。
コミュニケーション
インターンを通して、メンターの方々への質問の仕方については課題を感じました。インターンを振り返ると、特に最初の頃は、質問の粒度が細かく、自分でデバッグしたり、他のコードを注意深く確認する前に質問をしてしまったり、「これで合ってるのかな」と心配になることがあって、すぐに確認してしまっていました。また、タスクにも期限が存在するので、自分で調べて解決できるのか、聞いた方が良いのか、という判断が困難でした。
特にアンケートページの回答を入力する処理では、入力データがどのように処理されるのかが複雑に感じ、わからないことが特に多かったので、疑問点や解決したいことをメモ等にまず書き出し、わからないことを定期的に整理することを心がけていました。その中で他のコードを参照したり、調べたりして、疑問点が生じた場合に、聞くようにしていました。その中で、質問を重ねていくうちに、どのように調べれば自分が知りたいことを理解できるのか、デバッグを使用した解決方法についても学ぶことができました。このインターンシップで学んだ質問の粒度や解決能力を、これから様々な場面で、意識していきたいです。
最後に
メンターの方々をはじめ、インターンシップで関わってくださった皆様に、この場を借りてお礼申し上げます。開発だけでなく、人事や上長と面談をさせていただいたり、エキサイト社内イベント「BeerBash」にもご招待いただき、社員の方と交流し、会社の雰囲気を肌で感じることができました。技術的な知識はもちろん、チーム開発で求められることを学び、自分の中で新たな課題点や発見もあり、エキサイトでのキャリアイメージやエンジニアとしての解像度を十分に上げることができました。また、最初は「自分に開発ができるのだろうか」というような不安感もありましたが、自信を持つこともできました。
約1ヶ月という短い期間でしたが、充実したインターンシップとなりました。エキサイト株式会社の皆様ありがとうございました!
*1:shouldHaveReceived()を使用する場合は順番が反対になるそうです。