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
チームで運用する golangci-lint の向き合い方
Search
Sugar Sato
June 14, 2024
Programming
2.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
チームで運用する golangci-lint の向き合い方
LTで発表しきれなかったスライドが含まれています。
(20分以上いってしまうくらい、まだ喋れます....)
Sugar Sato
June 14, 2024
More Decks by Sugar Sato
See All by Sugar Sato
AIと共に生きる技術選定 2026
sgash708
0
160
Bref でサービスを運用している話
sgash708
0
270
tool ディレクティブを導入してみた感想
sgash708
1
280
DeepWiki で Go をもっと好きになろう
sgash708
0
1k
環境変数ライブラリ選手権
sgash708
0
280
はじめての Go * WASM * OCR
sgash708
1
410
もう僕は OpenAPI を書きたくない
sgash708
6
2.6k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
240
testcontainers のススメ
sgash708
1
520
Other Decks in Programming
See All in Programming
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
310
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
150
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
140
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
210
Oxcを導入して開発体験が向上した話
yug1224
4
290
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
190
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
720
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
500
Lessons from Spec-Driven Development
simas
PRO
0
140
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
300
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
270
Featured
See All Featured
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
130
Automating Front-end Workflow
addyosmani
1370
210k
Building Applications with DynamoDB
mza
96
7.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
200
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
600
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Balancing Empowerment & Direction
lara
6
1.1k
GitHub's CSS Performance
jonrohan
1033
470k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
720
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2k
Transcript
チームで運用する golangci-lint の向き合い方 golang.tokyo #35 2024.06.14
自己紹介 Sugar Sato (@satoIsSugar) • 2023年 BuySell Technologies 入社 •
基盤チーム所属 (Portal/Account) PjM • Go / Angular / Serverless ◦ Go歴: 4年くらい • 熱帯植物 ◦ ビカクシダ • 猫 ◦ Lambda (♀ 2才)
プロダクト群「バイセルリユースプラットフォーム Cosmos」の開発が進行中 リユースに必要なすべての機能を提供する 「リユースプラットフォーム Cosmos」の開発が進行中です。 Cosmosを活用して、バイセルグループ全体での業務効率改善やデータドリブン経営の深化を目指しています。 リユースプラットフォーム Cosmos 自社開発のリユース特化業務基幹システムでありサービス群の集合体 買取申込
買取・査定 在庫管理 販売 多様なチャネルで収益最大化 CRM -顧客対応- 買取種別に応じた最適なシステム構築 Visit -訪問買取 - Store -店舗買取 - Promas -商材マスタ - Appraisal -専門査定 - Stock -在庫管理 - EXS -販売管理 - Core -会員管理- Portal -データ利用- Pocket -データ基盤- 買取 専門チームによる真贋・査定と連携 査定 申込 効率的な顧客対応 在庫 在庫管理の最適・効率化 販売 データ 各事業プロセスにある データを一元管理 :基幹システム
None
みなさんは golangci-lint 導入してますか?
YES!!
どんなルールで運用してますか? なんとなく雰囲気で使っていませんか?
僕はそうでした😅 なので立ち返って運用ルールや チームでの向き合い方を考えてみました!
アジェンダ golangci-lint とは 01 実際の取り組み 02 まとめ 03
golangci-lint とは
• 高速リンターランナー ◦ 最初に解析したパスのディレクトリからルートまでの全てのディレ クトリにある設定ファイルを探す ◦ 使い方 ▪ ルールを追加する •
.golangci.(yml|yaml|json|toml) ▪ コマンド実行 • $ golangci-lint -v run ./... golangci-lint
• 5つの設定 ◦ run (解析時の設定) ◦ output (解析結果の出力設定) ◦ linters
(lintの設定) ▪ linters-settings ◦ issues (除外設定) ◦ severity (issue 重大度設定) 設定ファイル( .golangci.yml )について
run configuration • go • concurrency • timeout • issues-exit-code
• tests • build-tags • etc…
output configuration • sort-results • sort-order • formats • print-issued-lines
• print-issued-name • etc…
linters configuration • disable-all • enable • enable-all • disable
• presets • fast
issues configuration • exclude-rules • exclude-files • exclude-dirs • exclude
• exclude-use-default • exclude-generated • etc…
severity configuration • default-severity • case-sensitive • rules ◦ linters
◦ severity
golangci-lint コントリビュータ • sanposhiho さん • sivchari さん • karamaru-alpha
さん ◦ Goconf 2024 で copyloopvar 等について登壇! ▪ めっちゃ良かった....(小並) • etc…
実際の取り組み
• 必要最低限の設定 ◦ run ◦ linters ▪ linters-settings ◦ issues
自分たちの .golangci.yml
• 必要最低限の設定 ◦ run ◦ linters ▪ linters-settings ◦ issues
自分たちの .golangci.yml
• 必要最低限の設定 ◦ run ◦ linters ▪ linters-settings ◦ issues
自分たちの .golangci.yml
• 基本的に disable-all で運用 ◦ 保守的な運用 ◦ デフォルトのルールは全て適用す る ◦
メリット ▪ 気軽に golangci-lint のバー ジョン挙げられる ◦ デメリット ▪ 考慮漏れが発生するかも linters の運用方法
• enable の中でも Must と Should に分 けてルールを適用している ◦ Must
▪ golangci-lint のデフォルト true のオプション ◦ Should ▪ 自分たちとしてコード品質を保 つためのオプション linters の運用方法
• 「課題が出たタイミング」 ◦ 最近はルール追加することは少ない ▪ 運用が安定してきた証拠? ▪ (最新の追加されたルールを追えてないだけ...??) ルール追加の基準
• チームメンバーと制約について目線合わせする • “納得感”あるルール作りをしていく ◦ 自分本位なルールではないか ◦ 本当に必要なルールか ▪ 実際に導入してみたら却って「開発効率」を下げていないか
▪ もしチームにフィットしなくてメリットがなければ思い切って削 除する ルール追加にあたって気をつけていること
チームの運用方法については、わかった じゃあ、どんなルールを採用しているの?
• lll • gocyclo • goconst • nestif • tagliatelle
enable に採用しているルール
• lll • gocyclo • goconst • nestif • tagliatelle
enable に採用しているルール
• 一行あたりの文字数制限 (long line linter) • Go は1行のあたりの文字数を明確に決めていない ◦ https://go.dev/doc/effective_go#formatting
• PHP ◦ PSR-12: 80文字 or 120文字 • Java ◦ Oracle: 80文字 ◦ Google: 100文字 lll
• 自分のチームでは ◦ line-length: 140文字 ▪ 公式の推奨に合わせている ▪ デフォルト120文字 ◦
tab-width: 2 • ignore 設定はテストでも適用しない ◦ 可読性を担保する ◦ コードレビューの負担を減らす lll
• lll • gocyclo • goconst • nestif • tagliatelle
enable に採用しているルール
• 循環複雑度 (cyclomatic) ◦ 関数のソースコードを通る直 線的に独立したパスの数を数 値にしたもの ◦ 詳しい仕様については下記 ▪
https://github.com/fzipp/ gocyclo/tree/main gocyclo
enable に採用しているルール • lll • gocyclo • goconst • nestif
• tagliatelle
• 定数で置き換え可能な繰り返し文字列を指摘 ◦ デフォルト 3回繰り返しまで許可する ◦ 割とお気に入りのルール ▪ 気がつかないうちに全く同じ変数を書いて いたりするため
▪ ignore ルール設定も網羅している goconst
goconst
enable に採用しているルール • lll • gocyclo • goconst • nestif
• tagliatelle
• if のネスト回数制御 ◦ デフォルト 5回以上のネストを許可しない ◦ とりあえずいれておくだけで OK! ▪
不要なレビューが減る nestif
nestif
enable に採用しているルール • lll • gocyclo • goconst • nestif
• tagliatelle
• 読み方:タリアテッレ • タグ名の制御 ◦ field 名と一致させている ◦ json から
envconfig まで対応して いる ▪ https://golangci-lint.run/usa ge/linters/#tagliatelle tagliatelle
• タグの記述間違いに気が付き やすく、お気に入り • ただし、独自の命名ケースなど には対応していない tagliatelle
以上が linters に適用しているルール
• 必要最低限の設定 ◦ run ◦ linters ▪ linters-settings ◦ issues
自分たちの .golangci.yml
• 基本的に ignore ルールを適用しない方針 ◦ テストコードもプロダクションコード同様に扱い品質を保ちたい ◦ どうしても ignore ルールを追加したい時はチームで相談する
◦ lint 対象ファイルに勝手に ignore ルールを追加しない issues
• ファイル単位で ignore ルールを追 加しない ◦ 部分的に // nolint:ルール名 を
追加して適用する ◦ チーム相談の上で記述 issues
以上が issues の運用方法
• レビューの工数を ”少し” でも減らせる ◦ PR で「わざわざコメントするほどではないか」をなくせる ▪ 心理的負担を減らせる ◦
記述が統一されやすくなり可読性向上がみこめる ◦ Go を初めて書くメンバーも「記述が、ぶれにくくて良い」との声も 上がる golangci-lint のメリット
• gofmt とあわせて lint ルールから自動で修正してもらえるといいなぁ (願望) • 参画してくるメンバーへ lint ルール浸透が必要
◦ より改善できるチャンス! 今後の展望や課題
まとめ
• チームでの運用においては、最小限の設定で効果的に利用する ◦ 各設定の適用ルールや除外ルールを柔軟に調整することが重 要だと感じている • 課題感や改善できる箇所も存在している ◦ tagliatelle などに独自ルール追加ができないので自作できたら
いいな ◦ disable-all を使っているので、本来自分たちにピッタリなルール があるかもしれないが見逃している可能性がある まとめ
• golangci-lintの導入により、コード品質の向上やレビュー負担の軽減 といったメリットも享受できている ◦ これにより、開発プロセスがスムーズになり、新しいメンバーも記 述のぶれが少なくて済むと感じている まとめ
• 導入していなかった人は、ぜひ導入を! • 導入している人は ◦ おすすめの運用方法や、これ適用してないの?など会話した い! みなさんの .golangci.yml はどうですか?
THANK YOU
• https://github.com/golangci/golangci-lint • https://github.com/golangci/golangci-lint/blob/master/assets/go.png • https://www.docswell.com/s/takanakahiko/ZQ864X-2024-05-11-022041#p11 • https://golangci-lint.run/usage/linters/#tagliatelle • https://go.dev/doc/effective_go#formatting
• https://www.php-fig.org/psr/psr-12/#23-lines • https://google.github.io/styleguide/javaguide.html#s3.2-package-statement 引用