Slide 1

Slide 1 text

Friday, November 2, 12

Slide 2

Slide 2 text

matt aimonetti @merbist http://matt.aimonetti.net http://github.com/mattetti Friday, November 2, 12

Slide 3

Slide 3 text

special day! Friday, November 2, 12

Slide 4

Slide 4 text

f dia de los muertos x Friday, November 2, 12

Slide 5

Slide 5 text

Friday, November 2, 12

Slide 6

Slide 6 text

Human Languages studied by linguists Friday, November 2, 12

Slide 7

Slide 7 text

Sapir-Whorf Hypothesis linguistic differences have consequences on human cognition and behavior The principle of linguistic relativity holds that the structure of a language affects the ways in which its speakers conceptualize their world, i.e. their world view, or otherwise influences their cognitive processes. Friday, November 2, 12

Slide 8

Slide 8 text

Studying Programming Languages Friday, November 2, 12

Slide 9

Slide 9 text

How not to do it Friday, November 2, 12

Slide 10

Slide 10 text

Hello World! Friday, November 2, 12

Slide 11

Slide 11 text

Syntax Friday, November 2, 12

Slide 12

Slide 12 text

How to do it Friday, November 2, 12

Slide 13

Slide 13 text

Friday, November 2, 12

Slide 14

Slide 14 text

Karl Marx Friday, November 2, 12

Slide 15

Slide 15 text

Friday, November 2, 12

Slide 16

Slide 16 text

Not Karl Marx Friday, November 2, 12

Slide 17

Slide 17 text

Friday, November 2, 12

Slide 18

Slide 18 text

interpreted compiled dynamically typed statically typed object oriented functional difficulty JavaScript X X X* X easy Ruby/Python X X X X normal CoffeeScript X X X X normal Objective-C X X X X * nightmare Java X X X hard Go X * structural X X* X normal Clojure X X (hints) * X normal/ nightmare/ hell Scala X * structural X inferred X X normal/ nightmare Friday, November 2, 12

Slide 19

Slide 19 text

Friday, November 2, 12

Slide 20

Slide 20 text

Part I Friday, November 2, 12

Slide 21

Slide 21 text

How did that affect the way I write Ruby? Part II Friday, November 2, 12

Slide 22

Slide 22 text

Format Friday, November 2, 12

Slide 23

Slide 23 text

class Presentation attr_accessor :name, :topic def initialize(name, topic) self.name = name self.topic = topic end def start puts "Hi, my name is #{name} \ and I will talk about #{topic}." end end talk = Presentation.new("Matt", "Ruby") talk.start code example ported to each language Friday, November 2, 12

Slide 24

Slide 24 text

.Use case .Philosophy .what I dislike .what I like .where to start Friday, November 2, 12

Slide 25

Slide 25 text

Go Friday, November 2, 12

Slide 26

Slide 26 text

compiled structural typed object oriented* functional learning: normal Friday, November 2, 12

Slide 27

Slide 27 text

package demo import "fmt" type Presentation struct { " Name, Topic string } func (p *Presentation) start() string { " return "This is " + p.Name + ", and I will talk about " + p.Topic + "." } func main() { " talk := &Presentation{Name: "Matt", Topic: "Go"} " fmt.Println(talk.start()) } Friday, November 2, 12

Slide 28

Slide 28 text

Use case: concurrency Friday, November 2, 12

Slide 29

Slide 29 text

package main import ( " "fmt" " "net/http" " "time" ) var urls = []string{ " "http://rubyconf.com/", " "http://golang.org/", " "http://matt.aimonetti.net/", } type HttpResponse struct { " url string " response *http.Response " err error } Friday, November 2, 12

Slide 30

Slide 30 text

func asyncHttpGets(urls []string) []*HttpResponse { " ch := make(chan *HttpResponse, len(urls)) // buffered " responses := []*HttpResponse{} " for _, url := range urls { " " go func(url string) { " " " fmt.Printf("Fetching %s \n", url) " " " resp, err := http.Get(url) " " " ch <- &HttpResponse{url, resp, err} " " }(url) " } " for { " " select { " " case r := <-ch: " " " fmt.Printf("%s was fetched\n", r.url) " " " responses = append(responses, r) " " " if len(responses) == len(urls) { " " " " return responses " " " } " " default: " " " fmt.Printf(".") " " " time.Sleep(5e7) " " } " } " return responses } Friday, November 2, 12

Slide 31

Slide 31 text

func main() { " results := asyncHttpGets(urls) " for _, result := range results { " " fmt.Printf("%s status: %s\n", result.url, result.response.Status) " } } Friday, November 2, 12

Slide 32

Slide 32 text

$ go build concurrency_example.go && ./a.out .Fetching http://rubyconf.com/ Fetching http://golang.org/ Fetching http://matt.aimonetti.net/ .....http://golang.org/ was fetched .......http://rubyconf.com/ was fetched .http://matt.aimonetti.net/ was fetched http://golang.org/ status: 200 OK http://rubyconf.com/ status: 200 OK http://matt.aimonetti.net/ status: 200 OK http://bit.ly/go-async-http Friday, November 2, 12

Slide 33

Slide 33 text

Philosophy The new “C” Friday, November 2, 12

Slide 34

Slide 34 text

what I dislike A bit too low level for some Not so great GC Limited adoption* Odd conventions at times Friday, November 2, 12

Slide 35

Slide 35 text

what I like simple specs modern std libs concurrency (goroutines/channels) sensible conventions fast compilation flexible code organization simpler take on OO features of FP error handling documentation source as documentation Friday, November 2, 12

Slide 36

Slide 36 text

how to get started http://tour.golang.org Friday, November 2, 12

Slide 37

Slide 37 text

Clojure Friday, November 2, 12

Slide 38

Slide 38 text

compiled dynamically typed (w/ hints) functional “object oriented*” learning: normal/nightmare Friday, November 2, 12

Slide 39

Slide 39 text

(defprotocol Talk "A conference talk" (start [p] "return the speaker and topic.")) (defrecord Presentation [name topic] Talk; implement the Talk protocol (start [_] (str "Hi, this is " name " and I will talk about " topic "."))) (def talk (Presentation. "Matt" "Clojure")) (start talk) Friday, November 2, 12

Slide 40

Slide 40 text

Use case: Data Processing Friday, November 2, 12

Slide 41

Slide 41 text

(ns example.word-count (:use clojure.contrib.io clojure.contrib.seq-utils)) (defn parse-line [line] (let [tokens (.split (.toLowerCase line) " ")] (map #(vector % 1) tokens))) (defn combine [mapped] (->> (apply concat mapped) (group-by first) (map (fn [[k v]] {k (map second v)})) (apply merge-with conj))) (defn sum [[k v]] {k (apply + v)}) (defn reduce-parsed-lines [collected-values] (apply merge (map sum collected-values))) (defn word-frequency [filename] (->> (read-lines filename) (map parse-line) (combine) (reduce-parsed-lines))) Friday, November 2, 12

Slide 42

Slide 42 text

Philosophy The pragmatic Scheme Friday, November 2, 12

Slide 43

Slide 43 text

what I dislike not so simple not always consistent need to know a lot of functions/macros not really web focused brain stack overflow hard mental context switch meaningless error stacks Friday, November 2, 12

Slide 44

Slide 44 text

what I like really great for data processing isolate problems efficiently fast java interop Friday, November 2, 12

Slide 45

Slide 45 text

how to get started https://github.com/functional-koans/clojure-koans Friday, November 2, 12

Slide 46

Slide 46 text

Friday, November 2, 12

Slide 47

Slide 47 text

compiled static/inferred/dynamic type object oriented & functional Learning: normal/hard Friday, November 2, 12

Slide 48

Slide 48 text

class Presentation(val name: String, val topic: String) { val start = "My name is "+ name + " and I will talk about " + topic +"." } val talk = new Presentation("Matt", "Scala") talk.start Friday, November 2, 12

Slide 49

Slide 49 text

Use case: Service Oriented Architecture Whenever you need a more “entreprisey” Ruby Friday, November 2, 12

Slide 50

Slide 50 text

Twitter’s Finagle Friday, November 2, 12

Slide 51

Slide 51 text

Friday, November 2, 12

Slide 52

Slide 52 text

Future + pipeline Friday, November 2, 12

Slide 53

Slide 53 text

val authenticatedUser: Future[User] = User.authenticate(email, password) val lookupTweets: Future[Seq[Tweet]] = authenticatedUser flatMap { user => Tweet.findAllByUser(user) } Friday, November 2, 12

Slide 54

Slide 54 text

for { user <- User.authenticate(email, password) tweets <- Tweet.findAllByUser(user) } yield tweets Friday, November 2, 12

Slide 55

Slide 55 text

Async, blocking or not futures FP & OOP both fully embraced Friday, November 2, 12

Slide 56

Slide 56 text

val service = new Service[HttpRequest, HttpResponse] { def apply(request: HttpRequest) = Future(new DefaultHttpResponse(HTTP_1_1, OK)) } val address = new InetSocketAddress(10000) val server: Server[HttpRequest, HttpResponse] = ServerBuilder() .name("MyWebServer") .codec(Http()) .bindTo(address) .build(service) Friday, November 2, 12

Slide 57

Slide 57 text

Enumerable Anonymous methods Default method param Meta programming method_missing duck typing Mixins Focus on testing Friday, November 2, 12

Slide 58

Slide 58 text

Focus on Tests Inner methods Lazy evals/streams Great GC Performance Tools/IDE Friday, November 2, 12

Slide 59

Slide 59 text

Philosophy The academic version of Ruby Ruby minus scripting plus static typing Friday, November 2, 12

Slide 60

Slide 60 text

what I dislike huge surface stiff learning curve abused o_O:: syntax poor documentation feels like it’s trying to do everything JVM Friday, November 2, 12

Slide 61

Slide 61 text

what I like Close to Ruby/Python Does a lot of what Clojure offers Easy to get started Inferred types Flexible functional approach Modern concerns (parallelism) Pattern matching Relatively rich ecosystem Community JVM/CLR Friday, November 2, 12

Slide 62

Slide 62 text

where to get started Twitter’s Scala school A Tour of scala Coursera’s online class Friday, November 2, 12

Slide 63

Slide 63 text

How did that affect the way I write Ruby? Part II Friday, November 2, 12

Slide 64

Slide 64 text

Friday, November 2, 12

Slide 65

Slide 65 text

Ruby is (also) a functional programming language Friday, November 2, 12

Slide 66

Slide 66 text

fp & oop are complementary Friday, November 2, 12

Slide 67

Slide 67 text

fp when extend with new operations oop when extend with new data Friday, November 2, 12

Slide 68

Slide 68 text

fp when your data doesn’t change oop when your data evolves Friday, November 2, 12

Slide 69

Slide 69 text

It’s not because you can that you should Friday, November 2, 12

Slide 70

Slide 70 text

Typing Friday, November 2, 12

Slide 71

Slide 71 text

Testing != Documentation Friday, November 2, 12

Slide 72

Slide 72 text

Error handling Friday, November 2, 12

Slide 73

Slide 73 text

Compilers Friday, November 2, 12

Slide 74

Slide 74 text

Simplicity matters Friday, November 2, 12

Slide 75

Slide 75 text

Ruby’s limits Friday, November 2, 12

Slide 76

Slide 76 text

Performance Concurrency Freedom Friday, November 2, 12

Slide 77

Slide 77 text

“ruby” developer Friday, November 2, 12

Slide 78

Slide 78 text

problem solver Friday, November 2, 12

Slide 79

Slide 79 text

product builder Friday, November 2, 12

Slide 80

Slide 80 text

is just a detail Friday, November 2, 12

Slide 81

Slide 81 text

but choose wisely Friday, November 2, 12

Slide 82

Slide 82 text

languages shape how you solve problems Friday, November 2, 12

Slide 83

Slide 83 text

be curious learn a new language Friday, November 2, 12

Slide 84

Slide 84 text

and go build awesome stuff Friday, November 2, 12

Slide 85

Slide 85 text

Feedback Questions Friday, November 2, 12

Slide 86

Slide 86 text

matt aimonetti @merbist http://matt.aimonetti.net http://github.com/mattetti Friday, November 2, 12