・保守運用、既存改修
・各種バグ調査、修正
・バグ修正に伴う、リファクタリング
・iOS・Android間の挙動差異(仕様差異)の統一修正実装、仕様擦り合わせ作業
・追加開発機能の要件定義、仕様書作成、見積り
・追加開発機能の実装
・アップデートのストアリリース作業
・コードレビュー
・PrivacyManifest対応
・iOS17, Xcode15対応
・サービスUX向上の為の競合カラオケアプリとの比較検証テストケース作成と、検証実施、UX改善提案書の作成
・ベンダー引き継ぎ用のプロジェクト仕様書作成(アーキテクチャ図、使用技術リスト、画面詳細設計書の追加更新)
・SwiftConcurrencyを用いた非同期処理の実装
・VIPERアーキテクチャを用いた開発の知見
・UIKitとSwiftUIのハイブリット共存の知見
・Combine、CombineCocoaを用いたリアクティブ実装の知見
・toC向けアプリの保守運用の知見
・ユーザー目線で実際に利用しながらでの改善提案、仕様提案、品質向上提案の知見
・動画再生中の縦スクロールコンテンツのリストを追加取得、更新する際のリスト制御の知見(動画を停止・リセットさせない制御や、その他動画以外の画面上コンテンツの更新など)
UIKitをベースにしつつ細かいUI部分をUIHostingControllerを活用してSwiftUIとハイブリットにしたことで、従来の安定した遷移管理や安定したAPI群の恩恵を受けつつも、SwiftUIの未成熟な点の弱みをカバーしながらSwiftUIのUI実装のレビューのしやすさや保守性の恩恵を受けるという、バランスの取れた開発を経験することが出来たことは良い発見だったと思います。
また、以前までのプロジェクトではRxSwiftやCombineでのリアクティブな書き方を多用したMVVM的な開発が多かったですが、当案件では非同期処理にasync/await、各層間の連携にDelegateパターンを採用したことも新鮮な開発体験でした。
・サーバーサイド開発
・フロントエンド開発
・開発リード
・企画
・デザイン
・新規開発
・保守運用、既存改修
・OpenAIのAPIを利用したAIサービス開発全般の知見
・LangChain、ベクトル類似度検索などの知見
・Pythonを用いたOpenAIのChatCompletionAPIとVectorStoreとの連携実装
・PythonとFastAPIを用いたクライアント向けAPI実装
・SSEを用いたサーバー<->クライアント間のリアルタイム通信実装
・FlutterWebを用いたSPAウェブアプリの実装
・RiverpodとStateNotifierを用いたMVVM実装
・新規事業立ち上げ時の企画アイデア力、スピード開発力
・企画、デザイン、サーバーサイド、フロントエンドを1人でやることによるサービス開発の全体の流れに関する知見
当初インフラ担当の方と2人で開発を始め、私はAIロジック実装、サーバーサイド実装、フロントエンド実装を担当し、営業用のデモに使う為の試作品の開発を担当しました。
また、社長直下の少人数チームだった為にデザイナーやディレクターが不在な中、自らデザインと企画をし、それを自ら実装することでサービス開発全体の大部分の流れを経験することができ、学ぶことが多かったです。
サービス規模拡大に伴いチームメンバーのマネジメントをしながらの企画、開発、精度向上研究をする難しさも経験できました。
また何より、未経験分野だったLLMやAIサービスの知見を広げながらも、FAQ的な用途のチャットサービスの回答精度向上の為の手法も手探りで研究、改善実装を繰り返していた過程では大きなやりがいを感じました。
・保守運用、既存改修
・各種バグ調査、修正
・今後のバグ抑制の為のリファクタリング
・iOS・Android間の挙動差異(仕様差異)の統一修正実装、仕様擦り合わせ作業
・追加開発機能の要件定義、仕様書作成、見積り
・追加開発機能の実装
・アップデートのストアリリース作業
・コードレビュー
・結合テストケースの追加更新、テスト実施
・Karteで集計する為のイベント追加、更新実装(アプリ内に仕込んでいるAnalytics用のイベント送信処理)
・フルSwiftUIでの開発、アプリ構成の知見
・CombineとSwiftUIの組み合わせでのリアクティブな開発の知見
・MVVM+FluxアーキテクチャとSwiftUIの組み合わせでの開発の知見
・SwiftUIでのディープリンク実装の知見
フルSwiftUIでの開発が今回のプロジェクトで初めての経験でした。
比較的機能が多く、複雑なアニメーションや多くのディープリンクを含んでいるアプリである一方で、当時まだ未成熟だったiOS13時代のSwiftUIを技術的挑戦として導入し開発されたという背景がある為、引き継いだ当初は多くのバグが潜んでいる状態でのスタートでした。
また、当時ベストプラクティスが確立されていなかった中で設計も試行錯誤して作られていた様で、アプリの土台部分だけ微妙にUIKitと共存していたりと複雑な構成になっていた為、まずはメインのライフサイクルをSwiftUIのライフサイクルにリプレイスするところから各種バグの根本修正を開始しました。
主にプッシュ通知契機での各種画面へのディープリンクや、認証周り(WebViewとの連携)での遷移に関するバグが多く、それらが複雑なフラグでの管理となっていた為、バグの現象自体を修正する一方で、なるべく依存するフラグの数を減らしてシンプルな実装にリファクタしていくことで今後のバグ発生の抑制にも努めました。
・新規開発実装
・アーキテクチャ選定、コーディング方針の取り決め作業
・サーバーエラーの統一スキーム定義、エラーコード、文言の取り決め作業
・コードレビュー
・UI実装(ログイン、新規登録の各ステップ、ホーム画面、Tiktok風な縦スクロール投稿一覧画面、縦スクロールコンテンツの入れ子横スクロール画面、プロフィール画面、各種プロフィール項目編集画面、その他各UI実装)
・認証処理実装(Apple, Google, Twitter, LINE, ゲストログイン)
・LINEログイン用のユニバーサルリンク対応
・API繋ぎ込み実装
・エラーハンドリング実装
・バリデーション実装
・強制アップデート機能の実装
・各種バグ調査、修正
・SwiftConcurrencyを用いた非同期処理の実装
・VIPERアーキテクチャを用いて大規模チーム開発におけるコーディングの個人差の抑制などの知見
・Combine、CombineCocoaを用いたリアクティブ実装の知見
・UIKitとSwiftUIのハイブリット共存の知見
・チーム内での命名規則の取り決めや、SwiftLintの導入による均一化へのアプローチなどの知見
比較的大人数での開発がこのプロジェクトで初めての経験だった為、コーディング方針の統一など今まで以上に意識することになり、とても学びが多かったです。
アーキテクチャ選定から実装方針、各実装者間での書き方の差異や命名規則などの細かい点についても事前にチームで意見を出し合い、統一性を確保しようと試行錯誤しました。また、このプロジェクトでは正社員メンバーだけでなく外部からの業務委託メンバーが多く参画していたこともあり、今まで社内で慣れ親しんでいた開発方法とは異なる幅広いコーディングスタイルや実装テクニックなどを知る機会にもなりました。(各種Extensionなども)
・新規開発実装
・保守運用、既存改修
・サーバーエラーの統一スキーム定義、エラーコード、文言の取り決め作業
・コードレビュー
・UI実装(ログイン、新規登録、ホーム画面、不動産や経理関連の各種「詳細・登録・編集」系画面、各種検索系画面、画像アップロード&一覧閲覧系画面、プロフィール画面、各種プロフィール項目編集画面、その他各UI実装)
・認証処理実装(Auth0)
・API繋ぎ込み実装
・エラーハンドリング実装
・ディープリンク実装
・プッシュ通知実装(FirebaseCloudMessaging)
・バリデーション実装
・強制アップデート機能の実装
・各種バグ調査、修正
・バグ修正に伴う、リファクタリング
・iOS・Android間の挙動差異(仕様差異)の統一修正実装、仕様擦り合わせ作業
・追加開発機能の要件定義、仕様書作成、見積り
・追加開発機能の実装
・コードレビュー
・初回ストア申請作業
・リジェクト対応
・アップデートのストアリリース作業
・RxSwift, RxCocoaを用いたリアクティブなMVVM実装
・FluxとMVVMを組み合わせた設計の知見
・API繋ぎ込みや、プッシュ通知、ディープリンク、強制アップデート、各種UI実装から証明書関連など基本的なiOS開発全般のノウハウ
・UIKitの細かいConstraint調整やStoryboard実装の知見
・UITableViewを用いた各種一覧、詳細系画面や項目数の増減する入力画面の実装、UIScrollViewを用いた入力系画面の実装など
不動産&会計関連という少し堅めな内容のアプリということで、実装内容自体は比較的シンプルな一覧・詳細閲覧や入力編集系画面が多い一方で、初期開発時点で画面数が数百画面、APIも百数十本という大規模なアプリでした。
また、私にとってこの案件が初めてのiOS開発経験だったこともあり、数百画面をほぼ1人で実装させて頂けたことでUIKitの細かい制約調整やレイアウト調整などの知見を貯めることが出来たと思います。
初回リリース後も比較的長い間保守運用に携わらせて頂き、API繋ぎ込み、プッシュ通知、ディープリンク、強制アップデート、証明書関連からストア申請対応など基本的なiOS開発全般のノウハウを網羅的に経験させて頂きました。
・新規開発実装
・開発リード、設計
・要件定義
・サーバーエラーの統一スキーム定義、エラーコード、文言の取り決め作業
・コードレビュー
・CoreNFCを活用した物理ICカードとの連携認証実装
・UI実装(ログイン、新規登録の各種ステップ、ホーム画面、医療系の各種「詳細・登録・編集」系画面、各種検索系画面、プロフィール画面、各種プロフィール項目編集画面、その他各UI実装)
・認証処理実装
・API繋ぎ込み実装
・エラーハンドリング実装
・バリデーション実装
・強制アップデート機能の実装
・各種バグ調査、修正
・iOS・Android間の挙動差異(仕様差異)の統一修正実装、仕様擦り合わせ作業
・コードレビュー
・初回ストア申請作業
・リジェクト対応
・アップデートのストアリリース作業
・CoreNFCを用いた、物理ICカード(Type-F、Felica)読み取り実装の知見
・RxSwift, RxCocoaを用いたリアクティブなMVVM実装
・StoreとMVVMを組み合わせた設計の知見
・UIKitの細かいConstraint調整やStoryboard実装の知見
サービスへのログイン認証においてSMS認証と物理ICカード認証(NFC)が必須であるというサービス仕様があり、ストア審査でのリジェクトが懸念される問題がありました。
特に物理ICカードによるNFC認証に関しては、アメリカのApple社へカードを送付することは現実的では無いと判断し、ディレクターと相談の上、審査提出ページにて英語での事情説明と、実際のユーザーが行うSMS認証&NFCカード認証の様子を収めたデモ動画を撮影し、提出することで結果的に無事審査を通過することが出来ました。
また、審査時には製品版と全く同じバイナリを提出する必要がある為、審査用の分岐コードを最小限に抑える必要がありました。その為にNFC認証だけでなくSMS認証も全てデモ動画の内容に含めることでスキップし、結果としては審査用に用意した電話番号&パスワードでのログイン時のみ特別なアクセストークンを受け取り、それ以降の認証は全てスキップするというシンプルな実装にすることで製品版への影響を最小限にすることが出来たと思います。
・新規開発実装
・要件ヒアリング
・画面デザイン作成
・ARを用いた垂直計測方法の考案
・遠く離れた対象物への計測オブジェクトの射出実装
・計測オブジェクトの設置位置を微調整するコントローラー盤の実装
・撮影画像のExif情報を遠くの対象物の位置情報に書き換える処理実装の検証
・現場検証
・改善案考案
・ARKit、SceneKitを用いた実装、アニメーション制御の知見
・アプリ内で撮影した画像に任意のExif情報(異なる座標)を書き込む実装の知見
「遠くの対象物を離れたところから高さを計測したい」というざっくりとした要望を頂き、実現可能性の調査からモック実装&現場検証までを急ピッチで約3日間ほどで行いました。
ARを用いて垂直計測を行うことは比較的容易でしたが、対象物への距離を正確に測ることはライダースキャナでも距離の限界があることなどから現実的では無いと判断し、別途市販のレーザー計測器と組み合わせることを提案しました。そして、対象物への距離を取得した後に対象物の根本に計測オブジェクトを指定距離分射出し、そこから垂直に高さを計測する方法を考案しました。また、対象物に一度近づくことができる場合も想定して木の根本に直接計測オブジェクトを設置する方法も別途用意し提案しました。
また、ユースケース的に「実際には木に近づかないが撮影した画像にはその木の座標のExif情報を付与したい」という要望があった為、こちらの実現方法も併せて調査しました。