Slide 1

Slide 1 text

Sansan株式会社 部署 名前 品質の高い機能を”早く”提供するために 技術的な面でチームでやったこと、 やりたいこと 技術本部 Bill One Engineering Unit 兼 情報セキュリティ部 CSIRTグループ 茂木康汰

Slide 2

Slide 2 text

写真が入ります 茂木 康汰 Sansan株式会社 技術本部 Bill One Engineering Unit 2021年7月19日入社 高木 徹(Toru-Takagi) @TTrpbm

Slide 3

Slide 3 text

© Sansan, Inc. Bill Oneは、Sansan株式会社が提供するインボイス管理サービスです。 郵送やメールといったさまざまな方法・形式で届く請求書をオンラインで一括受領し、素早く正確にデータ化。請求書をクラ ウド上で一元管理することで、アナログで非効率な請求書業務をデジタル化します。インボイス制度や電子帳簿保存法にも対 応し、月次決算業務を効率化することで、企業経営における意思決定のスピードを加速します。 ※月次決算業務 毎月の営業成績、財政状況を明らかにするために行われる業務。経理担当者が行う業務で、毎月の数字の締め処理作業として発生します。

Slide 4

Slide 4 text

4 ©Sansan, Inc. 4 ©Sansan, Inc. - 戦略グループ かにかん(旧さばかん) > 品質高く価値を早く提供する - Goの知見がある人が多く、Goつよつよもいる > Bill One 2つ目のGoマイクロサービス - Goで得た知見をServer-Side Kotlinに持ち込んでる チーム紹介

Slide 5

Slide 5 text

5 ©Sansan, Inc. 5 ©Sansan, Inc. 品質高く早く出すために技術面でやったこと 開発の型化 コードの自動生成 テストコードの充実 運用コストを見据えたエラーハンドリング

Slide 6

Slide 6 text

6 ©Sansan, Inc. 6 ©Sansan, Inc. - イベントストーミング、ドメインモデリング(Miro) - .protoファイルでAPI定義 - interfaceを全員モブプロ - DDDの各層を個別に実装 > テーブルテスト > sqlcによるテーブル操作コードの自動生成 > 必要なエラーのみハンドリング(共通エラー化) Goでの開発スタイル

Slide 7

Slide 7 text

Server-Side Kotlinに どう持ち込んだのか?

Slide 8

Slide 8 text

8 ©Sansan, Inc. 8 ©Sansan, Inc. - Before: JUnit5 > テストケースが網羅されているのかわかりづらい > 意識的に共通化しないとコード重複が多い > ParameterizedTestは微妙 - After: Kotest > テーブルテストが書きやすい > テストケースが網羅されているのか見やすい > 仕組み的に共通化される テーブルテスト

Slide 9

Slide 9 text

9 ©Sansan, Inc. 9 ©Sansan, Inc. テーブルテスト

Slide 10

Slide 10 text

10 ©Sansan, Inc. 10 ©Sansan, Inc. 品質高く早く出すために技術面でやったこと 開発の型化 コードの自動生成 テストコードの充実 運用コストを見据えたエラーハンドリング

Slide 11

Slide 11 text

11 ©Sansan, Inc. 11 ©Sansan, Inc. - Before > 時間削減でプロダクションコードを利用 > Repositoryと似たコードの二重実装 - After > sqlcによる自動生成 > テストのアサーション方法が統一 宣伝:Bill One開発文化のおかげでOSSにコントリビュートできた話 [1] テーブルアサーション

Slide 12

Slide 12 text

12 ©Sansan, Inc. 12 ©Sansan, Inc. 品質高く早く出すために技術面でやったこと 開発の型化 コードの自動生成 テストコードの充実 運用コストを見据えたエラーハンドリング

Slide 13

Slide 13 text

13 ©Sansan, Inc. 13 ©Sansan, Inc. - Before > require / checkでエラー投げ放題 - After > Kotlin標準のResult > kotlin-result導入 ※僕が唯一やったこと... エラーハンドリング

Slide 14

Slide 14 text

14 ©Sansan, Inc. 14 ©Sansan, Inc. - DomainServiceへのロジック閉じ込め(getter高階関数パターン) > kotlin-resultを半年使ってみて [2] > ビジネスロジックを「型」で表現する OOPのための関数型DDD [3] > DDDで集約を跨いだ情報でロジックを構築するための 「getter高階関数パターン」の紹介 [4] エラーハンドリング+α

Slide 15

Slide 15 text

15 ©Sansan, Inc. 15 ©Sansan, Inc. 品質高く早く出すために技術面でやったこと 開発の型化 コードの自動生成 テストコードの充実 運用コストを見据えたエラーハンドリング

Slide 16

Slide 16 text

16 ©Sansan, Inc. 16 ©Sansan, Inc. - Bill Oneでもトップクラスのリードタイム (12月末にチーム人数が半分になり混乱期あり) 宣伝: フロー効率から始めて、チームの生産性を向上させた話 [5] 結果

Slide 17

Slide 17 text

17 ©Sansan, Inc. 17 ©Sansan, Inc. - テストコードの自動生成 - TypeSpecやProtobufからのコード自動生成 これからやりたいこと

Slide 18

Slide 18 text

18 ©Sansan, Inc. 18 ©Sansan, Inc. - interfaceモブプロでテストケースの洗い出しを実施 - 型化された部分を実装する時間が無駄 > Kotestによる定型分 > DDD層ごとのテスト観点の違い - 型からズレたPRが上がってきた際のコスト 課題

Slide 19

Slide 19 text

19 ©Sansan, Inc. 19 ©Sansan, Inc. - interfaceモブプロ終了時にテストコードを自動生成しよう 解決策

Slide 20

Slide 20 text

20 ©Sansan, Inc. 20 ©Sansan, Inc. - Clikt > KotlinでCLIツールを作れるライブラリ - kotlin-inquirer > 選択UIなどリッチなCLIにできるライブラリ - kotlinpoet > Kotlinコードを自動生成するライブラリ - kotlin-compiler-embeddable > Kotlinのコンパイラにも利用されている静的解析 自動生成ツール

Slide 21

Slide 21 text

21 ©Sansan, Inc. 21 ©Sansan, Inc. - PsiFileFactory#createFileFromText > 文字列からKtFileを作成してくれる - collectDescendantsOfType > KtClass - classを表現。isDataでDataClassを絞り込める > KtObjectDeclaration - objectを表現 - KtFile#packageFqName > パッケージ名を取得 軽いkotlin-compiler-embeddable説明

Slide 22

Slide 22 text

22 ©Sansan, Inc. 22 ©Sansan, Inc. - KtClass#body > classの中身を取得できる - KtClass#body#functions -> List > methodを取得できる - KtNamedFunction#getValueParameters -> List > methodの引数情報を取得できる - KtNamedFunction#typeReference > methodの戻り値を取得できる - KtParameter#typeReference > 引数の型情報を取得できる 軽いkotlin-compiler-embeddable説明

Slide 23

Slide 23 text

23 ©Sansan, Inc. 23 ©Sansan, Inc. - 開発の型化することで高品質で早く開発できる - 自動生成は生産性を大きくあげる - チームに特化させれば自動生成コードは数十時間が作れる - 顧客に価値を早く届けることが仕事 まとめ

Slide 24

Slide 24 text

Bill One 開発エンジニア 採用情報 https://media.sansan-engineering.com/billone-engineer

Slide 25

Slide 25 text

25 ©Sansan, Inc. 25 ©Sansan, Inc. [1] Sansan Tech Blog. “Bill One開発文化のおかげでOSSにコントリビュートできた話”. https://buildersbox.corp-sansan.com/entry/2024/02/02/110000, (2024/10/06) [2] 株式会社ログラス テックブログ. “kotlin-resultを半年使ってみて”. https://zenn.dev/loglass/articles/try-using-kotlin-result, (2024/10/06) [3] YuitoSato. “ビジネスロジックを「型」で表現するOOPのための関数型DDD”. https://speakerdeck.com/yuitosato/functional-and-type-safe-ddd-for-oop, (2024/10/06) [4] 株式会社ログラス テックブログ. “DDDで集約を跨いだ情報でロジックを構築するための「getter高階関数パター ン」の紹介”. https://zenn.dev/loglass/articles/2e0fdbf5b0f7a9, (2024/10/06) [5] SansanTech. “フロー効率から始めて、チームの生産性を向上させた話”. https://speakerdeck.com/sansantech/sansan-20230831-3-1, (2024/10/06) 参考URL