Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

品質の高い機能を”早く”提供するために技術的な面でチームでやったこと、やりたいこと

SansanTech
October 24, 2024

 品質の高い機能を”早く”提供するために技術的な面でチームでやったこと、やりたいこと

■ イベント
Server-Side Kotlin LT大会 vol.13
https://server-side-kotlin-meetup.connpass.com/event/328808/

■ 発表者
技術本部 Bill One Engineering Unit 茂木 康汰

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

■ Sansan Tech Blog
https://buildersbox.corp-sansan.com/

SansanTech

October 24, 2024
Tweet

More Decks by SansanTech

Other Decks in Technology

Transcript

  1. 4 ©Sansan, Inc. 4 ©Sansan, Inc. - 戦略グループ かにかん(旧さばかん) >

    品質高く価値を早く提供する - Goの知見がある人が多く、Goつよつよもいる > Bill One 2つ目のGoマイクロサービス - Goで得た知見をServer-Side Kotlinに持ち込んでる チーム紹介
  2. 6 ©Sansan, Inc. 6 ©Sansan, Inc. - イベントストーミング、ドメインモデリング(Miro) - .protoファイルでAPI定義

    - interfaceを全員モブプロ - DDDの各層を個別に実装 > テーブルテスト > sqlcによるテーブル操作コードの自動生成 > 必要なエラーのみハンドリング(共通エラー化) Goでの開発スタイル
  3. 8 ©Sansan, Inc. 8 ©Sansan, Inc. - Before: JUnit5 >

    テストケースが網羅されているのかわかりづらい > 意識的に共通化しないとコード重複が多い > ParameterizedTestは微妙 - After: Kotest > テーブルテストが書きやすい > テストケースが網羅されているのか見やすい > 仕組み的に共通化される テーブルテスト
  4. 11 ©Sansan, Inc. 11 ©Sansan, Inc. - Before > 時間削減でプロダクションコードを利用

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

    / checkでエラー投げ放題 - After > Kotlin標準のResult > kotlin-result導入 ※僕が唯一やったこと... エラーハンドリング
  6. 14 ©Sansan, Inc. 14 ©Sansan, Inc. - DomainServiceへのロジック閉じ込め(getter高階関数パターン) > kotlin-resultを半年使ってみて

    [2] > ビジネスロジックを「型」で表現する OOPのための関数型DDD [3] > DDDで集約を跨いだ情報でロジックを構築するための 「getter高階関数パターン」の紹介 [4] エラーハンドリング+α
  7. 18 ©Sansan, Inc. 18 ©Sansan, Inc. - interfaceモブプロでテストケースの洗い出しを実施 - 型化された部分を実装する時間が無駄

    > Kotestによる定型分 > DDD層ごとのテスト観点の違い - 型からズレたPRが上がってきた際のコスト 課題
  8. 20 ©Sansan, Inc. 20 ©Sansan, Inc. - Clikt > KotlinでCLIツールを作れるライブラリ

    - kotlin-inquirer > 選択UIなどリッチなCLIにできるライブラリ - kotlinpoet > Kotlinコードを自動生成するライブラリ - kotlin-compiler-embeddable > Kotlinのコンパイラにも利用されている静的解析 自動生成ツール
  9. 21 ©Sansan, Inc. 21 ©Sansan, Inc. - PsiFileFactory#createFileFromText > 文字列からKtFileを作成してくれる

    - collectDescendantsOfType > KtClass - classを表現。isDataでDataClassを絞り込める > KtObjectDeclaration - objectを表現 - KtFile#packageFqName > パッケージ名を取得 軽いkotlin-compiler-embeddable説明
  10. 22 ©Sansan, Inc. 22 ©Sansan, Inc. - KtClass#body > classの中身を取得できる

    - KtClass#body#functions -> List<KtNamedFunction> > methodを取得できる - KtNamedFunction#getValueParameters -> List<KtParameter> > methodの引数情報を取得できる - KtNamedFunction#typeReference > methodの戻り値を取得できる - KtParameter#typeReference > 引数の型情報を取得できる 軽いkotlin-compiler-embeddable説明
  11. 23 ©Sansan, Inc. 23 ©Sansan, Inc. - 開発の型化することで高品質で早く開発できる - 自動生成は生産性を大きくあげる

    - チームに特化させれば自動生成コードは数十時間が作れる - 顧客に価値を早く届けることが仕事 まとめ
  12. 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