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
67
testcontainers のススメ
sgash708
1
120
「僕ら」のテストに対する向き合い方
sgash708
3
370
spansql で ENUM を使いたかった話
sgash708
2
140
qmuntal/stateless のススメ
sgash708
0
150
sqlx の実装を読んでみた話
sgash708
1
160
Atlas をプロジェクト導入してみた話
sgash708
0
460
サーバーレス環境をより改善してみた話
sgash708
4
1.8k
Other Decks in Programming
See All in Programming
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
200
Zoneless Testing
rainerhahnekamp
0
120
今年一番支援させていただいたのは認証系サービスでした
satoshi256kbyte
1
260
テストコードのガイドライン 〜作成から運用まで〜
riku929hr
5
840
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
Jakarta EE meets AI
ivargrimstad
0
260
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
420
責務を分離するための例外設計 - PHPカンファレンス 2024
kajitack
8
1.8k
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
140
GitHubで育つ コラボレーション文化 : ニフティでのインナーソース挑戦事例 - 2024-12-16 GitHub Universe 2024 Recap in ZOZO
niftycorp
PRO
0
100
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
360
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
450
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
What's in a price? How to price your products and services
michaelherold
243
12k
Building Applications with DynamoDB
mza
91
6.1k
Visualization
eitanlees
146
15k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Optimising Largest Contentful Paint
csswizardry
33
3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
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 引用