Slide 1

Slide 1 text

Building a better language together Polishing Ruby

Slide 2

Slide 2 text

Why are you here?

Slide 3

Slide 3 text

Because you care about Ruby?

Slide 4

Slide 4 text

Prove it.

Slide 5

Slide 5 text

Leave it better than you found it.

Slide 6

Slide 6 text

Nobody’s asking you to change the world.

Slide 7

Slide 7 text

Just add to it.

Slide 8

Slide 8 text

Not like this.

Slide 9

Slide 9 text

Improving the world a little for a good reason is better than changing it a lot for a bad one.

Slide 10

Slide 10 text

+1

Slide 11

Slide 11 text

@olivierlacan (oh-lee-vee-yay!)

Slide 12

Slide 12 text

Not a satanist Really.

Slide 13

Slide 13 text

Please don’t smite me during this talk. @hone02

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

APIs. I made one. (wee!)

Slide 17

Slide 17 text

Ruby with

Slide 18

Slide 18 text

Rails and

Slide 19

Slide 19 text

tests I even wrote and stuff.

Slide 20

Slide 20 text

★ (pause for wild cheering) ★

Slide 21

Slide 21 text

What if someone (me) changes the API later?

Slide 22

Slide 22 text

it breaks the iOS app? What if

Slide 23

Slide 23 text

What if I forgot my pants and everybody is laughing at me right now?

Slide 24

Slide 24 text

and then go get ice cream! Let’s write some integration tests

Slide 25

Slide 25 text

Given a user,
 When I ask the User API,
 Then I should receive data about this user.

Slide 26

Slide 26 text

user = create(:user, name: “Olivier”) response = get(“/api/users/1.json”) data = JSON.parse(response.body) ! expect(data). to include({ name: “Olivier”})

Slide 27

Slide 27 text

RSpec says 1 example, 0 failures

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

Can I do that in Ruby?

Slide 30

Slide 30 text

Can I ask a Hash: Do you include this other Hash, perchance?

Slide 31

Slide 31 text

Let’s try.

Slide 32

Slide 32 text

data.include?({ name: “Olivier”}) => false

Slide 33

Slide 33 text

Nope.

Slide 34

Slide 34 text

RSpec is neat.™

Slide 35

Slide 35 text

user = create(:user, name: “Olivier”) response = get(“/api/users/1.json”) data = JSON.parse(response.body) ! expect(data). to include({ name: “Olivier”})

Slide 36

Slide 36 text

rspec-expectations include matcher

Slide 37

Slide 37 text

lib/rspec/matchers/built_in/include.rb:58

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

lib/rspec/matchers/built_in/include.rb:74

Slide 40

Slide 40 text

You’re a Hash. 
 I’m a Hash. Let’s dance!

Slide 41

Slide 41 text

lib/rspec/matchers/built_in/include.rb:58

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

Is your value for this key the same as my value for this key?

Slide 45

Slide 45 text

Warning Doesn’t work with nested hashes.

Slide 46

Slide 46 text

Now, back to Hash.

Slide 47

Slide 47 text

How does Hash#include? work?

Slide 48

Slide 48 text

Hint: Not as neat.

Slide 49

Slide 49 text

x = { a: true, b: false } ! y = { a: true } ! x.include?(y) => false

Slide 50

Slide 50 text

Hash#include? == Hash#has_key?

Slide 51

Slide 51 text

Hash#include? Hash#has_key? Hash#member? Hash#key?

Slide 52

Slide 52 text

That’s weird.

Slide 53

Slide 53 text

We value keys over values.

Slide 54

Slide 54 text

Poor values are going to feel devalued.

Slide 55

Slide 55 text

“ Principe of least astonishment If a necessary feature has a high astonishment factor, it may be necessary to redesign the feature.

Slide 56

Slide 56 text

Is Hash#include? astonishing?

Slide 57

Slide 57 text

String#include?

Slide 58

Slide 58 text

x = "abc" => "abc" ! x.include?("a") => true ! x.include?("d") => false ! x.include?("abc") => true

Slide 59

Slide 59 text

Array#include?

Slide 60

Slide 60 text

a = [1,2,3] => [1, 2, 3] ! a.include?(1) => true ! a.include?(4) => false ! a.include?([1,2,3]) => false

Slide 61

Slide 61 text

Answer: Hash#include? is a little astonishing, to me.

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

Maybe I can do something about it.

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

Lesson #1 ! My expectations and surprises are not universal.

Slide 68

Slide 68 text

Lesson #2 ! Nobody wants to break the Ruby API.

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

Hope, at last!

Slide 71

Slide 71 text

“Does this Hash contain this other Hash?”

Slide 72

Slide 72 text

Hash#contain?

Slide 73

Slide 73 text

x = { a: true, b: false } ! y = { a: true } ! x.contain?(y) => true

Slide 74

Slide 74 text

Wouldn’t that be nice?

Slide 75

Slide 75 text

Or Hash#subhash? like Set#subset?

Slide 76

Slide 76 text

Along comes a Patch Monster

Slide 77

Slide 77 text

Nobuyoshi Nakada @hone02

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

nobu made my idea real.

Slide 80

Slide 80 text

Thank you nobu.

Slide 81

Slide 81 text

Lesson #3 ! You don’t need to know C to contribute to Ruby.

Slide 82

Slide 82 text

Lesson #4 ! There are many good humans in the community who will help you.

Slide 83

Slide 83 text

What now?

Slide 84

Slide 84 text

bugs.ruby-lang.org

Slide 85

Slide 85 text

No content

Slide 86

Slide 86 text

Read the Wiki Read the Wiki (yes, it’s a little messy)

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

How to Request Features

Slide 89

Slide 89 text

Meaningful improvement? 1

Slide 90

Slide 90 text

Before Iterate over the hash or use a 
 side-effect of another method (hack) to the achieve expected result.

Slide 91

Slide 91 text

After Ask hash if it contains another hash: it responds true or false. It’s an expressive and less surprising interface.

Slide 92

Slide 92 text

New request? 2

Slide 93

Slide 93 text

No content

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

Not really.

Slide 96

Slide 96 text

But different scope 
 & use case.

Slide 97

Slide 97 text

And the issue hasn’t been followed-up on.

Slide 98

Slide 98 text

3 Can it be done another way?

Slide 99

Slide 99 text

Yes, but verbose or inexpressive.

Slide 100

Slide 100 text

4 Would it benefit many people?

Slide 101

Slide 101 text

No content

Slide 102

Slide 102 text

Seems like it.

Slide 103

Slide 103 text

5 Good name?

Slide 104

Slide 104 text

Question: does hash contain other hash? ! Method: Hash#contain?

Slide 105

Slide 105 text

So, yes.

Slide 106

Slide 106 text

6 Arguments?

Slide 107

Slide 107 text

A hash.

Slide 108

Slide 108 text

7 Return value?

Slide 109

Slide 109 text

A boolean.

Slide 110

Slide 110 text

8 Any risk of incompatibility?

Slide 111

Slide 111 text

Nope, it’s brand new.

Slide 112

Slide 112 text

9 Write it.

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

But nobu’s patch is better.

Slide 115

Slide 115 text

No content

Slide 116

Slide 116 text

9 Make a concise but complete proposal.

Slide 117

Slide 117 text

No content

Slide 118

Slide 118 text

I’m still working on it.

Slide 119

Slide 119 text

Follow through. 10

Slide 120

Slide 120 text

Will do.

Slide 121

Slide 121 text

Let’s Rewind

Slide 122

Slide 122 text

Find Inspiration 0

Slide 123

Slide 123 text

Other People’s Feature Requests

Slide 124

Slide 124 text

No content

Slide 125

Slide 125 text

No content

Slide 126

Slide 126 text

Documentation Patches

Slide 127

Slide 127 text

No content

Slide 128

Slide 128 text

“ documenting-ruby.org Existing documentation could use some polish in form of clearer descriptions and better examples

Slide 129

Slide 129 text

Docs are a great 
 place to start.

Slide 130

Slide 130 text

No content

Slide 131

Slide 131 text

No content

Slide 132

Slide 132 text

Accepted Features

Slide 133

Slide 133 text

No content

Slide 134

Slide 134 text

https://bugs.ruby-lang.org/projects/ruby-trunk/issues?query_id=94

Slide 135

Slide 135 text

No content

Slide 136

Slide 136 text

There are quite a few unassigned ones.

Slide 137

Slide 137 text

No content

Slide 138

Slide 138 text

Bugs!

Slide 139

Slide 139 text

No content

Slide 140

Slide 140 text

Sounds less fun, but fixing bugs will definitely help.

Slide 141

Slide 141 text

Feature requests are a tougher sell.

Slide 142

Slide 142 text

Maintainers

Slide 143

Slide 143 text

No content

Slide 144

Slide 144 text

No content

Slide 145

Slide 145 text

Talk to maintainers

Slide 146

Slide 146 text

The Core Team is pretty busy, why not save them some work.

Slide 147

Slide 147 text

Get Comfortable

Slide 148

Slide 148 text

No content

Slide 149

Slide 149 text

Terence Lee

Slide 150

Slide 150 text

No content

Slide 151

Slide 151 text

You’re not alone.

Slide 152

Slide 152 text

No content

Slide 153

Slide 153 text

That’s my answer by the way.

Slide 154

Slide 154 text

No content

Slide 155

Slide 155 text

No content

Slide 156

Slide 156 text

olivierlacan.typeform.com/to/WxL7Ql

Slide 157

Slide 157 text

Science needs to meet reality before it becomes technology.

Slide 158

Slide 158 text

This is were you come in.

Slide 159

Slide 159 text

Your point of view matters.

Slide 160

Slide 160 text

Your help is needed.

Slide 161

Slide 161 text

status quo With a more diverse community the is more likely to be challenged.

Slide 162

Slide 162 text

That’s how we make progress.

Slide 163

Slide 163 text

Let’s make this Ruby sparkle!

Slide 164

Slide 164 text

Thank you for caring. [email protected]