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
630
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
130
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
540
技術的負債に対する視力を得る / How to View Technical Debt
forrep
0
950
しくじり先生 - 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
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
Vite+ Unified Toolchain for the Web
naokihaba
0
740
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
270
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
800
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
190
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
480
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
170
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
継続モナドとリアクティブプログラミング
yukikurage
3
490
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
230
Featured
See All Featured
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
Chasing Engaging Ingredients in Design
codingconduct
0
230
The World Runs on Bad Software
bkeepers
PRO
72
12k
Side Projects
sachag
455
43k
WENDY [Excerpt]
tessaabrams
11
38k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Speed Design
sergeychernyshev
33
1.9k
Typedesign – Prime Four
hannesfritz
42
3.1k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Mind Mapping
helmedeiros
PRO
1
280
Raft: Consensus for Rubyists
vanstee
141
7.6k
Google's AI Overviews - The New Search
badams
0
1.1k
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