Slide 1

Slide 1 text

転職して ユニットテストに救われている話 〜キャッチアップからテスト文化の浸透、そしてアーキテクチャ改善へ〜 2022/04/27 単体テストはエンジニアを救うLT大会 #SHIFT_EVOLVE

Slide 2

Slide 2 text

本日のLTはユニットテストへの感謝の意になります笑 ● 今年(2022年)の1月に未経験技術スタックの会社に転職しました ● ユニットテストを通して、 ○ キャッチアップから改善まで良かったことがたくさんあった(ある)ので 振り返りを共有させていただければと思っています!

Slide 3

Slide 3 text

自己紹介 nihemak (にへまこ) Makoto Nihei ● ドクターメイト株式会社 (2022/01〜) ● プロダクト開発エンジニア ● 日々キャッチアップ中

Slide 4

Slide 4 text

ドクターメイト株式会社

Slide 5

Slide 5 text

転職してぶち当たった壁3つ ● 😨 完全未経験な技術スタック... ○ ReactNative(Reactも)/Firebase/GCPは使ったことありませんでした ■ それまではAngular/NestJS/AWSなどの人でした ● 😨 コード実装能力の衰え... ○ 直近1年間はプロダクトマネージャ・開発責任者でした ■ ロール上、意識してコードからは少し距離を置いてました ● 😨 コードベースがモノリシック... ○ 大きめReact Component内で多数のFirebase操作など... ■ 未経験技術なのもあり更に把握困難に。。

Slide 6

Slide 6 text

さらなる壁、 ● 😨 そして、テストコードもありませんでした... ○ 一応バックログには積まれてありましたが導入に挫折した形跡が...

Slide 7

Slide 7 text

さらなる壁、そしてユニットテストへ ● 😨 そして、テストコードもありませんでした... ○ 一応バックログには積まれてありましたが導入に挫折した形跡が... ● 💪 自分、ユニットテスト書けます!! ○ エクストリームプログラミング/TDD経験はあったのでテストなら書ける ○ まだコードベース小の今のうちにやった方が良い(後からだとかなり大変… ○ というわけでレジェンドコード改善をスタートしました! ■ ※レジェンドコード === レガシーコード ■ ※レガシーコードとはテストのないコードのことです

Slide 8

Slide 8 text

まずはライトにテストコードがある状態を目指した Firebase 処理 Firebase 処理 React Component

Slide 9

Slide 9 text

まずはライトにテストコードがある状態を目指した Firebase 処理 Firebase 処理 React Component Firebase 処理 Firebase 処理 React Component Service テストコード テストコード 一歩一歩 気合いで! 各React Componentを1つずつ気合と根性で... ● ビジネスロジック/Firebase処理をServiceクラスに切り出し ○ Serviceクラスにテストコード追加 ■ Firebase Local Emulator Suite in Dockerを駆使 ○ 呼び出し元のReact Componentにもテストコード追加 ■ Serviceクラスはモック化

Slide 10

Slide 10 text

進めていった結果

Slide 11

Slide 11 text

ユニットテストで良かったことがPart.1 ● 😆 React Componentコードの見通しが良くなった ● 😆 テストコード追加を通して自身の技術面やプロダクト面のキャッチ アップが進んだ ● 😆 プルリクマージ前に実行するようにGitHub Actionsへ登録したこと で自動的にデグレを防止できるようになった ● 😆 チームのエンジニアがみんなテストコードを書く文化になった ● etc 良いことしかありませんでした!!!

Slide 12

Slide 12 text

しかし新たな問題が、 ● 😨 Serviceクラスが巨大な泥団子のようになってしまった... ○ テストコード追加を目的に進めた結果、Serviceクラスの設計は後回しに...

Slide 13

Slide 13 text

しかし新たな問題が、そしてアーキテクチャ改善へ ● 😨 Serviceクラスが巨大な泥団子のようになってしまった... ○ テストコード追加を目的に進めた結果、Serviceクラスの設計は後回しに... ● 💪 DDDを意識したオニオンアーキテクチャ化します!! ○ テストコードがあるので安心してリアーキテクティングできる ○ ユビキタス言語はすでにALPSで定義されてあった ■ ※ ALPS: Application-Level Profile Semantics (セマンティクス定義の規格) ■ ※ DDD: Domain-Driven Design (ドメイン駆動設計)

Slide 14

Slide 14 text

2022/03/13

Slide 15

Slide 15 text

テストコードを足場にServiceクラスをリアーキ中... Firebase 処理 Firebase 処理 Service テストコード

Slide 16

Slide 16 text

テストコードを足場にServiceクラスをリアーキ中... Firebase 処理 Firebase 処理 Service テストコード UseCase Domain Infrastructure Firebase 処理 テストコード ● 外側のテストコードがあるので安心してリアーキ できてます! ○ 根性でServiceクラスをUseCaseクラスへ徐々に浄化中 ○ (現在、改善活動に費やしているのは週1日程度です) とにかく 気合いで!

Slide 17

Slide 17 text

進めていった結果 この2冊は本当におすすめです! ・ドメイン駆動設計 モデリング/実装ガイド ・ドメイン駆動設計 サンプルコード&FAQ

Slide 18

Slide 18 text

ユニットテストで良かったことがPart.2+α ● 😆 内部設計が改善され高凝集/低結合な構造になった ○ 😆 テストが更に書きやすくなった ○ 😆 新規開発/機能追加が楽になった ● 😨 リアーキ前後の設計が混在して少し混乱の元に... ● etc まだまだ途中の段階ですので 最後までリアーキやり切ります!!!

Slide 19

Slide 19 text

まとめ

Slide 20

Slide 20 text

ユニットテスト is 素晴らしい :+1: :+1: :+1: ● 😆 テストを書くことでキャッチアップができました ● 😆 テストを書く文化が浸透しチームの品質意識が高まりました ● 😆 テストコードがあることで安全に設計/コードを磨いていけるようにな りました ● etc みんなテストコード書こうぜ!!!

Slide 21

Slide 21 text

We are hiring! ● ドクターメイトでは一緒に持続可能な医療介護の実現に取り組 んでいただけるエンジニアを絶賛大募集中です! ○ カジュアル面談などもしておりますのでお気軽にお声かけ くださいませー