Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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)

    View full-size slide

  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で発表したこと

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide