$30 off During Our Annual Pro Sale. View Details »

Goで始めるTDD

 Goで始めるTDD

# 説明
\非公式/ Go Conference 2022 Spring スポンサー企業4社 アフタートーク
以下のイベントで登壇した内容です
https://andpad.connpass.com/event/243953/

glassmonenkey

April 28, 2022
Tweet

More Decks by glassmonenkey

Other Decks in Technology

Transcript

  1. © 2012-2022 BASE, Inc. 1 Goで始めるTDD \非公式/ Go Conference 2022

    Spring スポンサー企業4社 アフタートーク BASE株式会社/永野 峻輔(@glassmonenkey)
  2. © 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で発表したこと
  3. © 2012-2022 BASE, Inc. 3 #gocon2022_4sponsor @glassmonkey #goconで話せなかった 開発プロセスの話です

  4. © 2012-2022 BASE, Inc. 4 #gocon2022_4sponsor @glassmonkey 今日話すこと • TDDとは

    • 題材について (姓名分割処理) • 実践してみた
  5. © 2012-2022 BASE, Inc. 5 © 2012-2022 BASE, Inc. 5

    TDD(テスト駆動開発)について
  6. © 2012-2022 BASE, Inc. 6 #gocon2022_4sponsor @glassmonkey なぜテストを書くのか

  7. © 2012-2022 BASE, Inc. 7 #gocon2022_4sponsor @glassmonkey テストを書く理由 • 不安の軽減

    • 開発者へのフィードバック • デグレの防止 • ナレッジの蓄積 … etc
  8. © 2012-2022 BASE, Inc. 8 #gocon2022_4sponsor @glassmonkey テストの種類 • 説明的なテスト

    ◦ コードの振る舞いを明らかにするようなテスト • 学習用テスト ◦ 新機能の試用やキャッチアップ用途なテスト • 回帰テスト ◦ 不具合の解消を証明するようなテスト
  9. © 2012-2022 BASE, Inc. 9 #gocon2022_4sponsor @glassmonkey 続きはwebで https://speakerdeck.com/budougumi0617/gocon2022spring

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

  11. © 2012-2022 BASE, Inc. 11 #gocon2022_4sponsor @glassmonkey 以下のステップで行われる作業の順序 • レッド:

    動作しない状態 • グリーン: 何でも良いからテストをパスする状態 • リファクタリング: ロジックが整理された状態 テスト駆動開発 (著)KentBeck (訳) 和田卓人 訳
  12. © 2012-2022 BASE, Inc. 12 #gocon2022_4sponsor @glassmonkey プロセスの理由 https://www.slideshare.net/t_wada/the-spirit-of-tdd 目的は動くコードを作ること

    青い経路が楽
  13. © 2012-2022 BASE, Inc. 13 #gocon2022_4sponsor @glassmonkey TDD駆動開発より ”テスト駆動開発はプログラミング中の不安を コントロールする手法だ”

    テスト駆動開発 (著)KentBeck (訳) 和田卓人 訳
  14. © 2012-2022 BASE, Inc. 14 #gocon2022_4sponsor @glassmonkey 不安のコントール • 実装が正しく動くか?

    • 影響範囲が想定通りか? …etc
  15. © 2012-2022 BASE, Inc. 15 #gocon2022_4sponsor @glassmonkey 大事なのは 開発者自身へのフィードバック

  16. © 2012-2022 BASE, Inc. 16 #gocon2022_4sponsor @glassmonkey TDDの心構え • シンプルなケースから始める

    ◦ 正常系や結果が空のものとか • カバレッジを気にしすぎない ◦ テストで気付けるのはあくまでテストケースに対して ◦ テスト自身は品質を上げない • 不安ならテストを書く ◦ 最初は迷ったら書く
  17. © 2012-2022 BASE, Inc. 17 © 2012-2022 BASE, Inc. 17

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

    姓名分割について
  19. © 2012-2022 BASE, Inc. 19 #gocon2022_4sponsor @glassmonkey 竈門炭治郎 → 「竈門」「炭治郎」?

  20. © 2012-2022 BASE, Inc. 20 #gocon2022_4sponsor @glassmonkey -nameで分割したいフルネーム -parseで分割文字列 (デフォルトは半角スペース)

    Python製のrskmoi/namedivider-python を移植 詳しくはhttps://github.com/glassmonkey/seimeiを見てね
  21. © 2012-2022 BASE, Inc. 21 #gocon2022_4sponsor @glassmonkey rskmoi/namedivider-python https://github.com/rskmoi/namedivider-python name

    の場合は名前分割 → 移植した機能 file経由で複数分割も可能 api用のコンテナも用意されている
  22. © 2012-2022 BASE, Inc. 22 #gocon2022_4sponsor @glassmonkey 詳しくはLTを見てね!!

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

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

    アルゴリズムについて
  25. © 2012-2022 BASE, Inc. 25 #gocon2022_4sponsor @glassmonkey 分割アルゴリズム • ルールベース

    ◦ 2文字の場合のみ適応 ▪ 乙一 → 「乙」「一」 • 統計量ベース ◦ 特徴量から最良のパターンを採用する ▪ 篠田麻里子 → 「篠」「田麻里子」OR 「篠田」「麻里子」etc…
  26. © 2012-2022 BASE, Inc. 26 #gocon2022_4sponsor @glassmonkey 2つの特徴量 • Order

    Point ◦ 文字の出現順序に着目 ▪ 篠田麻里子 → 「篠田」 「麻里子」 • Length Point ◦ 名字 or 名前の長さに着目 ▪ 松高子 →「松」 「高子」 ▪ 松高萌 →「松高」 「萌」 姓名分割プログラムをつくる-手法編-
  27. © 2012-2022 BASE, Inc. 27 #gocon2022_4sponsor @glassmonkey 2つの特徴量の関係 姓名分割プログラムをつくる-訂正編- 青が不正解

    赤が正解 OrderPoint + LengthPoint が最大が最良
  28. © 2012-2022 BASE, Inc. 28 #gocon2022_4sponsor @glassmonkey Goでの実現性について • 特徴量は数値の固定長配列

    ◦ sliceで問題無さそう • numpy使ってた箇所 ◦ ほぼ四則演算だったので問題無さそうだった ◦ 一部簡易的な実装にした • 特徴量マスターデータがcsv管理されている ◦ go:embed使えばIO無視出来そう
  29. © 2012-2022 BASE, Inc. 29 © 2012-2022 BASE, Inc. 29

    実装方針
  30. © 2012-2022 BASE, Inc. 30 #gocon2022_4sponsor @glassmonkey 実装方針 • TDDで小さく作りはじめる

    • テストデータは元ツールから生成 • マスターデータは元ツールに依存するように
  31. © 2012-2022 BASE, Inc. 31 #gocon2022_4sponsor @glassmonkey TDDで小さく作る 小さく段階を踏んで学習サイクルを回しながら作った 田中太郎

    -> 田中 太郎 乙一 -> 田中 太郎 竈門炭治郎 -> 田中 太郎 v0.0.1:ダミーパーサーによる実装 目的: CLIの実装 田中太郎 -> 田中 太郎 乙一 -> 乙 一 竈門炭治郎 -> 田中 太郎 v0.0.2: ルールベースによる実装 目的: パーサーの仕組みの追加 田中太郎 -> 田中 太郎 乙一 -> 乙 一 竈門炭治郎 -> 竈門 炭治郎 v0.0.3: 特徴量ベースによる実装 目的: アルゴリズムの再現
  32. © 2012-2022 BASE, Inc. 32 #gocon2022_4sponsor @glassmonkey 使用したテクニック • Table

    Driven Test • t.skipを使う
  33. © 2012-2022 BASE, Inc. 33 #gocon2022_4sponsor @glassmonkey Table Driven Test

    • テストのバリエーションを増やしやすい ◦ テストを書く心理的ハードルが下がる • t.Parallel() を使うときは注意 ◦ tt = tt を忘れないように https://github.com/golang/go/wiki/TableDrivenTests
  34. © 2012-2022 BASE, Inc. 34 #gocon2022_4sponsor @glassmonkey t.skipを使う 未完成なコードも適宜mainに混ぜるようにして 動作可能な状態を広げていった

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

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

  37. © 2012-2022 BASE, Inc. 37 #gocon2022_4sponsor @glassmonkey (余談)マスターデータについて • dependbotで元ライブラリのバージョン監視

    • GithubActionでマスターデータ(csv)を更新するように
  38. © 2012-2022 BASE, Inc. 38 © 2012-2022 BASE, Inc. 38

    感想
  39. © 2012-2022 BASE, Inc. 39 #gocon2022_4sponsor @glassmonkey 感想 • TDDで学びながら作れた

    ◦ 動かしながら検証というプロセスが良い ◦ 業務の合間に作ったので思い出しながら作ることができた ◦ デバックした内容が知見として貯まるのでデグレ防止になった • Goへの移植について ◦ シングルバイナリなので考えることが減って良い ◦ go:embedの使い所が理解できた。 ◦ 大体のことが標準ライブラリで可能なので学習コスト低くて良い
  40. © 2012-2022 BASE, Inc. 40 #gocon2022_4sponsor @glassmonkey Fuzzingは断念…🥲 日本語想定だったり、 今回の要件には合わず。

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

    are hiring !!