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
マグロ隊長kinTV
September 19, 2026
Technology
23
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
510
useEffectってなんで非推奨みたいなこと言われてるの?
maguroalternative
11
7.9k
React19.2のuseEffectEventを追う
maguroalternative
2
1.2k
UDDのススメ - 拡張版 -
maguroalternative
2
1.7k
遊戯王GX 丸藤兄弟から学ぶ成長
maguroalternative
1
210
UDDのすすめ
maguroalternative
0
1.5k
LINE Works Bot入門
maguroalternative
0
150
めぐろLT#21 今年一番の仕事の成果
maguroalternative
0
150
DiscordBotをPythonからGoへリプレイスした話
maguroalternative
1
220
Other Decks in Technology
See All in Technology
人間はどの意思決定を手放せるのか
kawasima
14
7k
GoにおけるFFIのこれまでとこれから
goccy
5
3.6k
Screen Lens - 今見てる画面を翻訳する
komagata
0
320
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
1
130
絵ではじめるKubernetesセキュリティ
aoi1
3
600
「守り」で活用するオンデバイスLLM 〜写ってはいけないを総力戦で防ぐ〜 / iOSDC Japan 2026
nakamuuu
0
160
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
0
2.7k
AIエージェントを最高のパートナーに育てる方法|評価と判断軸を育てる5つのステップ
koichiaoki
1
100
Spring BootからQuarkusへの移行
tatsuya1bm
2
120
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
5
25k
アプリをもっと"iOSアプリっぽく"する小さな工夫 / Small Touches That Make Your App Feel More Like an iOS App
matsuji
1
910
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
How to train your dragon (web standard)
notwaldorf
97
6.8k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Believing is Seeing
oripsolob
1
220
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
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で縛ろう 検証に困ったら振る舞いに注目してみる