Slide 1

Slide 1 text

A look back at CAPITAINE TRAIN

Slide 2

Slide 2 text

A look back at CAPITAINE TRAIN *aka Captain Train, aka Trainline *

Slide 3

Slide 3 text

Disclaimer We don’t work at Trainline anymore. Everything discussed in this presentation relates to what we experienced from 2013 to 2017.

Slide 4

Slide 4 text

2009 Capitaine Train founded

Slide 5

Slide 5 text

2009 Capitaine Train founded May 2010 Beta website

Slide 6

Slide 6 text

n May 2010 Beta website October 2012 Public website

Slide 7

Slide 7 text

October 2012 Public website March 2013 Cyril’s arrival

Slide 8

Slide 8 text

March 2013 Cyril’s arrival October 2013 iOS app

Slide 9

Slide 9 text

October 2013 iOS app November 2013 Mathieu’s arrival

Slide 10

Slide 10 text

November 2013 Mathieu’s arrival March 2014 Android app

Slide 11

Slide 11 text

March 2014 Android app July 2014 Android Wear app

Slide 12

Slide 12 text

July 2014 Android Wear app September 2014 Flavien’s arrival

Slide 13

Slide 13 text

September 2014 Flavien’s arrival September 2015

Slide 14

Slide 14 text

September 2015 October 2015 Flavien left

Slide 15

Slide 15 text

October 2015 Flavien left November 2015 Jérémie’s arrival

Slide 16

Slide 16 text

November 2015 Jérémie’s arrival Trainline buys Captain Train March 2016

Slide 17

Slide 17 text

Trainline buys Captain Train March 2016 September 2016

Slide 18

Slide 18 text

September 2016 2017 We all leave

Slide 19

Slide 19 text

Recruiting smart people is hard Take your time and be demanding

Slide 20

Slide 20 text

What are we looking for?

Slide 21

Slide 21 text

Autonomy What are we looking for?

Slide 22

Slide 22 text

Autonomy What are we looking for? • Curiosity

Slide 23

Slide 23 text

Autonomy What are we looking for? • Curiosity • Honesty

Slide 24

Slide 24 text

Autonomy What are we looking for? • Curiosity • Honesty • Involvement

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

A multi-step process Application Quiz Technical project Face-to-face interviews

Slide 27

Slide 27 text

Step 1 Application

Slide 28

Slide 28 text

Capitaine Train 20 rue Saint-Georges 75009 Paris France Capitaine Train Pre-Interview (Android) 1. What is the difference between LinkedList and ArrayList? 2. What is the difference between an interface and an abstract class? 3. What is the difference between fnal, fnally and fnalize? 4. What is an Adapter? How to use it? How to create one in your project? Step 2 Quiz

Slide 29

Slide 29 text

Step 3 Technical project “ Make an app using the Star Wars API at https://swapi.co/

Slide 30

Slide 30 text

Step 4 Face-to-face interviews

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

It doesn’t make sense to hire smart people and then tell them what to do; we hire smart people so they can tell us what to do. – Steve Jobs “

Slide 35

Slide 35 text

Company values Minimise interruptions Trust by default

Slide 36

Slide 36 text

Letting you do your best work

Slide 37

Slide 37 text

A scattered Android team Cyril Jérémie Mathieu

Slide 38

Slide 38 text

Synchronise time together In Paris office at the same time

Slide 39

Slide 39 text

Take advantage of time together

Slide 40

Slide 40 text

Meetings

Slide 41

Slide 41 text

Meetings Make decisions

Slide 42

Slide 42 text

Meetings Make decisions Confront ideas

Slide 43

Slide 43 text

Meetings Make decisions Confront ideas In person - Hangouts

Slide 44

Slide 44 text

Meetings Make decisions Confront ideas In person - Hangouts Keep a written record

Slide 45

Slide 45 text

Regular meetings

Slide 46

Slide 46 text

Regular meetings Sync with release

Slide 47

Slide 47 text

Regular meetings Sync with release Assign features wisely

Slide 48

Slide 48 text

Regular meetings Sync with release Assign features wisely Check progress

Slide 49

Slide 49 text

Regular meetings Sync with release Assign features wisely Check progress About every 2 weeks

Slide 50

Slide 50 text

Impromptu meetings

Slide 51

Slide 51 text

Impromptu meetings Discuss feature design technical solutions

Slide 52

Slide 52 text

Impromptu meetings Discuss technical solutions feature design

Slide 53

Slide 53 text

Making remote work Keep communicating

Slide 54

Slide 54 text

Text communication

Slide 55

Slide 55 text

Text communication Share knowledge

Slide 56

Slide 56 text

Text communication Share knowledge Ask questions

Slide 57

Slide 57 text

Text communication Share knowledge Ask questions Transmit information

Slide 58

Slide 58 text

Text communication Share knowledge Ask questions Transmit information Video when needed

Slide 59

Slide 59 text

Importance of being offline

Slide 60

Slide 60 text

work in autonomy communication

Slide 61

Slide 61 text

Keep it simple, stupid aka KISS principle

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

Keep in mind the long run

Slide 65

Slide 65 text

After v27 - 06/12/2016 Before v1 - 03/03/2014

Slide 66

Slide 66 text

After v27 - 06/12/2016 Before v1 - 03/03/2014

Slide 67

Slide 67 text

Go beyond the application Get to know the platform and how to interact with it

Slide 68

Slide 68 text

Android iOS

Slide 69

Slide 69 text

Android iOS

Slide 70

Slide 70 text

Embrace the platform design language Guidelines are a first step, a kickstart

Slide 71

Slide 71 text

Android iOS

Slide 72

Slide 72 text

Android iOS

Slide 73

Slide 73 text

Android iOS

Slide 74

Slide 74 text

Design is a balance Getting the best out of a set of constraints

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

Design is never done… Now Future ?

Slide 77

Slide 77 text

Secret to good design is iteration

Slide 78

Slide 78 text

Software release trains

Slide 79

Slide 79 text

TIME Train vN Train vN+1

Slide 80

Slide 80 text

TIME Train vN Train vN+1

Slide 81

Slide 81 text

TIME Train vN Train vN+1

Slide 82

Slide 82 text

TIME Train vN Train vN+1

Slide 83

Slide 83 text

TIME Train vN Train vN+1

Slide 84

Slide 84 text

TIME Train vN Train vN+1

Slide 85

Slide 85 text

TIME Train vN Train vN+1

Slide 86

Slide 86 text

TIME Train vN Train vN+1

Slide 87

Slide 87 text

6 weeks release cycle

Slide 88

Slide 88 text

Day to day

Slide 89

Slide 89 text

Code

Slide 90

Slide 90 text

Merge request Code

Slide 91

Slide 91 text

Monitoring Merge request Code

Slide 92

Slide 92 text

No kidding? Business as usual

Slide 93

Slide 93 text

Monitoring Merge request Code

Slide 94

Slide 94 text

Code Git best practices

Slide 95

Slide 95 text

Git best practices Several subjects in parallel Code

Slide 96

Slide 96 text

Code Git best practices Several subjects in parallel Backlog always full

Slide 97

Slide 97 text

Code Git best practices Several subjects in parallel Backlog always full Defensive programming

Slide 98

Slide 98 text

The backend is not your friend

Slide 99

Slide 99 text

Monitoring Merge request Code

Slide 100

Slide 100 text

Autonomy Merge request

Slide 101

Slide 101 text

Merge request Autonomy Conventions over tools

Slide 102

Slide 102 text

Autonomy Conventions over tools Save time for review Merge request

Slide 103

Slide 103 text

Merge request Autonomy Conventions over tools Save time for review In depth

Slide 104

Slide 104 text

Merge request Autonomy Conventions over tools Save time for review In depth QA

Slide 105

Slide 105 text

One hour of review per day Keep the bugs out

Slide 106

Slide 106 text

Monitoring Merge request Code

Slide 107

Slide 107 text

Monitoring Crash monitoring

Slide 108

Slide 108 text

Monitoring Crash monitoring Analytics

Slide 109

Slide 109 text

Monitoring Crash monitoring Analytics Play Store

Slide 110

Slide 110 text

Monitoring Crash monitoring Analytics Play Store Customer support

Slide 111

Slide 111 text

With great autonomy comes great responsibility

Slide 112

Slide 112 text

And great pride

Slide 113

Slide 113 text

Disclaimer The architecture was created in 2013. There was no real popular solution for architecting your app back then. Choices would probably be different today

Slide 114

Slide 114 text

How to build your architecture?

Slide 115

Slide 115 text

Use proven technologies & focus on features

Slide 116

Slide 116 text

Must be understandable by new developers easily

Slide 117

Slide 117 text

Design for scale but do not over-engineer it

Slide 118

Slide 118 text

Adapt your architecture to your product (and your API)

Slide 119

Slide 119 text

An account was mandatory

Slide 120

Slide 120 text

AccountAuthenticator

Slide 121

Slide 121 text

Users use the app while travelling in a train

Slide 122

Slide 122 text

Offline by default

Slide 123

Slide 123 text

Use case search & book a ticket

Slide 124

Slide 124 text

Operations 100% online

Slide 125

Slide 125 text

Operations 100% online • quick

Slide 126

Slide 126 text

Data is valid for short period of time

Slide 127

Slide 127 text

API call directly from the screen

Slide 128

Slide 128 text

Use case after-sales

Slide 129

Slide 129 text

Operations 100% online

Slide 130

Slide 130 text

Operations 100% online • maybe minute(s)

Slide 131

Slide 131 text

We need to keep operation’s state

Slide 132

Slide 132 text

Live with your architecture

Slide 133

Slide 133 text

Libraries must be carefully chosen

Slide 134

Slide 134 text

Tech debts It impacts your

Slide 135

Slide 135 text

Tech debts It impacts your • Productivity

Slide 136

Slide 136 text

Tech debts It impacts your • Productivity • APK size

Slide 137

Slide 137 text

How do we select one?

Slide 138

Slide 138 text

How do we select one? 1. Maintained

Slide 139

Slide 139 text

How do we select one? 2. Simple & focused

Slide 140

Slide 140 text

How do we select one? 3. Not a core part

Slide 141

Slide 141 text

How do we select one? 4. Documented

Slide 142

Slide 142 text

in that order.

Slide 143

Slide 143 text

How do we maintain them? Part of our release cycle

Slide 144

Slide 144 text

No content

Slide 145

Slide 145 text

How do we maintain them? Test their integration

Slide 146

Slide 146 text

Thank you! @cyrilmottier @JeremMartinez

Slide 147

Slide 147 text

Thank you! @cyrilmottier @JeremMartinez @Mathieu_Calba