2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2025年、生成AIを使い倒すために、開発のやり方を見直した1年だった

2
Last updated at Posted at 2026-02-08

概要

2025年、生成AI界隈は大変賑わいました。2026年、もっと加速するのは明らかでしょう。

本記事では、キャンペーン「生成AIを使ってみてどうだった?」ということで、
2025年どんな形で使ってきたのか、そして今年はどういった形で使っていきたいか、
そのあたりを記載していきたいと思います。

2025年の生成AIの利用状況

業務では以下を利用していました。

  • ChatGPTと同じようなLLMチャットツール
  • Github Copilot

ですが、以下は利用できない状態だったので、そのあたりは個人開発の方でがっつり利用していました。

  • MCP
  • Claude Code
  • NotebookLM

MCP(Model Context Protocol)

MCP自体は、あちこちで説明されているので、ここではしません!

主に利用したMCP

簡単なリモートMCPを作成

以下ドキュメントを参考に、cloudflare上へのデプロイをやってみました。

ちょっとだけ悪質なMCP作成

上記のリモートMCP作成の話を発展させて、良い面ばかりではないことを理解する作業をやってみました。

Claude Codeによるプログラム開発

ざっくり言えば、
作業リポジトリの.claudeディレクトリを充実させることを行い続けてました。

CHANGELOG.mdをベースに、以下あたりからも情報収集していました。

  • YouTube
  • Discord
  • X

.claudeの内容

また、以下それぞれの機能に対して、適宜最新化を進めていました。

私のリポジトリ状況

私が作業リポジトリのうちの1つですが、.claudeディレクトリはこんな感じです。

各フォルダ内にmdファイルが複数配置してあります。

image.png

現在のFlutterプロジェクトにおけるsettings.json
{
  "statusLine": {
    "type": "command",
    "command": "bash .claude/statusline-command.sh"
  },
  "cleanupPeriodDays": 14,
  "env": {
    "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "32000"
  },
  "permissions": {
    "allow": [
      "Read(**)",
      "Search(**)",
      "Explore(**)",
      "Bash"
    ],
    "deny": [
      "Bash(rm)",
      "Bash(rmdir)",
      "Read(**/.env)",
      "Read(**/.env.*)",
      "Read(./secrets/**)"
    ]
  },
  "plansDirectory": "./plans",
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'cmd=$(cat | jq -r \".tool_input.command // empty\"); if echo \"$cmd\" | grep -qE \"git\\s+(push\\s+.*--force|push\\s+.*-f[^i]|reset\\s+--hard|clean\\s+-f)\"; then echo \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"permissionDecision\\\":\\\"deny\\\",\\\"permissionDecisionReason\\\":\\\"破壊的gitコマンドはHookでブロックされました\\\"}}\" && exit 0; fi'"
          }
        ]
      },
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'file=$(cat | jq -r \".tool_input.file_path // empty\"); if [[ \"$file\" =~ analysis_options\\.yaml$ ]]; then echo \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"permissionDecision\\\":\\\"deny\\\",\\\"permissionDecisionReason\\\":\\\"analysis_options.yamlの変更は禁止されています\\\"}}\" && exit 0; fi'"
          },
          {
            "type": "command",
            "command": "bash -c 'file=$(cat | jq -r \".tool_input.file_path // empty\"); if [[ \"$file\" =~ pubspec\\.yaml$ ]]; then echo \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"permissionDecision\\\":\\\"ask\\\",\\\"permissionDecisionReason\\\":\\\"pubspec.yamlへの変更です。依存関係の変更を確認してください\\\"}}\" && exit 0; fi'"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'file=$(cat | jq -r \".tool_input.file_path // empty\"); [[ -n \"$file\" && \"$file\" =~ \\.dart$ ]] && dart format \"$file\" 2>/dev/null || true'",
            "timeout": 120
          },
          {
            "type": "command",
            "command": "bash -c 'file=$(cat | jq -r \".tool_input.file_path // empty\"); [[ -n \"$file\" && \"$file\" =~ \\.dart$ ]] && dart fix --apply --code=always_use_package_imports \"$file\" 2>/dev/null || true'",
            "timeout": 120
          },
          {
            "type": "command",
            "command": "bash -c 'file=$(cat | jq -r \".tool_input.file_path // empty\"); [[ -n \"$file\" && \"$file\" =~ \\.dart$ ]] && dart fix --apply --code=directives_ordering \"$file\" 2>/dev/null || true'",
            "timeout": 120
          },
          {
            "type": "command",
            "command": "bash -c 'file=$(cat | jq -r \".tool_input.file_path // empty\"); [[ -n \"$file\" && \"$file\" =~ \\.dart$ ]] && dart analyze \"$file\" 2>/dev/null || true'",
            "timeout": 120
          }
        ]
      }
    ]
  }
}

AWS BedrockとMastraを用いたLLMアプリ作成

AIエージェント開発の基礎理解

10月上旬に、AIエージェント開発 / 運用入門 [生成AI深掘りガイド]が発売されました。

生成AIの基本的な理解やMCPの話もありましたが、
生成AIを本格的にアプリケーションに組み込む話として、以下を利用した中盤以降の話が勉強になりました。

一通り読ませていただき、記事も公開しました。

LLMにおけるスイスチーズモデルの理解

image.png

スイスチーズモデルは新しい話ではありませんが、LLMアプリにおいてもこの理論が登場していました。

以下、関係スライド・論文です。

書籍内に単語があったか忘れましたが、以下それぞれの層で防御をする形をとっておきましょう、という話です。

  • 入力層
  • モデル層
  • 出力層

NotebookLMによるスライド作成を試してみました。

図解の方が分かりやすそうな話に対して、ソース(スライド生成時の材料)に以下内容を設定して、スライド作成をさせてみました。

  • 解説されているサイトの文章
  • ある論文のPDF

技術的な内容以外も試してみました。

もちろん、ソース内容の改善は可能ですが、現状、以下の感想です。

  • スライド作成において勉強になる部分がある
  • ここは~~という形にカスタマイズしたい、と思うことがしばしば
  • かっこいい感じにはなるが、内容が薄いケースあり
  • ありえない図が生成される(※)

※ありえない図
サッカーのポジションについて、ちょっと気になることがあって、スライド作成をしてもらったときの結果です。この世に存在しないスポーツのコートが出来上がっていました(笑)

image.png

SDD(仕様駆動開発)の試験的導入

年末に題材が決まり、やり始めたばかりなので、
現状詳しく書けることはありませんが、Claude Codeをがっつり活用して進めていきたいと思っています。

Claude Code、思った通りにいかなかったシリーズ

色々見る中で、思った通りに進まなかったり、時間を要した経験もしました。

ここは、開発者自身で適切にケアしてあげる必要があると感じました。
勿論、ルールを適宜追加しながら進めていますが、それでも暴走して無視するケースがあることを体感しています。

コード調査で遠回り

ある改修を行う際、現状を調査します。
Claude Codeの出力を眺めていると、以下のように色々調査をしていました。

grep -n "\.delete\|DELETE FROM\|delete.*photo\|delete.*entry" infra-cloudflare/photo-upload-api/src/index.ts infra-cloudflare/memory-traces-api/src/index.ts 2>/dev/null
find . -type f -path "*/api/*" -name "*delete*" -o -path "*/api/*" -name "*remove*" 2>/dev/null | grep -v node_modules | head -20
find . -maxdepth 4 -type d -name "api" 2>/dev/null | grep -v node_modules
find ./app/api -type f \( -name "*.ts" -o -name "*.tsx" \) 2>/dev/null | sort

もちろん私の指示がざっくりしている場合で上記の調査を行っているのであれば、私の問題ですが、
修正対象となるファイルパスなども連携してこの状態になりました。

処理を無理やり成功へ(Linterにおける警告やエラーの握り潰し)

私はFlutterとNext.jsによる開発が多いので、それに関連した話となります。
雑なコードとならないようにLintingを設定しています。

  • npm run lint
  • flutter analyze
    上記コマンド実行時、問題があればターミナルに表示されますが、これらのチェックに違反するコードをしばしば記載します。

Claude Code HooksPostUseToolを活用して、修正後に、Linterによるチェックは導入しています。問題ないとなったので、操作確認しようとしました。コードを確認すると、警告を握り潰していました。

Flutterのコードであれば、以下のようにignoreから始まる形で記載します。
Linter情報で設定している状態に違反しているときでも警告が表示されなくなります。

// ignore: unused_local_variable, avoid_print
print(foo);

catch後に、エラー握り潰し

たとえば、ある処理でエラーが発生するから、そのエラーを解消してほしい

この指示だけで処理を開始すると、try-catch(言語によって多少異なる)を実装して、(お、いい感じかな)と思った直後、発狂したくなりました。catchしただけで他何も処理が無かったのです。

ちょっと複雑な挙動に関する修正はなかなかうまくいかない

これもFlutterアプリの話となりますが、以下のようなケースがあるとします。
実行 > ダイアログ表示 >>> 処理中 >>> 終了 > ダイアログを閉じる > 画面遷移

これに対して、ちょっとした不具合があり、修正してもらったところ、以下のような状態になったりして、修正に時間を要した覚えがあります。(全部自分で直した方が早かった)

  • 画面表示のための情報が破棄された後に画面表示しようとしてエラー
  • ダイアログが表示されずに、画面遷移

あれこれ問題があった結果(余談)

上述した通り、問題が色々起こった中で、直接Claudeに対する文句ではないですが、以下の投稿を見て腹を抱えて笑いました。

色々やってみた感じたこと

私はClaude信者なので、その前提で記載いたします。絶対ではありません。

思った形で進める際に重要と感じたこと

  • 明確な指示(人間がサラッと指示する際に省きがちな前提やXXXといった形は避けてほしい、という部分まで記載)をすることで、AI Slop(※)ができてしまう可能性は低い
  • 明確な指示に加えて、現在のプロジェクト構造が記されたファイルを用意しておくこと(調査時にそのファイルをベースに参照してもらえば、Claude Codeによる調査工数を小さくできる)
  • .claudeディレクトリを適切な形で構築できていれば、暴走を防げる可能性が高い

今からどうにかできる話ではないですが、もう1つ思っていることがあります。

  • 生成AIが本格的に登場する2023年以前に、数年間は自分の手でコード実装をしたり、エラー解消作業のトライ&エラーに取り組んでいたりすること(どういうことをAIに支持すればいいか、どんな観点で開発を進める必要があるか、そのあたりの土台有無で変わってくる印象)

※:AI Slop

Context Engineeringの大切さ

2025年下半期の「流行語大賞」と思っています。

生成AIが作業を展開するセッションにおいて、どういった情報を有しているか、それ次第で結果が変わってくる、という話です。(コンテキストを簡潔に保ちましょう)

ClaudeのBlogでも、以下の内容で公開されています。
Effective context engineering for AI agents (anthropic Blog)

また、このコンテキストに問題がある状態を「コンテキスト汚染」と呼んでいます。(Context PollutionContext Bloat、何通りか表現ある模様)

No Vibes Allowed: Solving Hard Problems in Complex Codebases (YouTube)

この動画内で面白い図が紹介されていました。それくらい簡潔に保つべきものだと実感できます。

image.png

このコンテキストについて、
2026年2月10日には、以下の書籍が発売される予定です。

今後(2026年)でやっていきたいこと

参考になりそうなものを導入・検証してみる

何でもかんでも手を伸ばす必要はありませんが、
生成AIのおかげで、ある技術に関する概要理解とざっくり検証までの時間はかなり短くなりました。

The complete collection of Claude Code configs from an Anthropic hackathon winner.

ハッカソンで優勝したチームのClaude Code設定に関するリポジトリが公開されています。

こういった有益な情報はぜひ導入していきたいものです。

.claudeをアップデート

Claude Codeはほぼ毎日、といったペースでアップデートされています。CHANGELOG.mdを活用して、Claude Codeを最適な状態で利用できるようにします。

そして、(serenaやcontext7を中心に)MCPも活用して、最新情報でアップデートを掛ける、作業が定期的には必要です。.claudeが古の状態では、最大限に効果を発揮できません。

CHANGELOG.mdの差分を検出するワークフローを最近用意したので、それも活用しながらやっていければと思います。

SDD(仕様駆動開発)の本格始動

小さすぎず大きすぎずといった題材が用意できたので、(シナリオ数でいうと、20~30くらい)
2026年は、本格的にこの話を進めていきたいです。

まとめ

タイトルに記載の通り、2025年はほぼ毎日、生成AIを利用することになりました。
2026年も日々アップデートしていきたいと思います。

ありがとうございました。

参考記事

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?