Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
C#未経験の僕がAIに読めるコードを書かせるまで
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
マグロ隊長kinTV
September 19, 2026
Technology
400
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C#未経験の僕がAIに読めるコードを書かせるまで
C#Kaigi2026の登壇資料です。
https://csharpkaigi.net/talks/lt-ai-readable-code
マグロ隊長kinTV
September 19, 2026
More Decks by マグロ隊長kinTV
See All by マグロ隊長kinTV
感動を貰う側から与える側へ -アイドルマスターミリオンライブから学ぶCfPに挑むと言うこと-
maguroalternative
1
590
useEffectってなんで非推奨みたいなこと言われてるの?
maguroalternative
11
8k
React19.2のuseEffectEventを追う
maguroalternative
2
1.2k
UDDのススメ - 拡張版 -
maguroalternative
2
1.9k
遊戯王GX 丸藤兄弟から学ぶ成長
maguroalternative
1
220
UDDのすすめ
maguroalternative
0
1.5k
LINE Works Bot入門
maguroalternative
0
160
めぐろLT#21 今年一番の仕事の成果
maguroalternative
0
160
DiscordBotをPythonからGoへリプレイスした話
maguroalternative
1
230
Other Decks in Technology
See All in Technology
「作れる」と「リリースできる」の間にあったもの── PdMを外して見えた、PdMがやるべき仕事/Buildable ≠ Shippable: What Removing the PM Taught Me About the PM’s Job
yappli_developers
0
320
Claude Code on Bedrock で統制をかける小ネタ集/claude-code-bedrock-governance-tips
emiki
1
13k
国際カードブランドルール変更に伴うクレジットカード決済取引仕様変更について
k1style
0
240
日本AIベンチャーレポート2026
kentarofujii
0
250
AWS DevOps Agentはどこまで任せられるか 〜機能の現在地と、機能拡張の実践〜
nyankotaro
0
260
AI駆動開発における開発環境のセキュリティの考え方
yamahiro
2
640
Adversary Infrastructure Hunting101
disconinja
0
160
CTO Night & Day Morning Session_AI-DLC:生成 AI 時代の開発プロセス変革
pikosan0000
0
110
ガチで放置できるClaude Code実行環境の作り方.pdf
lamaglama39
5
9.9k
アカウント統制の健康診断
kenichinakamura
1
210
[re:Invent2026事前勉強会(有志開催)]続きは、ラスベガスの廊下で / continue-in-the-vegas-hallway
sh_fk2
0
310
演劇と私とスクラム
chinmo
0
160
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Site-Speed That Sticks
csswizardry
13
1.6k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.4k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
420
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
RailsConf 2023
tenderlove
30
1.6k
Typedesign – Prime Four
hannesfritz
42
3.2k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
590
Building Applications with DynamoDB
mza
96
7.3k
WCS-LA-2024
lcolladotor
0
920
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
370
Transcript
C#未経験の僕がAIに読める コードを書かせるまで マグロ/佐々木陽貴 2026/9/19 C#Kaigi
自己紹介 名前:マグロ/佐々木陽貴(sasaki haruki) 所属:株式会社くふうカンパニー Twitter:sigumataityouda GitHub:maguro-alternative コメント:基本ruby,ts,go書いてます。
未経験でもC#が扱える時代に 昨今のAIエージェント情勢で細かい言語仕様を知らなくても扱えるように
ただし認知負債は貯まる こちらが認識できるのは側だけ 中身のブラックボックス化は徐々に進んでいく
読めるようにしよう 読める=意図通りか検証できるようにすること - ASTで縛って読めるコードを書かせる BDDによる振る舞いの検証
例 例として「避けゲー」を作る - 画面の上から落ちてくる敵を左右に動いて避ける 生き残った時間だけスコアが増える
読めるコードを書かせる まず読める定義を測る - C#の基本文法を徹底的に見て、気になったものは調べる or AIに聞く - たまにクイズ形式で AIに問題出してもらってそれを解くみたいなこともした
読めるコードを書かせる わかったこと - 基本文法は問題なし。 public sealed class UserRepository : IUserRepository
{ private readonly IDbConnection _connection; public async Task<IReadOnlyList<User>> FindActiveAsync( CancellationToken cancellationToken = default) { ... } }
読めるコードを書かせる わかったこと - 基本文法は問題なし。 宣言が他言語より長いが中身 が簡潔 public sealed class UserRepository
: IUserRepository { private readonly IDbConnection _connection; public async Task<IReadOnlyList<User>> FindActiveAsync( CancellationToken cancellationToken = default) { ... } }
読めるコードを書かせる ハマった点 - LINQによる遅延評価 - 画面外にいった敵を消して追加する var onScreen = enemies.Where(e
=> e.Y > bottomY); enemies.Add(new Enemy(...)) if (onScreen.Count() > 10) { ... } ここで追加した敵は onScreenに含まれな いと思ってた。
読めるコードを書かせる ハマった点 - LINQによる遅延評価 - 画面外にいった敵を消して追加する var onScreen = enemies.Where(e
=> e.Y > bottomY); enemies.Add(new Enemy(...)) if (onScreen.Count() > 10) { ... } 遅延評価が入るので 追加した敵も対象とな る
読めるコードを書かせる ハマった点 - LINQによる遅延評価 - 他言語だと明示的に書かないと基本遅延操作にならない (Ruby:lazy,TS/JS:function*) ORMではよく採用されるけど、 console使っているとついつい忘れる var
onScreen = enemies.Where(e => e.Y > bottomY); enemies.Add(new Enemy(...)) if (onScreen.Count() > 10) { ... }
読めるコードを書かせる ハマった点 - LINQによる遅延評価 - 遅延評価を辞めさせて、結果を必ず返す方式にする var onScreen = enemies.Where(e
=> e.Y > bottomY).ToList();
読めるコードを書かせる ハマった点 - 拡張メソッド - そもそもなんだこれ 既存クラスに新たにメソッドを追加できるもの public static class
EnemyExtensions { public static bool IsThreatening(this Enemy enemy, Player player) { return enemy.IsAlive && enemy.DistanceTo(player) < 5f; } } Enemyを直接いじらず にIsThreateningを追加
読めるコードを書かせる ハマった点 - 拡張メソッド - 変に依存が増えて全体像が追いづらくなるため使用を避ける public static class EnemyExtensions
{ public static bool IsThreatening(this Enemy enemy, Player player) { return enemy.IsAlive && enemy.DistanceTo(player) < 5f; } }
読めるコードを書かせる 禁止する方法 書かれたらコンパイルエラーで落とす
読めるコードを書かせる 禁止する方法 書かれたらコンパイルエラーで落とす ASTを弄って落とすようにする 基本文法は問題なく読めたのでASTも問題なく読めると判断
読めるコードを書かせる LINQ 結果を必ず返すようにする (他にも条件があるものの)とりあえずこの3つが分かれば良い 代入、戻り値の部分 か? メソッドが LINQ のも のか?
戻り値が遅延型か?
読めるコードを書かせる LINQ 代入、戻り値の部分か? context.RegisterSyntaxNodeAction(AnalyzeLocalDeclaration, SyntaxKind.LocalDeclarationStatement); context.RegisterSyntaxNodeAction(AnalyzeFieldDeclaration, SyntaxKind.FieldDeclaration); context.RegisterSyntaxNodeAction(AnalyzeAssignment, SyntaxKind.SimpleAssignmentExpression); context.RegisterSyntaxNodeAction(AnalyzeReturn,
SyntaxKind.ReturnStatement); context.RegisterSyntaxNodeAction(AnalyzeArrowBody, SyntaxKind.ArrowExpressionClause);
読めるコードを書かせる LINQ private static bool IsLinqOperator(IMethodSymbol method) LINQ のメソッドか判定 {
INamedTypeSymbol containing = method.ContainingType; if (containing == null || containing.ContainingNamespace == null) { return false; } if (containing.ContainingNamespace.ToDisplayString() != "System.Linq") { return false; } return containing.Name == "Enumerable" || containing.Name == "Queryable";
読めるコードを書かせる 遅延型かどうか LINQ if (definition.SpecialType == SpecialType.System_Collections_Generic_IEnumerable_T || definition.SpecialType ==
SpecialType.System_Collections_IEnumerable) { return true; } if (definition.ContainingNamespace != null && definition.ContainingNamespace.ToDisplayString() == "System.Linq") { return definition.Name == "IOrderedEnumerable" || definition.Name == "IQueryable" || definition.Name == "IOrderedQueryable";
読めるコードを書かせる 禁止する方法 書かれたらコンパイルエラーで落とす ASTを弄って落とすようにする 基本文法は問題なく読めたのでASTも問題なく読めると判断 →条件式の塊なので全然読める
振る舞いの検証 動作が正しいか検証する必要もある 実際にプレイするのもありだけど正直限界もあるので自動テストも入れる でもどこまで検証すればいい?
振る舞いの検証 こうあってほしいと言うストーリー像がある ユーザーストーリーを立ててそれを元にテストを組み立てる BDDを採用
振る舞いの検証 BDD(振る舞い駆動開発) システムの振る舞いを中心に捉える手法 Gherkin記法を使うことで自然言語を元にテストを組むことができる
振る舞いの検証 例:プレイヤーがどれだけ粘るか ストーリー:生き残った時間でスコアが増える Given:ラウンドが始まったとき、スコアは 0 When:時間が経つ Then:スコアが増える
振る舞いの検証 ストーリー通り組めるのでわかりやすい public void GrowsWithSurvivedTime() { // Given ラウンドが始まり、スコアは 0
Score score = new Score(); // When 2 秒生き残る score.Advance(2f); // Then スコアは 1 秒あたり 10 ずつ増え、20 になる Assert.AreEqual(20, score.Value); }
結果 自分の想定通りのコードになるので読みやすくはなった。 理解が追いつかない部分も機械的に落とすようになっているので、認知負荷の軽減に は繋がっている。
結果 また敢えて禁止したものがどういった課題を解決するのかを認識できた。 なので結果的にC#学習の補助になった。 ※以前はLINQ自体を禁止してたけど徐々にわかってきたので部分的に解放してる
課題 Unity周りの認知負債がたまりやすい - Unityの属性 MonoBehaviour シーンの入れ替え... Unity側を薄くして振る舞い見てるけど、Unityが丸々負債と化すのでこの辺もどうにかしたいところ...
まとめ - 読みづらいものはASTで縛ろう 検証に困ったら振る舞いに注目してみる