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
710
チームで運用する golangci-lint の向き合い方
LTで発表しきれなかったスライドが含まれています。
(20分以上いってしまうくらい、まだ喋れます....)
Sugar Sato
June 14, 2024
Tweet
Share
More Decks by Sugar Sato
See All by Sugar Sato
「僕ら」のテストに対する向き合い方
sgash708
2
190
spansql で ENUM を使いたかった話
sgash708
2
120
qmuntal/stateless のススメ
sgash708
0
130
sqlx の実装を読んでみた話
sgash708
1
140
Atlas をプロジェクト導入してみた話
sgash708
0
380
サーバーレス環境をより改善してみた話
sgash708
4
1.8k
Other Decks in Programming
See All in Programming
どうして僕の作ったクラスが手続き型と言われなきゃいけないんですか
akikogoto
1
120
最新TCAキャッチアップ
0si43
0
140
CSC509 Lecture 12
javiergs
PRO
0
160
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
5
430
初めてDefinitelyTypedにPRを出した話
syumai
0
410
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
110
CSC509 Lecture 11
javiergs
PRO
0
180
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
1
100
Remix on Hono on Cloudflare Workers
yusukebe
1
290
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
2
1.1k
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
2
670
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
How to Ace a Technical Interview
jacobian
276
23k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
93
Building Applications with DynamoDB
mza
90
6.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
What's new in Ruby 2.0
geeforr
343
31k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
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 引用