Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
最近コードレビューで指摘したこと
Search
forrep
April 24, 2024
Programming
620
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
120
Linux && Docker 研修/Linux && Docker training
forrep
28
5.8k
RAGにベクトルDBは必要ない!DBも不要で運用めちゃ楽な RAG Chatbot を作った話
forrep
38
18k
Google Analytics でサイト速度を計測する / Measure site speed with Google Analytics
forrep
2
440
「プログラマーのためのCPU入門」は入り口として丁度よい!
forrep
54
38k
DevTools でパフォーマンスチューニング入門 / Introduction to Performance Tuning with DevTools
forrep
2
530
技術的負債に対する視力を得る / How to View Technical Debt
forrep
0
940
しくじり先生 - NFS+sqliteで苦労した話から学ぶ、問題解決の考え方 / problem-solving approach
forrep
1
1.4k
理屈で考える、データベースのチューニング / Database tuning How-To
forrep
28
9.7k
Other Decks in Programming
See All in Programming
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
170
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
140
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.1k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
540
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
210
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
570
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.4k
JavaDoc 再入門
nagise
1
370
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
200
Featured
See All Featured
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
860
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
RailsConf 2023
tenderlove
30
1.5k
So, you think you're a good person
axbom
PRO
2
2.1k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
440
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Test your architecture with Archunit
thirion
1
2.3k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
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