🤖

iOS エンジニアが仕事で ChatGPT と何をしているか

に公開

🤖 はじめに

こんにちは、tattsun です 🙌

AI活用したいが、モバイル開発だと上手くいかないな…と日々、頭を悩ませている真っ最中ですが少しずつわかってきたこともあるので記事にしてみようと思います。

🤖 前提

普段の業務で活用していることもあって、完全にゼロから作るより、既存コードをスケールさせる "1 → 10" タスクが中心です。
実際の業務で主に利用しているのは以下の3つ:

  • ChatGPT
  • Devin
  • Cline

1. ChatGPT を活かした情報収集フロー

個人的に一番使っているのが、ChatGPT です。最近、カメラ周りの実装を担当する機会があり、かなりお世話になりました 🙇

ChatGPT に依頼することは主に:

  • 自分の知識にないことについての調査
  • コード内の命名やリファクタリング

具体的にどうやって活用しているか少しご紹介しようと思います。

https://openai.com/ja-JP/chatgpt/overview/

1-1. 一次情報を丸ごと集める

技術スキルが一定のレベルになってくると基本的なことは頭に入っているので、実装する際に検索したりということはほぼありません。逆に言うと調べたいタイミングは自分の知識が 0 な状態に近く、単語もわからなければ、なんて調べたら良いかもわからない状態になります 🤔

これを ChatGPT に「〇〇な実装をしたい」と投げるとそれっぽい情報が返ってくるので最初の知識のインプットにとても役立ちます。0 → 1 にするのは、学習においても苦労する部分なので、ここをスキップできるのはとてもありがたいです。

今回は、カメラ周りの実装では大まかにこのような流れで実装まで進めました。

🤖 Swiftでカメラを実装するときに参考になる一次情報を集めてください

一覧でまとめてくれるので資料としてもかなり優秀です。日本語に変換もしてくれるので自分で情報を集めるよりも格段に速いですし、網羅的に表示してくれるので自分で検索する手間も省けます 🎉

1-2. Apple サンプルコードを素早く把握

🤖 Apple が提供しているサンプルコードのURLと内容のサマリを教えてください

ここまででわかる通り、基本的には Apple が提供しているものをベースにインプットしています。困ったら範囲を広げるイメージで依頼をしています。

コードや概要を読むまでもなく、取捨選択が出来るのは効率化の観点でも良いですね 🎉

1-3. 実装 → 調整までのループ

👨 情報を元に自分でサンプルコードを実装してみる

ここまで情報が集まれば、これを元に実装を進めていきます。状況によっては、Cline や Devin を利用して、コードを書かせることもあります。 タスクの要件に合わせて、実装を変えていく際に不具合や最適化の面でどうすべきか迷うシーンがあるので、さらに ChatGPT に質問して、最適な状態にしていくのが私の開発スタイルです 💪

🤖 写真を撮影する際にパフォーマンス面で考慮すべき設定値とどのような影響があるかまとめてください

カメラの実装は、何も考えなければかなり簡単ですが、プロダクトの機能としてリリースすることを考えるとパフォーマンスや解像度などを考慮する必要があります。

ステークホルダーにそのまま共有できるレベルの資料が生成されました 🎉
この情報を元に取捨選択を自分で行います。実際の要件にあっているかや挙動、パフォーマンスを確認しながら最適な設定値を決めました。パフォーマンスや不具合など懸念点がある場合は、Deep Research を利用することが多いです。 時間はかかってしまいますが、自分の中で確信が持てない場合のファクト調査として重宝しています。あとは要件として難しい場合に必要な項目をさらに分解して、どのような技術を使うべきかなどを検討することもあります。

2. 命名やリファクタリング支援

自分が開発において苦手なことのひとつに命名があります。これまで自分の設計や実装に対して、正しい命名になっているか頭を悩ませてきました🤮
自分の英語力を上げるのは、別でやるとして楽々悩みを解消してくれる ChatGPT には日々感謝の気持ちを込めて、誠実に接するようにしています(関係ない)

カメラの権限をリクエストする処理を参考にします。

private func hogeFunction() async -> Bool {
    let mediaType = AVMediaType.video
    let status = dependency.cameraSession.authorizationStatus(for: mediaType)

    switch status {
    case .notDetermined, .restricted, .denied:
        return await dependency.cameraSession.requestAccess(for: mediaType)

    case .authorized:
        return true

    @unknown default:
        return false
    }
}

自分で考えるのも面倒なので func hogeFunction() のように仮置きすることが多いです。コードを入力して、以下のように指示します。

メソッド内の処理を確認して、Appleの命名規則に沿ってメソッド名を提案してください。

普段はプロンプトに記載してあるのでここまで丁寧に指示はしませんが、こうすると以下のような出力が得られます。

自分で考えずとも命名を行なってくれるのは素晴らしいですね 🎉
ここからさらにリファクタリングをしてもらいます。このコードは .denied, .restricted でも権限をリクエストしていますが、実際には API から false が返ってくるだけなので不要な実装が含まれています。

アプリの挙動としては変わらないため、気付きにくいですが実装としては良くないですね 🤔
リファクタリングをお願いしてみましょう。

このコードをリファクタリングしてください。

すると以下のような出力が得られました。

/// Requests camera access only when必要なときだけ許可を要求し、利用可能かどうかを返す。
@discardableResult
private func requestCameraAccessIfNeeded() async -> Bool {
    let authorizationStatus = dependency.cameraSession.authorizationStatus(for: .video)

    switch authorizationStatus {
    case .notDetermined: // まだユーザーに尋ねていない
        return await dependency.cameraSession.requestAccess(for: .video)

    case .authorized: // すでに許可済み
        return true

    case .denied, .restricted: // 拒否 or 機能制限―再要求できない
        return false

    @unknown default: // 将来追加される可能性に備える
        return false
    }
}

コメントでの補足もあって、コピペするだけでレビューが通りそうです 🎉
これだけでも自分の考えるリソースが削減されるのでその間に他のタスクを進めたり、設計を考えたりと自分が出来ることの幅が広がります。

まとめ

読んでいただきありがとうございました 🙇

Devin や Cline でタスクを完全に任せることを並行して、チャレンジしていますがなかなか思い通りの出力が得られず苦戦しています。モバイルの領域だとまだ難しい点もあるように感じていますが、最大限に AI を活用して、より自分の価値を高めていきたいですね。

エンジニアの業界的にも盛り上がっている話題だと思うので、積極的に挑戦していこうと思います 💪

おまけ

ChatGPT に感想を聞いてみた

dely Tech Blog

Discussion