Slide 1

Slide 1 text

Look at all these toys!

Slide 2

Slide 2 text

Help – it’s Ruby!

Slide 3

Slide 3 text

All alone

Slide 4

Slide 4 text

Is Ruby dying?

Slide 5

Slide 5 text

Where do Rubyists go?

Slide 6

Slide 6 text

Where do Rubyists go? Tobias Pfeiffer @PragTob pragtob.info

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

673 Responses

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

First Rails Release

Slide 12

Slide 12 text

Rails 1.0

Slide 13

Slide 13 text

“I had written half of Rails in PHP. Then Rails was announced and it was like a cheat code to a working framework.” Why did you learn Ruby?

Slide 14

Slide 14 text

First Rails Girls Workshop

Slide 15

Slide 15 text

First Rails Girls Berlin Workshop

Slide 16

Slide 16 text

Surveys and Bias

Slide 17

Slide 17 text

Like some bias?

Slide 18

Slide 18 text

Like to do Ruby in 5 years?

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

Omissions

Slide 23

Slide 23 text

Tools

Slide 24

Slide 24 text

Disclaimer

Slide 25

Slide 25 text

Meet & Greet

Slide 26

Slide 26 text

1990 1995 2000 2005 2010 2015

Slide 27

Slide 27 text

Name: Popular Rubyists: Known for: Self-assessment: Ruby All of them Metaprogramming, dynamic, Scripting, web A dynamic, open source programming language with a focus on simplicity and productivity.

Slide 28

Slide 28 text

FizzBuzz!

Slide 29

Slide 29 text

1 2

Slide 30

Slide 30 text

1 2 Fizz

Slide 31

Slide 31 text

1 2 Fizz 4 Buzz

Slide 32

Slide 32 text

1 2 Fizz 4 Buzz Fizz

Slide 33

Slide 33 text

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14

Slide 34

Slide 34 text

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz

Slide 35

Slide 35 text

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 …

Slide 36

Slide 36 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)}

Slide 37

Slide 37 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)}

Slide 38

Slide 38 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)}

Slide 39

Slide 39 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)}

Slide 40

Slide 40 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)}

Slide 41

Slide 41 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)}

Slide 42

Slide 42 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)}

Slide 43

Slide 43 text

Name: Popular Rubyists: Known for: Self-assessment: Crystal Erik Berlin, Piotr Szotkowski, Fabio Akita Ruby-like, Performance, Type Inference Fast as C, slick as Ruby

Slide 44

Slide 44 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)}

Slide 45

Slide 45 text

def fizzbuzz(n) if (n % 15).zero? "FizzBuzz" elsif (n % 5).zero? "Buzz" elsif (n % 3).zero? "Fizz" else n end end (1..100).each {|n| puts fizzbuzz(n)} cp fizzbuzz.rb fizzbuzz.cr

Slide 46

Slide 46 text

Name: Popular Rubyists: Known for: Self-assessment: Elixir José Valim, Dave Thomas, Xavier Noria Erlang VM, Actors, Functional, Phoenix dynamic, functional language designed for building scalable and maintainable applications.

Slide 47

Slide 47 text

defmodule FizzBuzz do def fizzbuzz(n) when rem(n, 15) == 0, do: "FizzBuzz" def fizzbuzz(n) when rem(n, 5) == 0, do: "Buzz" def fizzbuzz(n) when rem(n, 3) == 0, do: "Fizz" def fizzbuzz(n), do: n end Enum.each(1..100, fn i -> IO.puts(FizzBuzz.fizzbuzz(i)) end)

Slide 48

Slide 48 text

defmodule FizzBuzz do def fizzbuzz(n) when rem(n, 15) == 0, do: "FizzBuzz" def fizzbuzz(n) when rem(n, 5) == 0, do: "Buzz" def fizzbuzz(n) when rem(n, 3) == 0, do: "Fizz" def fizzbuzz(n), do: n end Enum.each(1..100, fn i -> IO.puts(FizzBuzz.fizzbuzz(i)) end)

Slide 49

Slide 49 text

Name: Popular Rubyists: Known for: Self-assessment: Haskell Chad Fowler Type System, Monads, Pure An advanced, purely functional programming language.

Slide 50

Slide 50 text

main = mapM_ (putStrLn . fizzbuzz) [1..100] fizzbuzz x | x `mod` 15 == 0 = "FizzBuzz" | x `mod` 3 == 0 = "Fizz" | x `mod` 5 == 0 = "Buzz" | otherwise = show x

Slide 51

Slide 51 text

main = mapM_ (putStrLn . fizzbuzz) [1..100] fizzbuzz x | x `mod` 15 == 0 = "FizzBuzz" | x `mod` 3 == 0 = "Fizz" | x `mod` 5 == 0 = "Buzz" | otherwise = show x

Slide 52

Slide 52 text

main = mapM_ (putStrLn . fizzbuzz) [1..100] fizzbuzz x | x `mod` 15 == 0 = "FizzBuzz" | x `mod` 3 == 0 = "Fizz" | x `mod` 5 == 0 = "Buzz" | otherwise = show x

Slide 53

Slide 53 text

Name: Popular Rubyists: Known for: Self-assessment: Go Katrina Owen, Evan Phoenix Goroutines, Simple, No Exceptions, No Generics open source programming language that makes it easy to build simple, reliable, and efficient software.

Slide 54

Slide 54 text

package main import "fmt" import "strconv" func FizzBuzz(i int) string { switch { case i%15 == 0: return "FizzBuzz" case i%3 == 0: return "Fizz" case i%5 == 0: return "Buzz" default: return strconv.Itoa(i) } } func main() { for i := 1; i <= 100; i++ { fmt.Println(FizzBuzz(i)) } }

Slide 55

Slide 55 text

package main import "fmt" import "strconv" func FizzBuzz(i int) string { switch { case i%15 == 0: return "FizzBuzz" case i%3 == 0: return "Fizz" case i%5 == 0: return "Buzz" default: return strconv.Itoa(i) } } func main() { for i := 1; i <= 100; i++ { fmt.Println(FizzBuzz(i)) } }

Slide 56

Slide 56 text

package main import "fmt" import "strconv" func FizzBuzz(i int) string { switch { case i%15 == 0: return "FizzBuzz" case i%3 == 0: return "Fizz" case i%5 == 0: return "Buzz" default: return strconv.Itoa(i) } } func main() { for i := 1; i <= 100; i++ { fmt.Println(FizzBuzz(i)) } }

Slide 57

Slide 57 text

Name: Popular Rubyists: Known for: Self-assessment: Rust Steve Klabnik, Yehuda Katz, Sean Griffin Memory Management, Compiler, Firefox Quantum a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety.

Slide 58

Slide 58 text

fn main() { (1..101).for_each(|n| println!("{}", fizzbuzz(n))) } fn fizzbuzz(n: i32) -> String { match (n % 3, n % 5) { (0, 0) => "FizzBuzz".to_string(), (0, _) => "Fizz".to_string(), (_, 0) => "Buzz".to_string(), _ => n.to_string(), } }

Slide 59

Slide 59 text

fn main() { (1..101).for_each(|n| println!("{}", fizzbuzz(n))) } fn fizzbuzz(n: i32) -> String { match (n % 3, n % 5) { (0, 0) => "FizzBuzz".to_string(), (0, _) => "Fizz".to_string(), (_, 0) => "Buzz".to_string(), _ => n.to_string(), } }

Slide 60

Slide 60 text

fn main() { (1..101).for_each(|n| println!("{}", fizzbuzz(n))) } fn fizzbuzz(n: i32) -> String { match (n % 3, n % 5) { (0, 0) => "FizzBuzz".to_string(), (0, _) => "Fizz".to_string(), (_, 0) => "Buzz".to_string(), _ => n.to_string(), } }

Slide 61

Slide 61 text

Name: Popular Rubyists: Known for: Self-assessment: JavaScript Yehuda Katz, Jeremy Ashkenas Quirks, Async, Compile to a lightweight interpreted or JIT- compiled programming language with first-class functions.

Slide 62

Slide 62 text

const fizzBuzz = n => { if (n % 15 === 0) { return "FizzBuzz"; } else if (n % 3 === 0) { return "Fizz"; } else if (n % 5 === 0) { return "Buzz"; } else { return n; } }; for (let n = 1; n <= 100; n += 1) { console.log(fizzBuzz(n)); }

Slide 63

Slide 63 text

const fizzBuzz = n => { if (n % 15 === 0) { return "FizzBuzz"; } else if (n % 3 === 0) { return "Fizz"; } else if (n % 5 === 0) { return "Buzz"; } else { return n; } }; for (let n = 1; n <= 100; n += 1) { console.log(fizzBuzz(n)); }

Slide 64

Slide 64 text

const fizzBuzz = n => { if (n % 15 === 0) { return "FizzBuzz"; } else if (n % 3 === 0) { return "Fizz"; } else if (n % 5 === 0) { return "Buzz"; } else { return n; } }; for (let n = 1; n <= 100; n += 1) { console.log(fizzBuzz(n)); }

Slide 65

Slide 65 text

Name: Popular Rubyists: Known for: Self-assessment: Clojure Russ Olsen, Bozhidar Batsov, Arne Brasseur Rich Hickey, Lisp, JVM, () a robust, practical, and fast programming language with a set of useful features that together form a simple, coherent, and powerful tool.

Slide 66

Slide 66 text

(defn fizzbuzz [n] (cond (zero? (mod n 15)) "FizzBuzz" (zero? (mod n 3)) "Fizz" (zero? (mod n 5)) "Buzz" :else n)) (run! println (map fizzbuzz (range 1 101)))

Slide 67

Slide 67 text

(defn fizzbuzz [n] (cond (zero? (mod n 15)) "FizzBuzz" (zero? (mod n 3)) "Fizz" (zero? (mod n 5)) "Buzz" :else n)) (run! println (map fizzbuzz (range 1 101)))

Slide 68

Slide 68 text

(defn fizzbuzz [n] (cond (zero? (mod n 15)) "FizzBuzz" (zero? (mod n 3)) "Fizz" (zero? (mod n 5)) "Buzz" :else n)) (run! println (map fizzbuzz (range 1 101)))

Slide 69

Slide 69 text

What you got?

Slide 70

Slide 70 text

Paradigm

Slide 71

Slide 71 text

Procedural Procedural Functional Functional Procedural Functional Object Object Functional Functional

Slide 72

Slide 72 text

Parallelism

Slide 73

Slide 73 text

Parallelism vs Concurrency

Slide 74

Slide 74 text

Yes Goroutines + channels Yes Agnostic Yes/No Webworkers+ Yes STM, pmap, Transducers Concurrent Concurrent Yes Actors Yes Mvar, par, STM

Slide 75

Slide 75 text

Performance!

Slide 76

Slide 76 text

Type System

Slide 77

Slide 77 text

Static Inferred Static Inferred Dynamic Optional Inferred++ Dynamic Optional Inferred++ Dynamic Static Inferred++ Dynamic Optional Inferred++ Static Inferred++

Slide 78

Slide 78 text

Compiled vs Interpreted

Slide 79

Slide 79 text

Compiled Compiled Interpreted Compiled Interpreted Compiled Compiled Compiled

Slide 80

Slide 80 text

Self-hosted

Slide 81

Slide 81 text

Show me your code

Slide 82

Slide 82 text

Yes Yes No No No Yes Yes Yes

Slide 83

Slide 83 text

Garbage- Collection

Slide 84

Slide 84 text

Yes No Yes Yes Yes Yes Yes Yes

Slide 85

Slide 85 text

Single File Distribution

Slide 86

Slide 86 text

Yes Yes No No No Yes Yes Yes

Slide 87

Slide 87 text

Ruby-like Syntax

Slide 88

Slide 88 text

No No No No Yes Yes Yes No

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

Parallel

Slide 91

Slide 91 text

Parallel Typing

Slide 92

Slide 92 text

Parallel Typing Fast

Slide 93

Slide 93 text

So, what?

Slide 94

Slide 94 text

Expand Your Mind

Slide 95

Slide 95 text

“Ruby's OO model was brain-expanding, and I was seeking more brain-expanding paradigms that would let me think entirely new thoughts.” Why did you learn a new language?

Slide 96

Slide 96 text

Joy

Slide 97

Slide 97 text

Domain

Slide 98

Slide 98 text

Tools

Slide 99

Slide 99 text

Where does Ruby go?

Slide 100

Slide 100 text

“Rails is strangling Ruby. In the same way that you don't quit because of a bad company, you quit because of a bad boss.”

Slide 101

Slide 101 text

Where does Ruby go?

Slide 102

Slide 102 text

Parallel Typing Fast

Slide 103

Slide 103 text

“Ruby is the best language I have used over my 30 years programming. I hope Ruby 3 puts an end to the Ruby is slow meme once and for all.”

Slide 104

Slide 104 text

“I really like Ruby for what it is, and don't think 'adding a type system' or something is the best way to keep Ruby relevant. Don't morph Ruby in to something it's not.”

Slide 105

Slide 105 text

We’re all great!

Slide 106

Slide 106 text

Explore some new lands!

Slide 107

Slide 107 text

Enjoy Coding & Learning in whatever language... Tobias Pfeiffer @PragTob pragtob.info