AI時代のGo開発2026 爆速開発のためのガードレール

4.1K Views

February 21, 26

スライド概要

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

AI時代のGo開発2026 爆速開発のためのガードレール UPSIDER Ryo Mimura 2026/02/21 Go Conference mini in Sendai 2026 © 2026 UPSIDER.inc 1

2.

Presenter Profile 三村 遼 Ryo Mimura) @r4mimu 株式会社UPSIDER ● ● これまで ○ 社内CI/CD基盤・開発生産性 ○ BtoB SaaS プロダクトエンジニア 2025 ○ UPSIDER カード事業部 Backend Engineer ● ランニング🏃 サウナ🧖 飲酒🍻 ● 好きなパッケージ: context © 2026 UPSIDER.inc 2

3.

UPSIDERについて ビジョン / ミッション 挑戦者を支える世界的な 金融プラットフォームを創る UPSIDERはカード会社から、総合金融機関へ © UPSIDER Inc 3

4.

提供サービス一覧 UPSIDERはAI化された総合金融機関へ 当社はこれまで決済事業に特化し、お客様の成長をサポートしてきました。しかし今後は総合金融機関として進化していきます。 挑戦者を応援する法人カード 請求書カード払いサービス グロースデットファンド 経営者の挑戦を支える法人カード https://up-sider.com/ https://shi-harai.com/ https://www.upsidercap.com/ https://president-card.com/ Adboost BUSINESS 与信枠の増枠&広告媒体 仕入れの後払いを実現 ビジネスリーダー向けコミュニティ 経営者のための経理丸投げサービス https://breakthrough-grid.com/ https://ai-keiri.up-sider.com/ 4

5.

実績 ユーザー数 100,000社以上 1 売上規模 約 100億円 2 年間成長 50%以上を継続 2 *1 当社が提供する全サービスのリリースからの登録企業数の合計、 2025年11月時点。 *2 2025年4月末時点。 株式会社UPSIDER ファクトブック 5

6.

Agenda Topic 1 AI 開発の「速さ」と「治安」 Topic 2 Architecture: 依存の制御 Topic 3 Testing: AIのハックを防ぐ © 2026 UPSIDER.inc 6

7.

Section AI開発の「速さ」と「治安」 © 2026 UPSIDER.inc 7

8.

Section AIコーディングは当たり前 ● Cursor, Claude Code, Codex, GitHub Copilot,... ● 「仕様を満たす実装」は当たり前に実現してくれる ● 徐々にモデルの間の実装能力の差は縮まっている(気がする)。どのモデルも賢 い ● 関心はツール・モデル比較よりも 「どうやってチームで安定して良いコード を出し続けるか」に移ってきた © 2026 UPSIDER.inc 8

9.

Section What is 良いコード? 「良い」にはいくつかの観点がある ● 正しく動く:仕様を満たす ● 読みやすい:認知負荷が低い ● パフォーマンスが良い:速い、省リソース ● 柔軟性が高い:要件の変化・拡張に対応できる ※様々な観点があるが主旨と離れるのでざっくり © 2026 UPSIDER.inc 9

10.

Section 我々の文脈での「良いコード」 新規社内サービスの立ち上げ = 不確実性が高い ● 要件が変わる、増える、なくなる、決まっていない ● この文脈で最も重要なのは要件の変化に対応できる こと ○ もちろん正しく動き、読みやすく、パフォーマンスも良いほど嬉しいのは前提で ➡ そのためには適切なモジュール化とアーキテクチャルールの遵守が必要 ➡ ここでは コードが「正しく動く状態で、ルールが守られ、秩序が保たれている状態」 を「治安が良い」 と呼びます © 2026 UPSIDER.inc 10

11.

Section 治安を悪くする実装 🤖 AIで速く作れるようになった一方で、治安が悪化しやすくもなった 例えばこんな経験… ● 古い書き方を提案される ● コードベースの悪癖を増幅する ● 既存アーキテクチャの構成を無視する実装 © 2026 UPSIDER.inc 11

12.

Section 治安を悪くする実装 🤖 AIで速く作れるようになった一方で、治安が悪化しやすくもなった 例えばこんな経験… ● 古い書き方を提案される ● コードベースの悪癖を増幅する ● 既存アーキテクチャの構成を無視する実装 go fixのblogが公開されたよ! https://go.dev/blog/gofix ➡ 実害は少ないがノイズになる、秩序が保たれない interface{} tt := tt for i := 0; i < 5; i++ © 2026 UPSIDER.inc 12

13.

Section 治安を悪くする実装 🤖 AIで速く作れるようになった一方で、治安が悪化しやすくもなった 例えばこんな経験… ● 古い書き方を提案される ● コードベースの悪癖を増幅する ● 既存アーキテクチャの構成を無視する実装 ➡ return err のラップ忘れを「プロジェクトのスタイル」として量産 TODOコメントを付けている実装やワークアラウンドをそのまま模倣 など... © 2026 UPSIDER.inc 13

14.

Section 治安を悪くする実装 🤖 AIで速く作れるようになった一方で、治安が悪化しやすくもなった 例えばこんな経験… ● 古い書き方を提案される ● コードベースの悪癖を増幅する ● 既存アーキテクチャの構成を無視する実装 ➡ 依存関係の方向を無視した参照 domain の struct に技術要素が入る など... © 2026 UPSIDER.inc 14

15.

Section Rules / Skills で防げるのでは? お察しの通り、Rules / Skills を整えれば一定の治安維持は可能だが...? ● コンテキスト量や指示の仕方等で、Rulesが無視される。非決定的 ● 人の手による実装では、ソフトな制約はすり抜けられる ● 全パターンを自然言語で網羅するのは難しい ➡ Rules / Skills だけでは治安は保ちきれないことを想定しておく ガードレールとしてのハード制約が必要 © 2026 UPSIDER.inc 15

16.

Section ソフトとハードで治安を守る 堅牢に治安を守るには、制約の種類を分けて考える ● ● ソフト制約 (破ろうと思えば破れる、非決定的) ○ Rules / Skills(AIへの指示) ○ Review(人間 + AI) ハード制約 (物理的・機械的に破れない、決定的) ○ コンパイル時に遮断 ○ CI (違反したらマージ不可) ■ Test, Lint © 2026 UPSIDER.inc 16

17.

Section ソフトとハードで治安を守る 堅牢に治安を守るには、制約の種類を分けて考える ● ● ソフト制約 (破ろうと思えば破れる) ハード制約の話をします ○ Rules / Skills(AIへの指示) ○ Review(人間 + AI) ハード制約 (物理的・機械的に破れない、決定的) ○ コンパイル時に遮断 ○ CI (違反したらマージ不可) ■ Test, Lint © 2026 UPSIDER.inc 17

18.

Section 今回の視点 Go の機能・ライブラリを用いたハード制約で治安を下支えする話 ● Goの言語機能・ライブラリ・エコシステム ● 依存の制御 ● Test,Lint,CIなどの仕組み化 これまでの開発経験や、最近考えているAI開発での速さと治安の良さを 両立させるには?を共有します © 2026 UPSIDER.inc 18

19.

Section Architecture: 依存の制御 © 2026 UPSIDER.inc 19

20.

Section AIは知りすぎるとブレる ● コンテキストウィンドウ内のトークン数が増えるにつれモデルの能力が低下する ● ソフト制約 (お気持ち) の限界 ○ 「HandlerからRepositoryを呼ばない」というルールは、自然言語で指示しても守られ ないことがある ○ レビューで人間が気づいて指摘するのはコストが高い 参考:Effective context engineering for AI agents © 2026 UPSIDER.inc 20

21.

Section 依存のコントロール ● 「守る」のではなく「物理的に通れなくする」 ○ ● 人間のお気持ちやルールに頼らず、ツールで強制 ハード制約: ○ internal による外部参照からの守り ■ ○ pkg/internal/** は pkg/ 配下からしか import できない Lint で依存ルール違反を落とす ■ 許可されていないパッケージ間の依存 ■ 依存の向きが正しくない © 2026 UPSIDER.inc 21

22.

Section internal で外部参照から守る © 2026 UPSIDER.inc 22

23.

Section Lint で依存ルール違反を落とす depguard の例 ❌ © 2026 UPSIDER.inc 23

24.

Section Lint で治安を守る ● depguard はgolangci-lint に入ってるため始めやすい ○ arch-go, go-arch-lint などあるがなんでもいい ○ ルールを Config as Code で管理できるのが大事 ■ ● 依存関係に限らず Lint は重要 ○ ● 落ちたときにAIが自己分析できる 例: errcheck, wrapcheck 人間はロジックの正しさだけに集中できるようになる © 2026 UPSIDER.inc 24

25.

Section コンテキスト制御のための Package by Feature ● ドメイン単位 Feature)でパッケージを切る ↔ 技術レイヤーでパッケージを切る © 2026 UPSIDER.inc 25

26.

Section コンテキスト制御のための Package by Feature ● ✅ Pros ○ 凝集度が高く、ドメイン特化したRules / Skillsを管理しやすい ■ ○ ● 機能単位では並行開発しやすい ❓ Cons ○ ○ ● Rules globs: feature_hoge/** マイクロサービス的な設計の難しさが増える 共通パッケージが肥大化しがち AI文脈ではないが、 実用 Go言語 第2版でも Package by Feature が推されている 組織とフェーズと要件の好みに依る © 2026 UPSIDER.inc 26

27.

Section Testing: AIのハックを防ぐ © 2026 UPSIDER.inc 27

28.

Section テストでの課題あるある ● 「xxxを実装してテストもして」とするとテストを「通す」ことに最適化しがち ○ mock.any, mock.anyTimes でのバイパス ● 正常系を満たせばOKとしている ● エッジケースは考慮漏れ (...人間もやりがち😇) © 2026 UPSIDER.inc 28

29.

Section 対策:Fuzzing test でAIに自滅してもらう 🤖💥 ● testing.F を活用 ● seed corpus の生成は AI が得意 ➡ 「壊す」方向にも AI を使う🔥 https://go.dev/doc/security/fuzz/ より引用 © 2026 UPSIDER.inc 29

30.

Section 対策:Mutation test で信頼性を担保 ● 意図的にコードに変更を加え、テストがちゃんと失敗するかを検証する ○ if a < b ➡ if a >= b に改変 ○ 値を改変 const HOGE  1 ➡ const HOGE = 555 ○ 処理を一部削除 ➡ 落ちるべき時にちゃんと落ちるかを検証し、テストの品質確認・実装ハックを防ぐ (発表者は Go でやったことないので、良いライブラリや知見があれば教えて下さい...!) 参考: https://stryker-mutator.io/docs/ © 2026 UPSIDER.inc 30

31.

Section 対策:モックではなく DBを使う ● 実 DB を使ってテストを実行 ○ testcontainers-go, dockertest ● クエリとデータから正しさを担保する ● Package by Feature なら TestMain でパッケージ単位のセットアップが完結する ○ Go のテストはパッケージ単位のプロセス ○ 結合テストが書きやすい © 2026 UPSIDER.inc 31

32.

Section さらなる課題:トレードオフ ● ● DBを使ったテスト、Fuzzing test, Mutation test はどちらも実行時間がかかる ○ コンテナ起動 + マイグレーション ○ ランダム値・コード変更生成 テスト間で干渉するので、DBの起動単位は考える必要がある ○ 単一:事前に起動しておく ○ 複数:テスト内で起動(シングルトン、テストスイートごと) ○ トランザクションを commit しない、 defer rollback の仕組み化 ➡ テスト起動・実行時間 と 複雑性 増 © 2026 UPSIDER.inc 32

33.

Section テスト戦略・高速化が大事 ● テスト戦略 ○ ● ユニットテストではモック、コアロジック・結合テストではDB 開発者体験 :テストCI を速くしよう ○ 並列実行 t.Parallel() ○ cache の活用 ○ DBを SQLite の in memory に差し替えて妥協 ○ テストファイル分割 gotesplit ○ テスト用 seed データをイメージに入れておく ○ などなど... The Practical Test Pyramid より引用 親の顔より見たテストピラミッド © 2026 UPSIDER.inc 33

34.

Section まとめ ● AIによる治安の悪化をいかに防ぐか ○ ● ● アーキテクチャの構造 ○ AIがコンテキストを集めやすく理解しやすいパッケージ ○ internal や Lint での強制 テスト ○ ● ソフト制約とハード制約 ハックを許さない、検出できるようにする Lint や テストを強制する CI を品質ゲートにしよう © 2026 UPSIDER.inc 34

35.

Section … © 2026 UPSIDER.inc 35

36.

Section 特に目新しいこと言ってないな 💬 © 2026 UPSIDER.inc 36

37.

Section …ただの当たり前のプラクティスですよね 💬 © 2026 UPSIDER.inc 37

38.

Section ただの当たり前の話では? ● ● そのとおり、ここ数年(数十年?)言われてきたプラクティス ○ 適切なモジュール化と依存制御 ○ テストを速く、フィードバックループを短く ○ 開発者体験CI/CD, Observability への投資 目的が変わった ○ 人間へのルール・エラーログ ➡ AIへの修正プロンプト ○ 人間の待ち時間 ➡ AIの試行回数 © 2026 UPSIDER.inc 38

39.

Section なぜ、いま改めて重要なのか ● AI によって最も速くなったのは 「実装」フェーズ ● ボトルネックが実装の前後にシフト ● 実装が爆速になり、元々あった ボトルネックが AI によって露呈し 増幅されている © 2026 UPSIDER.inc 39

40.

Section 開発者体験 = エージェント体験 “The Venn Diagram of Developer Experience and Agent Experience is a circleˮ “「開発者体験とエージェント体験のベン図は円である」ˮ — Laura Tacho martinfowler.com Fragments: February 13 より © 2026 UPSIDER.inc 40

41.

開発者体験 = エージェント体験 © 2026 UPSIDER.inc 41

42.

Section Goと開発者体験 ● 標準機能が豊富ですぐ実行可能 ○ run, test, build, mod, vet, generate ○ ⭐fix: Go チームもAIの古いコード生成を課題視 (ref: https://go.dev/blog/gofix ● 高速なビルド、シングルバイナリ ● 標準パッケージが厚い ● ○ net/http, log/slog, context ○ 標準で Observability 向上させやすい 書き方が統一されやすい ➡ これらは全て人間のための設計だが、そのままAI にも効く © 2026 UPSIDER.inc 42

43.

Section まとめ ● AI開発では治安維持のガードレールとしてのアーキテクチャ・テスト・CI が大事 ○ 開発者体験を上げよう ● 開発プロセスは変わっていない、ボトルネックが実装の前後にシフト ● 特別な新技術ではない、これまでのプラクティスがAI 時代になお一層効く ○ 開発者体験の向上 ≒ エージェント体験の向上 ● 開発者体験の重要さを考えると Go は最高ってコト!? ● AI時代の開発に一緒に取り組んでくれる仲間を募集中です!We are hiring!! © 2026 UPSIDER.inc 43

44.

Section References ● https://www.martinfowler.com/articles/exploring-gen-ai/ccmenu-quality.html ● https://martinfowler.com/fragments/20260213.html © 2026 UPSIDER.inc 44