Slide 1

Slide 1 text

github Behind the Feature

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Search

Slide 4

Slide 4 text

January 2013 Search

Slide 5

Slide 5 text

4-9 months Search

Slide 6

Slide 6 text

elasticsearch Search

Slide 7

Slide 7 text

design Search

Slide 8

Slide 8 text

@jonrohan @TwP

Slide 9

Slide 9 text

@holman 

Slide 10

Slide 10 text

Planning

Slide 11

Slide 11 text

We knew search sucked

Slide 12

Slide 12 text

Start by talking about it

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

From: [email protected] Subject: Search Results If you have a spare moment, go to github.com/search. These search pages need some lovin’ in a bad, bad way.

Slide 15

Slide 15 text

Backend Two-person teams

Slide 16

Slide 16 text

Two-person teams Frontend

Slide 17

Slide 17 text

Building

Slide 18

Slide 18 text

Okay, let’s build something

Slide 19

Slide 19 text

BRANCHES

Slide 20

Slide 20 text

git checkout -b search-next BRANCHES

Slide 21

Slide 21 text

Really simple branching BRANCHES

Slide 22

Slide 22 text

Cut a branch from master BRANCHES (rarely from non-master branch)

Slide 23

Slide 23 text

Push whenever; let others help BRANCHES

Slide 24

Slide 24 text

No need for complicated forks BRANCHES

Slide 25

Slide 25 text

COMMITS

Slide 26

Slide 26 text

git commit -m “Design Search” COMMITS

Slide 27

Slide 27 text

git commit -m “:lipstick:” COMMITS

Slide 28

Slide 28 text

COMMITS

Slide 29

Slide 29 text

We don’t rebase or do any fancy merge strategies COMMITS

Slide 30

Slide 30 text

Small, incremental commits COMMITS

Slide 31

Slide 31 text

PULL REQUESTS

Slide 32

Slide 32 text

Open a Pull Request PULL REQUESTS

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

Sometimes we open pulls before code PULL REQUESTS

Slide 35

Slide 35 text

PULL REQUESTS Sometimes we open pulls after code

Slide 36

Slide 36 text

PULL REQUESTS Sometimes pulls aren’t for merging

Slide 37

Slide 37 text

130 commits 10 contributors 2 months

Slide 38

Slide 38 text

PULL REQUESTS Let your pulls evolve

Slide 39

Slide 39 text

MENTIONS

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

MENTIONS Low-overhead way to ask for help

Slide 43

Slide 43 text

MENTIONS Non-intrusive way to ask for help

Slide 44

Slide 44 text

MENTIONS Feel good about a ship by mentioning the relevant team

Slide 45

Slide 45 text

TESTING

Slide 46

Slide 46 text

TESTING Tests are kinda critical

Slide 47

Slide 47 text

TESTING Every commit we push triggers three builds: ruby 1.8 ruby 1.9 github enterprise

Slide 48

Slide 48 text

Build notifications

Slide 49

Slide 49 text

TESTING Make it hard to ignore failures

Slide 50

Slide 50 text

Shipping

Slide 51

Slide 51 text

STAFF-SHIPPING Limit your exposure

Slide 52

Slide 52 text

STAFF-SHIPPING We have ~35 features staff-shipped

Slide 53

Slide 53 text

STAFF-SHIPPING My GitHub looks different from yours:

Slide 54

Slide 54 text

REDACTED

Slide 55

Slide 55 text

STAFF-SHIPPING Ranges from four-line config changes to entire feature redesigns

Slide 56

Slide 56 text

STAFF-SHIPPING Coworkers are the only real beta testers

Slide 57

Slide 57 text

STAFF-SHIPPING def search_enabled? current_user.staff? end master

Slide 58

Slide 58 text

STAFF-SHIPPING def search_enabled? true end ship-search

Slide 59

Slide 59 text

STAFF-SHIPPING No risky deploys; it’s already production-tested

Slide 60

Slide 60 text

STAFF-SHIPPING Search’s design was staff-shipped for two months

Slide 61

Slide 61 text

STAFF-SHIPPING Search’s backend was staff-shipped for four months

Slide 62

Slide 62 text

STAFF-SHIPPING Gist 2.0 was staff-shipped for a year

Slide 63

Slide 63 text

STAFF-SHIPPING More real-world usage means fewer surprises

Slide 64

Slide 64 text

STAFF-SHIPPING Shipping is scary; reduce surprises

Slide 65

Slide 65 text

DEPLOYMENT

Slide 66

Slide 66 text

DEPLOYMENT Deploying is scary; reduce surprises

Slide 67

Slide 67 text

DEPLOYMENT Deploying to production involves 80 servers and hundreds of Unicorn processes and magic and it’s a wonder this stuff works

Slide 68

Slide 68 text

DEPLOYMENT We want it easy enough for a designer to deploy

Slide 69

Slide 69 text

github/hubot

Slide 70

Slide 70 text

DEPLOYMENT hubot deploy github

Slide 71

Slide 71 text

DEPLOYMENT Hubot talks to an API that knows how to deploy every app

Slide 72

Slide 72 text

DEPLOYMENT hubot deploy github/ship-search

Slide 73

Slide 73 text

DEPLOYMENT Deploy a branch; rollback by deploying master

Slide 74

Slide 74 text

DEPLOYMENT hubot deploy github/master

Slide 75

Slide 75 text

 CHATOPS

Slide 76

Slide 76 text

 CHATOPS Chat’s important to us

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

 CHATOPS Search didn’t need standup meetings

Slide 79

Slide 79 text

 CHATOPS Chat is asynchronous and non-blocking

Slide 80

Slide 80 text

 CHATOPS “Chatops”

Slide 81

Slide 81 text

 CHATOPS Transparent way of handling ops

Slide 82

Slide 82 text

 CHATOPS Search deployed, check perf

Slide 83

Slide 83 text

 CHATOPS /graph me -1h substr(es-*_github.load)

Slide 84

Slide 84 text

 CHATOPS

Slide 85

Slide 85 text

 CHATOPS load on es-storage15 is higher than the other storage nodes

Slide 86

Slide 86 text

 CHATOPS let's let it go a bit- could just be due to relocating shards causing iowait

Slide 87

Slide 87 text

 CHATOPS Working over SSH is non-collaborative

Slide 88

Slide 88 text

 CHATOPS Makes it obvious what needs automation and tooling

Slide 89

Slide 89 text

Maintaining

Slide 90

Slide 90 text

 POST-SHIP

Slide 91

Slide 91 text

 POST-SHIP Keep shipping

Slide 92

Slide 92 text

No content

Slide 93

Slide 93 text

 BUGS

Slide 94

Slide 94 text

 BUGS Keep fixing

Slide 95

Slide 95 text

No content

Slide 96

Slide 96 text

 BUGS Don’t assume someone else will fix ‘em

Slide 97

Slide 97 text

Thanks.