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
最近コードレビューで指摘したこと
Search
forrep
April 24, 2024
Programming
650
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
最近コードレビューで指摘したこと
forrep
April 24, 2024
More Decks by forrep
See All by forrep
サービスに組み込むAIのパターン/アンチパターン
forrep
0
160
Linux && Docker 研修/Linux && Docker training
forrep
28
5.9k
RAGにベクトルDBは必要ない!DBも不要で運用めちゃ楽な RAG Chatbot を作った話
forrep
38
18k
Google Analytics でサイト速度を計測する / Measure site speed with Google Analytics
forrep
2
470
「プログラマーのためのCPU入門」は入り口として丁度よい!
forrep
54
38k
DevTools でパフォーマンスチューニング入門 / Introduction to Performance Tuning with DevTools
forrep
2
570
技術的負債に対する視力を得る / How to View Technical Debt
forrep
0
980
しくじり先生 - NFS+sqliteで苦労した話から学ぶ、問題解決の考え方 / problem-solving approach
forrep
1
1.4k
理屈で考える、データベースのチューニング / Database tuning How-To
forrep
28
9.9k
Other Decks in Programming
See All in Programming
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
190
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
450
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
170
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
190
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
120
APNsからLive Activityを開始する話
yumnumm
0
170
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
1.6k
オーケストレーション記述言語 Katari
yukikurage
0
180
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.8k
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
2
1.2k
残高管理から台帳サービスへの進化
artoy
1
210
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
41k
Designing for Performance
lara
612
70k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Statistics for Hackers
jakevdp
799
230k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
370
Ruling the World: When Life Gets Gamed
codingconduct
0
410
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
エンジニアに許された特別な時間の終わり
watany
109
250k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Transcript
最近コードレビューで 指摘したこと 1 株式会社ラクーンホールディングス 技術戦略部 羽山純
自己紹介 • 名前 ◦ 羽山 純(Jun Hayama) ◦ @forrep •
所属 ◦ 株式会社ラクーンホールディングス 技術戦略部 • 技術領域 ◦ バックエンド・インフラ ◦ パフォーマンス改善 ◦ AI(企業審査AI) • 個人活動 ◦ アプリ開発 2
後でコードを読む人の消費時間を最小化する 3
後でコードを読む人の消費時間を最小化する • 次のパターンは正常系に進む ◦ form.hasErrors() == false かつ firstError !=
null ◦ form.hasErrors() == true かつ firstError == null • 後から読む人は上記パターンの調査が必要になる ◦ あえてそういうコードとなっている、無視できない public String controller(Form form) { if (form.hasErrors()) { Error firstError = form.getFirstError(); if (firstError != null) { return firstError.getMessage() } } // 正常系の処理 // ... } 4
後でコードを読む人の消費時間を最小化する • 必要のない条件は削除する、でないと後の人が困る • 必要な条件なら、再現できるテストケースを書く public String controller(Form form) {
Error firstError = form.getFirstError(); if (firstError != null) { return firstError.getMessage() } // 正常系の処理 // ... } 5
要件外/想定外の責任をしっかり放棄する 6
要件外/想定外の責任をしっかり放棄する • 赤枠のフィルタ処理は必要なさそう • from.getErrors() はフレームワーク内の処理で不透明 ◦ null 要素が混じる可能性はゼロではない(ほぼゼロだけど) •
後で修正する人は、この行を簡単に削除できない ◦ この状態で数年間動いてたら、消すのは怖い ◦ 必要性は分からないが、修正後も維持するしかない ◦ null 要素を含むテストは不可能でモヤモヤする Optional<Error> firstError = form .getErrors() // Stream<Error> .filter(Objects::nonNull) // Stream<Error> .findFirst(); // Optional<Error> 7
要件外/想定外の責任をしっかり放棄する • 要件外/想定外の事象には対処しない ◦ 想定しない null 要素は致命的な問題の可能性 ◦ 動作を続けるよりもフェイルファストで落とす方が安全 ▪
動き続けたら問題の発生自体に気づけない • 想定外へ対処するとあなたは安心するが後の人は不安になる ◦ 責任をしっかり放棄することが、責任を取るということ ▪ この状態でしばらく正常稼働すれば問題ないと確認できる ◦ 「想定しない状態だけど動くように」は害でしかない Optional<Error> firstError = form .getErrors() // Stream<Error> .findFirst(); // Optional<Error> 8