Slide 1

Slide 1 text

© 2012-2022 BASE, Inc. 1 Goで始めるTDD \非公式/ Go Conference 2022 Spring スポンサー企業4社 アフタートーク BASE株式会社/永野 峻輔(@glassmonenkey)

Slide 2

Slide 2 text

© 2012-2022 BASE, Inc. 2 #gocon2022_4sponsor @glassmonkey 自己紹介 所属 BASE 株式会社 BASE BANKチーム Engineering Program Manager 資金調達プロダクト「YELL BANK」の開発責任者やってます。 Go, PHP, Pythonを書きつつ時々データエンジニアも。 趣味 Flutterアプリ開発 hasura.ioやsupabaseがマイブーム SNS Twitter:@glassmonekey  Github: https://github.com/glassmonkey 永野 峻輔 (ながの しゅんすけ) #goconで発表したこと

Slide 3

Slide 3 text

© 2012-2022 BASE, Inc. 3 #gocon2022_4sponsor @glassmonkey #goconで話せなかった 開発プロセスの話です

Slide 4

Slide 4 text

© 2012-2022 BASE, Inc. 4 #gocon2022_4sponsor @glassmonkey 今日話すこと ● TDDとは ● 題材について (姓名分割処理) ● 実践してみた

Slide 5

Slide 5 text

© 2012-2022 BASE, Inc. 5 © 2012-2022 BASE, Inc. 5 TDD(テスト駆動開発)について

Slide 6

Slide 6 text

© 2012-2022 BASE, Inc. 6 #gocon2022_4sponsor @glassmonkey なぜテストを書くのか

Slide 7

Slide 7 text

© 2012-2022 BASE, Inc. 7 #gocon2022_4sponsor @glassmonkey テストを書く理由 ● 不安の軽減 ● 開発者へのフィードバック ● デグレの防止 ● ナレッジの蓄積 … etc

Slide 8

Slide 8 text

© 2012-2022 BASE, Inc. 8 #gocon2022_4sponsor @glassmonkey テストの種類 ● 説明的なテスト ○ コードの振る舞いを明らかにするようなテスト ● 学習用テスト ○ 新機能の試用やキャッチアップ用途なテスト ● 回帰テスト ○ 不具合の解消を証明するようなテスト

Slide 9

Slide 9 text

© 2012-2022 BASE, Inc. 9 #gocon2022_4sponsor @glassmonkey 続きはwebで https://speakerdeck.com/budougumi0617/gocon2022spring

Slide 10

Slide 10 text

© 2012-2022 BASE, Inc. 10 #gocon2022_4sponsor @glassmonkey TDD = テスト駆動開発

Slide 11

Slide 11 text

© 2012-2022 BASE, Inc. 11 #gocon2022_4sponsor @glassmonkey 以下のステップで行われる作業の順序 ● レッド: 動作しない状態 ● グリーン: 何でも良いからテストをパスする状態 ● リファクタリング: ロジックが整理された状態 テスト駆動開発 (著)KentBeck (訳) 和田卓人 訳

Slide 12

Slide 12 text

© 2012-2022 BASE, Inc. 12 #gocon2022_4sponsor @glassmonkey プロセスの理由 https://www.slideshare.net/t_wada/the-spirit-of-tdd 目的は動くコードを作ること 青い経路が楽

Slide 13

Slide 13 text

© 2012-2022 BASE, Inc. 13 #gocon2022_4sponsor @glassmonkey TDD駆動開発より ”テスト駆動開発はプログラミング中の不安を コントロールする手法だ” テスト駆動開発 (著)KentBeck (訳) 和田卓人 訳

Slide 14

Slide 14 text

© 2012-2022 BASE, Inc. 14 #gocon2022_4sponsor @glassmonkey 不安のコントール ● 実装が正しく動くか? ● 影響範囲が想定通りか? …etc

Slide 15

Slide 15 text

© 2012-2022 BASE, Inc. 15 #gocon2022_4sponsor @glassmonkey 大事なのは 開発者自身へのフィードバック

Slide 16

Slide 16 text

© 2012-2022 BASE, Inc. 16 #gocon2022_4sponsor @glassmonkey TDDの心構え ● シンプルなケースから始める ○ 正常系や結果が空のものとか ● カバレッジを気にしすぎない ○ テストで気付けるのはあくまでテストケースに対して ○ テスト自身は品質を上げない ● 不安ならテストを書く ○ 最初は迷ったら書く

Slide 17

Slide 17 text

© 2012-2022 BASE, Inc. 17 © 2012-2022 BASE, Inc. 17 題材

Slide 18

Slide 18 text

© 2012-2022 BASE, Inc. 18 © 2012-2022 BASE, Inc. 18 姓名分割について

Slide 19

Slide 19 text

© 2012-2022 BASE, Inc. 19 #gocon2022_4sponsor @glassmonkey 竈門炭治郎 → 「竈門」「炭治郎」?

Slide 20

Slide 20 text

© 2012-2022 BASE, Inc. 20 #gocon2022_4sponsor @glassmonkey -nameで分割したいフルネーム -parseで分割文字列 (デフォルトは半角スペース) Python製のrskmoi/namedivider-python を移植 詳しくはhttps://github.com/glassmonkey/seimeiを見てね

Slide 21

Slide 21 text

© 2012-2022 BASE, Inc. 21 #gocon2022_4sponsor @glassmonkey rskmoi/namedivider-python https://github.com/rskmoi/namedivider-python name の場合は名前分割 → 移植した機能 file経由で複数分割も可能 api用のコンテナも用意されている

Slide 22

Slide 22 text

© 2012-2022 BASE, Inc. 22 #gocon2022_4sponsor @glassmonkey 詳しくはLTを見てね!!

Slide 23

Slide 23 text

© 2012-2022 BASE, Inc. 23 © 2012-2022 BASE, Inc. 23 実践

Slide 24

Slide 24 text

© 2012-2022 BASE, Inc. 24 © 2012-2022 BASE, Inc. 24 アルゴリズムについて

Slide 25

Slide 25 text

© 2012-2022 BASE, Inc. 25 #gocon2022_4sponsor @glassmonkey 分割アルゴリズム ● ルールベース ○ 2文字の場合のみ適応 ■ 乙一 → 「乙」「一」 ● 統計量ベース ○ 特徴量から最良のパターンを採用する ■ 篠田麻里子 → 「篠」「田麻里子」OR 「篠田」「麻里子」etc…

Slide 26

Slide 26 text

© 2012-2022 BASE, Inc. 26 #gocon2022_4sponsor @glassmonkey 2つの特徴量 ● Order Point ○ 文字の出現順序に着目 ■ 篠田麻里子 → 「篠田」 「麻里子」 ● Length Point ○ 名字 or 名前の長さに着目 ■ 松高子 →「松」 「高子」 ■ 松高萌 →「松高」 「萌」 姓名分割プログラムをつくる-手法編-

Slide 27

Slide 27 text

© 2012-2022 BASE, Inc. 27 #gocon2022_4sponsor @glassmonkey 2つの特徴量の関係 姓名分割プログラムをつくる-訂正編- 青が不正解 赤が正解 OrderPoint + LengthPoint が最大が最良

Slide 28

Slide 28 text

© 2012-2022 BASE, Inc. 28 #gocon2022_4sponsor @glassmonkey Goでの実現性について ● 特徴量は数値の固定長配列 ○ sliceで問題無さそう ● numpy使ってた箇所 ○ ほぼ四則演算だったので問題無さそうだった ○ 一部簡易的な実装にした ● 特徴量マスターデータがcsv管理されている ○ go:embed使えばIO無視出来そう

Slide 29

Slide 29 text

© 2012-2022 BASE, Inc. 29 © 2012-2022 BASE, Inc. 29 実装方針

Slide 30

Slide 30 text

© 2012-2022 BASE, Inc. 30 #gocon2022_4sponsor @glassmonkey 実装方針 ● TDDで小さく作りはじめる ● テストデータは元ツールから生成 ● マスターデータは元ツールに依存するように

Slide 31

Slide 31 text

© 2012-2022 BASE, Inc. 31 #gocon2022_4sponsor @glassmonkey TDDで小さく作る 小さく段階を踏んで学習サイクルを回しながら作った 田中太郎 -> 田中 太郎 乙一 -> 田中 太郎 竈門炭治郎 -> 田中 太郎 v0.0.1:ダミーパーサーによる実装 目的: CLIの実装 田中太郎 -> 田中 太郎 乙一 -> 乙 一 竈門炭治郎 -> 田中 太郎 v0.0.2: ルールベースによる実装 目的: パーサーの仕組みの追加 田中太郎 -> 田中 太郎 乙一 -> 乙 一 竈門炭治郎 -> 竈門 炭治郎 v0.0.3: 特徴量ベースによる実装 目的: アルゴリズムの再現

Slide 32

Slide 32 text

© 2012-2022 BASE, Inc. 32 #gocon2022_4sponsor @glassmonkey 使用したテクニック ● Table Driven Test ● t.skipを使う

Slide 33

Slide 33 text

© 2012-2022 BASE, Inc. 33 #gocon2022_4sponsor @glassmonkey Table Driven Test ● テストのバリエーションを増やしやすい ○ テストを書く心理的ハードルが下がる ● t.Parallel() を使うときは注意 ○ tt = tt を忘れないように https://github.com/golang/go/wiki/TableDrivenTests

Slide 34

Slide 34 text

© 2012-2022 BASE, Inc. 34 #gocon2022_4sponsor @glassmonkey t.skipを使う 未完成なコードも適宜mainに混ぜるようにして 動作可能な状態を広げていった

Slide 35

Slide 35 text

© 2012-2022 BASE, Inc. 35 #gocon2022_4sponsor @glassmonkey GoLandの場合 実装のtodoリストとしても使える

Slide 36

Slide 36 text

© 2012-2022 BASE, Inc. 36 #gocon2022_4sponsor @glassmonkey テストデータ作成について コードコメントに特徴量のテストデータがあったので活用 一部は元ツールをforkして内部データをdumpして作成

Slide 37

Slide 37 text

© 2012-2022 BASE, Inc. 37 #gocon2022_4sponsor @glassmonkey (余談)マスターデータについて ● dependbotで元ライブラリのバージョン監視 ● GithubActionでマスターデータ(csv)を更新するように

Slide 38

Slide 38 text

© 2012-2022 BASE, Inc. 38 © 2012-2022 BASE, Inc. 38 感想

Slide 39

Slide 39 text

© 2012-2022 BASE, Inc. 39 #gocon2022_4sponsor @glassmonkey 感想 ● TDDで学びながら作れた ○ 動かしながら検証というプロセスが良い ○ 業務の合間に作ったので思い出しながら作ることができた ○ デバックした内容が知見として貯まるのでデグレ防止になった ● Goへの移植について ○ シングルバイナリなので考えることが減って良い ○ go:embedの使い所が理解できた。 ○ 大体のことが標準ライブラリで可能なので学習コスト低くて良い

Slide 40

Slide 40 text

© 2012-2022 BASE, Inc. 40 #gocon2022_4sponsor @glassmonkey Fuzzingは断念…🥲 日本語想定だったり、 今回の要件には合わず。

Slide 41

Slide 41 text

© 2012-2022 BASE, Inc. 41 #gocon2022_4sponsor @glassmonkey フルサイクル開発やってます!! 興味あったらDM待ってます!! We are hiring !!