OJTで実施したアプリ開発の取り組みを振り返る

Android, OJT, アプリ開発, 新卒1年目

はじめに

こんにちは、株式会社レコチョク新卒1年目の我那覇です。
プロダクト開発第1グループに所属し、Androidアプリエンジニアとして業務に携わっています。

配属から約半年間、個別課題を進めた後、業務と並行して同期の本多と2人でのアプリ作成課題に取り組みました。

本記事では、アプリ作成課題の詳細と全体の流れを振り返りながらご紹介します。

目的

アプリ作成課題の目的は大きく次の2つです。

  • これまでの研修で習得した知識をアウトプットする
  • 2人で協力し、チーム開発を経験する

アプリ開発の要件

今回の課題を進めるにあたり、以下の要件が提示されました。

  • UI:Jetpack Composeを利用して2画面以上のUIを作成し、画面間の遷移を実装する
  • 通信:無料APIを用いて通信を行い、OkHttp + Retrofitのライブラリを活用する
  • 設計:MVVMアーキテクチャを採用し、シーケンス図、クラス図を作成する
  • 機能:ライトモードとダークモードを選択可能にし、アプリ再起動後も設定を保持する
       Coilライブラリを使用してWebから取得した画像を表示する

これらの要件を満たすため、GitHubのIssuesやProjectsを使ってタスクを細分化し、進捗を管理しました。

開発の進め方

一週間単位に区切り、以下の方法で情報を共有しながら開発を進めました。

  • 週2回のMTGを設定
    • 水曜:私と本多の2人で進捗確認
    • 実装について困っていることがあれば相談し、機能のアイデアや改善点について話し合う
    • 金曜:OJTの先輩も交えた進捗確認
    • 一週間の進捗を報告し、次の週に実装する内容を決定する
  • タスク管理
    • GitHubのIssuesとProjectsを活用
    • 金曜のMTGで、その週に対応するタスクを決定
    • 各タスクの担当を割り振り、一週間で完了できるように進める

💡 良かった点

  • 2人での進捗確認と相談の流れ
    • 新卒2人でお互いの進捗を確認しながら、困ったことや不明点があれば話し合いました。
      必要に応じて金曜のMTGで先輩に相談するという流れができていた点が良かったと感じています。
  • タスクの配分と進め方
    • 2人の経験には差がありますが、担当するタスクの量や難易度ができるだけ偏らないように配慮して割り振りました。
      それにより、わからないところは相手に質問したり、ペアプロ形式で実装することで互いに協力して進めることができました。

全体スケジュール

全体スケジュールは以下の通りです。
11月から3月にかけて取り組み、グループ内の成果発表をもって完了しました。

日付 営業日 作業内容 補足
11/18 0.5 アプリ作成課題開始 要件説明
11/19 – 12/6 13 アプリ作成案出し 11/22(複数案) → 詳細詰め
12/12 – 12/20 7 シーケンス図作成 適宜修正
12/19 – 12/20 2 要件定義 (完了の定義、最低ラインの決定) 最低限実装する機能の選定
12/26 – 1/9 6 クラス図作成 適宜修正
1/10 -2/21 29 実装 最低ライン実装完了
2/25 – 3/11 11 追加実装 機能追加、修正など (3/6動作確認会)
3/6 – 3/11 4 発表準備 スライド作成
3/12 0.5 成果発表 プロダクト開発第1グループ内

これまでの個別課題では作るものがある程度決まっていましたが、今回は初めて2人で一からアプリの作成を行う課題でした。
開発を進める中で、最低限実装すべき内容や適切な設計に悩んだり、発表前の動作確認会でバグの発見やAPIの仕様書確認不足などに気がつき、修正に追われることもありました。
長いようであっという間の5ヶ月間でしたが、最終的には無事に形にし、発表することができました。

作成したアプリ

今回作成したのは、ユーザーの回答をもとに飲食店を提案する「何食べネーター」というアプリです。

image_1.GIF

経緯

アプリを作成する際、無料APIの使用が必須要件として求められていました。
そこでまず無料で使えるAPIをリサーチし、それぞれの活用方法を考えながら複数の案を検討しました。

その中でホットペッパーグルメのグルメサーチAPIに注目し、飲食店の情報を取得できることから「その日の気分や条件に合ったお店が提案できるアプリ」の案が浮かびました。
さらに、Akinatorのように質問によってユーザーの希望に合ったお店を導き出す仕組みが出来れば、楽しみながらお店探しができそうだと考えました。

このような経緯から、ホットペッパーグルメのグルメサーチAPIを利用した飲食店提案アプリを作成することに決定しました。

【当初のイメージ】

役割分担

我那覇と本多の役割分担は大まかに以下の通りです。

  • 本多:主に設計部分を担当し、クラス図、シーケンス図を作成
  • 我那覇:主にアプリ全体のデザインを担当
    要件定義・実装は2人で行う
我那覇 本多
要件定義
設計
デザイン
実装

【クラス図・シーケンス図】

【UIデザイン】
Figmaで作成

実装した機能

実装した主な機能は以下の4つです。
1. 質問機能
2. 検索結果の表示
3. テーマカラーの切り替え
4. 項目のスキップ


1. 質問機能
はじめに、アプリの主要な部分である質問機能です。
質問項目は以下の4つに分かれています。

  • ジャンル
  • 予算
  • エリア
  • 希望

各項目で複数の質問パターンが設定されており、ユーザーが「いいえ」を選択した場合は同じ項目内の次の質問へ、「はい」を選択した場合は次の質問項目へ移るように実装しています。
「はい」と回答した質問をリストとして保持し、APIを呼び出す際の条件として使用しています。

当初はAkinatorのような質問形式を目指していましたが、現状では事前に用意した質問を順番に表示する形式に留まりました。

image_3.GIF


2. 検索結果の表示
次に、検索結果画面です。
ユーザーが選択した回答に基づいて、グルメサーチAPIを利用した検索結果を表示しています。

  1. ユーザーが選択した回答:検索条件として画面上部に表示され、ユーザーが選択した内容を確認できる
  2. 店舗情報:店名 / キャッチフレーズ / 住所 / 営業時間 / ホットペッパーグルメ店舗ページURL(クリックで遷移)を表示
  3. ページ遷移:検索結果が複数ページに渡る場合は、「前へ」「次へ」のボタンで遷移
  4. もう一度ボタン:質問開始画面に戻り、新たな条件で再度検索を始める

 


3. テーマカラーの切り替え
要件の一つであるダークモードとライトモードのテーマカラー切り替え機能です。
画面右上に配置したスイッチボタンで切り替えることができます。
また、設定したテーマはアプリ再起動時にも保持されるようになっています。

image_6.GIF


4. 項目スキップ
ユーザーが特定の質問項目をスキップしたい場合、スキップボタンを利用することで、その項目だけを飛ばすことができるようになっています。

当初は全ての質問を抜けて検索結果に遷移するボタンを考えていましたが、その場合後の質問項目も全て飛ばしてしまうことから、項目単位でスキップできるボタンを設けることにしました。

image_7.GIF

苦労した点

1. 2人での開発の進め方
細かく区切ったタスクをお互いに割り振って進める中で、どちらかの作業が終わらないと次の作業に進めない場面 が多くありました。
相手のコードを前提とした作業が必要になるため、理解しながら実装を進めるのに苦労しました。

【例】

  • 各画面で使用するボタンやテキストの共通コンポーネントの作成 → それを利用したUIの実装
  • データクラスの定義 → それに基づいたデータ取得処理の実装
  • API通信処理の実装 → 取得したデータの状態管理や加工処理の実装

コードレビューや定期的な話し合いの場を通じて、以下のような判断をしながら進めるようにしました。

  • 意図を理解し問題がないと判断した場合は、相手の設計意図を尊重し、その方針に沿って自分の作業を進める
  • 改善の余地があると感じた場合は、より良い方法を提案し、相手と話し合いながら調整する
  • 疑問点がある場合は、「こういう理由でここを変えてもいいか?」と意見を交わしながら進める

相手の進捗や実装内容を意識しつつ、コードの表面的な動作だけでなく、「なぜそのように実装したのか」という背景や意図を理解することが重要だと感じました。

2. APIの扱い
APIのリファレンスを自分達で読み込みながら実装を進める点にも苦労しました。
個別課題でAPIを扱った際は具体例が示されていたためスムーズに理解できましたが、今回は詳細な情報を自分で読み解き、レスポンスを確認しながら進める必要がありました。

うまくデータが取得できない際は、以下のような観点から原因を探る必要があり、試行錯誤を繰り返しました。

  • APIのエンドポイントが正しいか
  • 通信が正常に行われているか
  • リクエストの指定が間違っていないか
  • シリアライズで失敗していないか
  • APIの仕様は把握できているか

この過程を通して、APIの仕様書やレスポンス、エラーメッセージを丁寧に読み解くことの重要性を改めて学びました。

まとめ

2人での開発経験を通して、単に作業を切り分けて個々で進めるだけではなく、互いの実装を理解し、連携を取りながら進めていくことの重要性を学びました。

当初の想定通りにいかなかった部分や改善が必要な箇所もいくつか残ってしまいましたが、これまでの学習内容をアウトプットしながら、協力して開発に取り組むことができたと感じています。

最後までお読みいただきありがとうございました。
今回作成したアプリについては、こちらの記事でも紹介していますので、併せてご覧ください!