Slide 1

Slide 1 text

DBのメタデータを管理する 文化を作る 2021-04-02 第31回中国地方DB勉強会 株式会社リゾーム 尾古 豊明(@patorash)

Slide 2

Slide 2 text

目次 ● 自己紹介 ● 会社紹介 ● 担当製品紹介 ● 元々あった課題について ● 新たな課題について ● 情報格差を解消するためにやっていること ● なぜカラムにコメントをつけるのか? ● データベースのカラムにコメントを付けるためにやったこと ● まとめ

Slide 3

Slide 3 text

自己紹介 名前:尾古 豊明(おこ とよあき) twitter: @patorash 所属:株式会社リゾーム システム企画・開発部 役職:専門職 仕事内容: ショッピングセンターに関連するサービス開発 Ruby on Railsで自社サービスの開発・運用(8年目) 近況:歯の親知らずを抜いたが痛みが思ったより長く続いて苦しんでいる。 20代のうちに抜いとくほうが治りも早くて良いらしい。 ちなみに今月もう一本抜くので怖い。

Slide 4

Slide 4 text

会社紹介 株式会社リゾーム ● 岡山県岡山市にある会社。創立30年を迎えた。 ● ショッピングセンター向けのシステム開発・コンサル等 ● 基本的に自社開発。MS系とRails系の2チームがある。 ● Rails系のチームでは、AWS・Heroku・CircleCI・Mackerel等を使用。

Slide 5

Slide 5 text

担当製品の紹介(SC GATE) 日本全国のショッピングセンターにある ショップの出退店をデータベース化した Webサービスを開発。 Rails3系の頃から開発していて、 現在はRails6.0系の最新。 昨年、脱CoffeeScript、Webpacker導入など、 一応ギリギリでモダンなところを 取り入れている。

Slide 6

Slide 6 text

元々あった課題

Slide 7

Slide 7 text

開発メンバーが増えない

Slide 8

Slide 8 text

経緯 ● 立ち上げの時に私のみアサイン。 ● 他のプロジェクトに比べると手が掛からない構成のため、 ほぼ1人で開発を継続。 ● 他のプロジェクトから開発メンバーが追加されることもあったが、 他のプロジェクトが忙しくなると戻る、を繰り返して早8年。 ● 昨年9月から新卒入社2年目の後輩がアサイン! ● 今年になってパートナーさんも追加! ● 突如3名体制になったのである!

Slide 9

Slide 9 text

新たな課題

Slide 10

Slide 10 text

スキルの違いが大きい

Slide 11

Slide 11 text

スキルの違いが大きい ● 私はRails歴9年 ● 2年目の後輩は1年目は社内研修+α。アサインされるまで、 本格的な開発経験はなく、機能開発を完全に任せるのは難しい。 (最近になって多少できるようになってきた) ● パートナーさんはRuby、Railsは初めてとはいうものの、他言語での開発経験があ るため、飲み込みが早い。しかし、運用のことは任せられない。

Slide 12

Slide 12 text

当初の考え ● 製品の概要や運用フローなどはもうドキュメントにしてある ● 仕様に関しては、ざっくりとは説明したけれど、 細かいところは実際に開発しながら把握していくしかなかろう ● 結構ドキュメント化はしているから、わからないところがあったら 質問してくるでしょう

Slide 13

Slide 13 text

実際は任せづらい… ● 製品が成熟しているため、割と高度なバックログが多い。 ● とはいえ、仕事をしてもらわなくては…と、できそうなバックログを振るも、思ったより 上手くいかない。 ● うまくできないけれど、質問も来ない。 質問がきたら「答え教えてください」のようなものが多い。

Slide 14

Slide 14 text

2冊の本に出会う

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

オープンセミナー岡山2020の話を聞いて (興味のある方は公開動画をご覧ください)

Slide 18

Slide 18 text

スキルの違いが大きい 情報格差が大きい

Slide 19

Slide 19 text

本を読んだり、OSOの後での考え ● 私は長年のドメイン知識の優位性+経験で開発スピードが速いだけ。 ● ドメイン知識が乏しいと、わからないことがわからない。 ● 後輩のスキルがなかなか上がらないと感じていたが、スキル以前にドメイン知識が 乏しいせいで躓いてしまっているのではないか? ● ドメイン知識が増えれば自身で課題に気付き、自律的に動けるようになる。 ● このままだとドメイン知識のギャップが埋まるには相当な時間がかかる。 つまり、スキル向上もかなり時間がかかると思われる。 ● より積極的に暗黙知を形式知に変換していかなければならない。

Slide 20

Slide 20 text

情報格差を解消するために取り組んでいること ● 朝会・夕会をする ● バックログから作業チケットを作る際に私が作成しておく ● ハマったらすぐテレビ会議してもOKとする ● 場合によってはVSCode LiveShareでペアプロする ● リファクタリングデーを設ける ● ライブラリを管理するファイルにコメントを付ける ● データベースのテーブル・カラムにコメントを付ける

Slide 21

Slide 21 text

なぜテーブル・カラムにコメントを付けるのか? ● MVCのモデル層にはビジネスロジックが集まる ● モデル層を読み解くには最もドメイン知識が要る ● 一見では意味のわからない英語のカラムの存在(ドメイン由来) ● (経験の浅い人にとって)謎のテーブルの存在(ライブラリ由来) ● (経験の浅い人にとって)謎のカラムの存在(ライブラリ由来) ● ここにコメントをつければかなりの量の暗黙知を形式知に変換できる!

Slide 22

Slide 22 text

モチベーションを高めたい ● Mackerelでコメントの入っているカラム数を計測する仕組みを作る。 ○ テーブル+ビュー数 ○ カラム数 ○ コメント数 ● 実装については、ブログを読んでください。 (最後のスライドに載せています) ● 計測した結果…

Slide 23

Slide 23 text

テーブル数75・カラム数775

Slide 24

Slide 24 text

形式知に変えられるのは私だけ… でも愚直にやるのは辛い

Slide 25

Slide 25 text

流石に楽をしたい… ● メタプログラミングで国際化(I18n)のデータがある場合はそれをコメントとして入れ るようにして、約70%のコメントを埋めることができた # == Schema Information # # Table name: prefs # # id(都道府県ID) :integer not null, primary key # region_id(地方ID) :integer not null # name(都道府県名) :string(255) not null # # Indexes # # index_prefs_on_name_and_region_id (name,region_id) UNIQUE # class Pref < ApplicationRecord

Slide 26

Slide 26 text

もっと分かりやすくしたい ● ActiveRecord::Enumを使っている箇所は、カラムに入っているデータは 実際はただの数字で、その値が何を示すのかがわからない ● 再度、メタプログラミングで、コメントにどの値が何を示すのかを入れた ● Before ● After # status(ステータス) :integer default("accepted"), not null # status(ステータス:{0=>"受付済", 1=>"処理中", 2=>"完了", 3=>"失敗"}) :integer default("accepted"), not null

Slide 27

Slide 27 text

残り30%を埋めたい ● どのテーブルのどのカラムにコメントがないのか?プログラムで調べる。 ● プログラムでコメント追加用のコードを生成させた。 ● あとは無心にtoのところにコメントを書いていくのみ。 # table_with_columnsは、テーブル名をキーとする Hashオブジェクト table_with_columns.each do |table, columns| columns.each do |column| puts "change_column_comment(:#{table}, :#{column.name}, from: nil, to: '')" end end # => 出力は以下のように …。これをマイグレーションファイルにコピー &ペーストする change_column_comment(:posts, :id, from: nil, to: '') change_column_comment(:posts, :title, from: nil, to: '') change_column_comment(:posts, :content, from: nil, to: '') change_column_comment(:tags, :id, from: nil, to: '') change_column_comment(:tags, :name, from: nil, to: '')

Slide 28

Slide 28 text

コメント付与率90%近くに上昇!

Slide 29

Slide 29 text

テーブル・カラムにコメントを入れた効果をヒアリング ● A5SQLでテーブル定義を確認する際に 日本語で表示されてわかりやすい ● 知らない単語の意味を調べる手間が なくなった ● 単純に英語よりも日本語のほうが 読みやすいし理解しやすい

Slide 30

Slide 30 text

まとめ:文化は作れたのか? ● ここ1か月ちょっとのことなので、文化を作る基礎ができた、と言いたい。 ● パートナーさんがテーブル生成時にコメントを付けてくれていた。 ● Mackerelで可視化されたことと、既存のコードにコメントが付いているので、コメント を付ける動機付けになった。 ● 割れ窓理論のように、コメントのないカラムを放置しないよう、 啓蒙を続けて文化を育んでいきたい。

Slide 31

Slide 31 text

ご清聴ありがとうございました

Slide 32

Slide 32 text

リンク ● DBのテーブル数、カラム数、コメント数をMackerelに登録するrake task作った - patorashのブログ ● I18nのデータを基にDBのカラムにコメントを追加する - patorashのブログ ● メタプログラミングでActiveRecord::Enumの値についてカラムにコメントする - patorashのブログ ● コメントのないカラムを抽出してマイグレーション処理を生成する - patorashのブロ グ ● カラムだけでなく、テーブルにもコメントを追加する - patorashのブログ ● オープンセミナー2020@岡山 - connpass