コネヒト開発者ブログ

コネヒト開発者ブログ

個人で開発したOSSを会社のプロダクションコードに投入した話

f:id:itosho525:20171114185252p:plain

こんにちは。先日社内LTで乃木坂46の紹介をした@itoshoです。

いつもアイドルの話ばかりしたり、週末はアイドルのライブに行ったりしている僕ですが、実はちょっと前に忙しいヲタ活の合間を縫いながら、OSSをつくりまして、最終的にそれを弊社のサービスに混ぜ込んだ話を今日はしたいと思います。

会社のプロダクションコードに投入するために

せっかくOSSをつくったので、やっぱり実際に使いたい!使われたい!と思うのが自然な流れだと思いますが、いざ実際に動いている会社のプロダクションコードに実績もない個人のOSSを投入するのはつくった本人も怖いですし、周りも(一定以上の信頼関係があるとは言え)大丈夫かな?と心配してしまうと思います。

というわけで、今回個人で開発したOSSを会社のプロダクションコードに投入する際のガイドラインを作成してみました。

以下は、社内で公開したガイドラインの抜粋です。*1

心構え

  • 臆せずどんどんOSSをつくって公開していこう!
  • でも、会社のプロダクションコードに投入するのは責任を持とう!
    • これは別に不具合があった時に怒られるという意味ではなくプロフェッショナルとして誇りを持って投入していこうという意味です。
  • なので、投入する時はちゃんとチームでコンセンサスをとってから投入しましょう。
    • 相談された人も無下にせず、OSSをつくったことを讃え、リスペクトの気持ちを忘れないようにチェックしましょう。

投入するための最低条件

  • MITライセンスであること
  • コミットメッセージやIssueが英語で書かれていること
  • 各言語のパッケージ管理のスタンダードなエコシステムに乗っていること
    • バージョン管理もちゃんとすること
  • テストがきちんと書かれていること
    • CIをPassをしていること
    • カバレッジが高い水準にあること
      • OSSの特性に依ると思うので必ずしも100%である必要はありません
      • ただし、理由はちゃんとチームメンバーに説明しましょう
  • ドキュメントが整備されていること
    • 最低限使い方がREADME読んで理解出来ること
  • メンテし続けていく気概があること

投入までの流れ

  • 上記の条件を満たしてからチームメンバーに導入の相談をする。*2
  • 相談されたメンバーはコード等を確認して、適宜フィードバックを行う。
  • 必要に応じて修正を繰り返して、チームとしてGoサインが出たら、遂に投入です!

ガイドラインを作成してみて

公開してまだ日が浅いので、今後見直しが発生するかもしれませんが、一定の基準や方針が出来たのはよかったかなと思っています。

今回ガイドラインを作成したのは自分自身、基準がなくて困ったということもありますが、個人でつくったOSSが会社のシステムやサービスをよりよくするものであれば、絶対投入したほうがいいし、まして、それが心理的な障壁だけで投入を躊躇しているんだったらもったいないなと思ったので、このような方針を示してみました。

また、これにより少しでも会社のメンバーがOSSをつくるモチベーションが上がればいいなとも思っています!

ちなみに、どんなOSSをつくったの?

ここからはおまけですが、せっかくなので、どんなOSSをつくったか簡単に紹介させていただきます。

一言で言うと、複雑になりがちなDBへのクエリメソッドを簡単に記述出来るCakePHPのBehaviorプラグインです。

名前はそのままでEasy Queryと名付けました。

どれくらいEasyなの?

CakePHPではレコードの一括登録を行いたい時、 通常saveMany()という関数を利用します。

使い方としてはこんな感じです。

<?php

$data = [
    [
        'title' => 'First Article',
        'body' => 'First Article Body',
        'created' => '2012-02-22 00:00:00',
        'modified' => '2012-02-22 00:00:00'
    ],
    [
        'title' => 'Second Article',
        'body' => 'Second Article Body',
        'created' => '2012-02-22 00:00:00',
        'modified' => '2012-02-22 00:00:00'
    ]
];
$articles = TableRegistry::get('Articles');

$entities = $articles->newEntities($data);
$result = $articles->saveMany($entities);

分かりやすいですね。*3

ただ、このsaveMany()とっても便利なのですが、いわゆるBulk Insertではないので、大量のデータを一括登録したい時はパフォーマンスが問題になる場合があります。

どうしても、Cake的な書き方で、Bulk Insertしたい時はこんな書き方をします。

<?php

$data = [
    [
        'title' => 'First Article',
        'body' => 'First Article Body',
        'created' => '2012-02-22 00:00:00',
        'modified' => '2012-02-22 00:00:00'
    ],
    [
        'title' => 'Second Article',
        'body' => 'Second Article Body',
        'created' => '2012-02-22 00:00:00',
        'modified' => '2012-02-22 00:00:00'
    ]
];
$articles = TableRegistry::get('Articles');

$query = $articles->query()->insert([
    'title', 
    'body',
    'created',
    'modified'
]);
$query->clause('values')->values($data);
$result = $query->execute();

コード量はほとんど変わらないですが、やや直感的じゃなくなっちゃいますね。

というわけでBulk Insertのような複雑になっちゃうクエリを抽象化して、簡単に扱えるようにしたのが、今回開発したEasy Queryです。

Bulk Insertの例で言うと、こういう感じで書けます。

<?php

$data = [
    [
        'title' => 'First Article',
        'body' => 'First Article Body',
        'created' => '2012-02-22 00:00:00',
        'modified' => '2012-02-22 00:00:00'
    ],
    [
        'title' => 'Second Article',
        'body' => 'Second Article Body',
        'created' => '2012-02-22 00:00:00',
        'modified' => '2012-02-22 00:00:00'
    ]
];
$articles = TableRegistry::get('Articles');
$articles->addBehavior('Itosho/EasyQuery.Insert');

$entities = $this->Articles->newEntities($data);
$result = $this->Articles->bulkInsert($entities);

saveMany()と同じようなI/Fで書けるので(自分で言うのも何ですが)直感的ですね!

補足

今回はOSSの紹介がメインではないので、インストール方法や細かい利用方法はGithubやPackagistをご覧いただければと思いますが、Bulk Insert以外にもUpsertやBulk Upsertにも対応しておりますので、よかったら使ってみてください。*4

現状MySQLしかサポートしていなかったり、createdmodifiedが自動で更新されなかったりというIssueがありますが、鋭意対応中です!

最後に

僕自身もこれから乃木坂46のようなビックなOSSをつくれるように頑張るぞ!

脚注

*1:一部内容を加筆・修正しております。

*2:もちろん、つくっている途中で相談してもOKですが最終的にはこの条件を満たすようにする。

*3:timestamp behaviorを利用すれば、createdとmodifiedは省略出来ます。

*4:一生懸命つくっていますが、利用に際しては自己責任でお願いいたします。