Slide 1

Slide 1 text

OSS にみる レール の外側 竹内雄一 Takeyu Web Inc.

Slide 2

Slide 2 text

@takeyuweb 2008年〜フリーランス 2016年 法人成り Rails おじさん(Rails 1.0系~) Saitama.rb発起人

Slide 3

Slide 3 text

Takeyu Web Inc.

Slide 4

Slide 4 text

Takeyu Web Inc. フルリモートとフルフレックスにこだ わってるRails受託会社

Slide 5

Slide 5 text

リモートワークとRails リモートワークではコミュニケーション の敷居が高い レールがあることは、リモートに向いて いる(と、思っている)

Slide 6

Slide 6 text

レールに乗る 他人(過去の自分含む)にコードを読 むヒントを与えることができる

Slide 7

Slide 7 text

そんなレールから外れるとい うこと 『常識』が通用しなくなる? 世界中の開発者が参加するOSSで はどうやっているか? リモートワークのヒントもあるのでは

Slide 8

Slide 8 text

今回見たOSS Name Stars Contributors GitLab 21,029 1,545 Discourse 25,573 649 Mastodon 14,031 476

Slide 9

Slide 9 text

見ること appの中身 rails new したときデフォルトで作 られるもの以外 その他

Slide 10

Slide 10 text

GitLab https://github.com/gitlabhq/gitlabhq 21,029 Stars 1,545 Contributors

Slide 11

Slide 11 text

GitLab のapp (1) finders graphql policies presenters serializers

Slide 12

Slide 12 text

GitLab のapp (2) services uploaders validators workers

Slide 13

Slide 13 text

GitLab のapp いっぱいある! 独自のディレクトリについて README.md がしっかり書いてある

Slide 14

Slide 14 text

GitLab の xxxx/README.md 読めば使い方はわかる Wikiなど外部リソースへ誘導されな い 必要なときにすぐ存在を見つけられ て良い

Slide 15

Slide 15 text

xxxx/README.md に書いてある こと いつ使うか? なんで標準のじゃアカンのか 具体的に何が嬉しいか コードの書き方

Slide 16

Slide 16 text

app/presenters/README.md app/presenters/README.md

Slide 17

Slide 17 text

GitLab lib gemで提供されるようなものなど、特定 の目的のために使うクラス群。こちら は README.md はない api Grape::API backup バックアップ処理いろいろ database / file etc banzai Markdown => HTML renderer etc…

Slide 18

Slide 18 text

GitLab その他 Migration の spec 独自Cops 整理された routes

Slide 19

Slide 19 text

Migration の spec db/migrations/*.rb ごとに実行前後 どうなるべきか?の spec がある db/migrate/ 20170713104829_add_foreign_key_to_m erge_requests.rb spec/migrations/ add_foreign_key_to_merge_requests_sp ec.rb

Slide 20

Slide 20 text

独自Cops プロジェクトでやってはいけないこと、 やるべきことについてCopsで指摘して れる

Slide 21

Slide 21 text

RuboCop::Cop::GitLab::Find erWithFindBy rubocop/cop/gitlab/ finder_with_find_by.rb # 通常こうやって #execute を使うんだけど results = DummyFinder.new(some_args).execute # find_by と組み合わせて使うときは DummyFinder.new(some_args).execute.find_by!(1) # こう書くようにしようね DummyFinder.new(some_args).find_by!(1)

Slide 22

Slide 22 text

独自Cops の spec spec/rubocop/**_spec.rb 独自Copsが具体的になにを警備して いるかわかりやすくてよい

Slide 23

Slide 23 text

整理された routes (1) config/routes.rb Rails.application.routes.draw do # (snip) draw :api draw :sidekiq draw :help

Slide 24

Slide 24 text

整理された routes (2) config/routes/api.rb GraphQL と REST API constraints(::Constraints::FeatureConstrainer.new(:graphql)) do post '/api/graphql', to: 'graphql#execute' mount GraphiQL::Rails::Engine, at: '/-/graphql-explorer', graphql_path: '/api/graphql' end API::API.logger Rails.logger mount API::API => '/'

Slide 25

Slide 25 text

GitLab のまとめ 「うちではこう書いてください」みたい なの、多い 理由と書き方について詳しく説明があるの で辛くはない Rails標準におけるActiveRecordの 書き方みたいに、GitLabのFinderの 書き方のような決まり事がはっきり している 独自Copで決まり事を守っているか

Slide 26

Slide 26 text

GitLab のまとめ 意識高い(系ではない)印象

Slide 27

Slide 27 text

Discourse https://github.com/discourse/ discourse 25,573 Stars 649 Contributors

Slide 28

Slide 28 text

Discourse の app (1) serializers services

Slide 29

Slide 29 text

Discourse の app (2) app を見ても 「ウッ」ってならない 標準のようでそうでもないものもあ る app/jobs

Slide 30

Slide 30 text

Discourse の app/serializers active_model_serializers gem

Slide 31

Slide 31 text

Discourse の app/jobs (1) ActiveJobではない include Sidekiq::Worker した共 通の基底クラスを持つクラス群 それなりに厚い 独自の仕組み Job::Base#execute

Slide 32

Slide 32 text

Discourse の app/jobs (2) readonly modeへの対応 onceoff

Slide 33

Slide 33 text

Discourse の app/jobs 追加 ディレクトリ名かぶりは ActiveJob が後からだからでは ActiveJob に機能が足りないから仕 方ない わかる 別にそれ自体はよい、ActiveJobで済むな らそれでいいが、だめなら他の方法は否 定しない

Slide 34

Slide 34 text

Discoures の app/services 自由に作られている印象。基底クラス や .new.execute のような決まりはな い。カオス。 UserMerger SearchIndexer HandleChunkUpload DestroyTask

Slide 35

Slide 35 text

Discourse の lib scheduler validators wizard auth/authenticator etc

Slide 36

Slide 36 text

Discourse の その他 Danger

Slide 37

Slide 37 text

Danger Danger http://danger.systems/ CI上で動作、PRに対して自動で指 摘 PR自体の問題「テスト書いてないけ ど?」「こんなのレビューできないよ」 みたいなの ルールをRubyで書ける (Dangerfile。次ページ。)

Slide 38

Slide 38 text

Discourse の Dangerfile (抜 粋) if git.lines_of_code > 500 warn("This PR seems big, we prefer smaller PR. Please be sure this is needed and can't be split in smaller PRs.") end

Slide 39

Slide 39 text

Discourse のまとめ 「うちではこう書いてください」みたい なのはあまりない なるべくレールに載る意識を感じる app/services にモヤモヤ

Slide 40

Slide 40 text

Mastodon https://github.com/tootsuite/ mastodon 14,031 Stars 476 Contributors

Slide 41

Slide 41 text

Mastodon の app chewy lib policies presenters serializers services validators

Slide 42

Slide 42 text

Mastodon の app/chewy chewy gem Elasticsearch

Slide 43

Slide 43 text

Mastodon の app/lib なぜ Rails.root.join("lib") で ないのか?よくわからない lib はほとんど使っていない

Slide 44

Slide 44 text

Mastodon の app/lib について 追記 /lib だとオートリロードが働かない Railsの /lib はタスクを書く場所み たいな雰囲気があるので /app 以 下に置く気持ちはわかる

Slide 45

Slide 45 text

Mastodon の app/policies 権限管理 pundit gem

Slide 46

Slide 46 text

Mastodon の app/presenters ActiveModelSerializers::Model だったりそうでなかったり シリアライズに使ったり、 ActiveRecordモデル間の関係(フォ ロワー、ブロック etc..)を表示用に まとめたり

Slide 47

Slide 47 text

Mastodon の app/serializers active_model_serializers gem

Slide 48

Slide 48 text

Mastodon の app/services パブリックなインスタンスメソッドは #callのみ class HogeService < BaseService HogeService.new.call(arg1, arg2, arg3)

Slide 49

Slide 49 text

Mastodon の app/workers Sidekiq::Worker

Slide 50

Slide 50 text

Mastodon の まとめ app/services は読みやすいし、使 い方がはっきりしていて心理的負担 が少ない が、他はなんだかよくわからん bundle install がなかなか通らな くてつらい

Slide 51

Slide 51 text

余談:脱線事故(僕の失敗) 記事で読んだから試しに使ってみた あとから別にいらなかった そもそも正しく使えてない ルールが明確でなく各自自由に書 いちゃう→カオス 依存gemが増えてアップデート辛い

Slide 52

Slide 52 text

まとめ フレームワーク的に使ってほしいも のは app 直下、そうでないものは lib 本当に必要か? 新しいレールを敷く 人は弱いので RuboCop Danger な どツールの力を借りる

Slide 53

Slide 53 text

宣伝(1) Saitama.rb やってます! 埼玉県在住のRubyist 毎月第3土曜日 13:00~ 大宮駅東口徒歩1分 初心者から(ときどき)Railsコミッ ターまで

Slide 54

Slide 54 text

宣伝(2) Rails受託案件募集してます! 11月~ぐらい 週3~ リモート 準委任(条件はご相談ください)