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
3
820
チームで運用する golangci-lint の向き合い方
LTで発表しきれなかったスライドが含まれています。
(20分以上いってしまうくらい、まだ喋れます....)
Sugar Sato
June 14, 2024
Tweet
Share
More Decks by Sugar Sato
See All by Sugar Sato
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
62
testcontainers のススメ
sgash708
1
120
「僕ら」のテストに対する向き合い方
sgash708
3
370
spansql で ENUM を使いたかった話
sgash708
2
140
qmuntal/stateless のススメ
sgash708
0
150
sqlx の実装を読んでみた話
sgash708
1
160
Atlas をプロジェクト導入してみた話
sgash708
0
450
サーバーレス環境をより改善してみた話
sgash708
4
1.8k
Other Decks in Programming
See All in Programming
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
140
バグを見つけた?それAppleに直してもらおう!
uetyo
0
180
MCP with Cloudflare Workers
yusukebe
2
220
Security_for_introducing_eBPF
kentatada
0
110
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
390
StarlingMonkeyを触ってみた話 - 2024冬
syumai
3
270
SymfonyCon Vienna 2025: Twig, still relevant in 2025?
fabpot
3
1.2k
これが俺の”自分戦略” プロセスを楽しんでいこう! - Developers CAREER Boost 2024
niftycorp
PRO
0
190
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
130
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
Асинхронность неизбежна: как мы проектировали сервис уведомлений
lamodatech
0
770
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
Designing Experiences People Love
moore
138
23k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Side Projects
sachag
452
42k
Why Our Code Smells
bkeepers
PRO
335
57k
Building Your Own Lightsaber
phodgson
103
6.1k
Faster Mobile Websites
deanohume
305
30k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.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 引用