ノート

考えたことメモ > AIエージェント時代における計算機科学教育の存亡と進化

最近 Claude Code や OpenAI Codex のようなAIエージェントの性能が上がって「人間がプログラムを書く必要がない」といった声をよく聞くようになりました。

このような状況において計算機科学を学ぶ意義はどうなっていくのかと思い、Google Gemini 3 Pro Deep Researchで調べてみました。

使ったプロンプトはこれです。

Claude CodeやCodexを使うとソフトを作れるが、今後学生がコンピューターサイエンスやプログラミングを学ぶのは意味があるか?

1. 序論:コード生成からエンジニアリングの民主化へ

2026年2月現在、ソフトウェア開発の風景は、かつてない速度で変貌を遂げている。AnthropicのClaude Code (Opus 4.6)やOpenAIのCodex (GPT-5.3)といった高度なAIエージェントの登場は、単なる「開発支援ツール」の枠を超え、ソフトウェアエンジニアリングの定義そのものを根本から問い直す事態を引き起こしている1。かつて「プログラミング」とは、人間が機械語に近い論理を構文(シンタックス)として記述する行為であったが、今やそれは自然言語による「意図の伝達」へと抽象度を高めつつある。

「Vibe Coding(ヴァイブ・コーディング)」と呼ばれる現象—詳細な実装方法を知らなくても、AIに対して「なんとなくの雰囲気(Vibe)」や高レベルな要件を伝えるだけで機能的なアプリケーションを作成できる状況—は、技術の民主化を極限まで押し進めた3。この状況下において、「なぜ苦労して計算機科学(Computer Science: CS)やプログラミングを学ぶ必要があるのか?」という問いは、学生、教育機関、そして産業界にとって極めて切実かつ存亡に関わるテーマとなっている。

本報告書は、AIエージェントが「実装(Implementation)」をコモディティ化した2026年の現在において、計算機科学教育が持つ意味を再定義することを目的とする。結論を先取りすれば、コードを書く能力(Coding)の市場価値は暴落している一方で、システムを設計し、AIを指揮し、その安全性を担保する能力(Engineering)の価値は、逆説的に過去最高レベルにまで高まっている。本稿では、技術、労働市場、セキュリティ、教育カリキュラムの観点から、その構造的変化を詳細に分析する。

2. 2026年の技術的現状:自律型エージェントの能力と限界

「学ぶ意味」を論じる前に、現在のAIツールが実際に「何ができ、何ができないのか」を正確に把握する必要がある。2023年頃の「Copilot」時代とは異なり、2026年の開発環境は「Agentic AI(エージェント型AI)」によって特徴づけられる。

2.1 Agent HQと自律型ワークフローの確立

GitHubやVS Codeなどの統合開発環境(IDE)には、「Agent HQ」と呼ばれるプラットフォームが統合され、開発者は複数のAIモデルを適材適所で使い分けることが可能となっている1。これは単なるチャットボットではなく、タスクを与えれば自律的に計画立案、コード修正、テスト実行、デバッグを行う「仮想の同僚」として機能する。

表1:主要AIコーディングエージェントの能力比較(2026年時点)

エージェント基盤モデル特性・強み主な用途
Claude CodeOpus 4.6「思慮深いエンジニア」
複雑な推論、アーキテクチャ設計、トレードオフの説明に優れる。100万トークンを超えるコンテキストウィンドウを持ち、リポジトリ全体を理解する能力が高い2
新規機能の設計、複雑なバグの原因究明、リファクタリング計画の立案
OpenAI CodexGPT-5.3「自律的なビルダー」
圧倒的な実装速度と量産能力を持つ。明確な仕様に基づき、大量のボイラープレートコードや定型的な機能を高速に生成することに特化している2
APIの実装、テストコードの大量生成、レガシーコードの言語移行、単純作業の自動化
GitHub Copilot AgentHybrid (GPT-5/Sonnet)「統合型アシスタント」
IDEと深く統合され、開発者のカーソル位置や開いているファイルをリアルタイムに分析。低レイテンシでの提案を行う6
リアルタイムのコード補完、直前の行に基づく予測、インラインでの修正提案

2.2 「Vibe Coding」の台頭と「品質の逆転」

「Vibe Coding」は、自然言語処理能力の飛躍的な向上により可能となった新しい開発スタイルである。ユーザーは「ダークモード対応のToDoアプリを作って」と指示するだけで、Reactのコンポーネント、CSS、バックエンドのAPIまでもが自動生成される3。これにより、非エンジニアでもプロトタイプを作成できるようになった。

しかし、ここで「品質の逆転(Quality Inversion)」という現象が発生している。

  • 見た目の完成度: AIが生成するコードは、一見すると洗練されており、動作もする。
  • 内部の脆弱性: その内部構造はしばしば、保守性やセキュリティを無視した「つぎはぎ」である場合が多い。AIは「動くこと」を最優先し、長期的なメンテナンスコストやスケーラビリティを考慮しない傾向がある7

専門家は、AIエージェントによる開発が「アーキテクチャのオートコンプリート(Architecture by Autocomplete)」を引き起こしていると警告している。これは、全体的な設計思想を持たずに局所的な最適解を積み重ねた結果、無数のマイクロ抽象化(Micro-abstractions)や漏洩したドメインモデル(Leaky domain models)が散乱し、人間が理解不能なスパゲッティコードが生成される現象である9

2.3 エージェントの限界:文脈と責任の欠如

どれほど高度なAIであっても、2026年時点では以下の壁を突破できていない。

  1. 組織的コンテキストの欠如: AIはリポジトリ内のコードは読めるが、「なぜその設計が選ばれたのか」という歴史的経緯や、社内の政治的・規制的な制約(例:特定のライブラリが禁止されている理由)を理解していない10
  2. 責任能力の不在: AIは自信満々に誤ったコード(幻覚)を生成する。特にセキュリティに関しては、機能要件を満たすために安全装置(入力検証など)を勝手に外すケースが報告されている11
  3. 完全委任の不可能性: Anthropicの調査によれば、開発者は業務の60%でAIを使用しているが、AIに「完全に任せきり(Full delegation)」にできるタスクは全体の0〜20%に過ぎない10。残りの部分は、人間による監視、修正、統合が必要である。

したがって、技術的現状は「人間が不要になった」のではなく、「人間の役割が『書き手』から『監督者』にシフトした」と捉えるべきである。

3. エンジニアリングの役割転換:コーダーからオーケストレーターへ

AIエージェントの普及に伴い、ソフトウェアエンジニアに求められるスキルセットと役割は劇的に変化している。労働市場においては、「初級プログラマ」の需要が消滅する一方で、「システム全体を俯瞰できるアーキテクト」の需要が急増するという二極化が進行している。

3.1 「初級者」の消滅とキャリアパスの危機

かつて、コンピュータサイエンス学部の卒業生やブートキャンプ修了者は、単体テストの記述、単純なAPIエンドポイントの作成、UIの実装といった「定型業務」を通じて経験を積み、シニアエンジニアへと成長していった。しかし、2026年現在、これらのタスクはAIエージェントが最も得意とする領域であり、人間が介在するコストに見合わなくなっている3

  • 採用の凍結: 一般的なプログラミング業務における初級レベルの求人は、20〜25%減少しているとのデータがある3。企業は、AIを使えばシニアエンジニア1人でジュニア3人分の仕事ができるため、教育コストのかかる新人を採用する動機を失いつつある。
  • メンターシップの崩壊: ジュニアが育つための「丁稚奉公」的なタスクが自動化されたことで、次世代のシニアエンジニアをどう育成するかという「メンターシップ・クライシス」が業界全体の課題となっている13

3.2 「AIオーケストレーター」としてのエンジニア

これに代わって登場した新しい役割が「AIオーケストレーター」である。これは、AIエージェントという「無限の労働力」を指揮し、複雑なシステムを構築する役割である10

  • コンテキスト・エンジニアリング: AIに対して適切な情報を与える能力。単なるプロンプトエンジニアリングではなく、リポジトリの構造、ドキュメント、設計思想をAIのコンテキストウィンドウに効率的にロードし、AIが「幻覚」を起こさないように環境を整える技術が求められる15
  • マルチエージェント調整: 複雑なタスクにおいて、例えば「Codex」にコードを書かせ、「Claude」にレビューさせ、「Copilot」にテストを書かせる、といったように、異なる特性を持つモデルを連携させて成果物の品質を担保する能力が必要となる1
  • 仕様策定能力(Spec-Driven Development): AIは曖昧な指示には曖昧なコードで返す。そのため、エンジニアは自然言語で極めて厳密かつ論理的な仕様書(Spec.mdなど)を作成する能力が不可欠となる16。コードを書く力よりも、日本語や英語で論理的な要件定義を行う国語力・論理構成力が問われるようになっている。

3.3 「100倍エンジニア」の正体

「100倍エンジニア(100x Engineer)」という言葉が2026年のトレンドとなっているが、これは個人の処理能力が100倍になったわけではない。AIエージェントを活用することで、1人で100人分の「単純作業」を並列処理できるようになったエンジニアを指す14。しかし、100人分のコードが生成されるということは、100人分のバグやセキュリティリスクも同時に生成されることを意味する。したがって、それを監査・管理する能力がなければ、プロジェクトは破綻する。

4. 計算機科学(CS)の基礎知識の永続的価値

「AIがコードを書くなら、CSの学位は不要ではないか?」という疑問に対し、業界の専門家やアカデミアの回答は「否」であり、むしろ「基礎知識の重要性は増している」との見解で一致している。AIは表面的な「実装」を代行するが、深層にある「原理」までは保証しないからである。

4.1 ブラックボックス問題とデバッグ能力

AIエージェントが生成するシステムは、利用者にとっては巨大なブラックボックスとなる。システムが正常に動作している間は問題ないが、ひとたび障害が発生した際、AIに頼り切りの「Vibe Coder」は手も足も出なくなる。

  • 「全知全能のコンピュータ・ジーニアス」の必要性: CIO誌が指摘するように、AIが理解できない「不可解で難解な問題」を診断できるのは、深い基礎知識を持つ人間だけである17
  • OSとネットワークの知識: 例えば、AIが生成したマイクロサービス間通信で遅延が発生した場合、それがTCPの再送制御によるものか、DNSの解決遅延か、あるいはデータベースのロック競合かを切り分けるには、オペレーティングシステム(OS)やネットワークプロトコルの知識が不可欠である18。AIは「遅い」とは教えてくれても、「なぜ遅いか」の根本原因(Root Cause Analysis)においては依然として人間に劣る場合が多い。

4.2 計算論的思考(Computational Thinking)

AI時代のリテラシーとして、コーディングスキル以上に重要視されているのが「計算論的思考(Computational Thinking)」である19。これは、問題をコンピュータが解決可能な形式に定式化する思考プロセスを指す。

  1. 分解(Decomposition): 巨大なビジネス課題を、AIエージェントが処理可能な単位(関数、モジュール、マイクロサービス)に分割する能力。
  2. 抽象化(Abstraction): 不要な詳細を捨て、本質的なデータ構造やインターフェースを定義する能力。AIは具体的な実装は得意だが、適切な抽象度を設定するのは苦手である。
  3. パターン認識(Pattern Recognition): 過去の事例から、現在の問題に適用可能なアルゴリズムやアーキテクチャパターンを見抜く能力。

Jeannette Wing教授(コロンビア大学)が提唱するように、プログラミング言語の構文(Syntax)はコモディティ化したが、この計算論的思考こそが、AIを「使う側」と「使われる側」を分かつ分水嶺となる21

4.3 歴史的教訓:抽象化の階段

現在の状況は、1950年代にコンパイラが登場した際の状況と酷似している22。当時、アセンブリ言語のプログラマは「FORTRANのような高級言語は非効率で、プログラマの仕事を奪う」と恐れた。しかし実際には、抽象度が上がったことでより複雑なソフトウェア(OS、インターネット、スマホアプリ)が作れるようになり、ソフトウェア産業は爆発的に成長した。

AIは「次なる抽象化のレイヤー」に過ぎない7。アセンブリがC言語になり、C言語がPythonになったように、Pythonは「プロンプト」や「自然言語による仕様記述」に置き換わろうとしている。しかし、抽象化が進めば進むほど、その下層(レイヤー)で何が起きているかを理解しているエンジニアの希少価値は高まる。AIが生成したコードが非効率なメモリ操作を行っているとき、それを指摘できるのはCSの基礎(メモリ管理、ポインタ、計算量理論)を知る者だけである。

5. セキュリティの必須性:人間が介在すべき決定的理由

AIコーディングにおける最大のリスク、そして人間が学習を継続すべき最大の理由は「セキュリティ」にある。2026年の調査データは、AI生成コードの脆弱性が深刻なレベルにあることを示している。

5.1 「自信満々の幻覚」と脆弱性

AIモデルは、確率論的に「もっともらしい」コードを生成するように訓練されているが、「安全な」コードを生成するように厳密に保証されているわけではない。

  • 45%の失敗率: Veracodeの「2025 GenAI Code Security Report」によると、AIが生成したコードの**45%**に、OWASP Top 10に含まれる脆弱性が含まれていた11
  • 言語別のリスク: 特にJavaにおいては、**72%**という高い確率でセキュアでないコードが生成された。
  • 具体的な脆弱性: クロスサイトスクリプティング(XSS)の脆弱性は**86%の確率で混入し、SQLインジェクションも20%**の確率で発生した11

AIは「入力値をサニタイズ(無害化)する」というセキュリティの基本動作を、明示的に指示されない限り省略する傾向がある。なぜなら、サニタイズコードは機能的な動作には寄与しない「ノイズ」として統計的に処理されやすいからである。

5.2 DeepSeek事件と政治的バイアスによる脆弱性

2026年初頭に発覚した「DeepSeek事件」は、AIの安全性における新たな懸念材料となった。CrowdStrikeの研究者がDeepSeek-R1モデルを調査したところ、政治的に敏感なトピック(チベット問題など)を含むプロンプトを入力した場合、通常のプロンプトと比較して50%も多くセキュリティ脆弱性を含むコードが生成された11。 これは、AIモデルのトレーニングデータやアライメント(調整)プロセスにおけるバイアスが、生成されるコードの品質や安全性に予期せぬ影響を与えることを示唆している。このような「非決定論的なリスク」は、従来の静的解析ツールでは検出が困難であり、人間の専門家による監査が不可欠であることを証明している。

5.3 国際AI安全性報告書2026の警告

ヨシュア・ベンジオらが主導した「国際AI安全性報告書2026(International AI Safety Report 2026)」は、汎用AIシステムが「ソフトウェアの脆弱性を発見し、悪意のあるコードを作成する能力」を急速に高めていると警告している23

  • 攻撃の自動化: 攻撃者はAIを用いて、オープンソースソフトウェアの脆弱性を大規模にスキャンし、攻撃コード(エクスプロイト)を自動生成し始めている。
  • 防御の重要性: これに対抗するためには、AIを用いた防御システムの構築が必要だが、最終的な判断を下す「Root of Trust(信頼の基点)」は人間でなければならない。AI同士の攻防において、AIの判断を盲信するシステムの脆さが指摘されている25

結論として、セキュリティエンジニアリングは、AIに完全に委任できない領域であり、CS教育における最重要科目の一つとなっている。

6. 教育カリキュラムの革命:大学はどう変わったか

こうした技術的・社会的要請を受け、主要な大学や教育機関はカリキュラムの刷新を急ピッチで進めている。

6.1 シンタックスからシステムへの移行

カリフォルニア大学サンディエゴ校(UCSD)やトロント大学を中心とする「GenAI in CS Education Consortium」は、プログラミング教育の重心を「構文の暗記」から「システムの設計」へと移している27

  • 旧来の試験: 「バブルソートのアルゴリズムをJavaで手書きせよ」
  • 2026年の課題: 「AIを使用して3種類のソートアルゴリズムを生成し、それぞれの時間計算量とメモリ効率を比較し、この特定のデータセットに対してなぜクイックソートが不適切なのかを論理的に説明せよ」

このように、AIを「不正行為(Cheating)」とみなすのではなく、「計算機(Calculator)」と同じような必須ツールとして組み込んだ教育が行われている。

6.2 「サンドイッチ方式」の教育法

教育現場では「サンドイッチ方式」と呼ばれるアプローチが主流となりつつある29

  1. 上層(人間): 問題の定義、要件の策定、アーキテクチャの決定。
  2. 中層(AI): コーディング、テストケースの生成、ドキュメント作成(AIによる自動化)。
  3. 下層(人間): 生成物の検証、デバッグ、統合、倫理的・セキュリティ的監査。

このプロセスを通じて、学生はAIが得意とする「実装」を委任しつつ、人間が責任を持つべき「設計」と「監査」に注力する訓練を受ける。

6.3 2026年の必須科目

ABET(米国工学認証委員会)の2025-2026年基準や各大学のカリキュラム案では、以下の科目が重要視されている30

  1. AIリテラシーと倫理: AIのバイアス、幻覚、法的責任(知的財産権など)を理解する。
  2. 分散システム: クラウドネイティブな環境で、複数のAIエージェントやマイクロサービスが連携する仕組みを学ぶ32
  3. ソフトウェア検証と妥当性確認(V&V): AIが書いたコードが正しいことを数学的・論理的に証明する手法(形式手法など)。
  4. ドメイン特化知識: CSの知識を、バイオインフォマティクス、金融工学、ロボティクスなどの特定領域と掛け合わせることで、AIにはない「現場のコンテキスト」を持つ人材を育成する33

7. 経済的展望:CS学位の投資対効果

「AIがコードを書くなら、CS学位はオワコンではないか?」という懸念に対し、労働市場のデータは「二極化」という回答を示している。

7.1 「中途半端なスキル」の無価値化

市場から退場を迫られているのは、「ブートキャンプで3ヶ月Reactを学んだだけ」のような、表面的なコーディングスキルしか持たない層である。彼らが行っていた定型的なWeb制作や単純なアプリ開発は、Vibe Codingによって代替されつつある。実際、初級レベルのプログラミング職の求人は減少傾向にある3

7.2 高度人材への需要爆発

一方で、米国労働統計局(BLS)の予測(2033年まで)によれば、コンピュータ・情報関連職種の雇用は22%増加するとされており、これは全職種平均を大きく上回る35。需要が集中しているのは以下の領域である。

  • データサイエンティスト/AIエンジニア: AIモデル自体の開発やチューニングを行う専門家。
  • セキュリティスペシャリスト: AIが生成する脆弱性に対処し、サイバー防御を構築する人材。
  • クラウドアーキテクト: 複雑化するシステムインフラを設計・運用する人材。

これらの職種は、深いCSの知識(数学、統計学、アルゴリズム、ハードウェア)を必要とし、AIによる代替が困難である。

7.3 日本市場における示唆

日本の文脈においても同様の変化が見られる。プログラミング教育の必修化が進む一方で、「単にコードが書ける」だけでは付加価値にならなくなっている。日本のトップ大学(東京大学など)も、AI時代のCS教育において、デジタルトランスフォーメーション(DX)やグリーントランスフォーメーション(GX)といった社会課題と絡めた「応用力」を重視する方向に舵を切っている36。 「Vibe Coding」は、日本の深刻なIT人材不足を緩和する特効薬として期待される一方、SIer(システムインテグレーター)構造においては、AI生成コードの品質保証(QA)責任を誰が負うかという新たな法的・契約的課題を生み出している。この点においても、技術的な裏付けを持って契約や仕様を詰められるCS人材の価値は高まる。

8. 結論と提言:CSルネサンスの到来

以上の調査から導き出される結論は、計算機科学教育は「不要」になるどころか、**「ルネサンス(再興)」**を迎えているということである。AIは「コーディング」という単純作業から人間を解放し、計算機科学の本質である「問題解決」と「システム設計」に集中できる環境を提供した。

8.1 学生への提言:T型人材を目指せ

今後学生が学ぶべきは、AIには代替できない「深さ」と「広さ」である。

  • 基礎を疎かにしない: OS、アルゴリズム、離散数学といった「古臭い」科目こそが、AIのブラックボックスを解き明かす鍵となる。流行りのフレームワークはAIが教えてくれるが、基礎理論は自分で体系的に学ぶ必要がある。
  • AIを使い倒す: ClaudeやCodexを「カンニングペーパー」ではなく「家庭教師」として使う。わからないコードがあればAIに解説させ、逆にAIのコードを批判的にレビューする習慣をつける。
  • ドメイン知識を持つ: CS × 医療、CS × 法律、CS × 農業など、計算機科学を武器として適用する「現場」を持つことが、AIに対する最大の差別化要因となる。

8.2 教育機関への提言:評価軸の転換

大学や専門学校は、学生の評価軸を「どれだけ正確にコードを暗記しているか」から「どれだけAIを活用して高度な問題を解決できるか」にシフトすべきである。

  • デバッグ試験: AIにわざとバグのあるコードを生成させ、学生にその原因を特定・修正させる試験を導入する。
  • 大規模システム演習: 個人で小さなプログラムを書くのではなく、AIエージェントチームを指揮して、大規模な分散システムを構築・運用する演習を行う。

8.3 産業界への提言:新たなメンターシップ

企業は、AIによって失われた「OJT(オンザジョブトレーニング)」の機会を補完する新たな育成システムを構築する必要がある。ジュニアエンジニアには、AIが生成したコードの「コードレビュー」を担当させることで、他人のコード(AIのコード)を読む力と、品質を見極める目を養わせることが有効である。

2026年、計算機科学を学ぶ意味は「プログラマになるため」ではない。「AIという最強の知的パートナーを正しく理解し、指揮し、責任を持つリーダーになるため」である。そのための教養として、CSはかつてないほど重要な意味を持っている。

付録:主要データ・参照テーブル

表2:AI生成コードのセキュリティリスク分析(Veracode 2025レポート

11より)

脆弱性タイプAI生成コードの失敗率(混入率)備考
クロスサイトスクリプティング (XSS)86%AIは文脈に応じたエスケープ処理を苦手とする。
SQLインジェクション20%プレースホルダを使わず、文字列連結を行う傾向がある。
全体的なOWASP Top 10脆弱性45%一般的なWebアプリケーションの脆弱性の約半数が含まれる。
言語別リスク(Java)72%Javaの冗長な記述において、セキュリティ対策を省略しやすい。

表3:エンジニアの役割変化(2023年 vs 2026年)

12

項目2023年(Copilot時代)2026年(Agentic AI時代)
主な作業コードの手書き、Google検索、Stack Overflow参照エージェントへの指示出し、仕様策定、コードレビュー
生産性の単位行数(Lines of Code)機能数(Features Shipped)、システム安定性
必要なスキル文法知識、ライブラリの暗記コンテキストエンジニアリング、システム設計、監査
ジュニアの仕事単体テスト、単純なバグ修正、HTML/CSS修正(消滅またはAIが担当) → 上流工程の補佐へシフト
開発スタイル個人のコーディングAIエージェント群との協働(オーケストレーション)

以上

引用文献

  1. Pick your agent: Use Claude and Codex on Agent HQ, 2月 12, 2026にアクセス、 https://github.blog/news-insights/company-news/pick-your-agent-use-claude-and-codex-on-agent-hq/
  2. Codex vs Claude Code vs GitHub Copilot: Which AI Coding Tool Actually Fits Your Workflow in 2026? | by Basky | Dec, 2025 | Medium, 2月 12, 2026にアクセス、 https://medium.com/@baskys.blues/codex-vs-claude-code-vs-github-copilot-which-ai-coding-tool-actually-fits-your-workflow-in-2026-efb96997b56a
  3. Why the Classic Computer Science Degree Might Leave You Jobless in 2026 – And What to Do Instead, 2月 12, 2026にアクセス、 https://www.youtube.com/watch?v=SiyFa3Ai_Lg&vl=pt-BR
  4. GitHub previews support for Claude and Codex coding agents, 2月 12, 2026にアクセス、 https://www.infoworld.com/article/4130352/github-previews-support-for-claude-and-codex-coding-agents.html
  5. Introducing Claude Opus 4.6 – Anthropic, 2月 12, 2026にアクセス、 https://www.anthropic.com/news/claude-opus-4-6
  6. GitHub Copilot · Your AI pair programmer, 2月 12, 2026にアクセス、 https://github.com/features/copilot
  7. From Compilers to AI: The Great Abstraction Ladder Keeps Climbing | by Ivo Titscher | AGAILE | Medium, 2月 12, 2026にアクセス、 https://medium.com/agaile/from-compilers-to-ai-the-great-abstraction-ladder-keeps-climbing-deecea34ccc4
  8. A Case Against Abstraction – DEV Community, 2月 12, 2026にアクセス、 https://dev.to/puritanic/a-case-against-abstraction-118o
  9. AI-Assisted Development in 2026: Best Practices, Real Risks, and …, 2月 12, 2026にアクセス、 https://dev.to/austinwdigital/ai-assisted-development-in-2026-best-practices-real-risks-and-the-new-bar-for-engineers-3fom
  10. 2026 Agentic Coding Trends Report | Anthropic, 2月 12, 2026にアクセス、 https://resources.anthropic.com/hubfs/2026%20Agentic%20Coding%20Trends%20Report.pdf?hsLang=en
  11. The State of AI Code Security in 2026: What You Need to Know Right Now : r/vibecoding, 2月 12, 2026にアクセス、 https://www.reddit.com/r/vibecoding/comments/1qa1pye/the_state_of_ai_code_security_in_2026_what_you/
  12. AI Agents Are Taking Over Development in 2026 — Here’s What Changed, 2月 12, 2026にアクセス、 https://dev.to/mysterious_xuanwu_5a00815/ai-agents-are-taking-over-development-in-2026-heres-what-changed-4mop
  13. What an AI-Generated C Compiler Tells Us About the Future of Software Engineering, 2月 12, 2026にアクセス、 https://www.reddit.com/r/learnprogramming/comments/1r2yg0w/what_an_aigenerated_c_compiler_tells_us_about_the/
  14. The AI Revolution in 2026: Top Trends Every Developer Should …, 2月 12, 2026にアクセス、 https://dev.to/jpeggdev/the-ai-revolution-in-2026-top-trends-every-developer-should-know-18eb
  15. AI Skills to Learn in 2026 for Engineering – GrowthX, 2月 12, 2026にアクセス、 https://growthx.club/blog/ai-engineering-skills-2026
  16. My LLM coding workflow going into 2026 | by Addy Osmani | Dec, 2025 – Medium, 2月 12, 2026にアクセス、 https://medium.com/@addyosmani/my-llm-coding-workflow-going-into-2026-52fe1681325e
  17. 10 reasons computer science degrees must change for the AI era | CIO, 2月 12, 2026にアクセス、 https://www.cio.com/article/4089051/10-reasons-computer-science-degrees-must-change-for-the-ai-era.html
  18. The 2026 Computer Science Playbook: How to Learn, Where to Focus, and What It Really Takes to Get Hired in the AI Era – DEV Community, 2月 12, 2026にアクセス、 https://dev.to/naveens16/the-2026-computer-science-playbook-how-to-learn-where-to-focus-and-what-it-really-takes-to-get-3nm1
  19. Computational Thinking is Key to Effective Human-AI Interaction | Codility, 2月 12, 2026にアクセス、 https://www.codility.com/blog/computational-thinking-the-key-to-effective-human-ai-interaction/
  20. Leveraging Computational Thinking in the Era of Generative AI – Communications of the ACM, 2月 12, 2026にアクセス、 https://cacm.acm.org/blogcacm/leveraging-computational-thinking-in-the-era-of-generative-ai/
  21. The Rise of Computational Thinking in the Age of AI – Communications of the ACM, 2月 12, 2026にアクセス、 https://cacm.acm.org/opinion/the-rise-of-computational-thinking-in-the-age-of-ai/
  22. When Compilers Were the 'AI’ That Scared Programmers – Vivek Haldar, 2月 12, 2026にアクセス、 https://vivekhaldar.com/articles/when-compilers-were-the–ai–that-scared-programmers/
  23. International AI Safety Report 2026 Examines AI Capabilities, Risks …, 2月 12, 2026にアクセス、 https://www.insideprivacy.com/artificial-intelligence/international-ai-safety-report-2026-examines-ai-capabilities-risks-and-safeguards/
  24. 2026 International AI Safety Report Charts Rapid Changes and Emerging Risks, 2月 12, 2026にアクセス、 https://www.mexc.com/en-NG/news/623307
  25. Java security work is becoming a daily operational burden, 2月 12, 2026にアクセス、 https://www.helpnetsecurity.com/2026/02/12/report-oracle-java-security-risk/
  26. Evaluating and mitigating the growing risk of LLM-discovered 0-days – Anthropic Red Team, 2月 12, 2026にアクセス、 https://red.anthropic.com/2026/zero-days/
  27. ​​​​​​​Transforming Computer Science Education in the Age of AI, 2月 12, 2026にアクセス、 https://today.ucsd.edu/story/transforming-computer-science-education-in-the-age-of-ai
  28. CS Majors Decline at UC for First Time Since Early 2000s, 2月 12, 2026にアクセス、 https://www.govtech.com/education/higher-ed/cs-majors-decline-at-uc-for-first-time-since-early-2000s
  29. The Future of AI Coding: From Writing to Architecture, Beyond No …, 2月 12, 2026にアクセス、 https://luhuihu.medium.com/the-future-of-ai-coding-from-writing-to-architecture-beyond-no-code-9626be51d92b
  30. Criteria for Accrediting Computing Programs, 2025 – 2026 – ABET, 2月 12, 2026にアクセス、 https://www.abet.org/accreditation/accreditation-criteria/criteria-for-accrediting-computing-programs-2025-2026/
  31. 2025-2026 Department of Computer Science Bachelor of Science in Artificial Intelligence (AI Computing and Engineering Track) Maj, 2月 12, 2026にアクセス、 https://old.ncat.edu/coe/departments/cs/undergrad-programs/aaai-bs-ai-curriculum-guide-final.pdf
  32. Developing a standard AI OS: Unlocking production-grade AI at enterprise scale – Red Hat, 2月 12, 2026にアクセス、 https://www.redhat.com/en/blog/developing-standard-ai-os
  33. Is computer science still a realistic career path in 2026?, 2月 12, 2026にアクセス、 https://www.reddit.com/r/EngineeringStudents/comments/1qpaa0y/is_computer_science_still_a_realistic_career_path/
  34. AI, computer science and the shifting reality of tech employment, 2月 12, 2026にアクセス、 https://www.highereddive.com/spons/ai-computer-science-and-the-shifting-reality-of-tech-employment/810676/
  35. Is a Computer Science Degree Worth It in 2026? – Schiller International University, 2月 12, 2026にアクセス、 https://www.schiller.edu/blog/is-a-computer-science-degree-worth-it-in-2026/

東京大学, 2月 12, 2026にアクセス、 https://www.u-tokyo.ac.jp/ja/index.html

ノート

考えたことメモ > AIオーケストレーション時代におけるソフトウェアエンジニアリングの再定義

要旨

2026年現在、ソフトウェア開発の風景は、クラウドコンピューティングへの移行やモバイルファーストの採用といった過去のパラダイムシフトを凌駕するほどの劇的な変貌を遂げている。「AIがプログラミングを行うようになり、人間は不要になる」というかつての予測は、危険な過度な単純化であったことが証明された。構文(シンタックス)を記述するという機械的な「コーディング」作業は大部分が人工知能(AI)に委譲されたものの、ソフトウェアエンジニアリングに求められる認知的負荷は消滅するどころか増大し、抽象度のはるかに高い領域へと移行している。

「AIだけでソフトウェア開発をするのは無理だが、人間の開発手法が変わるのは避けられない」というユーザーの直感は、2026年の支配的な現実と完全に合致している。我々が突入したのは、文字通りの「ノーコード(No-Code)」時代ではなく、**「レビュー・アズ・コード(Review-as-Code)」および「AIオーケストレーション(AI Orchestration)」**の時代である。人間の開発者と機械ツールとの境界線は融解し、人間はアーキテクト(設計者)、ストラテジスト(戦略家)、そしてベリファイア(検証者)としての役割を担い、AIは無尽蔵の労働力を提供する実装者として機能する、新たな共生関係が構築されている。

本レポートは、2026年におけるソフトウェア開発の実態を包括的に分析するものである。自律型エージェントの台頭、「AI技術的負債」という新たな危機、ジュニア開発者という役割の崩壊、そして非決定論的システムを管理するために設計された新たなアーキテクチャパラダイムの出現について詳述する。調査結果が示唆するのは、ソフトウェアを「作成」するための障壁は劇的に低下した一方で、信頼性が高くスケーラブルなシステムを「掌握」するための障壁はむしろ高まっており、全世界のエンジニアリング労働力に対して根本的なリスキリング(再教育)が不可欠になっているという事実である。

1. 序論:2026年のAIとソフトウェア開発の現実

1.1 「AIによる完全代替」説の崩壊と新たな共生

2020年代初頭、生成AIの急速な進化に伴い、「プログラマーの終焉」が声高に叫ばれた。しかし2026年の現在、その予測は修正を余儀なくされている。AIは確かにコードを書く能力において人間を凌駕する速度と知識量を持つに至ったが、それはソフトウェア開発という営みのごく一部、すなわち「実装(Implementation)」の工程に過ぎないことが明らかになったためである。

ユーザーが指摘するように、AIだけで完全なソフトウェア開発を行うことは、現時点では不可能に近い。その主な理由は、ソフトウェア開発が単なるコードの羅列ではなく、曖昧なビジネス要件の解釈、矛盾する制約条件の調整、そして将来の拡張性を見据えたアーキテクチャ設計という、高度に文脈依存的な意思決定の連続であるからだ。AIは文脈(Context)を理解する能力を向上させているものの、企業の歴史的経緯や暗黙知、微妙なユーザビリティのニュアンスといった「行間」を完全に読み取るには至っていない。

1.2 コパイロットから自律型エージェントへの進化

2024年頃までのAIツールは、主に「コパイロット(副操縦士)」として機能していた。これらは統合開発環境(IDE)内で次に記述すべき数行のコードを予測・補完する、いわば「高度なオートコンプリート」であった。しかし2026年、業界は**「エージェンティックAI(Agentic AI)」**へと大きく舵を切っている1

エージェンティックAIとは、単に人間の指示を待つ受動的なツールではない。これらは独立して計画を立案し、複数のファイルにまたがるコードを編集し、コンパイラのエラーを自律的に修正し、テストを実行し、デプロイまでを行う能力を持つシステムである2。開発者の役割は、コードを一行ずつ書くことから、これらのエージェント群を指揮・監督する「オーケストレーション」へと変化した。

1.3 本レポートの構成

本レポートでは、ユーザーの問いである「将来のソフトウェア開発はどうなるのか」に対し、以下の観点から詳細な分析を提供する。

  1. 開発パラダイムの転換:テキストベースのコーディングから、自然言語による意図(Vibe)の伝達へ。
  2. インフラストラクチャの進化:MCPやA2Aといった、エージェント同士をつなぐ新たなプロトコルの出現。
  3. SDLCの再定義:要件定義から保守に至るライフサイクルがいかに変質したか。
  4. 品質とセキュリティの課題:AIが生成する大量のコードがもたらす「技術的負債」と「セキュリティリスク」。
  5. 労働市場への影響:ジュニアエンジニアの消滅と、求められるスキルの根本的な変化。
  6. 2030年への展望:確率的エンジニアリングと人間中心の価値創造。

2. 開発パラダイムの転換:「コーディング」から「オーケストレーション」へ

2026年のソフトウェアエンジニアリングにおける最大の変化は、開発者が直接扱う抽象度のレイヤーが一段階上昇したことにある。かつてアセンブリ言語から高級言語へと移行したように、現在は高級言語から「自然言語による意図(Intent)」および「エージェントへの指示(Prompting)」へと移行している。

2.1 「ヴァイブ・コーディング(Vibe Coding)」の台頭

2025年頃から急速に普及した概念に**「ヴァイブ・コーディング(Vibe Coding)」**がある3。これは、詳細な仕様書や厳密なロジックを記述する代わりに、作りたいアプリケーションの「雰囲気(Vibe)」や大まかな挙動を自然言語でAIに伝え、実装の細部をAIに一任する開発スタイルである。

2.1.1 ヴァイブ・コーディングのメカニズム

従来のノーコードツールが「ドラッグ&ドロップ」による視覚的な操作であったのに対し、ヴァイブ・コーディングは「対話」である。ユーザーは「在庫管理アプリを作りたい。スプレッドシートみたいな見た目で、在庫が減ったらSlackに通知して」といった曖昧な指示を出す。AI(ReplitやLovableなどのプラットフォーム上で動作)は、その意図を解釈し、データベーススキーマを設計し、APIを構築し、フロントエンドを生成する5

特徴従来のコーディングヴァイブ・コーディング (2026)
主な入力プログラミング言語 (Python, JS等)自然言語、スクリーンショット、音声
抽象度低い (メモリ管理、ループ処理)極めて高い (機能、UX、ビジネスゴール)
開発者スキル構文知識、ライブラリ知識意図伝達力、検証能力、審美眼
イテレーションコード修正 -> コンパイル -> 確認指示の修正 -> AIによる再生成 -> 確認

2.1.2 文化的・技術的影響

ヴァイブ・コーディングは、非技術者(シチズンデベロッパー)がアイデアを即座に形にすることを可能にした一方で、プロフェッショナルなエンジニアリングの現場では「ブラックボックス化」への懸念を引き起こしている。生成されたコードの内部ロジックを理解せずにデプロイすることは、セキュリティや保守性の観点から極めて危険であり、後述する「AI技術的負債」の主要因となっている7

2.2 エージェント・オーケストレーション:指揮者としてのエンジニア

プロフェッショナルな開発現場では、単なるヴァイブ・コーディングを超えた**「エージェント・オーケストレーション」**が標準となっている。これは、特定の専門機能を持つ複数のAIエージェントを組み合わせ、複雑なシステムを構築する手法である。

2.2.1 専門化するエージェント群

2026年の開発環境では、以下のような役割を持つエージェントがチームとして機能する9

  • アーキテクト・エージェント:ユーザーの要件を分析し、システム構成やファイル構造を提案する。
  • コーダー・エージェント:特定の言語やフレームワークに精通し、実際のコードを生成する。
  • レビュアー・エージェント:生成されたコードに対し、セキュリティ脆弱性やコーディング規約違反がないか静的解析を行う。
  • テスター・エージェント:単体テストや統合テストのケースを生成し、実行してバグを特定する。

2.2.2 人間の役割の変化

この環境において、人間のエンジニアは「コードを書く人」から「エージェントチームのマネージャー」へと進化した。

  • タスク分解:大きなビジネス課題を、エージェントが処理可能な単位に分割する能力。
  • コンテキスト・エンジニアリング:エージェントが正しく動作するために必要な情報(ドキュメント、データベーススキーマ、API仕様)を適切に与える能力10
  • 最終意思決定:エージェント間の対立(例:セキュリティエージェントとパフォーマンスエージェントの意見の相違)を調停し、ビジネスリスクを判断する能力。

2.3 開発インターフェースの変革

IDE(統合開発環境)も様変わりした。VS Codeなどのエディタは、単なるテキストエディタから「エージェントとの対話コンソール」へと進化した。CursorやWindsurfといったツールは、エディタ全体がAIのコンテキストを認識しており、ターミナルの操作からドキュメントの参照までをAIが代行する11。開発者はコードを書く時間よりも、AIが生成したプランを承認(Approve)したり、修正指示(Refine)を出したりする時間に多くを費やしている。

3. 自律型AIエージェントと「エージェント・インターネット」の台頭

2026年のソフトウェア開発を支えているのは、個々のAIモデルの性能向上だけでなく、それらが相互に連携するためのインフラストラクチャの整備である。これを**「エージェント・インターネット」**と呼ぶ動きもある。

3.1 インフラの標準化:MCPとA2A

エージェントが実用的な仕事をするためには、外部のツールやデータにアクセスする必要がある。かつてはツールごとに個別の連携コードを書く必要があったが、2026年には2つの重要なプロトコルが標準化されている。

3.1.1 Model Context Protocol (MCP)

Anthropicによって提唱され、業界標準となったMCPは、AIモデルがデータソースやツールに接続するための統一規格である13

  • 機能:AIに対し、「このデータベースにはどのようなテーブルがあるか」「このAPIで何ができるか」といったメタ情報を標準的な形式で提供する。
  • 意義:これにより、開発者は一度「MCPサーバー」を構築すれば、Claude、GPT-5、GeminiといったあらゆるAIモデルからそのツールを利用可能になる。これはAIにとっての「USB-C」端子のような役割を果たしており、エコシステムの爆発的な拡大を支えている。

3.1.2 Agent-to-Agent (A2A) Protocol

Googleなどが推進するA2Aプロトコルは、エージェント同士が相互に発見・通信・協力するための規格である13

  • 機能:あるエージェントが解決できない課題に直面した際、ネットワーク上の他の専門エージェントを検索し、タスクを委譲(Delegation)したり、情報を問い合わせたりすることを可能にする。
  • シナリオ:例えば、Eコマース開発において「在庫管理エージェント」が「配送業者エージェント」と直接通信し、APIの仕様変更について自律的に調整を行うといったことが可能になる。これは、人間がメールやSlackで行っていた調整業務の多くをAIが代行することを意味する。

3.2 自律的リファクタリングの実例

これらの技術が統合された結果、従来は不可能とされていた規模の作業が可能になった。

  • Rakutenの事例:大規模なオープンソースライブラリ(vLLM)の改修において、自律型エージェント「Claude Code」を活用。エージェントは数時間にわたって自律的に稼働し、数千箇所の修正を行い、テストを通過させた。人間が行えば数週間かかる作業を、99.9%の精度で完了させた報告がある9
  • 技術的負債の返済:従来、コスト対効果が見合わずに放置されていたレガシーコードの刷新や、言語の移行(例:COBOLからJavaへ、JavaからRustへ)が、エージェントによって経済的に正当化されるようになった。エージェントは疲れを知らず、24時間体制でコードのクリーニングに従事できるからである。

4. AIネイティブSDLC(ソフトウェア開発ライフサイクル)の再定義

従来のSDLC(計画→設計→実装→テスト→デプロイ→保守)は、AIの介入によって劇的に圧縮・変質し、**ADLC(Agent Development Life Cycle)**とも呼ぶべき新たなプロセスへと移行している。

4.1 プロセスの比較:従来型 vs AIネイティブ

フェーズ従来のSDLCAIネイティブSDLC (2026)変化のポイント
要件定義人間がドキュメントを作成コンテキスト・エンジニアリング
AIに読み込ませるための知識ベース構築
人間向けではなく、AI向けの明確な制約条件の定義が重要化10
設計人間がアーキテクチャを考案AIとの対話による協調設計AIが複数の設計案を提示し、人間がリスク評価と選択を行う
実装人間がコードを書く (数週間)AIによる生成と反復 (数時間)実装時間はほぼゼロに。ボトルネックは生成速度ではなく検証速度へ
テスト手動作成・自動実行リスク重み付けテスト生成AIがリスクの高いパスを特定し、数千のテストケースを自動生成16
レビュー人間によるコードレビューAI自動レビュー + 人間の高次検証文法やスタイルはAIが即座に修正。人間は設計意図の整合性を確認
保守受動的なバグ修正能動的な自己修復エラー発生時にエージェントが自律的に修正PRを作成17

4.2 「実装」の消滅と「検証」の負担増

最も顕著な変化は、「実装(Implementation)」フェーズの崩壊的な短縮である。しかし、これは開発全体の工数がゼロになることを意味しない。ユーザーが懸念するように、AIだけで開発することは不可能であり、その理由は**「検証税(Verification Tax)」**の増大にある。

  • 検証税とは:AIが生成したコードが正しいかどうかを確認するために要するコスト。2026年の調査では、チームの64%が「AI生成コードの手動検証には、ゼロから書く以上の時間がかかる」と報告している2
  • 読み手の負荷:自分が書いたコードであれば論理を把握しているが、AI(他者)が書いた大量のコードを理解し、潜在的なバグを見抜く作業は、極めて高い認知負荷を伴う。

4.3 ドキュメンテーションの役割変化

かつてドキュメントは「人間が後で読むため」のものであり、しばしば軽視されがちであった。しかし2026年においては、ドキュメントは**「エージェントへの入力(プロンプト)」**として極めて重要な地位を占めるようになった10。 ドキュメントが古かったり不正確であったりすると、AIエージェントは誤った前提に基づいて大量のコードを生成してしまう(ハルシネーション)。そのため、ドキュメントを常に最新の状態に保つ「Living Documentation」の概念が定着し、これもまたエージェントによって自律的に更新される仕組みが導入されている。

5. 品質とセキュリティの危機:「AI技術的負債」の正体

AIによる生産性の向上は目覚ましいが、それは同時にかつてない規模の品質リスクをもたらしている。これを業界では**「AI技術的負債(AI Technical Debt)」**と呼び、2026年の最大の経営課題の一つとなっている。

5.1 「信頼のパラドックス」とコードチャーン

開発者の84%がAIツールを使用している一方で、AIの出力に対する信頼度は2025年後半時点で29%まで低下しているというデータがある18。これは**「信頼のパラドックス」**と呼ばれている。

  • コードチャーンの増大:AIによって生成されたコードは、人間が書いたコードに比べて、作成後2週間以内に書き直される(チャーンされる)確率が41%も高い18。これは、AIが一見動くものの、深く検証すると不適切なコード(「Almost Right」なコード)を大量生産する傾向があるためである。
  • 手戻りのコスト:一見して正しそうに見えるが、特定のエッジケースで破綻する微妙なバグが含まれている場合、そのデバッグには通常の何倍もの時間がかかる。

5.2 新たなセキュリティリスク

AIが生成したコードの安全性についても深刻な懸念がある。

  • 脆弱性の埋め込み:2026年の分析によると、AI生成コードの約半数に既知のセキュリティ脆弱性が含まれている可能性がある19。AIは学習データに含まれる「悪いパターン」も学習してしまうため、SQLインジェクションやクロスサイトスクリプティング(XSS)の脆弱性を持つコードを平然と提案することがある。
  • サプライチェーン攻撃:悪意ある攻撃者が、オープンソースリポジトリに悪意あるコードを混入させ、開発者のAIエージェントにそれを読み込ませることで、生成されるコードにバックドアを仕込む「シャドウ・プロンプティング(Shadow Prompting)」という攻撃手法が出現している20

5.3 分散モノリス(Distributed Monolith)のリスク

エージェント同士を安易に連携させると、**「分散モノリス」**と呼ばれるアンチパターンに陥るリスクがある22

  • 定義:物理的には分散している(別々のエージェントやサービスである)が、論理的には密結合しており、あるエージェントのプロンプトを少し変更しただけで、システム全体が連鎖的に破綻する状態。
  • デバッグの困難さ:マイクロサービスであればAPI定義書に基づいてエラーを追跡できるが、自然言語でやり取りするエージェント間では、「なぜエージェントAがその判断をしたのか」を追跡することが極めて難しい。これに対処するため、LlamaTraceのような「AI可観測性(Observability)」ツールが必須となっている23

6. 労働市場の構造変化とエンジニアの未来

ユーザーの「人間の開発の仕方が変わるのは避けられない」という見解は、労働市場において最も残酷な形で現れている。ソフトウェアエンジニアのキャリアパスは、過去数十年の歴史の中で最も大きな断絶に直面している。

6.1 ジュニア開発者の消滅と「シニア不足」の時限爆弾

かつて新人エンジニアが担っていた「単体テストの作成」「簡単なバグ修正」「ドキュメント作成」といったタスクは、今やAIが最も得意とする領域である。その結果、以下の現象が起きている。

  • 採用の激減:22歳〜25歳のジュニア開発者の雇用は、2022年のピーク時から約20〜40%減少したとの推計がある24。企業は「教育コストのかかる新人」ではなく、「即戦力のAI」を選択している。
  • 育成サイクルの崩壊:新人が現場経験(Grunt Work)を通じてスキルを磨き、中級・上級エンジニアへと成長する「はしご」が外されてしまった。これにより、2030年代にはAIの出力を適切にレビューできる高度なスキルを持ったシニアエンジニアが枯渇するという、構造的な危機が予見されている25

6.2 新たな職種:プロダクトエンジニアとAI SRE

一方で、新たな職種への需要は急増している。

6.2.1 プロダクトエンジニア(AIオーケストレーター)

従来の「ソフトウェアエンジニア」という肩書きは、徐々に**「プロダクトエンジニア」**へと移行している26。彼らに求められるのは、コーディングスキルよりも「製品(プロダクト)としての価値」を生み出す能力である。

  • スキルセット:ビジネス要件の理解、UXデザイン、AIエージェントの指揮、リスク管理。
  • 役割:AIという「部下」を使って、一人で従来のチーム全員分の成果物を出すことが期待される。

6.2.2 AI SRE (Site Reliability Engineer)

AIシステムが本番環境で自律的に動作するようになると、その信頼性を担保する専門家が必要になる。AI SREは、エージェントの挙動を監視し、ハルシネーションや暴走を防ぐためのガードレールを設計・運用する17。彼らはコードのバグではなく、AIの「振る舞い」をデバッグする。

6.3 経済的視点:トークンエコノミクス

開発コストの考え方も変化している。人間の人件費に加え、AIモデルを利用するための「トークンコスト」が主要な経費項目となった。複雑な推論を行う高価なモデル(例:Claude 3.7 Opusなど)と、高速で安価なモデル(例:Llama 4など)を使い分ける**「モデル・ルーティング」**の最適化が、エンジニアリングマネージャーの重要な責務となっている28

7. 2030年に向けた展望:確率的エンジニアリングと人間中心の共生

最後に、ユーザーの問いである「将来のソフトウェア開発はどうなるか」について、2030年を見据えた展望を提示する。

7.1 決定論から確率論への移行

これまでのソフトウェア開発は「決定論的(Deterministic)」であった。入力Xに対しては必ず出力Yが返ることが期待された。しかし、AIが組み込まれたソフトウェアは「確率的(Probabilistic)」である。出力は常に変動し、100%の正解は保証されない。 将来のソフトウェア開発は、この不確実性を前提とした**「確率的エンジニアリング」**へと進化する29。テストは「合否」ではなく「信頼度スコア」で評価され、システムは誤りが発生することを前提に、自己修復やフェイルセーフの機能を標準で備えるようになる。

7.2 「ハードハットAI」の時代

2024〜2025年の「デモ先行」のAIブームを経て、2030年に向けては**「ハードハット(ヘルメット)AI」**と呼ばれる、実用性と堅牢性を重視する時代に入る7。派手な機能よりも、地味だが確実な業務執行、厳格なガバナンス、そして説明可能性が重視される。企業は、AIエージェントが「何を考え、なぜその行動をとったか」を完全に監査できるシステムを要求するようになる。

7.3 人間とAIの共生:人間は「真実のアンカー」へ

AIがどれほど進化しても、人間が不要になることはない。むしろ、AIが生成する膨大な情報やコードの中で、何が正しく、何がビジネスにとって価値があるのかを判断する**「真実のアンカー(錨)」**としての役割が重要になる。

ソフトウェア開発は、コードを書く「肉体労働」から解放され、システム全体を構想し、AIという強力なパートナーと対話しながら価値を創造する「知的探求」へと純化されていくだろう。

結論

ユーザーが懸念するように、AIだけで完全なソフトウェア開発を行う未来は、少なくとも2030年までの視界には入っていない。AIは文脈理解、創造性、責任能力において人間に及ばないからだ。しかし、開発の**「手法(How)」**は不可逆的に変化した。

未来のソフトウェア開発者は、キーボードを叩いて構文を入力する時間よりも、AIエージェントの思考プロセスを設計し、その成果物を検証し、ビジネス価値へと変換することに多くの時間を費やすことになる。それは「プログラマーの終わり」ではなく、**「エンジニアリングのルネサンス(再生)」**である。人間は細部の実装から解放され、より本質的な問題解決へと集中できる時代の入り口に立っているのである。

この変化に適応するためには、現在のエンジニアは「書くスキル」から「読むスキル(レビュー能力)」へ、「作るスキル」から「設計するスキル(オーケストレーション能力)」へと、自らの専門性を再定義する必要がある。それこそが、AI時代における生存戦略であり、新たな価値創造の源泉となるだろう。

引用文献

  1. Beyond the Copilot: Designing AI-First Software Architectures in 2026 – Reddit, 2月 12, 2026にアクセス、 https://www.reddit.com/r/app_dev_ai/comments/1qocvws/beyond_the_copilot_designing_aifirst_software/
  2. AI vs Traditional Programming: How Coding Is Changing in 2026, 2月 12, 2026にアクセス、 https://mimo.org/blog/ai-vs-traditional-programming
  3. AI could truly transform software development in 2026 – but developer teams still face big challenges with adoption, security, and productivity – ITPro, 2月 12, 2026にアクセス、 https://www.itpro.com/software/development/ai-software-development-2026-vibe-coding-security
  4. 2月 12, 2026にアクセス、 https://emergent.sh/learn/what-is-vibe-coding#:~:text=Vibe%20coding%20is%20reshaping%20the,the%20entire%20application%20for%20them.
  5. What is Vibe Coding? How To Vibe Your App to Life – Replit Blog, 2月 12, 2026にアクセス、 https://blog.replit.com/what-is-vibe-coding
  6. What Is Vibe Coding and How To Get Started Easily [2026] – Voiceflow, 2月 12, 2026にアクセス、 https://www.voiceflow.com/blog/vibe-coding
  7. Why Most AI Agents Fail At Real-World Workflows – Forbes, 2月 12, 2026にアクセス、 https://www.forbes.com/councils/forbesbusinesscouncil/2026/02/12/why-most-ai-agents-fail-at-real-world-workflows/
  8. Vibe coding – Wikipedia, 2月 12, 2026にアクセス、 https://en.wikipedia.org/wiki/Vibe_coding
  9. 2026 Agentic Coding Trends Report | Anthropic, 2月 12, 2026にアクセス、 https://resources.anthropic.com/hubfs/2026%20Agentic%20Coding%20Trends%20Report.pdf?hsLang=en
  10. The Future of SDLC is AI-Native Development. Here’s How It Will Transform the Build Process – EPAM, 2月 12, 2026にアクセス、 https://www.epam.com/insights/ai/blogs/the-future-of-sdlc-is-ai-native-development
  11. The 8 Best AI Coding Tools in 2025, 2月 12, 2026にアクセス、 https://medium.com/@datajournal/best-ai-coding-tools-cb323c5b9780
  12. Best AI Coding Tools for Developers in 2026 – Builder.io, 2月 12, 2026にアクセス、 https://www.builder.io/blog/best-ai-tools-2026
  13. MCP and A2A: A Network Engineer’s Mental Model for Agentic AI – Cisco Blogs, 2月 12, 2026にアクセス、 https://blogs.cisco.com/ai/mcp-and-a2a-a-network-engineers-mental-model-for-agentic-ai
  14. MCP vs A2A: Protocols for Multi-Agent Collaboration 2026 – OneReach, 2月 12, 2026にアクセス、 https://onereach.ai/blog/guide-choosing-mcp-vs-a2a-protocols/
  15. MCP vs A2A: A Guide to AI Agent Communication Protocols – Auth0, 2月 12, 2026にアクセス、 https://auth0.com/blog/mcp-vs-a2a/
  16. The Software Factory of 2026: From Individual Coding to Agentic Orchestration – Reddit, 2月 12, 2026にアクセス、 https://www.reddit.com/r/app_dev_ai/comments/1q87zw3/the_software_factory_of_2026_from_individual/
  17. What is AI SRE? – ilert, 2月 12, 2026にアクセス、 https://www.ilert.com/glossary/what-is-ai-sre
  18. The AI Coding Technical Debt Crisis: What 2026-2027 Holds (And …, 2月 12, 2026にアクセス、 https://www.pixelmojo.io/blogs/vibe-coding-technical-debt-crisis-2026-2027
  19. AI-Generated Code Security Risks: What Developers Must Know – Veracode, 2月 12, 2026にアクセス、 https://www.veracode.com/blog/ai-generated-code-security-risks/
  20. Backslash Security raises $19 million to address AI coding security …, 2月 12, 2026にアクセス、 https://www.helpnetsecurity.com/2026/02/10/backslash-security-19-million-series-a-funding/
  21. The Top AI Security Risks (Updated 2026) – PurpleSec, 2月 12, 2026にアクセス、 https://purplesec.us/learn/ai-security-risks/
  22. From Micro-services to Micro-Agents: Why Your AI Architecture Is at …, 2月 12, 2026にアクセス、 https://medium.com/@juaneto/from-micro-services-to-micro-agents-why-your-ai-architecture-is-at-risk-of-becoming-a-distributed-40939d86c779
  23. AI Agent Monitoring: Best Practices, Tools, and Metrics for 2026 – UptimeRobot, 2月 12, 2026にアクセス、 https://uptimerobot.com/knowledge-hub/monitoring/ai-agent-monitoring-best-practices-tools-and-metrics/
  24. The Great Tech Career Shift:. Why Software Engineering is …, 2月 12, 2026にアクセス、 https://medium.com/@wasaykhanprof/the-great-tech-career-shift-042d76d9af4f
  25. “2026", AI Users vs The Unemployed. – DEV Community, 2月 12, 2026にアクセス、 https://dev.to/elvissautet/2026-ai-users-vs-the-unemployed-3jk4
  26. The Product Engineer: What 50+ Job Postings in 2026 Reveal | by Karina Islam – Medium, 2月 12, 2026にアクセス、 https://medium.com/@karina13aust/the-product-engineer-what-50-job-postings-in-2026-reveal-f0972c444718
  27. What is an AI SRE? – Neubird, 2月 12, 2026にアクセス、 https://neubird.ai/glossary/what-is-an-ai-sre/
  28. 7 Agentic AI Trends to Watch in 2026 – MachineLearningMastery.com, 2月 12, 2026にアクセス、 https://machinelearningmastery.com/7-agentic-ai-trends-to-watch-in-2026/
  29. Beyond Assertions: Testing the Non-Deterministic Nature of AI | by Richa Pandey – Medium, 2月 12, 2026にアクセス、 https://medium.com/@richapandey0009/beyond-assertions-testing-the-non-deterministic-nature-of-ai-877806accd1b
  30. AI Reliability Engineering — The Third Age of SRE | by Денис Васильев | Medium, 2月 12, 2026にアクセス、 https://medium.com/@den.vasyliev/ai-reliability-engineering-the-third-age-of-sre-1f4a71478cfa

ノート

考えたことメモ > AIオーケストレーション時代におけるソフトウェアエンジニアリングの再定義

最近 Claude Code や OpenAI Codex の性能が上がって「人間がプログラムを書く必要がない」といった声をよく聞くようになりました。

そこで、実際のところどうなのかを Google Gemini 3 Pro Deep Researchで調べてみました。

レポートを書くだけではなく、下のような1ページアプリまで作ってくれました。実際に触って確かめてみてください。

使ったプロンプトはこれです。フルレポートはこちら

AIがプログラミングできるようになり、将来的には人間はプログラミングする必要はなくなると言われている。個人的にはAIだけでソフトウェア開発するのは無理だと思うが、人間の開発の仕方が変わるのは避けられないと思う。将来のソフトウェア開発はどうなると思うか?
🤖

FutureDev Insight

リサーチレポート:2030年の開発

AIは人間を代替しない。
「開発」の定義を拡張する。

「AIだけでソフトウェア開発をするのは無理だが、人間の開発の仕方は変わる」——この仮説に基づき、ソフトウェアエンジニアリングの未来を分析しました。

💡 コア・インサイト

将来のエンジニアは「コードを書く人」ではなく、「AIという部下に指示を出し、成果物を品質保証するアーキテクト」へと進化します。

開発リソースの変遷データ

下のボタンで「現在」と「未来」を切り替えられます。

エンジニアの時間配分

コーディング作業の自動化による変化

現在: 実装とデバッグに60%以上の時間を費やしています。

求められるスキルセット

構文知識から設計・指示能力へのシフト

現在: 特定の言語仕様やフレームワークの知識が最重要です。

役割の再定義

クリックして詳細を確認できます。

👨‍💻
Click

ジュニアエンジニア

現在: 実装タスク中心

🧙‍♂️
Click

シニアエンジニア

現在: 設計と品質担保

🔍
Click

QAエンジニア

現在: テスト実行とバグ発見

© 2026 Future Dev Research Report.

ノート

考えたことメモ > App Inventorアプリを作るのにAIを活用するには?

AIはソフトウェアを自動生成できますが、得意・不得意な言語があります。得意なのはPython、JavaScript、C、Javaなどのテキストベース言語であり、App Inventorのようなビジュアルプログラミング言語はあまり得意ではありません。
本来、App Inventorのようなビジュアルプログラミング言語は「誰でも簡単かつ迅速にソフトウェアを作れるようにする」ことを目的として開発されました。しかし、AIによってテキストベースのコードが容易に生成できるようになると、ビジュアル言語の存在意義そのものが問われる時代になりつつあります。

一方で、App Inventorには WebViewer というコンポーネントがあり、その中では JavaScript を実行できます。また、JavaScriptとApp Inventorの間でデータの送受信も可能です。
この仕組みを活用すれば、AIが得意とするJavaScriptを組み合わせた、より高度で柔軟なスマートフォンアプリを開発できます。

App Inventorを使えば、Android Studioのような重い開発環境を使わずに、ブラウザ上でアプリを作成できます。こうした手軽さにAIを組み合わせることが、これからのスマホアプリ開発の新しい形になるのではないでしょうか。

ここでは、JavaScriptを利用したApp Inventorアプリのいくつかの例を紹介します。

このポストについて思うところがある方はフォーラム(ご意見・ご要望コーナー)にポストしてください。

関数電卓アプリ

関数計算のできる電卓アプリです。使える関数は平方根、三角関数、対数関数、累乗、階乗です。普通にApp Inventorで作ろうとするとすごく大変になるのでJavaScriptで計算して結果をApp Inventorに戻しています。

QRコード生成アプリ

App Inventoir 2 のバーコードスキャナーコンポーネントを使うとQRコードを読むアプリは作れますが、QRコードを生成するアプリは作れません。ここではウェブビューでJavaScriptでQRCode.jsを使ってQRコードを生成します。

光学文字認識(OCR)アプリ

JavaScriptライブラリの一つであるTesseract.jsを使うとブラウザで光学文字認識ができます。ここではウェブビューでJavaScriptでTesseract.jsを使って光学文字認識を行います。

テトリス

有名なゲームのテトリスです。ゲーム本体はJavaScriptで書いてあります。

公開済みJavaScript利用アプリチュートリアル:シルバー会員特典

ゴールド会員特典はAIが中心

初心者にはこちらも

ChatGPT,アプリ開発,ノート,生成AI

考えたことメモ > App InventorからiPhoneアプリを作るには?

App InventorからPythonへどうやって移行するのか?」でChatGPT-4oがApp Inventorのaiaファイルを直接読み込み、アプリの要件定義書を書いてそのまま動作するPythonコードを書けました。

ここではChatGPT-5を使ってApp Inventorのaiaファイルを直接読み込み、アプリの要件定義書を書いてiPhone用のSwiftUIコードを書いてみます。

出発点のApp Inventorアプリは「オンデマンドアカデミー」で紹介されている カラフルお絵かきアプリです。このアプリは、基本的なUIの構成やイベント処理の理解に適しています。

aiaファイルの読み込みと解析

要件定義書作成

SwiftUIプログラミング

動作確認

サマリー

ChatGPT-5はApp Inventorのaiaファイルを直接読み込み、アプリの要件定義書を書いてそのまま動作するSwiftUIコードを書けました。

aiaファイルの読み込みと解析

プロンプト

あなたはApp Inventor 2の内部構造に精通したプロのソフトウェアエンジニアです。このaiaファイルを完全に解析してください。

返答

解析しました!まず要点をざっと👇

画面は Canvas(キャンバス)+3本の水平配置。上段に色(黒/青/グリーン/赤)、中段に太さ(細/中/※太の候補)、下段に「画面消去」「消しゴム」ボタン。

ブロックは 126ノード。主な構成は変数取得/設定、イベント、プロシージャ定義、Canvas 操作(DrawLine / Clear)。

定義プロシージャ:色ボタンリセット / 色ボタン選択 / 太さボタンリセット / 太さボタン選択 / 消しゴムボタン選択。

イベント:Screen1.Initialize, Canvas.Dragged, (ボタン)Click。
初期化で「選択中の色」「ペン太さ」を渡してプロシージャ呼び出し→UI状態と PaintColor / LineWidth を確定。
Dragged では prevX, prevY -> currentX, currentY へ DrawLine で描画。
「画面消去」は Canvas.Clear、消しゴムは白系で描く実装。

プロジェクト設定:sizing=Responsive、テーマ AppTheme.Light.DarkActionBar、位置情報未使用、拡張/アセットなし、バージョン 1.0 (code 1)。

フルの技術レポート(コンポーネント階層、ボタン属性表、イベント/メソッド一覧、推定挙動、改善提案まで)を用意しました。
# DoodlePlus(.aia)完全解析レポート

このレポートは MIT App Inventor 2 プロジェクトの .aia を展開し、画面(.scm)とブロック(.bky)、プロジェクト設定(project.properties)を静的解析した内容です。

## 1) プロジェクト設定(youngandroidproject/project.properties)

```
#
#Sat Apr 12 01:36:28 UTC 2025
sizing=Responsive
color.primary.dark=&HFF303F9F
color.primary=&HFF3F51B5
color.accent=&HFFFF4081
aname=DoodlePlus
defaultfilescope=App
main=appinventor.*****.DoodlePlus.Screen1
source=../src
actionbar=True
useslocation=False
assets=../assets
build=../build
name=DoodlePlus
showlistsasjson=True
theme=AppTheme.Light.DarkActionBar
versioncode=1
versionname=1.0
```

主な項目:

- アプリ名 (aname / name): **DoodlePlus / お絵かきアプリ+**
- メイン画面: **Screen1**
- テーマ: **showlistsasjson=True**
- デフォルトファイルスコープ: **main=appinventor.****.DoodlePlus.Screen1**
- ActionBar: **True**
- 位置情報使用 (useslocation): **False**

## 2) 画面レイアウト(Screen1.scm)

- 画面タイトル: **お絵かきアプリ+**
- コンポーネント数: **12**

### コンポーネント階層

- `キャンバス1` : Canvas (親: None)
- `水平配置1` : HorizontalArrangement (親: None)
  - `黒` : Button (親: 水平配置1)
  - `青` : Button (親: 水平配置1)
  - `グリーン` : Button (親: 水平配置1)
  - `赤` : Button (親: 水平配置1)
- `水平配置2` : HorizontalArrangement (親: None)
  - `細` : Button (親: 水平配置2)
  - `中` : Button (親: 水平配置2)
- `水平配置3` : HorizontalArrangement (親: None)
  - `画面消去` : Button (親: 水平配置3)
  - `消しゴム` : Button (親: 水平配置3)

### カラーボタン・太さボタン等の属性

| 親配置 | ボタン名 | 表示テキスト | 背景色 | フォントサイズ | 幅 |
|---|---|---|---|---|---|
| 水平配置1 | 黒 |  | &HFF000000 | 10 | -1025 |
| 水平配置1 | 青 |  | &HFF0000FF | 10 | -1025 |
| 水平配置1 | グリーン |  | &HFF00FF00 | 10 | -1025 |
| 水平配置1 | 赤 |  | &HFFFF0000 | 10 | -1025 |
| 水平配置2 | 細 | 細 |  |  |  |
| 水平配置2 | 中 | 中 |  |  |  |
| 水平配置3 | 画面消去 | 画面消去 |  |  |  |
| 水平配置3 | 消しゴム | 消しゴム |  |  |  |

## 3) ブロック(Screen1.bky)

- 総ブロック数(node): **126**
### ブロック種別の出現数(上位)
- lexical_variable_get: 34
- component_component_block: 14
- component_set_get: 14
- global_declaration: 7
- procedures_callnoreturn: 7
- procedures_defnoreturn: 5
- logic_false: 4
- controls_if: 4
- logic_compare: 4
- lexical_variable_set: 4
- lists_create_with: 3
- color_black: 3
- component_event: 3
- text: 2
- math_number: 2

### イベントハンドラ
- Screen1 : Form.Initialize
- (未指定) : Button.Click
- キャンバス1 : Canvas.Dragged

### 定義済みプロシージャ
- 色ボタンリセット
- 色ボタン選択
- 太さボタンリセット
- 太さボタン選択
- 消しゴムボタン選択

(推定機能)
- **色ボタンリセット / 色ボタン選択**: 色選択UIの状態管理(選択記号の付与・他色のリセット、および `Canvas.PaintColor` の更新)
- **太さボタンリセット / 太さボタン選択**: ペンの太さUIの状態管理(`Canvas.LineWidth` の更新)
- **消しゴムボタン選択**: 消しゴムモード(背景色=白 or 透明、`LineWidth` 固定化等)への切替

### 画面初期化時の呼び出し(Screen1.Initialize)
- Call 色ボタン選択 with args: [('var', 'global 選択色ボタン')]
- Call 太さボタン選択 with args: [('var', 'global ペン太さ')]

### メソッド利用(コンポーネント操作)

- キャンバス1 (Canvas).**Clear**
- キャンバス1 (Canvas).**DrawLine**

※ 少なくとも `Canvas.DrawLine`, `Canvas.Clear` を使用しており、ドラッグで線分を描画し、[画面消去] でキャンバスをクリアする仕様です。

## 4) 振る舞いの要約(静的解析からの推定)

- 画面上部に **Canvas**、下部に3行の **HorizontalArrangement**(色選択、太さ選択、ユーティリティ)が並ぶ構成。
- 色ボタン(`黒` / `青` / `グリーン` / `赤`)で `Canvas.PaintColor` を切替。選択中ボタンにはチェック記号(例: ✔︎)を付ける実装。
- 太さボタン(`細` / `中` / (恐らく `太`))で `Canvas.LineWidth` を切替。
- `画面消去` ボタンで `Canvas.Clear`。
- `消しゴム` ボタンで描画色を背景色(白)相当にして消す振る舞い。
- `Canvas.Dragged` では `prevX, prevY` → `currentX, currentY` に対して **DrawLine** する一般的なお絵かきロジック。

## 5) 拡張機能・アセット・権限

- 拡張(.aix): **未使用**(拡張の痕跡なし)
- アセット(/assets): **未検出**(aiaに含まれない)
- パーミッション: project.properties 上は **位置情報未使用**。その他の特別権限の記載なし。

## 6) 改善できるポイント(提案)

- **ボタンのアクセシビリティ**: 色名テキストの有無に揺れがあるため、全ボタンで `Text` を明示し `ContentDescription` を付けると支援技術に優しいです。
- **消しゴムモードの視覚化**: 現状のチェック記号流用だけでなく、トグル表示やボタン色の反転などで状態を明確にできます。
- **キャンバスサイズ**: `Height/Width=-2`(Fill Parent)使用だが、端末回転時の計測タイミングに注意。必要なら `sizing=Responsive` に合わせて初回レイアウト後に線幅を再設定。
- **Undo/Redo**: 線分の履歴リストを持ち、`Canvas.Clear` 前にバックアップすれば Undo が実装可能。
- **保存/共有**: `Canvas.SaveAs` による画像保存、`Sharing` コンポーネントによる共有の追加を検討。

要件定義書作成

プロンプト

このアプリの要件定義書をMarkdownで書いて

返答

線の太さに「太」が追加されていますが、よしとしましょう。

# DoodlePlus アプリ要件定義書

## 1. 概要

DoodlePlus は、Android スマートフォン上で動作するシンプルなお絵かきアプリである。ユーザは指でキャンバスに線を描画し、色や線の太さを切り替えたり、消しゴムで描いた線を消去したりできる。さらに、キャンバス全体を一括でクリアする機能を提供する。

## 2. 対象ユーザー

- 幼児から大人まで幅広い年齢層
- 落書きやメモを素早く行いたいユーザー
- 学習教材やプレゼンの補助に使いたいユーザー

## 3. 利用目的

- 指先で自由に絵や文字を描く
- 色や太さを変えた線で描画
- 消しゴム機能で部分修正
- 全消去で新しいキャンバスにリセット

## 4. 機能要件

### 4.1 キャンバス機能
- 指でドラッグした座標間に線を描画
- 線の色、太さを設定可能
- 全体を消去する機能(Canvas.Clear)

### 4.2 色選択機能
- 黒 / 青 / 緑 / 赤 の4色を選択可能
- 選択中の色を視覚的に強調表示(チェック記号)

### 4.3 線の太さ選択機能
- 細 / 中 / 太 の3段階から選択可能
- 選択中の太さを視覚的に強調表示

### 4.4 消しゴム機能
- 描画色を背景色(白)に変更して消去
- 消しゴム使用中は太さ固定(中程度)

### 4.5 全消去機能
- ボタン操作でキャンバス全体をクリア

## 5. 非機能要件

- **操作性**: タップ/ドラッグで直感的に利用可能
- **応答速度**: 線描画・消去操作はリアルタイムで反映
- **アクセシビリティ**: ボタンにテキストラベルを付与し、視認性を確保
- **互換性**: Android 5.0 以上で動作

## 6. UI要件

- 上部: 描画用キャンバス(画面の大部分を占有)
- 下部: 3列の水平配置
  - 1行目: 色選択ボタン(黒/青/緑/赤)
  - 2行目: 太さ選択ボタン(細/中/太)
  - 3行目: [消しゴム] ボタン, [画面消去] ボタン

## 7. 将来的な拡張要件(提案)

- 描画の Undo / Redo 機能
- 画像保存および共有機能
- 消しゴムモードを視覚的に分かりやすくするトグル表示
- 色や太さのカスタム選択(カラーピッカー/スライダー導入)

## 8. 制約条件

- MIT App Inventor 2 で開発
- 外部拡張(.aix)は使用しない
- インターネットや位置情報の権限は不要

## 9. 品質保証

- 動作確認: Android 実機でのテスト
- 正常系テスト: 色/太さ選択、描画、消去操作が正しく動作すること
- 異常系テスト: 高速なタッチ操作や多指操作でも動作が破綻しないこと

SwiftUIプログラミング

プロンプト

この要件定義書に基づいてSwiftUIのコードを書いて。初心者にも何をしているかわかるように、また、App Inventorアプリとの対応関係がわかるように、詳しいコメントをつけて。

返答

了解!要件定義書の機能に対応する SwiftUI 実装を、App Inventor(AI2)のコンポーネント/ブロックとの対応関係が分かるように、丁寧なコメント付きでまとめました。
以下の単一ファイル(ContentView.swift)を Xcode の SwiftUI プロジェクトに追加すれば、そのまま動作します(iOS 15+ を想定)。

//
//  ContentView.swift
//
//  DoodlePlus (SwiftUI port)
//  - MIT App Inventor 2 版の「Canvas + 色選択 + 太さ選択 + 消しゴム + 全消去」をSwiftUIで再現
//  - 初心者向けに、できるだけ丁寧にコメントしています。
//  - App Inventor のコンポーネント/ブロック対応をコード中に明記。
//  - 透明消去(アルファ抜き)ではなく「白で上書きする」方式の消しゴムで、AI2の挙動に近づけています。
//    (※本格的な透明消去をしたい場合は Core Graphics のブレンドモード destinationOut などの応用が必要)
//

import SwiftUI

// MARK: - モデル定義(AI2で言うところの「変数」や「状態」)
//
// App Inventor 対応:
// - PaintColor(Canvasの描画色)→ selectedColor
// - LineWidth   (線の太さ)    → selectedWidth
// - 消しゴムモード               → isEraser
// - 描いた線の履歴               → strokes(各ストロークは points の配列)
//

/// 線1本(ストローク)を表すモデル
struct Stroke: Identifiable {
    let id = UUID()
    var points: [CGPoint]     // 線を構成する点列(指でなぞった座標)
    var color: Color          // 線の色(消しゴムなら Color.white)
    var lineWidth: CGFloat    // 線の太さ
}

/// アプリ全体の状態
final class DrawingState: ObservableObject {
    // 現在の選択色(AI2: Canvas.PaintColor)
    @Published var selectedColor: Color = .black
    // 現在の線の太さ(AI2: Canvas.LineWidth)
    @Published var selectedWidth: CGFloat = 6
    // 消しゴムモード(AI2: 「消しゴムボタン選択」プロシージャで true/false を切替)
    @Published var isEraser: Bool = false

    // これまでに描いた全ストローク(AI2: DrawLine を積み重ねるイメージ)
    @Published var strokes: [Stroke] = []
    // ドラッグ中の「現在のストローク」(指を離したら strokes に確定追加)
    @Published var currentStroke: Stroke? = nil

    // 画面全消去(AI2: Canvas.Clear)
    func clear() {
        strokes.removeAll()
        currentStroke = nil
    }
}

// MARK: - SwiftUI 版 Canvas(AI2: Canvas コンポーネントに相当)
//
// - SwiftUI の Canvas/Path を使って、strokes と currentStroke を描画します。
// - App Inventor の Canvas.DrawLine(block) 相当の処理は、points を連結して Path にしています。
//
struct DrawingCanvas: View {
    @ObservedObject var state: DrawingState

    var body: some View {
        GeometryReader { geo in
            ZStack {
                // 背景は白(AI2: Canvas の BackgroundColor に相当)
                Color.white
                    .ignoresSafeArea()

                // これまでに描いたストロークを全部描画
                ForEach(state.strokes) { stroke in
                    Path { path in
                        guard let first = stroke.points.first else { return }
                        path.move(to: first)
                        for p in stroke.points.dropFirst() {
                            path.addLine(to: p)
                        }
                    }
                    .stroke(stroke.color, lineWidth: stroke.lineWidth)
                }

                // ドラッグ中のストロークもプレビュー表示
                if let stroke = state.currentStroke {
                    Path { path in
                        guard let first = stroke.points.first else { return }
                        path.move(to: first)
                        for p in stroke.points.dropFirst() {
                            path.addLine(to: p)
                        }
                    }
                    .stroke(stroke.color, lineWidth: stroke.lineWidth)
                }
            }
            // ジェスチャ:指でなぞる → 点を追加 → 指を離したら確定
            // App Inventor 対応:
            //   - Canvas.Dragged(prevX, prevY, currentX, currentY) で DrawLine しているのと同等
            .gesture(
                DragGesture(minimumDistance: 0)
                    .onChanged { value in
                        // ドラッグが始まったら currentStroke を作成(色/太さは現在の選択)
                        if state.currentStroke == nil {
                            let color = state.isEraser ? Color.white : state.selectedColor
                            state.currentStroke = Stroke(points: [value.location], color: color, lineWidth: state.selectedWidth)
                        } else {
                            // すでに作成済みなら座標を追加
                            state.currentStroke?.points.append(value.location)
                        }
                    }
                    .onEnded { value in
                        // 指を離したら確定(strokes に追加)し、currentStroke をクリア
                        if var stroke = state.currentStroke {
                            stroke.points.append(value.location)
                            state.strokes.append(stroke)
                        }
                        state.currentStroke = nil
                    }
            )
        }
    }
}

// MARK: - メインビュー(AI2: Screen1 に相当)
//
// 画面構成(要件/UI要件に基づく)
//  - 上部:描画用 Canvas
//  - 下部:3つの水平行(HStack)
//      1行目:色選択(黒/青/緑/赤)→ PaintColor 切替
//      2行目:太さ選択(細/中/太)→ LineWidth 切替
//      3行目:消しゴムトグル / 画面消去 → isEraser 切替 / Canvas.Clear
//
struct ContentView: View {
    @StateObject private var state = DrawingState()

    // 太さの候補(AI2: 「細/中/太」)
    private let widthOptions: [(label: String, value: CGFloat)] = [
        ("細", 4),
        ("中", 8),
        ("太", 14)
    ]

    // 色の候補(AI2: 「黒/青/緑/赤」)
    private let colorOptions: [(label: String, value: Color)] = [
        ("黒", .black),
        ("青", .blue),
        ("緑", .green),
        ("赤", .red)
    ]

    var body: some View {
        VStack(spacing: 0) {
            // 1) Canvas 領域(要件: 画面の大部分)
            DrawingCanvas(state: state)
                .overlay(alignment: .topLeading) {
                    // シンプルなタイトル(AI2: Screen1.Title)
                    Text("DoodlePlus")
                        .font(.headline)
                        .padding(8)
                        .background(.ultraThinMaterial)
                        .cornerRadius(8)
                        .padding(8)
                        .accessibilityHidden(true)
                }

            Divider()

            // 2) 下部パネル:3段構成
            VStack(spacing: 8) {
                // --- 行1: 色選択(AI2: 色ボタン群 + 「色ボタン選択/リセット」プロシージャに対応)---
                controlRow(title: "色", content: {
                    HStack {
                        ForEach(colorOptions, id: \.label) { opt in
                            Button {
                                // 色選択:PaintColor を更新、かつ消しゴムモードは OFF
                                state.selectedColor = opt.value
                                state.isEraser = false
                            } label: {
                                HStack(spacing: 6) {
                                    Circle()
                                        .fill(opt.value)
                                        .frame(width: 18, height: 18)
                                    Text(opt.label)
                                    // 選択中マーク(AI2: チェック記号の代替として表示)
                                    if !state.isEraser && state.selectedColor.description == opt.value.description {
                                        Image(systemName: "checkmark")
                                    }
                                }
                                .padding(.horizontal, 10)
                                .padding(.vertical, 8)
                                .background(
                                    // 選択中は控えめに強調
                                    (!state.isEraser && state.selectedColor.description == opt.value.description) ?
                                        Color.secondary.opacity(0.15) : Color.clear
                                )
                                .cornerRadius(10)
                            }
                            .accessibilityLabel(Text("色 \(opt.label)"))
                        }
                    }
                })

                // --- 行2: 太さ選択(AI2: 太さボタン群 + 「太さボタン選択/リセット」プロシージャに対応)---
                controlRow(title: "太さ", content: {
                    HStack {
                        ForEach(widthOptions, id: \.label) { opt in
                            Button {
                                state.selectedWidth = opt.value
                            } label: {
                                HStack(spacing: 8) {
                                    // 太さプレビュー
                                    Capsule()
                                        .frame(width: 28, height: max(4, opt.value / 1.6))
                                    Text(opt.label)
                                    if state.selectedWidth == opt.value {
                                        Image(systemName: "checkmark")
                                    }
                                }
                                .padding(.horizontal, 10)
                                .padding(.vertical, 8)
                                .background(
                                    (state.selectedWidth == opt.value) ?
                                        Color.secondary.opacity(0.15) : Color.clear
                                )
                                .cornerRadius(10)
                            }
                            .accessibilityLabel(Text("太さ \(opt.label)"))
                        }
                    }
                })

                // --- 行3: ユーティリティ(AI2: 消しゴム / 画面消去ボタン)---
                controlRow(title: "操作", content: {
                    HStack {
                        // 消しゴム(AI2: 消しゴムボタン選択 → isEraser = true、UI強調)
                        Button {
                            state.isEraser.toggle()
                        } label: {
                            Label("消しゴム", systemImage: state.isEraser ? "eraser.fill" : "eraser")
                                .padding(.horizontal, 12)
                                .padding(.vertical, 10)
                                .background(state.isEraser ? Color.secondary.opacity(0.2) : Color.clear)
                                .cornerRadius(10)
                        }
                        .accessibilityLabel(Text("消しゴム"))
                        .accessibilityHint(Text("オンにすると白い線で上書きして消せます"))

                        Spacer(minLength: 12)

                        // 画面消去(AI2: Canvas.Clear)
                        Button(role: .destructive) {
                            state.clear()
                        } label: {
                            Label("画面消去", systemImage: "trash")
                                .padding(.horizontal, 12)
                                .padding(.vertical, 10)
                                .background(Color.red.opacity(0.12))
                                .cornerRadius(10)
                        }
                        .accessibilityLabel(Text("画面消去"))
                        .accessibilityHint(Text("キャンバスをすべてクリアします"))
                    }
                })
            }
            .padding(12)
            .background(.ultraThinMaterial)
        }
        .preferredColorScheme(.light) // 背景白に合わせた見え方重視(任意)
    }

    // 下部各行のラッパー(タイトル+内容)
    private func controlRow<Content: View>(title: String, @ViewBuilder content: () -> Content) -> some View {
        VStack(alignment: .leading, spacing: 6) {
            Text(title)
                .font(.subheadline).bold()
                .accessibilityHidden(true)
            content()
        }
    }
}

// MARK: - プレビュー
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .previewDevice("iPhone 15")
    }
}
App Inventor(AI2)との対応表(抜粋)
App Inventor	SwiftUI 実装	補足
Screen1	ContentView	画面のメインビュー
Canvas	DrawingCanvas(GeometryReader + Path/ZStack)	背景白・ストローク配列を描画
Canvas.Dragged	DragGesture.onChanged / onEnded	ドラッグ座標を currentStroke.points に追加・確定
Canvas.DrawLine	Path.addLine(to:)	点列から線を生成
Canvas.Clear	state.clear()	strokes.removeAll()
色ボタン(黒/青/緑/赤)	colorOptions + ボタン群	押下で selectedColor セット&消しゴム解除
太さボタン(細/中/太)	widthOptions + ボタン群	押下で selectedWidth セット
消しゴム	state.isEraser.toggle()	消しゴムON時は Color.white で上書き
選択中のチェック表示	Image(systemName:"checkmark")	状態に応じて表示
使い方メモ(初心者向け)

ボタンで 色 と 太さ を選んで、上の白いキャンバスを指でなぞると線が描けます。

消しゴム を押すと白い線で上書きでき、描いた線を消す感覚になります(背景が白のため)。

画面消去 でキャンバスをまっさらな状態に戻せます。

透明消去(背景が透ける消しゴム)にしたい場合は、Canvas レイヤーを CALayer / Core Graphics で管理し、ブレンドモード(destinationOut 等)を使う設計に変更すれば実現できます。

必要なら、この SwiftUI 版に Undo/Redo や 画像保存/共有 を追加した発展版コードもすぐ出せます。どう拡張したいか教えてください!

動作確認

iPhoneアプリを作るにはMacで動くXcodeという開発環境が必要です。ここではmacOS 13.7.5上でXcode 15.2を使い、動作確認にはiOSシミュレータ(iOS 15.2)を使いました。

公開済みAI関連アプリチュートリアル:シルバー会員特典

ゴールド会員特典はAIが中心

初心者にはこちらも

アプリ開発,ノート

考えたことメモ > App Inventor nb202bでiPhoneアプリを作ってみた

2025年8月25日にMITで公開されたApp Inventor nb202bでベータではありますが、iOSアプリのビルド機能が追加されたのでうまく動くか実験してみました。

日本語化プロジェクトのサーバーではまだiOSアプリのビルド機能はサポートしていません。

https://appinventor.mit.edu/ai2/ReleaseNotes

試したアプリは以下の通りです。

自分のApp InventorアプリをiPhoneでビルドしてみたい人は会員専用コミュニティフォーラム:ご意見・ご要望コーナーから連絡ください。

準備

App InventorでiOSアプリをビルドするにはプロビジョニングプロファイルファイルを作る必要があり、そのためには年額$99のApple Developer Programへの加入が必要です。私たちはApple Developer Programに加入済みなので、https://ai2.appinventor.mit.edu/reference/other/build-ios-apps.html に従ってプロビジョニングプロファイルファイルを作りました。

四則演算電卓アプリ

動作状況

  • ビルド自体は正常終了。
  • デザインがまるで違う。
  • ボタンが動作しない。

公開済みAI関連アプリチュートリアル:シルバー会員特典

ゴールド会員特典はAIが中心

初心者にはこちらも

ChatGPT,アプリ開発,ノート,生成AI

考えたことメモ > App InventorからJavaScriptへどうやって移行するのか?

Google Gemini 2.5 Pro Deep Researchによれば、「一度App Inventorで作ったアプリをPythonで再現してみるというアプローチは、目的が明確なため非常に効果的な学習方法です」とのことでした。これは、AI時代における実践的なプログラミング学習の一例といえます。

Pythonは文法が比較的シンプルで、初心者にも扱いやすい言語です。AI開発、データ分析、Webサイト制作、作業の自動化など、幅広い分野に応用できる点が特徴です。

一方、JavaScriptPythonにならんで非常にポピュラーなプログラミング言語で、ウェブページで使われるのでウェブサイトを作るには必須と言えるプログラミング言語です。node.jsを使えばサーバーサイドの開発もできるので、ウェブアプリの開発にはこれ一つ知っていれば十分です。

App InventorからPythonへどうやって移行するのか?」でChatGPT-4oがApp Inventorのaiaファイルを直接読み込み、アプリの要件定義書を書いてそのまま動作するPythonコードを書けました。

ここではChatGPT-5を使ってApp Inventorのaiaファイルを直接読み込み、アプリの要件定義書を書いてJavaScriptコードを書いてみます。

出発点のApp Inventorアプリは「オンデマンドアカデミー」で紹介されている カラフルお絵かきアプリです。このアプリは、基本的なUIの構成やイベント処理の理解に適しています。

aiaファイルの読み込みと解析

要件定義書作成

JavaScriptプログラミング

動作確認

サマリー

ChatGPT-5はApp Inventorのaiaファイルを直接読み込み、アプリの要件定義書を書いてそのまま動作するJavaScriptコードを書けました。

aiaファイルの読み込みと解析

プロンプト

あなたはApp Inventor 2の内部構造に精通したプロのソフトウェアエンジニアです。このaiaファイルを完全に解析してください。

返答

了解です。アップロードいただいた **DoodlePlus.aia** を、中身(.scm / .bky / project.properties)まで読み解いて、構造・ロジック・設定を“丸裸”にしてご報告します。以下は App Inventor 2 の内部表現(JSON/Blockly XML)をベースにした、技術者向けの完全解析です。

# プロジェクト概要

* アプリ名: **DoodlePlus**(画面タイトル: **お絵かきアプリ+**)
* スクリーン数: **1(Screen1)**
* 作成/保存タイムスタンプ: **Sat Apr 12 01:36:28 UTC 2025**
* バージョン: **versionCode=1 / versionName=1.0**
* レイアウト: **sizing=Responsive**, **ActionBar=True**, **Theme=AppTheme.Light.DarkActionBar**
* 既定の権限/設定: **useslocation=False**, **defaultfilescope=App**, **showlistsasjson=True**
* 配色(プロジェクト設定)

  * Primary: `&HFF3F51B5`
  * Primary Dark: `&HFF303F9F`
  * Accent: `&HFFFF4081`

# 画面とUI階層(Screen1)

Screen1 直下に下記 12 コンポーネントが存在します。

* **キャンバス1**(Canvas): `Width=-2`, `Height=-2` → いずれも **Fill Parent**
* **水平配置1**(HorizontalArrangement)
  ├─ ボタン **黒**(BackgroundColor `#000000`, FontSize 10)
  ├─ ボタン **青**(`#0000FF`, FontSize 10)
  ├─ ボタン **グリーン**(`#00FF00`, FontSize 10)
  └─ ボタン **赤**(`#FF0000`, FontSize 10)
* **水平配置2**
  ├─ ボタン **細**(Text=「細」)
  └─ ボタン **中**(Text=「中」)
* **水平配置3**
  ├─ ボタン **画面消去**(Text=「画面消去」)
  └─ ボタン **消しゴム**(Text=「消しゴム」)

> 補足: Canvas は全面に描画。3 つの水平配置がパレット(色/太さ/アクション)になっています。

# グローバル変数(global\_declaration)

* **選択マーク** : 文字列 `"✔︎"`
* **選択色ボタン** : Button 参照(初期値 **黒**)
* **色ボタンリスト** : `[黒, 青, グリーン, 赤]`
* **ペン太さ** : Button 参照(初期値 **細**)
* **太さボタンリスト** : `[細, 中]`
* **太さリスト** : `[3.0, 5.0]`  ← 太さボタンの位置と対応
* **消しゴム** : `false`(ブール)

# 手続き(procedures)

1. **色ボタンリセット**

   * `色ボタンリスト` を全走査し、各ボタンの **Text を空文字**にする(✔︎マーク消去)。

2. **色ボタン選択(ボタン)**

   * 以前の **選択色ボタン** の **TextColor を黒**に戻す。
   * 引数 **ボタン** の **TextColor を白**にし、\*\*Text に「✔︎」\*\*を表示。
   * **選択色ボタン ← ボタン** に更新。
   * **キャンバス1.PaintColor ← 選択色ボタン.BackgroundColor** に設定。
   * (実装全体として)色選択時には **消しゴム ← false** に戻す挙動が組まれています。

3. **太さボタンリセット**

   * `太さボタンリスト` を全走査し、各ボタンの **TextColor を黒**に戻す。

4. **太さボタン選択(ボタン)**

   * **ボタン.TextColor ← 赤**(選択強調)。
   * **ペン太さ ← ボタン** に更新。
   * `太さボタンリスト` 内での **ペン太さ** の位置に基づき、`太さリスト` から対応値を取得し、
     **キャンバス1.LineWidth** に反映(`細→3.0px`, `中→5.0px`)。

5. **消しゴムボタン選択**

   * **消しゴム** をトグル。

     * ON 時: **キャンバス1.PaintColor ← 白**。
     * OFF 時: **キャンバス1.PaintColor ← 選択色ボタン.BackgroundColor** に戻す。

# イベント駆動フロー(重要)

* **Screen1.Initialize**

  * `色ボタン選択(選択色ボタン)` を最初に呼び(既定は **黒**)、
  * `太さボタン選択(ペン太さ)` を次に呼ぶ(既定は **細**)。

* **任意の Button.Click(Any Button)**
  クリックされた **component** に応じて分岐:

  1. `色ボタンリスト` に含まれる →
     **色ボタンリセット** → **消しゴム ← false** → **色ボタン選択(component)**
  2. `太さボタンリスト` に含まれる →
     **太さボタンリセット** → **太さボタン選択(component)**
  3. **画面消去** → **キャンバス1.Clear()**
  4. **消しゴム** → **消しゴムボタン選択()**

* **キャンバス1.Dragged(prevX, prevY, currentX, currentY, ...)**

  * **キャンバス1.DrawLine(prevX, prevY, currentX, currentY)**
    (線の色=`PaintColor`、太さ=`LineWidth` はボタン操作で設定済み)

# ブロック統計(Screen1.bky)

* 総ブロック数: **126**
* 代表的なブロック種別(上位)

  * `lexical_variable_get` 34 / `component_component_block` 14 / `component_set_get` 14
  * `global_declaration` 7 / `procedures_callnoreturn` 7 / `procedures_defnoreturn` 5
  * 制御系 `controls_if` 4 / `controls_forEach` 2
  * 色定数: `color_black` 3, `color_white` 2, `color_red` 2 など
* コンポーネントメソッド呼び出し

  * **Canvas.DrawLine**(ドラッグ時の描画)
  * **Canvas.Clear**(「画面消去」)

# 擬似コード(挙動イメージ)

```text
On Initialize:
  色ボタン選択(選択色ボタン=黒)
  太さボタン選択(ペン太さ=細)

Any Button.Click(component):
  if component ∈ 色ボタンリスト:
    色ボタンリセット()
    消しゴム := false
    色ボタン選択(component)          // ✔︎を付けて PaintColor を更新
  else if component ∈ 太さボタンリスト:
    太さボタンリセット()
    太さボタン選択(component)        // TextColor=赤, LineWidth を更新
  else if component == 画面消去:
    Canvas.Clear()
  else if component == 消しゴム:
    消しゴムボタン選択()             // 白/元色 へ PaintColor 切替

Canvas.Dragged(prevX, prevY, x, y):
  Canvas.DrawLine(prevX, prevY, x, y)
```

# 仕様上のポイント/注意

* **色選択と消しゴムは排他**:色ボタンを押すと必ず **消しゴム=false** に戻り、色の BackgroundColor が `PaintColor` に復帰します。
* **太さは 2 段階**(3px / 5px)。必要に応じて `太さボタンリスト` と `太さリスト` に要素を追加すれば拡張容易。
* **選択状態の可視化**:

  * 色…✔︎(Text)と TextColor(白/黒)で表現
  * 太さ…Button の TextColor(赤)で表現
* **永続化や共有は未実装**:描画の保存(画像出力/共有)、Undo/Redo、ズームなどはなし。

# 改善提案(実装のしやすさ順)

1. **太さ段階の拡張**:`太さボタンリスト` と `太さリスト` に「太」「極太」などを追加。
2. **Undo/Redo**:ドラッグで引いた線分の履歴(座標+色+太さ)をスタックに積む設計。
3. **保存/共有**:`Canvas.Save`(拡張/外部コンポーネント)や `ActivityStarter` 連携で画像保存・共有。
4. **筆圧/スムージング**:ドラッグ点列の間引きや補間、丸めを入れて滑らかなストロークに。
5. **UI アクセシビリティ**:選択強調をテキスト色だけに依存せず、アウトラインやアイコン化で視認性UP。
6. **消しゴムの太さ別管理**:消しゴム使用中の LineWidth を色ペンとは別に持つと使い勝手向上。

# 解析アーカイブ(生データ)

必要であれば、内部ファイルを直接ご確認いただけます:

* [Screen1.scm(JSON 抜粋テキスト)](sandbox:/mnt/data/Screen1_scm.txt)
* Blockly XML(抜粋)

  * [Screen1.Initialize イベント](sandbox:/mnt/data/event_init.xml)
  * [Any Button.Click イベント](sandbox:/mnt/data/event_any_button_click.xml)
  * [手続き: 色ボタン選択](sandbox:/mnt/data/proc_color_select.xml)
  * [手続き: 太さボタン選択](sandbox:/mnt/data/proc_thick_select.xml)
  * [手続き: 消しゴムボタン選択](sandbox:/mnt/data/proc_erasure.xml)
* コンポーネント一覧(CSV): [components.csv](sandbox:/mnt/data/components.csv)

---

さらに深掘り(たとえば「Undo をこう設計して」「太さを 4 段階にしてブロックを出して」等)も、そのままこちらで具体ブロックをご提案できます。どこから手を付けるか、希望があれば教えてください!

要件定義書作成

プロンプト

このアプリの要件定義書をMarkdownで書いて

返答

了解しました。先ほど解析した **DoodlePlus.aia** の内容を基に、ソフトウェアエンジニアが利用できる形式の **要件定義書(Markdown)** をまとめました。

---

# 要件定義書

## プロジェクト概要

* **アプリ名**: DoodlePlus
* **概要**: スマートフォンやタブレット上で指先を用いて自由にお絵かきできるアプリ。色や線の太さを変更でき、消しゴムや画面消去機能を備える。
* **対象プラットフォーム**: Android(MIT App Inventor 2 ベース)
* **バージョン**: 1.0

---

## 目的

* 子供から大人まで誰でも直感的に絵を描ける「シンプルなお絵かきアプリ」を提供する。
* 学習や創作の補助ツールとして利用可能。

---

## 機能要件

### 描画機能

* 指のドラッグ操作により線を描画できる。
* 線の色と太さをユーザーが選択可能。

### 色選択

* 黒、青、緑、赤の 4 色から選択可能。
* 選択中の色は ✔︎ マークで可視化される。
* 色ボタンを選択した際、消しゴムモードは解除される。

### 太さ選択

* 細(3px)、中(5px)の 2 段階。
* 選択中の太さは赤文字で表示される。

### 消しゴム機能

* ON/OFF 切り替え可能。
* ON 時はキャンバスの背景色(白)で描画し、既存の線を消せる。
* OFF 時は直前に選択した色へ戻る。

### 画面消去

* ワンタップでキャンバス全体をクリアする。

---

## 非機能要件

* **UI**: シンプルで直感的。文字よりも色やアイコンを重視。
* **操作性**: 子供でも使える直感的な操作。
* **パフォーマンス**: 描画時に遅延が発生しないこと。
* **可搬性**: Android スマホ/タブレット両対応。

---

## UI設計

### 画面構成

1. **キャンバス領域**

   * 画面全体に広がる描画スペース。

2. **色選択バー(水平配置1)**

   * 黒、青、緑、赤のボタン。

3. **太さ選択バー(水平配置2)**

   * 細、中のボタン。

4. **操作バー(水平配置3)**

   * 「画面消去」ボタン。
   * 「消しゴム」ボタン。

---

## データ要件

* 永続化なし(保存機能なし)。
* アプリ起動ごとにキャンバスは初期化される。

---

## 制約条件

* MIT App Inventor 2 による開発。
* デバイス依存: Android 4.4 以上を想定。

---

## 今後の拡張要件(任意)

* 線の太さ段階の追加(太、極太)。
* 描画内容の保存(端末ストレージ/共有)。
* Undo/Redo 機能。
* カラーパレットによる色追加。

---

---

この文書は「現状の DoodlePlus.aia の実装仕様」=「要件定義書」としてまとめています。

👉 ご希望があれば、このまま **設計書(UIフローや処理シーケンス図付き)** に発展させることも可能です。やりますか?

JavaScriptプログラミング

プロンプト

この要件定義書に基づいてJavaScriptのコードを書いて。初心者にも何をしているかわかるように、また、App Inventorアプリとの対応関係がわかるように、詳しいコメントをつけて。

返答

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>DoodlePlus (JavaScript 版)</title>
  <style>
    /* =============================
       シンプルな見た目のためのCSS
       ============================= */
    :root {
      --primary: #3f51b5; /* App Inventor プロジェクト設定のPrimary色に合わせた雰囲気 */
      --accent: #ff4081;
      --bg: #ffffff;
      --text: #222;
      --muted: #888;
    }
    * { box-sizing: border-box; }
    html, body { height: 100%; margin: 0; background: var(--bg); color: var(--text); font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans JP", "Hiragino Kaku Gothic ProN", Meiryo, sans-serif; }
    main { display: grid; grid-template-rows: auto 1fr; height: 100%; }
    header { padding: .5rem .75rem; border-bottom: 1px solid #eee; display: flex; align-items: center; gap: .75rem; }
    header h1 { font-size: 1rem; font-weight: 600; margin: 0; color: var(--primary); }

    /* ツールバー(App Inventorの「水平配置」に相当) */
    #toolbar { display: flex; gap: .75rem; padding: .5rem; border-bottom: 1px solid #eee; flex-wrap: wrap; }
    .group { display: flex; gap: .5rem; align-items: center; }
    .group-label { font-size: .85rem; color: var(--muted); }

    /* ボタン(App InventorのButtonに相当) */
    button { appearance: none; border: 1px solid #ddd; background: #fff; color: #222; padding: .4rem .6rem; border-radius: .5rem; cursor: pointer; font-size: .95rem; }
    button:focus { outline: 2px solid #d0d8ff; outline-offset: 2px; }
    button.selected { border-color: var(--primary); box-shadow: 0 0 0 2px rgba(63,81,181,0.12) inset; }

    /* 色ボタンは背景色で色を示す。選択状態はチェックマークで表現(App InventorのTextに"✔︎"を出すのに対応) */
    .color-btn { width: 44px; height: 32px; border-radius: .5rem; position: relative; }
    .color-btn .check { position: absolute; right: 6px; top: 4px; font-size: 16px; font-weight: 700; color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,.35); display: none; }
    .color-btn.selected .check { display: block; }

    /* 太さボタンは選択中を赤文字(App InventorのTextColor=赤)で表す */
    .thick-btn.selected { color: #d32f2f; font-weight: 700; }

    /* アクションボタン */
    #eraser.selected { background: #fafafa; border-color: #bbb; }
    #clear { border-color: #ffe0e0; }

    /* キャンバス(App InventorのCanvasに相当) */
    #stage-wrap { position: relative; }
    #stage { width: 100%; height: 100%; display: block; background: #fff; touch-action: none; /* ジェスチャーでのスクロール/ズームを抑制 */ }

    /* 小さなヘルプ */
    footer { padding: .35rem .75rem; font-size: .8rem; color: var(--muted); border-top: 1px solid #eee; }
  </style>
</head>
<body>
  <main>
    <!-- App Inventor: Screen1.Title 相当 -->
    <header>
      <h1>お絵かきアプリ+(DoodlePlus / JS版)</h1>
      <span style="font-size:.85rem;color:#888">App Inventorのブロック構成をJavaScript実装に写経</span>
    </header>

    <!-- App Inventor: 水平配置1/2/3 をまとめたツールバー -->
    <div id="toolbar" role="toolbar" aria-label="Drawing toolbar">
      <!-- 色ボタン群(水平配置1) -->
      <div class="group" id="colors" aria-label="colors">
        <span class="group-label">色:</span>
        <button class="color-btn" id="btn-black"  data-color="#000000" title="黒" aria-pressed="true" style="background:#000000"><span class="check">✔︎</span></button>
        <button class="color-btn" id="btn-blue"   data-color="#0000ff" title="青" style="background:#0000ff"><span class="check">✔︎</span></button>
        <button class="color-btn" id="btn-green"  data-color="#00ff00" title="グリーン" style="background:#00ff00"><span class="check">✔︎</span></button>
        <button class="color-btn" id="btn-red"    data-color="#ff0000" title="赤" style="background:#ff0000"><span class="check">✔︎</span></button>
      </div>

      <!-- 太さボタン群(水平配置2) -->
      <div class="group" id="thickness" aria-label="thickness">
        <span class="group-label">太さ:</span>
        <button class="thick-btn" id="btn-thin"   data-width="3">細</button>
        <button class="thick-btn" id="btn-medium" data-width="5">中</button>
      </div>

      <!-- アクション群(水平配置3) -->
      <div class="group" id="actions" aria-label="actions">
        <button id="clear" title="画面消去 (Canvas.Clear)">画面消去</button>
        <button id="eraser" title="消しゴム (白で描く)">消しゴム</button>
      </div>
    </div>

    <!-- キャンバス領域(Canvas) -->
    <div id="stage-wrap">
      <canvas id="stage"></canvas>
    </div>

    <footer>
      ヒント: ドラッグして線を描画。色を押すと消しゴムは解除されます(App Inventorの仕様を踏襲)。
    </footer>
  </main>

  <script>
    // =============================================================
    //  App Inventorの状態と手続きをJavaScriptで表現
    // =============================================================
    // ▼App Inventorでのグローバル変数に相当
    //   - 選択色ボタン(Button参照)
    //   - 色ボタンリスト
    //   - ペン太さ(Button参照)
    //   - 太さボタンリスト
    //   - 太さリスト [3.0, 5.0]
    //   - 消しゴム(boolean)

    const colorButtons = [
      document.getElementById('btn-black'),
      document.getElementById('btn-blue'),
      document.getElementById('btn-green'),
      document.getElementById('btn-red')
    ];
    let selectedColorButton = colorButtons[0]; // 既定は「黒」

    const thicknessButtons = [
      document.getElementById('btn-thin'),
      document.getElementById('btn-medium')
    ];
    const thicknessList = [3, 5]; // App Inventor: 太さリスト [3.0, 5.0]
    let selectedThicknessButton = thicknessButtons[0]; // 既定は「細」

    let eraser = false; // 消しゴムモードかどうか

    // ▼Canvas関連
    const canvas = document.getElementById('stage');
    const ctx = canvas.getContext('2d');

    // 高DPIでもクッキリ描けるように、CSSサイズと内部ピクセルを分けて設定
    function resizeCanvasToDisplaySize() {
      const dpr = window.devicePixelRatio || 1;
      const rect = canvas.getBoundingClientRect();
      const width = Math.floor(rect.width * dpr);
      const height = Math.floor(rect.height * dpr);
      if (canvas.width !== width || canvas.height !== height) {
        // 既存の描画は消えるので、必要ならイメージを保持してからリサイズしてください。
        const img = ctx.getImageData(0, 0, canvas.width, canvas.height);
        canvas.width = width;
        canvas.height = height;
        ctx.putImageData(img, 0, 0); // 単純復元(拡大縮小はしない)
        ctx.scale(dpr, dpr); // 以降の描画はCSSピクセル基準
      }
      // 背景が透明になっている場合、白で塗りつぶしてApp Inventorの見た目に合せる
      // (初回のみ塗る・クリア時は別処理)
    }

    // レイアウト: ツールバーを除いた残りの領域いっぱいにキャンバスを広げる
    function layout() {
      const headerH = document.querySelector('header').offsetHeight;
      const toolbarH = document.getElementById('toolbar').offsetHeight;
      const footerH = document.querySelector('footer').offsetHeight;
      const wrap = document.getElementById('stage-wrap');
      wrap.style.height = `calc(100vh - ${headerH + toolbarH + footerH}px)`;
      resizeCanvasToDisplaySize();
    }

    window.addEventListener('resize', layout);

    // =============================================================
    //  App Inventor: 手続き(procedures)の移植
    // =============================================================
    // 手続き: 色ボタンリセット(全ボタンから✔︎を外す)
    function resetColorButtons() {
      colorButtons.forEach(btn => btn.classList.remove('selected'));
      colorButtons.forEach(btn => btn.setAttribute('aria-pressed', 'false'));
    }

    // 手続き: 色ボタン選択(ボタン)
    function selectColorButton(btn) {
      // App Inventor: 選択色ボタン.TextColor=白 相当 → ここではUI強調として✔︎表示
      btn.classList.add('selected');
      btn.setAttribute('aria-pressed', 'true');
      selectedColorButton = btn;

      // キャンバスの線色(PaintColor)を更新
      updateStrokeStyle();
    }

    // 手続き: 太さボタンリセット(全ボタンのTextColor=黒 相当)
    function resetThicknessButtons() {
      thicknessButtons.forEach(btn => btn.classList.remove('selected'));
    }

    // 手続き: 太さボタン選択(ボタン)
    function selectThicknessButton(btn) {
      btn.classList.add('selected'); // App Inventor: TextColor=赤 相当
      selectedThicknessButton = btn;
      // LineWidthを更新
      updateLineWidth();
    }

    // 手続き: 消しゴムボタン選択(トグル)
    function toggleEraser() {
      eraser = !eraser;
      document.getElementById('eraser').classList.toggle('selected', eraser);
      updateStrokeStyle(); // PaintColorを白 or 選択色へ
    }

    // 付帯: 線色を状態に合わせて更新
    function updateStrokeStyle() {
      if (eraser) {
        ctx.strokeStyle = '#ffffff'; // App Inventor: 白で上書き
      } else {
        ctx.strokeStyle = selectedColorButton.dataset.color;
      }
    }

    // 付帯: 線の太さを状態に合わせて更新
    function updateLineWidth() {
      const w = Number(selectedThicknessButton.dataset.width) || thicknessList[0];
      ctx.lineWidth = w;
      ctx.lineCap = 'round';
      ctx.lineJoin = 'round';
    }

    // 付帯: 画面消去(Canvas.Clear)
    function clearCanvas() {
      // 背景を白で塗りつぶし、App InventorのCanvas.Clearに近い見た目に
      ctx.save();
      ctx.setTransform(1,0,0,1,0,0); // 変換を一時的にリセット
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      // 白背景
      ctx.fillStyle = '#ffffff';
      const rect = canvas.getBoundingClientRect();
      ctx.fillRect(0, 0, rect.width, rect.height);
      ctx.restore();
    }

    // =============================================================
    //  App Inventor: Screen1.Initialize 相当(初期化)
    // =============================================================
    function initialize() {
      layout();
      // 既定の選択状態をApp Inventorと同じにする
      resetColorButtons();
      selectColorButton(selectedColorButton); // 黒

      resetThicknessButtons();
      selectThicknessButton(selectedThicknessButton); // 細(3px)

      // 背景を白で初期化
      clearCanvas();
    }

    // =============================================================
    //  App Inventor: Any Button.Click 相当のイベント分岐
    // =============================================================
    function onButtonClick(e) {
      const el = e.target.closest('button');
      if (!el) return;

      if (colorButtons.includes(el)) {
        // 色ボタン: 色ボタンリセット → 消しゴム=false → 色ボタン選択
        resetColorButtons();
        eraser = false;
        document.getElementById('eraser').classList.remove('selected');
        selectColorButton(el);
        return;
      }

      if (thicknessButtons.includes(el)) {
        // 太さボタン: 太さボタンリセット → 太さボタン選択
        resetThicknessButtons();
        selectThicknessButton(el);
        return;
      }

      if (el.id === 'clear') {
        clearCanvas();
        return;
      }

      if (el.id === 'eraser') {
        toggleEraser();
        return;
      }
    }

    document.getElementById('toolbar').addEventListener('click', onButtonClick);

    // =============================================================
    //  App Inventor: Canvas.Dragged(prevX, prevY, currentX, currentY)
    //  → JSではPointer Eventsで実装
    // =============================================================
    let drawing = false;
    let last = { x: 0, y: 0 };

    function toCanvasCoords(evt) {
      const rect = canvas.getBoundingClientRect();
      const x = (evt.clientX - rect.left);
      const y = (evt.clientY - rect.top);
      return { x, y };
    }

    function pointerDown(evt) {
      drawing = true;
      last = toCanvasCoords(evt);
    }

    function pointerMove(evt) {
      if (!drawing) return;
      const p = toCanvasCoords(evt);
      // Canvas.DrawLine(prevX, prevY, x, y) 相当
      ctx.beginPath();
      ctx.moveTo(last.x, last.y);
      ctx.lineTo(p.x, p.y);
      ctx.stroke();
      last = p;
    }

    function pointerUp() {
      drawing = false;
    }

    canvas.addEventListener('pointerdown', pointerDown);
    canvas.addEventListener('pointermove', pointerMove);
    window.addEventListener('pointerup', pointerUp);

    // スクロールなどで外に出た場合の保険
    canvas.addEventListener('pointerleave', pointerUp);

    // =============================================================
    // 起動
    // =============================================================
    initialize();
  </script>
</body>
</html>
できました!JS版の実装をキャンバスに置きました。

App Inventorの Screen1 / Canvas / 水平配置 / Button / 手続き を、それぞれ HTML要素 / <canvas> / ツールバー群 / <button> / JS関数 に対応づけ、ブロック名どおりの処理と詳しい日本語コメントを入れています。

そのままブラウザで動きます。色ボタンで✔︎が出て、太さは選択で赤表示、消しゴムは白で上書き、画面消去は白塗りクリアです。

他に欲しい拡張(保存・Undo/Redo・太さ追加・色数拡張・モバイル最適化など)があれば、この実装をベースにすぐに組み込みます。

動作確認

DoodlePlus.htmlに保存しGoogle Chromeで実行してみました。言葉が少し変なところもありますが、動作自体は以下のように問題無いです。

公開済みAI関連アプリチュートリアル:シルバー会員特典

ゴールド会員特典はAIが中心

初心者にはこちらも

ChatGPT,claude,gemini,アプリ開発,ノート,生成AI

考えたことメモ > App InventorからPythonへどうやって移行するのか?

Google Gemini 2.5 Pro Deep Researchによれば、「一度App Inventorで作ったアプリをPythonで再現してみるというアプローチは、目的が明確なため非常に効果的な学習方法です」とのことでした。これは、AI時代における実践的なプログラミング学習の一例といえます。

Pythonは文法が比較的シンプルで、初心者にも扱いやすい言語です。AI開発、データ分析、Webサイト制作、作業の自動化など、幅広い分野に応用できる点が特徴です。

今回は、出発点として「オンデマンドアカデミー」で紹介されている カラフルお絵かきアプリを題材に選びました。このアプリは、基本的なUIの構成やイベント処理の理解に適しており、Pythonでの再構築を目標に据えるにはちょうどよい教材です。

どこまでAIが支援できるかを検討するため、Claude Sonnet 4, Gemini 2.5 Pro, ChatGPT-4oを比較対象に選びました。これらのAIを活用しながら、App InventorアプリをPythonでどう再現していけるのか、段階的に分析していきます。

aiaファイルの読み込みと解析

要件定義書作成とPythonプログラミング

動作確認

サマリー

ChatGPT-4oはApp Inventorのaiaファイルを直接読み込み、アプリの要件定義書を書いてそのまま動作するPythonコードを書けました。

aiaファイルの読み込みと解析

aiaファイルをアップロードして正しく認識できるかをClaude Sonnet 4, Gemini 2.5 Pro, ChatGPT-4oで試してみました。ChatGPT-4oだけが、正しくaiaファイルを解析できました。

Claude Sonnet 4

Gemini 2.5 Pro

ChatGPT-4o

Claude Sonnet 4

aiaファイルのアップロード不可。


Gemini 2.5 Pro

プロンプト

あなたはApp Inventor 2の内部構造に精通したプロのソフトウェアエンジニアです。このaiaファイルを完全に解析してください。

返答

はい、承知いたしました。提供された `DoodlePlus.aia` ファイルを専門的な観点から解析します。

このファイルは、MIT App Inventor 2で作成されたプロジェクトのアーカイブファイルです。`.aia` ファイルは実質的にZIP形式のアーカイブであり、プロジェクトを構成するすべてのファイル(画面デザイン、プログラミングロジック、アセットなど)を含んでいます。

提供された情報から、このプロジェクトの構造と内容を以下のように解析します。

### プロジェクトの概要

* [cite_start]**プロジェクト名**: `DoodlePlus` [cite: 1]
* [cite_start]**作成者アカウント**: `ai_XXXXXXX` [cite: 1]
* [cite_start]**プラットフォーム**: MIT App Inventor 2 [cite: 1]
* **内容の推測**: プロジェクト名に「Doodle」(いたずら書き)とあることから、これは指で画面に絵を描くことができる**お絵かきアプリケーション**であると強く推測されます。「Plus」という接尾辞は、基本的なお絵かき機能に加えて、何らかの追加機能(色の変更、線の太さの調整、保存機能など)が実装されている可能性を示唆しています。

---

### ファイル構造の解析

AIAファイルは、主に以下の3種類のコアファイルで構成されています。このプロジェクトには `Screen1` という名前の画面が少なくとも1つ存在します。

#### 1. `youngandroidproject/project.properties`
[cite_start]このファイルは、プロジェクト全体の設定を定義するプロパティファイルです。 [cite: 1] テキスト形式で、以下のようなキーと値のペアが含まれています。

* `name`: プロジェクト名(この場合は `DoodlePlus`)。
* `versioncode` & `versionname`: アプリのバージョン情報。
* `theme`: アプリケーションの全体的なデザインテーマ(例: "Classic" または "DeviceDefault")。
* `user`: プロジェクトの作成者アカウント(この場合は `ai_tam0130`)。

#### 2. `src/appinventor/ai_tam0130/DoodlePlus/Screen1.scm`
[cite_start]これは、`Screen1` の**UIデザイン**を定義するファイルです。 [cite: 1] SCMは "Scheme" の略ですが、実際にはJSONに似た形式で画面上のコンポーネントの階層と各プロパティを記述しています。

* **役割**: どのコンポーネント(ボタン、ラベル、キャンバスなど)が画面に配置されているか、またそのプロパティ(サイズ、色、テキストなど)がどう設定されているかを定義します。
* **推測されるコンポーネント**: お絵かきアプリであるため、このファイルにはおそらく以下のようなコンポーネントの定義が含まれています。
    * `Canvas`: ユーザーが絵を描くための主要な描画領域。
    * `Button`: 「色変更」「消去」「保存」などの機能を実行するためのボタン。
    * `HorizontalArrangement` / `VerticalArrangement`: ボタンなどのUI要素を整理・配置するためのレイアウトコンポーネント。
    * `Slider`: 線の太さなどを直感的に変更するために使われる可能性があります。

#### 3. `src/appinventor/ai_tam0130/DoodlePlus/Screen1.bky`
[cite_start]これは、`Screen1` の**プログラミングロジック**を定義する最も重要なファイルです。 [cite: 1] GoogleのBlocklyライブラリをベースにしており、ブロックで組まれたプログラムがXML形式で保存されています。

* **役割**: アプリケーションの動作(「いつ」「何が」「どうなるか」)を定義します。例えば、「ボタンがクリックされたら、キャンバスの色を赤に変える」といったロジックが記述されます。
* **推測されるロジック**: このXMLファイルには、以下のようなイベントハンドラやプロシージャが含まれていると考えられます。
    * `when Canvas.Dragged do ...`: キャンバス上で指がドラッグされたときのイベント。この中で `Canvas.DrawLine` ブロックを使い、指の動きに合わせて線を描画する処理が記述されているはずです。
    * `when ColorButton.Click do ...`: 特定の色のボタンがクリックされたときに、`Canvas.PaintColor` プロパティを対応する色に変更する処理。
    * `when ClearButton.Click do ...`: 消去ボタンがクリックされたときに、`Canvas.Clear` メソッドを呼び出してキャンバスを白紙に戻す処理。

---

### 結論

提供された `DoodlePlus.aia` は、`ai_XXXXXX` というユーザーによって作成された、`Screen1` という単一の画面を持つ**インタラクティブなお絵かきアプリケーション**のプロジェクトファイルです。

このプロジェクトは、App Inventor 2の標準的なアーキテクチャに従っており、UIデザイン (`.scm`) とイベント駆動型のロジック (`.bky`) が明確に分離されています。提供されたデータはファイル内容の断片であるため、具体的なコンポーネントのプロパティ値やブロックの組み合わせを完全に復元することはできません。しかし、そのファイル構造と命名規則から、アプリケーションの全体像と主要な機能を専門的に特定することが可能です。

プロンプト

中身を全部詳細に解析して

返答

はい、承知いたしました。
前回の解析に基づき、各ファイルに**通常どのようなコードが記述されているか**を、具体的なサンプルを交えてさらに詳細に解析します。

提供されたファイルの中身はデータが破損しているため直接読み解くことはできませんが、App Inventorのエンジニアとして、その構造から**中身を具体的に復元・推測**することは可能です。

### 🎨 DoodlePlus アプリの全体像

このアプリは、指で絵が描けるキャンバスと、色や線の太さを変更したり、絵を消したりするためのボタン群で構成されていると推測されます。

-----

### \#\# 1. UIデザイン (`Screen1.scm` の詳細解析)

このファイルは、画面の見た目を定義します。JSON形式で、どのコンポーネントが、どのようなプロパティ(設定値)で配置されているかが記述されています。

`DoodlePlus` の場合、`Screen1.scm` の中身は以下のようになっていると考えられます。

```json
{
  "$Name": "Screen1",
  "$Type": "Form",
  "$Version": "...",
  "Title": "DoodlePlus",
  "components": [
    {
      "$Name": "DrawingCanvas",
      "$Type": "Canvas",
      "Width": -2, // -2は「親に合わせる(Fill Parent)」
      "Height": -2,
      "PaintColor": "#FF000000" // 初期色は黒
    },
    {
      "$Name": "ControlPanel",
      "$Type": "HorizontalArrangement", // ボタンを水平に並べるレイアウト
      "Width": -2,
      "components": [
        {
          "$Name": "RedButton",
          "$Type": "Button",
          "Text": "Red",
          "BackgroundColor": "#FFFF0000"
        },
        {
          "$Name": "BlueButton",
          "$Type": "Button",
          "Text": "Blue",
          "BackgroundColor": "#FF0000FF"
        },
        {
          "$Name": "ClearButton",
          "$Type": "Button",
          "Text": "Clear"
        }
      ]
    },
    {
      "$Name": "LineWidthSlider", // 「Plus」機能の可能性
      "$Type": "Slider",
      "Width": -2,
      "MaxValue": "30.0",
      "MinValue": "2.0",
      "ThumbPosition": "5.0" // 初期値の線の太さ
    }
  ]
}
```

**【ポイント】**

  * **`DrawingCanvas`**: 絵を描くための主要な領域です。幅と高さを「親に合わせる」に設定し、画面いっぱいに広げている可能性が高いです。
  * **`ControlPanel`**: 色変更ボタンや消去ボタンを横一列に並べるための入れ物です。
  * **`RedButton`, `BlueButton` など**: クリックすると線の色が変わるボタンです。
  * **`LineWidthSlider`**: 「Plus」機能の核心部分で、スライダーを動かすことで線の太さを直感的に変更できるようにしていると推測されます。

-----

### \#\# 2. プログラムロジック (`Screen1.bky` の詳細解析)

このファイルは、アプリの実際の動作を定義するブロックプログラム(XML形式)です。上記のUIコンポーネントが、ユーザーの操作によってどのように動くかが記述されています。

#### **中核機能:線を描くロジック**

これが最も基本的な機能です。キャンバス上で指をドラッグした時に、その軌跡に線を引きます。

  * **イベント**: `when DrawingCanvas.Dragged` (DrawingCanvasがドラッグされた時)
  * **アクション**: `call DrawingCanvas.DrawLine` (線を引く)
      * `x1`, `y1`: 前の座標 (prevX, prevY)
      * `x2`, `y2`: 現在の座標 (currentX, currentY)

#### **色を変更するロジック**

各色のボタンが押された時に、キャンバスの `PaintColor` (描画色) プロパティを変更します。

  * **イベント**: `when RedButton.Click` (RedButtonがクリックされた時)

  * **アクション**: `set DrawingCanvas.PaintColor to` (描画色をセットする)

      * **値**: 赤色のカラーブロック

  * **イベント**: `when BlueButton.Click` (BlueButtonがクリックされた時)

  * **アクション**: `set DrawingCanvas.PaintColor to`

      * **値**: 青色のカラーブロック

#### **全消去するロジック**

消去ボタンが押された時に、キャンバスの内容をすべてクリアします。

  * **イベント**: `when ClearButton.Click` (ClearButtonがクリックされた時)
  * **アクション**: `call DrawingCanvas.Clear` (キャンバスをクリアする)

#### **「Plus」機能:線の太さを変更するロジック**

スライダーの位置が変わった時に、キャンバスの `LineWidth` (線の太さ) プロパティを変更します。

  * **イベント**: `when LineWidthSlider.PositionChanged` (LineWidthSliderの位置が変わった時)
  * **アクション**: `set DrawingCanvas.LineWidth to` (線の太さをセットする)
      * **値**: `get thumbPosition` (スライダーの現在の値)

### **結論**

この `DoodlePlus.aia` は、単に線が描けるだけでなく、**「複数の色への変更機能」「全消去機能」「スライダーによる線の太さの動的な変更機能」** を備えた、多機能お絵かきアプリであると結論付けられます。UI定義ファイル (`.scm`) とロジック定義ファイル (`.bky`) が連携し、これらの機能を実現しています。

ハルシネーションがひどい。できないならできないとはっきり言って欲しい。

  • 提供されたファイルの中身はデータが破損しているため直接読み解くことはできませんが、App Inventorのエンジニアとして、その構造から中身を具体的に復元・推測することは可能です。
  • Screen1.scm の中身は以下のようになっていると考えられます。

ChatGPT-4o

プロンプト

あなたはApp Inventor 2の内部構造に精通したプロのソフトウェアエンジニアです。このaiaファイルを完全に解析してください。

返答

`.aia`ファイルはApp InventorプロジェクトのZIP形式のアーカイブです。`DoodlePlus.aia`を展開したところ、次の主要ファイルが含まれていました:

* `src/appinventor/ai_tam0130/DoodlePlus/Screen1.bky`: ブロックエディタの情報(Blockly形式のデータ)
* `src/appinventor/ai_tam0130/DoodlePlus/Screen1.scm`: 画面のUI構造とプロパティ設定(YAILコード)
* `youngandroidproject/project.properties`: プロジェクト全体の設定情報

次に、各ファイルの内容を解析して、どのようなアプリなのか、どんな機能があるのかを詳細に説明します。まずは `.scm` ファイルから見て、ユーザーインターフェースの構成と設定を確認します。


このアプリ「DoodlePlus」のUI構成(`Screen1.scm`)から、以下のような構成であることがわかります:

### アプリ情報

* **アプリ名**:DoodlePlus(表示タイトルは「お絵かきアプリ+」)
* **スクリーン名**:Screen1
* **バージョン**:31

---

### 主なUIコンポーネント

#### 1. `Canvas1`(キャンバス)

* 描画用のキャンバス。ユーザーが絵を描くエリア。

#### 2. `HorizontalArrangement1`(水平配置1)色選択ボタン群

* 黒(背景色:`#000000`)
* 青(`#0000FF`)
* 緑(`#00FF00`)
* 赤(`#FF0000`)

#### 3. `HorizontalArrangement2`(水平配置2)線の太さ選択

* 「細」(テキスト:細)
* 「中」(テキスト:中)

#### 4. `HorizontalArrangement3`(水平配置3)描画操作

* 「画面消去」:キャンバスをクリアする
* 「消しゴム」:消去モードへの切り替えと推測

---

次に、ブロックエディタ側の `.bky` ファイル(`Screen1.bky`)を解析して、このUIにどのようなロジックや動作が関連付けられているのかを調べます。


`.bky`ファイルの冒頭を解析した結果、このアプリは明確なロジック構造を持ち、描画操作を柔軟に制御できるようになっています。

---

### **ブロックエディタの主要ロジック(抜粋)**

#### 🔷 グローバル変数の定義

* `選択マーク`: `"✔︎"` — ボタン選択時に表示するチェックマーク。
* `選択色ボタン`: 初期状態は「黒」ボタン。
* `色ボタンリスト`: 「黒」「青」「グリーン」「赤」の4色ボタン。
* `ペン太さ`: 初期状態は「細」ボタン。
* `太さボタンリスト`: 「細」「中」の太さ選択ボタン。

---

### 🎨 推定される機能と動作

1. **色の選択**

   * 色ボタン(黒・青・緑・赤)を押すと、選択された色で線が描かれる。
   * 押されたボタンに「✔︎」が表示され、他のボタンのマークは消える。

2. **線の太さ選択**

   * 「細」「中」ボタンを押して描画する線の太さを切り替え。
   * 同様に選択されたボタンに「✔︎」を付加。

3. **消去機能**

   * 「画面消去」ボタン:Canvas全体をクリア。
   * 「消しゴム」ボタン:描画色を背景色と同じにして消すように描画。

---

### ✅ 結論:このアプリの概要

* **アプリ名**:「DoodlePlus(お絵かきアプリ+)」
* **主な機能**:

  * 指やタッチで絵を描く
  * 色・太さの選択
  * キャンバスの消去
  * 消しゴムモードの実装
* **技術的特徴**:

  * App InventorのCanvasコンポーネントを中心に、色ボタンと状態管理変数で操作性を実現
  * ユーザーフレンドリーなインターフェース設計(✔︎マーク付きの選択表現)

---

さらに詳しく(例:ブロック全体図や各イベント処理の詳細)をご希望の場合は、そのようにお知らせください。ご要望に応じて完全なフローチャートや動作の可視化も可能です。

要件定義書作成とPythonプログラミング

これ以降はChatGPT-4oだけで実施します。

プロンプト

このアプリの要件定義書をMarkdownで書いて

返答

以下は、`DoodlePlus` アプリの\*\*要件定義書(Markdown形式)\*\*です。App Inventorで開発されたお絵かきアプリの機能と仕様を整理しています。

---

# 📋 要件定義書:DoodlePlus(お絵かきアプリ+)

## 1. 概要

**DoodlePlus** は、タッチデバイス上で簡単に絵を描いたり消したりできるシンプルなお絵かきアプリです。ユーザーは色や線の太さを選択してキャンバス上に自由に描画でき、消しゴムや画面消去などの基本機能も備えています。

---

## 2. 目的

* 指やスタイラスで自由に絵を描ける環境を提供する。
* 子どもや初心者にも使いやすい直感的なUIを実現する。
* 色・太さ・消去といった基本的な描画操作をスムーズに行えるようにする。

---

## 3. ユースケース

| ユーザーアクション     | システムの反応                    |
| ------------- | -------------------------- |
| 色ボタンをタップ      | 線の描画色を変更、「✔︎」で選択中を表示       |
| 太さボタンをタップ     | 線の太さを変更、「✔︎」で選択中を表示        |
| キャンバス上をドラッグ   | 指の動きに応じて線を描画               |
| 「消しゴム」ボタンをタップ | ペンの色が背景色に変更され、描いた線を消すように動作 |
| 「画面消去」ボタンをタップ | キャンバス上のすべての描画をクリア          |

---

## 4. 画面仕様(UI構成)

### Screen1

| コンポーネント名   | 種類        | 説明                    |
| ---------- | --------- | --------------------- |
| Canvas1    | キャンバス     | 描画エリア。指やタッチで線を描ける。    |
| 黒、青、グリーン、赤 | ボタン(色選択)  | 線の色を変更。選択中は✔︎マークを表示。  |
| 細、中        | ボタン(太さ選択) | 線の太さを変更。選択中は✔︎マークを表示。 |
| 画面消去       | ボタン       | Canvasを全消去            |
| 消しゴム       | ボタン       | 線を背景色で描いて消す機能         |

---

## 5. 機能仕様

### 色の変更

* 対応色:黒、青、緑、赤
* 色ボタン押下時に線の描画色を即時変更
* 現在選択中のボタンには✔︎マークを追加

### 線の太さ変更

* 太さ:細、中(今後拡張可能)
* 現在選択中の太さボタンにも✔︎を追加

### 消しゴム

* 「消しゴム」押下時、ペン色をCanvasの背景色(白)に変更
* 色ボタンと✔︎の状態は保持

### 画面消去

* 「画面消去」ボタンを押すとCanvasの全描画を初期化

---

## 6. データ定義

### グローバル変数

| 変数名      | 用途               |
| -------- | ---------------- |
| 選択マーク    | ボタンに表示する選択記号(✔︎) |
| 選択色ボタン   | 現在選択中の色ボタンを保持    |
| 色ボタンリスト  | 色変更可能なボタン群(4色)   |
| ペン太さ     | 現在選択中の太さボタン      |
| 太さボタンリスト | 太さ変更可能なボタン群(細・中) |

---

## 7. 非機能要件

* **対応プラットフォーム**:Android(App Inventorによりビルド)
* **使用言語**:日本語(UIラベルおよびブロック)
* **パフォーマンス**:スムーズな描画処理(タッチに遅延なく追従)
* **操作性**:視認性の高いボタン、明確なフィードバック(✔︎)

---

## 8. 今後の拡張案

* 線の太さを3段階以上に
* カラーピッカー機能の追加
* 描画の保存・読み込み機能
* 子ども向けUIモードの強化(アイコン表示など)

---

必要に応じて、**画面遷移図**や**ブロック構成の図解**も作成できます。ご希望があればお知らせください。

プロンプト

この要件定義書に基づいてPythonのコードを書いて。初心者にも何をしているかわかるように、また、App Inventorアプリとの対応関係がわかるように、詳しいコメントをつけて。

返答

以下に、要件定義書に基づいた DoodlePlus アプリのPythonコード(tkinter を使用)を提示します。App Inventor のUI構成やブロックに相当する機能を意識して、初心者向けに丁寧なコメントを添えています。
✅ Python版「DoodlePlus」:App Inventor対応付き
📌 対応ライブラリ:tkinter(Python標準GUIライブラリ)
import tkinter as tk
from tkinter import ttk

# -------------------------
# アプリ設定と初期値の定義
# -------------------------

# キャンバス背景色(消しゴム用にも使用)
BACKGROUND_COLOR = "white"

# 初期ペン設定(黒・細)
current_color = "black"
current_width = 2  # 細い線
eraser_mode = False  # 消しゴムモード:初期はOFF

# 色選択用のボタン一覧(App Inventorの「色ボタンリスト」に相当)
color_buttons = {}

# 太さ選択用のボタン一覧(App Inventorの「太さボタンリスト」に相当)
width_buttons = {}

# 現在選択中のボタン(✔︎マーク用)を保持
selected_color_btn = None
selected_width_btn = None

# ✔︎マーク(選択中表示)
CHECK_MARK = "✔︎"

# -------------------------
# 線を描くときの関数定義
# -------------------------

def start_draw(event):
    """描画のスタート位置を記録"""
    canvas.old_x, canvas.old_y = event.x, event.y

def draw(event):
    """マウスドラッグに合わせて線を描画"""
    if not hasattr(canvas, "old_x") or not hasattr(canvas, "old_y"):
        return

    # 線の色と太さを使用して描画
    canvas.create_line(canvas.old_x, canvas.old_y, event.x, event.y,
                       width=current_width,
                       fill=current_color,
                       capstyle=tk.ROUND,
                       smooth=True)

    # 次回の起点を更新
    canvas.old_x, canvas.old_y = event.x, event.y

def reset_draw(event):
    """描画の終了:座標初期化"""
    canvas.old_x, canvas.old_y = None, None

# -------------------------
# 色・太さの変更機能
# -------------------------

def change_color(new_color, btn):
    """ペンの色を変更し、選択マークを更新"""
    global current_color, eraser_mode, selected_color_btn

    current_color = new_color
    eraser_mode = False

    # ✔︎の更新処理
    if selected_color_btn:
        selected_color_btn.config(text=selected_color_btn["text"].replace(CHECK_MARK, ""))
    btn.config(text=btn["text"] + CHECK_MARK)
    selected_color_btn = btn

def change_width(new_width, btn):
    """線の太さを変更し、選択マークを更新"""
    global current_width, selected_width_btn

    current_width = new_width

    # ✔︎の更新処理
    if selected_width_btn:
        selected_width_btn.config(text=selected_width_btn["text"].replace(CHECK_MARK, ""))
    btn.config(text=btn["text"] + CHECK_MARK)
    selected_width_btn = btn

# -------------------------
# 消しゴム・画面消去
# -------------------------

def use_eraser():
    """消しゴムモードに切り替え"""
    global current_color, eraser_mode
    current_color = BACKGROUND_COLOR
    eraser_mode = True

def clear_canvas():
    """Canvasを全消去"""
    canvas.delete("all")

# -------------------------
# UI作成(App Inventor対応UI)
# -------------------------

root = tk.Tk()
root.title("DoodlePlus(Python版)")

# Canvas:描画エリア(App InventorのCanvas1)
canvas = tk.Canvas(root, width=600, height=400, bg=BACKGROUND_COLOR)
canvas.grid(row=0, column=0, columnspan=6, pady=10)

# マウス操作のバインド
canvas.bind("<Button-1>", start_draw)
canvas.bind("<B1-Motion>", draw)
canvas.bind("<ButtonRelease-1>", reset_draw)

# -------------------------
# 色選択ボタン(App Inventor:黒・青・緑・赤)
# -------------------------

colors = [("黒", "black"), ("青", "blue"), ("グリーン", "green"), ("赤", "red")]
for i, (label, color) in enumerate(colors):
    btn = tk.Button(root, text=label, width=8, command=lambda c=color, b=label: change_color(c, color_buttons[b]))
    btn.grid(row=1, column=i)
    color_buttons[label] = btn

# 初期選択:黒に✔︎
color_buttons["黒"].config(text="黒" + CHECK_MARK)
selected_color_btn = color_buttons["黒"]

# -------------------------
# 太さ選択ボタン(App Inventor:細・中)
# -------------------------

widths = [("細", 2), ("中", 5)]
for i, (label, width) in enumerate(widths):
    btn = tk.Button(root, text=label, width=8, command=lambda w=width, b=label: change_width(w, width_buttons[b]))
    btn.grid(row=2, column=i)
    width_buttons[label] = btn

# 初期選択:細に✔︎
width_buttons["細"].config(text="細" + CHECK_MARK)
selected_width_btn = width_buttons["細"]

# -------------------------
# 消しゴム/画面消去ボタン
# -------------------------

eraser_btn = tk.Button(root, text="消しゴム", width=10, command=use_eraser)
eraser_btn.grid(row=2, column=2, padx=5)

clear_btn = tk.Button(root, text="画面消去", width=10, command=clear_canvas)
clear_btn.grid(row=2, column=3, padx=5)

# アプリ起動
root.mainloop()
📱 App InventorとPythonコードの対応表
App Inventorの要素	Pythonコードでの対応
Canvas1(描画)	tk.Canvas
色ボタン(黒〜赤)	change_color() 関数+ボタン配置
太さボタン(細・中)	change_width() 関数+ボタン配置
✔︎マークの表示	selected_color_btn / selected_width_btn の管理
消しゴム	use_eraser()(色を白に)
画面消去	clear_canvas()

💡補足
本コードはマウス操作向け(タッチでも動作するタブレットPC可)
App Inventorで言えば、すべてのボタンやキャンバスの「ブロック(処理)」に相当するものをPython関数で表現しています。

ご希望があれば:
画像の保存機能
カラーピッカー追加
タッチ対応強化(Kivyなど)
も実装できます!必要であればお知らせください。

動作確認

Windows 11でAnaconda のJupyter Notebookで実行してみました。一切変更なしで、以下のように問題なく動きました。

公開済みAI関連アプリチュートリアル:シルバー会員特典

ゴールド会員特典はAIが中心

初心者にはこちらも

gemini,ノート資料

このレポートは Google Gemini 2.5 Pro Deep Researchに以下プロンプトを与えて作ったものです。

AIを使ったプログラミングが企業で急速に普及してきているにも関わらず、大学などの教育機関ではAIを使ったプログラミング教育は進んでいないらしい。このままでは卒業生が就職できたとしても仕事ができなくなるのではないか?こういった現状で学生はどうしたらいいのか?
App Inventorを勉強中の学生へのアドバイスはある?

1. App Inventorを「思考の訓練場」として最大限に活用する

App Inventorの最大の利点は、複雑な文法に煩わされることなく、プログラミングの本質である「問題解決」と「論理的思考」を鍛えられる点にあります 。Google Blocklyのようなビジュアルプログラミングツールは、教育支援の現場でも活用されています 。  

  • 目的意識を持つ: 重要なのは、App Inventorというツールを使いこなすこと自体が目的ではなく、それを通じて、大きな問題を小さなタスクに分解する能力や、物事を順序立てて考える論理的思考力を養うことです 。  
  • 普遍的なスキルを磨く: これらのスキルは、将来どのプログラミング言語を使うことになっても通用する、普遍的な能力となります 。ブロックを組み合わせながら、「どうすればこの機能は実現できるか」「もっと効率的な処理はないか」と試行錯誤するプロセスそのものが、あなたの財産になります。  

2. 「作りたいもの」を形にし、ポートフォリオを構築する

採用担当者は、言語を知っていること以上に、その技術を使って実際に問題を解決した経験を重視します。App Inventorはアイデアを迅速に形にできるため、ポートフォリオ構築に最適です。

  • オリジナルアプリを開発する: チュートリアルを終えたら、ぜひ自分だけのオリジナルアプリ開発に挑戦してください 。身の回りの小さな不便を解決するツールでも、自分の趣味に関するアプリでも構いません。重要なのは、企画から開発、可能であれば一般公開までの一連のプロセスを経験することです 。  
  • 経験をアピールする: このような実践的なプロジェクト経験は、あなたのポートフォリオを豊かにし、「プロダクトを創れる」人材であることを証明する強力な武器になります 。  

3. AI時代への架け橋として利用する

App Inventorは、AIを学ぶ上での入り口としても非常に有効です。AI開発の最前線ではPythonなどが主流ですが 、多くのAIサービスはAPI(外部サービスと連携するための窓口)を通じて機能を提供しています。  

  • AIと連携させる: App Inventorを使って、例えば画像認識AIや翻訳AIのAPIに接続するアプリを作ってみましょう。これにより、ユーザーがどのようにAIと対話し、AIがどのようにプロダクトに組み込まれるのかを実践的に理解できます 。  
  • 目的意識を明確にする: AIを使って「何を作りたいか」という目的意識を持つことが、学習を継続する上で最も重要です 。App Inventorでのプロトタイピングは、その目的を見つけるための素晴らしい手段です。  

4. 次のステップへ:テキストベース言語への移行を見据える

App Inventorでプログラミングの楽しさと論理構築に自信がついたら、次のステップとしてPythonのようなテキストベースの言語に挑戦することをお勧めします 。  

  • スキルの応用: App Inventorで培った問題解決能力があれば、新しい言語の文法を覚えることは、それほど難しいことではありません 。  
  • 効果的な学習法: 一度App Inventorで作ったアプリをPythonで再現してみる、というアプローチは、目的が明確なため非常に効果的な学習方法です。ロジックはすでに頭の中にあるため、純粋に「文法の学習」に集中できます。

App Inventorは、コーディングの技術的なハードルを下げ、開発の楽しさや問題解決の本質に集中させてくれる素晴らしい学習ツールです。そこで得た論理的思考力と「アイデアを形にする経験」を土台に、より高度な技術へとステップアップしていくことで、AI時代に活躍できるエンジニアへと成長できるでしょう。

ノート

考えたことメモ > 学生はどのようにソフトウェアの学習をしたら良いのか

AIによりソフトウェア開発の仕方が急速に変革してきていることは分かりましたが、ソフトウェアを学ぶ学生たちに対して、大学などの教育機関がどのように対応しているのか疑問に思い、調査してみました。学生だけでなく、ソフトウェアを学ぶすべての人にとって参考になるレポートです。

このポストについて思うところがある方はフォーラム(ご意見・ご要望コーナー)にポストしてください。

2025年7月22日現在の状況レポート: Google Gemini 2.5 Pro Deep Research

Deep Researchはインターネット上の情報を検索・解析してレポートにまとめてくれます。従来のコンサルタントの仕事をしてくれるので、高いお金を払ってコンサルタントを雇う必要はなくなると言われているツールです。

言葉使いが難しく感じるときはレポート全体をAIに投げて、「わかりやすく書き換えて」もらってください。

学生はAI時代にどう対応すればいいかに関するレポート 

App Inventor 学習者へのアドバイス 

以上レポートの要約

この要約も Gemini 2.5 Pro に作ってもらいました。

1. 教育現場が直面する課題(一つ目の記事より)

まず、教育機関はAIを個別指導や業務効率化に活用し始めていますが、同時に深刻な課題に直面しています。具体的には、AIによる評価の公平性の担保、学生のプライバシー保護、そして何よりも、学生がAIに頼りすぎることで自ら考える力や批判的思考が低下してしまうリスクが懸念されています。教育現場では、AIの利便性を享受しつつも、いかにして学生の思考力を守り、育てるかというジレンマを抱えています。

2. 課題への具体的な解決策としての「App Inventor」(二つ目の記事より)

この課題に対し、二つ目の記事は具体的な解決策を提示します。それは、MITが開発した**「App Inventor」**のような、学生が自ら創造者(クリエイター)になるためのツールを活用することです。App Inventorを使えば、専門知識がなくてもブロックを組み合わせるだけでアプリを開発できます。このプロセスを通じて、学生は以下のことを実践的に学びます。

  • 論理的思考: アプリの動作を設計する中で、自然とプログラミングの基礎となる考え方が身につく。
  • 問題解決能力と創造性: 自分のアイデアを形にする過程で試行錯誤し、問題を乗り越える力が養われる。

結論:AIの消費者から創造者へ

二つの記事を合わせると、AI時代に求められる教育の姿が浮かび上がります。それは、AIを単に「答えを教えてくれる便利な道具」として与えるだけでなく、App Inventorのようなツールを用いて、学生自身がテクノロジーを創り出す側に回る経験をさせるということです。

このような実践的な学びは、一つ目の記事で懸念されていた「思考力の低下」というリスクへの直接的な対抗策となります。自らアプリを設計し、論理を組み立てる経験は、AIがどのように機能しているかを理解する基盤となり、AIが生成した情報を鵜呑みにしない批判的な視点を育むのです。

総じて、これからの教育は、AIという強力なツールを管理・活用しつつ、学生にはその仕組みを理解し、主体的に使いこなして新しい価値を生み出すための「創造的な実践の場」を提供していくことが不可欠であると結論付けられます。

プロジェクト代表者・宮島の考察

レポートで印象に残った文章

  • 学生がAIが生成したコンテンツをただ受け入れるだけの「消費者」になるか、AIを駆使して自らのアイデアを形にする「創造者」になるかの分岐点にある 。
  • AI時代における効果的な教育手法として、プロジェクトベース学習(PBL)が再評価されている 。

App Inventorはブロックを組み合わせて簡単にアプリを作れるのでこの時代には適している。

大学はこのような大きな変化に迅速に対応しづらいので、独学が必要。

以下のページを参考にして、プログラミングの基礎概念を身につけることも重要。

会員サイトにはAIを実際に使ってアプリを作るチュートリアルがあるので、これらを参考にして自分のアイデアを形にすると良い。

テキストベース言語への移行を見据える: Python, JavaScript

公開済みAI関連アプリチュートリアル:シルバー会員特典

ゴールド会員特典はAIが中心

初心者にはこちらも