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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
マグロ隊長kinTV
September 19, 2026
Technology
380
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
580
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
150
めぐろLT#21 今年一番の仕事の成果
maguroalternative
0
160
DiscordBotをPythonからGoへリプレイスした話
maguroalternative
1
230
Other Decks in Technology
See All in Technology
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.3k
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
150
大型犬好きによるPugの紹介
yamanoku
1
150
ハードウェアコンペでもAI駆動開発が進んでいる話
iotengineer22
1
700
生成AIと進める探索的データ分析(2026.10.03 第122回Tokyo.R勉強会)
tatamiya
2
1.5k
その Valkey 使いこなしていますか?
onk
PRO
1
190
LocalStack を使ったサーバーレスアプリケーション開発 / Serverless Development with LocalStack
kakakakakku
1
420
USB PDを使ってスマホを労わりたい
raspython3
0
160
PagerDuty Tech Hub-鳴らすけれど、人は動かない
ezaki
0
120
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
360
Running Kotlin + Quarkus with Lambda
nealle
1
460
組み立てて楽しむ AWS Blocks 入門
kmiya84377
0
230
Featured
See All Featured
Prompt Engineering for Job Search
mfonobong
0
500
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
620
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
350
A Soul's Torment
seathinner
8
3.7k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
620
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Raft: Consensus for Rubyists
vanstee
142
7.8k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
700
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で縛ろう 検証に困ったら振る舞いに注目してみる