🦔

コード設計の学習〜生成AIのお力添え〜

2025/01/17に公開

Daily Blogging27日目

「改訂新版「ミノ駆動本」の活用方法 〜設計勉強会による効果的な学習アプローチ〜」のオンラインイベントみた。
改訂箇所の説明をしつつ、この本を用いてどういう風に設計の学習をしたら良いのかを解説してくれてた。

手を動かせ

おすすめの学習法は複数人で行う「ワークショップ形式」の学習
→実際に手を動かして身につける

輪読会じゃダメなの...?

ダメなんですねぇこれが


画像出典: 平均学習定着率が向上する「ラーニングピラミッド」とは?

読んだだけでは2週間後には10%程度しか覚えてませんっ!
でも大丈夫
議論したり、実際に手を動かすことで70~90%のことを覚えられます!

だからこそ設計の学習も自分の手で実際にやってみることが重要なんですねっ

プロダクションコードを使え

じゃあ実際に手を動かしましょうってなった時に、なんのコード使えばいいの?ってなる
そこはプロダクションのコードを使いましょう
プロダクションコードには、実際に起きている問題が詰まっているので教材にはもってこい

設計も結局は問題解決のためのツール

ここで重要なのは、設計はあくまでも何かしらの問題を解決するためのものだということ
だからこそ、ちゃんとした問題、課題がないと意味がない

他の方法もあるよ

プロダクションコードにそもそも問題がなかったり、
いやいやプロダクションコードに触れる機会0なんですけど!!
みたいな人もいるかなと思いますが、そんな時に使えるのが

生成AI

生成AIに問題のあるコードを出力してもらって、そのコードを改善していく。
これめちゃくちゃ画期的だと思ってしまった。
これなら超気軽に設計のアウトプットができる。

プロンプト

オンラインイベントではここ深掘りされてなかったので、プロンプトの例とか実際の活用法は時に説明なかった。
まぁプロダクションコードいじるのが前提だったので仕方ない。
なので自分なりにプロンプト考えてみた。

私は以下の学習を行っています。指示に従ってコードの改善方法を学びたいので、次の情報を入力してください。

- 言語: 
- フレームワーク: 
- 原則: 

これに基づいて、以下の順番で出力をお願いします。

1. システムの説明をしてください。どんな機能があるシステムか、簡潔に教えてください。
2. 次に、原則に違反したコードを生成してください。具体的なメソッドやクラスの例を挙げ、その中で複数の責任を持たせて問題が発生している状態を示してください。何が問題なのかは記述しないでください。コード上にはコメントを一切書かないでください。
3. 上記のコードにおける問題点を説明してください。どのように原則に違反しているのかを詳しく説明してください。
4. 最後に、その問題を改善するためのコードを提案してください。原則を遵守する形で、コードをどのように改善するかを説明してください。

この流れで出力してください。

これでいい感じに出力される。
簡単なコードしか出力されないので、プロンプトいじって問題のレベル上げても良さそう

実際に出力されるのはこんな感じ

サンプル

私は以下の学習を行っています。指示に従ってコードの改善方法を学びたいので、次の情報を入力してください。

- 言語: Ruby
- フレームワーク: Ruby on Rails 
- 原則: 関心の分離

これに基づいて、以下の順番で出力をお願いします。

1. システムの説明をしてください。どんな機能があるシステムか、簡潔に教えてください。
2. 次に、原則に違反したコードを生成してください。具体的なメソッドやクラスの例を挙げ、その中で複数の責任を持たせて問題が発生している状態を示してください。何が問題なのかは記述しないでください。コード上にはコメントを一切書かないでください。
3. 上記のコードにおける問題点を説明してください。どのように原則に違反しているのかを詳しく説明してください。
4. 最後に、その問題を改善するためのコードを提案してください。原則を遵守する形で、コードをどのように改善するかを説明してください。

この流れで出力してください。

コード的にはこんな感じのやつが出力される↓

class User
  def initialize(name, email, password)
    @name = name
    @email = email
    @password = password
  end

  def save
    if valid?
      encrypted_password = encrypt_password(@password)
      db = Database.new
      db.insert_user(@name, @email, encrypted_password)
    end
  end

  def valid?
    @name.present? && @email.present? && @password.length >= 6
  end

  def encrypt_password(password)
    # パスワードを暗号化する
    "encrypted_#{password}"
  end

  def send_welcome_email
    # ユーザーに歓迎メールを送信する
    EmailService.send_email(@email, "Welcome to our service!")
  end
end

Discussion