TOP メディア一覧 技術投稿│AI活用のすすめ

2024.12.25

  • 技術情報
  • テックブログ

技術投稿│AI活用のすすめ

自己紹介


ニックネーム:ごーくん
経験年数:11年
日々周りに助けられている開発グループのグループマネージャー。
初めて入社した会社ではスマホアプリ開発をメインに行っていたが、入社した次の年には知人から暗号通貨のポータルサイト開発の話を受け、個人事業主になりWeb開発を行うようになった。アクロクレインに入社してからは、色んなレイヤーの開発を経験させてもらい、インフラ、バックエンド、フロントエンドすべて対応出来るようになった。


こんにちわ、ごーくんです。

4月から始まったこの技術記事シリーズ、開発グループのメンバーによる珠玉の記事群、いかがでしたでしょうか?
さて、年の瀬も迫る中、満を持して(というか半ば強制的に)グループマネージャーの私が登場です。
今年最後の記事、テーマはIT企業にとって避けては通れない、もはや空気のような存在…AIについてです!温かい目で見守っていただけると幸いです。

はじめに


システム開発の現場では、ChatGPTやGitHub Copilotなどのツールによるコーディングの効率化が注目を集めています。これらのAIツールは、単なるコード生成機能ではなく、強力な開発パートナーとしての役割を果たしています。

特に、フレームワークの多様化やライブラリの急速な進化により、開発者が追いかけるべき知識は日々増加しています。例えば、PHPの世界だけを見ても、Laravel、Symfony、その他多くのフレームワークやパッケージが存在し、それぞれに独自の作法やベストプラクティスがあります。

AIツールは、これらの課題に対する解決策として、コーディングの効率化だけでなく、学習支援や問題解決のガイドとしても機能します。

AI活用のメリット


■コーディング時間の短縮


開発現場で最も即効性のある効果が、コーディング時間の短縮です。特に以下のような場面で効果を発揮します

ボイラープレートコードの自動生成


PHPでよく使用されるクラスやインターフェースの基本構造を、AIに生成させることで、初期開発の時間を大幅に削減できます。

// AIへのプロンプト例:
// "ユーザー情報を管理するためのPHPのValueObjectクラスを作成してください。
// プロパティとして名前、メール、年齢を持ち、イミュータブルな設計にしてください。"

declare(strict_types=1);

class UserValue
{
    public function __construct(
        private readonly string $name,
        private readonly string $email,
        private readonly int $age
    ) {
        $this->validateEmail($email);
        $this->validateAge($age);
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function getEmail(): string
    {
        return $this->email;
    }

    public function getAge(): int
    {
        return $this->age;
    }

    private function validateEmail(string $email): void
    {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException('Invalid email format');
        }
    }

    private function validateAge(int $age): void
    {
        if ($age < 0 || $age > 150) {
            throw new InvalidArgumentException('Age must be between 0 and 150');
        }
    }
}

デザインパターンの実装


一般的なデザインパターンの実装も、AIに任せることで素早く行えます。

// AIへのプロンプト例:
// "PHPでシンプルなシングルトンパターンを実装してください。
// データベース接続を管理するクラスを例にしてください。"

class DatabaseConnection
{
    private static ?self $instance = null;
    private PDO $connection;

    private function __construct()
    {
        $this->connection = new PDO(
            "mysql:host=localhost;dbname=myapp",
            "username",
            "password",
            [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
        );
    }

    public static function getInstance(): self
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getConnection(): PDO
    {
        return $this->connection;
    }

    // シングルトンパターンを保証するためのメソッド
    private function __clone() {}
    private function __wakeup() {}
}

■エラー解決の効率化

開発中に遭遇するエラーの解決も、AIの得意分野です。エラーメッセージやスタックトレースを提示することで、的確な解決策を得ることができます。

// エラーが発生するコード例
try {
    $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
    throw $e;
}

// AIへのプロンプト例:
// "以下のPHPのエラーの原因と解決策を教えてください:
// JsonException: Malformed UTF-8 characters, possibly incorrectly encoded"

// AI提案の解決策実装例
try {
    $jsonString = mb_convert_encoding($jsonString, 'UTF-8', mb_detect_encoding($jsonString));
    $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
    throw $e;
}

■コードレビューの補助

AIは、コードレビューのプロセスでも強力な支援ツールとなります。特に以下のような観点でのレビューが効果的です。

コードの品質チェック

// AIへのプロンプト例:
// "以下のコードの品質改善点を指摘してください"

// 改善前のコード
class UserController {
    function save($data) {
        $db = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
        $name = $data['name'];
        $email = $data['email'];
        $sql = "INSERT INTO users (name, email) VALUES ('$name', '$email')";
        $db->query($sql);
        return true;
    }
}

// AI提案による改善後のコード
class UserController
{
    private PDO $db;
    
    public function __construct(PDO $db)
    {
        $this->db = $db;
    }
    
    public function save(array $data): bool
    {
        try {
            $stmt = $this->db->prepare(
                "INSERT INTO users (name, email) VALUES (:name, :email)"
            );
            
            $stmt->execute([
                'name' => $data['name'],
                'email' => $data['email']
            ]);
            
            return true;
        } catch (PDOException $e) {
            // エラーログの記録
            Logger::error('ユーザー登録エラー: ' . $e->getMessage());
            throw new UserRegistrationException('ユーザー登録に失敗しました');
        }
    }
}

パフォーマンス改善点の指摘

// AIへのプロンプト例:
// "以下のコードのパフォーマンス改善点を指摘してください"

// 改善前のコード
class ProductService
{
    public function getProductsWithCategories(): array
    {
        $products = [];
        $rows = $this->db->query("SELECT * FROM products")->fetchAll();
        
        foreach ($rows as $row) {
            $category = $this->db->query(
                "SELECT * FROM categories WHERE id = {$row['category_id']}"
            )->fetch();
            
            $products[] = [
                'id' => $row['id'],
                'name' => $row['name'],
                'category' => $category['name']
            ];
        }
        
        return $products;
    }
}

// AI提案による改善後のコード
class ProductService
{
    public function getProductsWithCategories(): array
    {
        return $this->db->query(
            "SELECT p.id, p.name, c.name as category_name
             FROM products p
             JOIN categories c ON p.category_id = c.id"
        )->fetchAll(PDO::FETCH_ASSOC);
    }
}

注意点と制限事項


■生成コードの検証必要性

AIが生成したコードは、あくまでも「提案」として扱う必要があります。以下の観点での検証が必須です。

セキュリティの検証

// AIが生成した危険な可能性のあるコード
class UserAuthentication
{
    public function login(string $username, string $password): bool
    {
        $query = "SELECT * FROM users
                 WHERE username = '$username'
                 AND password = '" . md5($password) . "'";
        
        $result = $this->db->query($query)->fetch();
        return !empty($result);
    }
}

// 適切な実装
class UserAuthentication
{
    public function login(string $username, string $password): bool
    {
        $stmt = $this->db->prepare(
            "SELECT password_hash FROM users WHERE username = :username"
        );
        
        $stmt->execute(['username' => $username]);
        $user = $stmt->fetch();
        
        if (!$user) {
            return false;
        }
        
        return password_verify($password, $user['password_hash']);
    }
}

ビジネスロジックの整合性

生成されたコードが、実際のビジネス要件を満たしているか必ず確認する必要があります。特に以下の点に注意が必要です。

・バリデーションルールの確認
・例外処理の適切性
・トランザクション処理の必要性
・権限チェックの実装

AIによって生成されたコードであっても、完璧ではありません。上記のような重要なビジネスロジックについては、必ずテストを実施し、期待通りの動作をするかを確認しましょう。
十分なテストを行うことで、潜在的な問題を早期に発見し、安定したシステム運用を実現できます。

■セキュリティリスク


機密情報の取り扱い

AIツールにソースコードの質問をする際、機密情報の漏洩を防ぐために以下の対策を心がけましょう。

・機密情報を削除またはマスクする: DB接続情報や認証情報は、ダミーデータに置き換えるか、完全に削除してからAIツールに入力する
・最小限のコードで質問する: 問題が発生している部分に絞った最小限のコードで質問することで、機密情報が漏洩するリスクを減らすことが出来る
・公開情報のみを使用する: 可能な限り、公開されているライブラリやサンプルコードを使用して質問を作成する
・質問前にコードレビューを行う: 機密情報が含まれていないか、第三者にコードレビューを依頼することも有効

これらの対策を講じることで、AIツールを安全に活用し、開発効率を高めることができます。

■ライセンスと著作権の考慮


コードライセンスの確認

AIが生成したコードが、特定のライブラリやフレームワークのコードを参考にしている可能性があります。以下の点に注意が必要です。

・オープンソースライセンスの確認
・商用利用の可否
・著作権表示の必要性

これらの点を遵守せずにAI生成コードを使用すると、ライセンス違反となる可能性があります。生成されたコードを使用する前に、必ずライセンスを確認し、適切な対応を行いましょう。

■プロジェクトでの利用制限


AI生成コードの利用制限は、プロジェクトごとに異なります。完全に禁止されている場合もあれば、特定のモジュールや機能に限定して許可されている場合もあります。
例えば、外部ライブラリとの連携部分やセキュリティに関連するコードの生成は禁止されることが多いです。また、生成されたコードをそのまま使用せず、必ずレビューとテストを行うこと、ライセンスを遵守することなどが条件として挙げられることもあります。
AIを利用する際はプロジェクトの具体的な制限事項について、チームに確認してから利用することが大切です。

まとめ


AIツールは開発効率を大幅に向上させる可能性を秘めていますが、あくまでも開発者の補助ツールとして位置づけることが重要です。適切な使用方法と検証プロセスを確立することで、より効果的な開発が可能となります。

特に以下の点を意識することで、AIツールを最大限に活用できます。

1. 明確な要件定義とプロンプトの作成
2. 生成コードの慎重な検証
3. セキュリティとライセンスへの配慮
4. チーム内でのベストプラクティスの共有

これらの点に注意を払いながら、AIツールを活用することで、より効率的で質の高い開発が可能となるでしょう。

お気づきの方もいるかもしれませんが、実はこの文章のほとんどは、AIによって生成されました。(全体の8割ほど)まるで魔法のようですね! 今後もAIと共に、よりスマートな開発を目指しましょう。 (ただし、AIに仕事を奪われないように…!)

今年一年、様々な出来事がありましたが、皆様にとってどのような一年だったでしょうか。来年も、皆様にとってより良い一年となりますように。そして、この場が皆様にとって有益な情報源であり続けられるよう、尽力してまいります。良いお年をお迎えください!

この記事をシェアする

  • X
  • facebook