最近の記事

もう「AI程度使えて当然」に? 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電脳会議 AIとIT業界の未来

今後はAIファースト、AIフレンドリーな設計がMUST

今後は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フレンドリー設計」とは単なる技術トレンドではなく、開発体制そのものの設計思想のシフトなんですよね。いやほんと、熱すぎます。火傷にご注意ください。

AI電脳会議 AIエージェントの限界とその対応

全てのモジュールにvariables.tfを配置する

ルール

Place variables.tf in every module. Empty file is acceptable

(全てのモジュールにvariables.tfを配置する)

解説

全てのモジュールにvariables.tfを配置します。variableブロックは必ずこのファイルに記載します。

機械的にコードの位置を推測できるようになるためAIとの相性も良いです。

サンプルコード

# ./modules/networking/variables.tf

variable "environment" {
  type        = string
  description = "環境名(development, staging, production)"
}

variable "project" {
  type        = string
  description = "プロジェクト名"
}

variable "vpc_cidr" {
  type        = string
  description = "VPCのCIDRブロック"
}

variable "public_subnet_cidrs" {
  type        = list(string)
  description = "パブリックサブネットのCIDRブロックリスト"
}

variable "availability_zones" {
  type        = list(string)
  description = "使用するアベイラビリティゾーンのリスト"
}

参考リンク

Infrastructure 開発ガイドライン Repository Structure

terraform.tfvars.jsonに変数値を記述する

ルール

Write variable values in terraform.tfvars.json. Environment-specific values in root modules, common values for all environments in repository root. However, it should be placed at the highest appropriate level in a monorepo.

(terraform.tfvars.jsonに変数値を記述する。環境固有の値はルートモジュールに、全環境共通の値はリポジトリルートに配置する。ただしモノレポの場合はふさわしいディレクトリのうち最上位でかまわない。)

解説

変数値はterraform.tfvarsその他ではなくterraform.tfvars.jsonに書きます。これはsopsを用いた暗号化の都合もあります。 なおリポジトリルートに配置するのはTerraform専用のリポジトリを使っている場合の話で、モノレポでさまざまなものが詰まっている場合はふさわしい場所のうち一番上位に配置します。たとえば<repository_root>/infrastructure/ です。

サンプルコード

// ./terraform.tfvars.json (リポジトリルート - 全環境共通)
{
  "project": "practitioner",
  "region": "ap-northeast-1"
}

// ./production/terraform.tfvars.json (環境固有)
{
  "environment": "production",
  "instance_type": "t3.medium",
  "instance_count": 3
}

// ./development/terraform.tfvars.json (環境固有)
{
  "environment": "development",
  "instance_type": "t3.micro",
  "instance_count": 1
}

参考リンク

備考

The reason for using the less readable json format is for ease of use with sops

Infrastructure 開発ガイドライン Repository Structure

機密情報は必ず暗号化して*.tfvars.jsonに記述する

ルール

*Always encrypt sensitive information when writing to .tfvars.json.enc

(機密情報は必ず暗号化して*.tfvars.json.encに記述する)

解説

APIキーやパスワード、秘密鍵などの機密情報を平文でリポジトリに保存するのはたとえPrivateリポジトリであっても絶対厳禁です。保存自体を避けられるなら避け、避けられないとしても必ず暗号化します。当然ハードコーディングもNGです。

暗号化にはsopsを用います。json形式なら部分的な暗号化も可能なためGitでの管理が容易です。KMSでも暗号化は可能ですが、ファイル全体を暗号化するため差分管理をGithub上で行うことができなくなり不便です。

ただし、ローカルで復号するとうっかりCursorで開くだけで潜在的にアウトです。暗号化するだけでなく、復号用の鍵と復号した後のデータからAIを隔離しなければいけません。

サンプルコード

// terraform.tfvars.json (sopsで暗号化前)
{
  "db_password": "ENC[AES256_GCM,data:xxx...]",
  "api_key": "ENC[AES256_GCM,data:yyy...]",
  "project": "practitioner"
}
# sopsで暗号化
sops -e terraform.tfvars.json > terraform.tfvars.json.enc

# sopsで復号化してterraform実行
sops exec-file terraform.tfvars.json.enc 'terraform apply -var-file={}'

参考リンク

Infrastructure 開発ガイドライン Repository Structure

テンプレートファイルは*.tftpl形式でtemplates/ディレクトリに配置する

ルール

*Save template files read by Terraform’s templatefile function as .tftpl in the caller’s templates/ (e.g., ./modules/api/templates/s3_bucket_policy.tftpl)

(Terraformのtemplatefileファンクションで読み込むテンプレートファイルは、*.tftpl形式で呼び出し元のtemplates/に保存する)

解説

Terraformのtemplatefile()で呼び出すテンプレートファイルは、templates/ディレクトリに、.tftpl拡張子を使って保存します。

決めの問題なのでAWSの推奨に従っています。

サンプルコード

# modules/api/main.tf
resource "aws_s3_bucket_policy" "main" {
  bucket = aws_s3_bucket.main.id

  # 同じモジュール内のtemplates/からテンプレートを読み込む
  policy = templatefile("${path.module}/templates/s3_bucket_policy.tftpl", {
    bucket_name = aws_s3_bucket.main.id
    account_id  = data.aws_caller_identity.current.account_id
  })
}

# ディレクトリ構造:
# modules/
#   api/
#     main.tf
#     templates/
#       s3_bucket_policy.tftpl    # S3バケットポリシーのテンプレート
#       iam_policy.tftpl          # IAMポリシーのテンプレート

参考リンク

Infrastructure 開発ガイドライン Repository Structure

リソースブロックは原則main.tfに記述し、大きい場合はサービス名でファイル分割する

ルール

In principle, write all resource blocks in main.tf. However, if large (guideline: 150 lines), extract to files named .tf (e.g., iam.tf)

(リソースブロックは原則main.tfに記述する。大きくなった場合(目安: 150行)は.tfという名前でファイルを分割する)

解説

リソースブロックはすべてmain.tf にいつも集めきるのが理想です。が、ファイルが大きくなりすぎると読みづらくなります。そのためある程度の規模をもつモジュールは、AWSサービスの名前を利用したファイルごとにリソースブロックを保存します(例: IAMリソースは iam.tf。RoleやPolicyなどを書く)。

分割の目安はおおざっぱに150行です。

サンプルコード

# main.tf (小規模な場合、すべてここに記述)
resource "aws_vpc" "main" {
  cidr_block = var.vpc_cidr
}


# 大規模になった場合は分割する
# iam.tf - IAMリソース
resource "aws_iam_role" "api" {
  name = "${var.environment}-${var.project}-api"
  # ...
}

参考リンク

Infrastructure 開発ガイドライン Repository Structure

全てのモジュールにmain.tfを配置する

ルール

Place main.tf in every module. Empty file is acceptable

(全てのモジュールにmain.tfを配置する)

解説

全てのモジュールに必ずmain.tfを配置します。ルートモジュールであればサブモジュール呼び出しの起点となります。

ただしサブモジュールの場合はやや浮いた立ち位置になりがちです。小さなサブモジュールならmain.tfにすべて書くためいいのですが、多くのサブモジュールは<リソース名>.tf(e.g., s3.tf)のようにリソースのまとまりごとにファイルを用意するためです。この場合でもmain.tfは空のまま放置します。何も書かないからと言って消したりしません。

サンプルコード

# ./modules/networking/main.tf
# ネットワーク関連のリソースを定義

resource "aws_vpc" "main" {
  cidr_block           = var.vpc_cidr
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = "${var.environment}-${var.project}-vpc"
  }
}

resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "${var.environment}-${var.project}-igw"
  }
}

参考リンク

Infrastructure 開発ガイドライン Repository Structure

再利用可能なモジュールは ./modules/ 配下に配置する

ルール

Reusable modules are placed under ./modules/ (e.g., ./modules/networking)

(再利用可能なモジュールは ./modules/ 配下に配置する)

解説

複数の環境から参照されるサブモジュールはすべてmodules/に集めます。こうすることでモジュールの性格を推測しやすくなり、迷うことが減ります。

サンプルコード

# ディレクトリ構造の例
# ./modules/networking/main.tf - ネットワーク関連の再利用可能モジュール
# ./modules/compute/main.tf    - コンピュート関連の再利用可能モジュール
# ./modules/database/main.tf   - データベース関連の再利用可能モジュール

参考リンク

Infrastructure 開発ガイドライン Repository Structure

全てのモジュールにREADME.mdを配置する

ルール

Always place README.md in every module. README.md should have module information auto-inserted by terraform-docs

(全てのモジュールにREADME.mdを配置する)

解説

README.mdには本来目的や概要を記すのですが、それらをSpec-Drivenではspec.mdに記します。 そのためterraform-docsによって自動生成されたドキュメントがREADME.mdのメインコンテンツとなります。

サンプルコード

# Networking Module

<!-- BEGIN_TF_DOCS -->
<!-- END_TF_DOCS -->

参考リンク

Infrastructure 開発ガイドライン Repository Structure