Rubyによるたのしいユーザー基盤再構築
RubyWorld Conference 20172017-11-01

諸橋恭介 @moro
1

解消できた不安‣ (写真)2

Kyosuke MOROHASHI! moro " moro3

6

http://techlife.cookpad.com/entry/2017/04/06/172601

Rubyによるたのしいユーザー基盤再構築

7

Rubyによるたのしいユーザー基盤再構築

8「たのしい」‣ ❌ おもしろおかしい‣ ⭕ いきいきと前向きに取り組める9

“And there's business value in fun - after
all motivation is a major factor inprogrammer productivity.
それから、「楽しさ」にもビジネス価値があります̶̶結局、モチベーションこそがプログラマの生産性を左右するのです。
https://martinfowler.com/bliki/DynamicTyping.html( http://bliki-ja.github.io/DynamicTyping/ )“
われわれは機械ではないので、やりたいと思うときに、何かを達成できるんです。何かを達成するには、突き動かす内なる力が必要です。それはモチベーションによって現れるんですね。(略) モチベーションを笑ってはいけない。
「なんでRubyなんか作った!? 迷惑だ！」に対するMatzの答え
http://el.jibun.atmarkit.co.jp/rails/2012/10/ruby-matz-7080.html

“
つまり「こんなことを言ったらチームメイトから馬鹿にされないだろうか」、あるいは「リーダーから叱られないだろうか」といった不安を、チームのメンバーから払拭する。
心理学の専門用語では「心理的安全性（psychologicalsafety）」と呼ばれる安らかな雰囲気をチーム内に育めるかどうかが、成功の鍵なのだという。
グーグルが突きとめた！社員の「生産性」を高める唯一の方法はこうだ--プロジェクト・アリストテレスの全貌
http://gendai.ismedia.jp/articles/-/48137

‣ 人々を最高に輝かせる‣ 高速に実験&学習する‣ 継続的に価値を届ける‣ 安全を必須条件にする

13

Rubyによるたのしいユーザー基盤再構築

14Rubyによるたのしいユーザー基盤再構築

15

チームとチームの外の人とみんなでサービスを届けるのがたのしいチームで開発するのがたのしい

コードを書くのがたのしい

チームとチームの外の人とみんなでサービスを届けるのがたのしいチームで開発するのがたのしい

コードを書くのがたのしい18

http://techlife.cookpad.com/entry/2017/04/06/172601

簡単な問題はあまり残っていない‣ 10年前‣ rails generate scaffold users

email:string password_digest:string‣ 現在‣ これまで使ってくれているユーザーさんに迷惑をかけないよう注意をはらいつつ、ビジネスニーズでうまれた多種多様な概念やデータ構造を整理して、今後のサービス展開の基盤となる。
19

簡単な問題はあまり残っていない‣ 月次利用者数：約6000万人‣ プレミアム会員数：190万人以上‣ この方たちに迷惑をかけないことを大前提とし、概念を整理して、実装もシンプルにしていく。
※数字は2017年6月末時点
20

The Recipe for
the World’s Largest
Rails Monolith
Akira Matsuda

https://speakerdeck.com/a_matsuda/the-recipe-for-the-worlds-largest-rails-monolith意識してたのしくしたい

22

23

24

“
Rubyは「たのしさ」を第一の目標にした世界初のプログラミング言語です。

— Rubyアプリケーションプログラミング 「1.3 Rubyの哲学」

Rails 10年史

‣ 昔は新進気鋭のWebフレームワークだった。
‣ 広く使われた結果、いまは愛憎ともに集める。

26

27

http://techlife.cookpad.com/entry/2017/04/06/172601

レガシーコード?

‣ 文字通りの「レガシー」= 遺産‣ 私たちのビジネスは、このコードがお金を稼いでくれているからこそできている。

28

“Regardless of what we discover, we understand and truly
believe that everyone did the best job they could, given
what they knew at the time, their skills and abilities, theresources available, and the situation at hand.
この会では、プロジェクトの全員が置かれた状況下でベストを尽くした、という ことを疑ってはならない (平鍋訳)

http://www.retrospectives.com/pages/retroPrimeDirective.html

Rails 10年史

‣ Ruby で昼の仕事ができるようになった。
‣ それ自体が、私たちにとってはとても偉大な遺産。
‣ ちゃんと、アップデートをしていく。

30

“ʻUse all the wise and knowledge you have of
your own, Samʼ

「お前が自分で持っている智恵や知識をある限り使ってごらんよ、サム、」— 指輪物語「王の帰還」

Is Rails dead?

‣ Fat Controller, Fat Model …
‣ Validatezer や Hanami が流行っている

32

この10年の学び:‣ ツールやフレームワークをただ適用するだけではうまくいかない。
‣ 背景になっていそうなコンセプトを、自分たちでちゃんと試してみよう。
33

サービス層としてのForm objectをよく考えてみる

34サービス層としての Form Object‣ テスト可能な「モデル層」は有用。
‣ 「プレゼンテーションとドメインの分離」ってやつ‣ コントローラからは常に who と when が渡される。
‣ ActiveSupport::CurrentAttributes なるほど。
‣ だんだん「フォーム」じゃないことも分かってきた。
‣ サービスを「入れ子」にしたいこともある。
35

Value Objectを発見する

36これまでのビジネスからも学ぶ‣ 登録中のデータは 「 validate: false なユーザー」ではない。
‣ 登録それ自体も一つの大事な機能である。
‣ Registration という概念を発見した。
‣ 同時に、登録後にちゃんと元のコンテキストに戻すのもとても大事ということも、学んだ。
37

resources :email_registrations, only: %i(show new create) docollection do
get :thanks
endresource :user, controller: :cookpad_users,
only: %i(show new create), module: :email_registrations
end
end

‣

Eメールでのユーザー登録 (email_registrations) 自体をリソースとして扱う。

‣

そこから別リソースとしてユーザー (cookpad_users) を作る。
38

コードを書くのはたのしい
39

チームとチームの外の人とみんなでサービスを届けるのがたのしいチームで開発するのがたのしい

コードを書くのがたのしい“ʻUse all the wise and knowledge you have of
your own, Samʼ

「お前が自分で持っている智恵や知識をある限り使ってごらんよ、サム、」— 指輪物語「王の帰還」

いろんなプラクティスがあるけど、ちょっとずつ試した:‣ ふりかえり‣ 見積りと計画づくり

42

いろんなプラクティスがあるけど、ちょっとずつ試した:‣ ふりかえり‣ これまでに何をしたか‣ 見積りと計画づくり‣ これから何をするか

43

44

‣ 毎週 n ポイント進んでいるのはわかった。が、「いつできる」かが見えづらかった。
‣ 実際に書いてみたら、感覚が表現できてた。

45

46

‣ 社内のプラクティスを輸入した。
‣ ドメインエキスパートにさわってもらう。
‣ 大小様々の気づいたことをどんどん直す。

47

カンバンにTryを貼る48

‣ Tryをいつも目にするように、貼った。
‣ これは未体験だったような。

49

チームで開発するのがたのしい
コードを書くのがたのしい

50

似ている

‣ 「これまで」に学んで‣ Rails一般やアプリケーションコードの苦労‣ 機能の使われ方‣ 「これから」を考える‣ ちょっとずつ「よい」設計をする‣ 必要なら技術的負債を借り入れる
51

似ている

‣ 「これまで」に学んで‣ これまでのイテレーションでのチームの進め方。
‣ 作ろうとした機能でほんとうに必要だったもの。

‣ 「これから」を考える‣ Try‣ これまでを踏まえた見積りと計画づくり。
52

自己相似性がある

53

チームとチームの外の人とみんなでサービスを届けるのがたのしいチームで開発するのがたのしい

コードを書くのがたのしい「知っていた」こと

55

“
だが、高みに 到達することが目的であれば、ソフトウェア開発は「プログラマーとその他大勢」 で成立するものではない。それが、過去 5 年間で私が学んだことだ。

— エクストリーム・プログラミング 「第25章 結論」

“There's a diﬀerence between
knowing the path and walking the path.

道を知ることと歩きだすことは違う— Morpheus; Matrix

58

“XPの価値は、ビジネスの世界で実践すべきものだ。
快適に暮らせる生活を送るだけでなく、関係者全員がお互いにリスペクトした人間関係によって、新しい働き方を開発するのである。(略) 創造的にいきいきと働くのである。
— エクストリーム・プログラミング 「第25章 結論」

自分たちのビジネスのユーザー状態を学習できてきた‣ かつては正しかった前提 (メールアドレスがある、など) が必要以上に広範に適用されている。
‣ かつては「メールアドレスを入力してユーザー登録」を前提としていた。
‣ メールアドレス入力を省いて、有料会員として使いたいと言ってくれるユーザーさんも出てきた。
‣ 「アプリをインストールしてくれた」らユーザーと扱う仕組みがいるのでは。

60

データ状態が難しい‣ サービス開発の各所で扱いづらくなっている。
‣ コミュニケーション系の機能で決済手段を意識しないといけない、など。
‣ 企画やサポートも難しければ、実装上の落とし穴になることもある。
‣ 新しく入社した人が理解するのも難しい。

61

“
チームが意識的に努力すれば、ドメインモデルはその共通言語の基盤となれるし、その一方で、チームのコミュニケーションをソフトウェアの実装と結びつけることもできる。

ドメイン駆動設計 「第2章 コミュニケーションと言語の使い方」

63

“
そのプロセスのなかで、開発者として最善を尽くすことだ。ビジネスのためになる優れたコードを書くことだ。

— エクストリーム・プログラミング 「第1章 XPとは何か」

チームとチームの外の人とみんなでサービスを届けるのがたのしいチームで開発するのがたのしい

コードを書くのがたのしい

チームとチームの外の人とみんなでサービスを届けるのがたのしいチームで開発するのがたのしい

コードを書くのがたのしい67

http://techlife.cookpad.com/entry/2017/04/06/172601

簡単な問題はあまり残っていない‣ 月次利用者数：約6000万人‣ プレミアム会員数：190万人以上‣ この方たちに迷惑をかけないことを大前提とし、概念を整理して、実装もシンプルにしていく。
※数字は2017年6月末時点
68

69

次の「レガシー」をつくっているのかも…

‣ 技術的負債を借り入れながら進める‣ 一時的にDBの同テーブルへ複数アプリケーションからwriteするとか‣ 今回もその中でベストを尽くす‣ 機能のスコープを分けてちょっとずつ出す。
‣ 変数のスコープも分ける、テスト可能にする… etc
70

“There's a diﬀerence between
knowing the path and walking the path.

道を知ることと歩きだすことは違う— Morpheus; Matrix

意識してたのしくしたい72“
それから、「楽しさ」にもビジネス価値があります
http://bliki-ja.github.io/DynamicTyping/74

チームとチームの外の人とみんなでサービスを届けるのがたのしいチームで開発するのがたのしい

コードを書くのがたのしい