Slide 1

Slide 1 text

android.scale() @fabiocarballo

Slide 2

Slide 2 text

“Building a bank the world loves to use.

Slide 3

Slide 3 text

Hypergrowth mode

Slide 4

Slide 4 text

2014

Slide 5

Slide 5 text

2014 5 Number of Android devs

Slide 6

Slide 6 text

2016 5 Number of Android devs

Slide 7

Slide 7 text

2016 5 Number of Android devs

Slide 8

Slide 8 text

2017 5 Number of Android devs

Slide 9

Slide 9 text

5 2018 15 Number of Android devs

Slide 10

Slide 10 text

27 15 5 Now Number of Android devs

Slide 11

Slide 11 text

500% 1.5 years

Slide 12

Slide 12 text

Technical Readiness Scale Recruiting Onboarding Automation Releases Team Culture

Slide 13

Slide 13 text

How do we approach code?

Slide 14

Slide 14 text

Broken Windows

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

What to consider defining your architecture?

Slide 17

Slide 17 text

What to consider defining your architecture? -Reduce number of discussions -Embrace evolution -Favour testability -Protects from making mistakes

Slide 18

Slide 18 text

Architecture

Slide 19

Slide 19 text

Activity Reactive Dependency Injection Layered Architecture core:

Slide 20

Slide 20 text

Reactive

Slide 21

Slide 21 text

Receive 10 € into Main Account Reactive

Slide 22

Slide 22 text

S1 S1 S2 S3 S1 spaces reactive store Receive 10 € into Main Account spaces microservice GET /spaces Reactive Space Details View Model

Slide 23

Slide 23 text

spaces reactive store spaces microservice GET /spaces Reactive Receive 10 € into Main Account Space Details View Model

Slide 24

Slide 24 text

S1 S2 S3 Spaces Dashboard View Model Space Details View Model spaces reactive store spaces microservice GET /spaces Reactive Receive 10 € into Main Account

Slide 25

Slide 25 text

S1 S2 S3 S2 S3 S1 S2 S3 S1 S2 S3 Space Details View Model spaces reactive store spaces microservice GET /spaces Reactive Receive 10 € into Main Account Spaces Dashboard View Model

Slide 26

Slide 26 text

Feature Layered Architecture

Slide 27

Slide 27 text

Domain Feature Presentation Data

Slide 28

Slide 28 text

Domain Presentation Data Dependency Injection

Slide 29

Slide 29 text

Domain Presentation Data Dependency Injection

Slide 30

Slide 30 text

Domain Presentation Data Dependency Injection Dagger Glue

Slide 31

Slide 31 text

Be ruthless about it Defining your tech stack

Slide 32

Slide 32 text

-Which problem is it solving? Defining your tech stack

Slide 33

Slide 33 text

-Which problem is it solving? -What is the impact? Defining your tech stack

Slide 34

Slide 34 text

-Which problem is it solving? -What is the impact? -Is it actively maintained? Defining your tech stack

Slide 35

Slide 35 text

-Which problem is it solving? -What is the impact? -Is it actively maintained? 2.0.1 2.0.2 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 Retrofit Version along 2.5 years Defining your tech stack

Slide 36

Slide 36 text

Wrapping 3rd parties behind an interface is actually good.

Slide 37

Slide 37 text

Wrapping 3rd parties behind an interface is actually good.

Slide 38

Slide 38 text

app Camera Lib 1 - Keeping two Camera libs in the app Wrapping 3rd parties behind an interface is actually good.

Slide 39

Slide 39 text

app Camera Lib 1 - Keeping two Camera libs in the app Wrapping 3rd parties behind an interface is actually good.

Slide 40

Slide 40 text

app Camera Interface Camera Lib 1 - Keeping two Camera libs in the app Wrapping 3rd parties behind an interface is actually good.

Slide 41

Slide 41 text

- Keeping two Camera libs in the app app Camera Interface Camera Lib 2 Camera Lib 1 Wrapping 3rd parties behind an interface is actually good.

Slide 42

Slide 42 text

app Camera Interface Camera Lib 2 Camera Lib 1 Compression issues! camera_lib: “camera_lib_2” camera_lib: “camera_lib_2” “camera_lib_1”

Slide 43

Slide 43 text

app Camera Interface Camera Lib 2 Camera Lib 1 Compression issues! camera_lib: “camera_lib_2” “camera_lib_1”

Slide 44

Slide 44 text

Workflow Fabio Lucia

Slide 45

Slide 45 text

Fábio Lucia Workflow

Slide 46

Slide 46 text

Fábio Lucia Mustafa Omkar Ilke Sergio

Slide 47

Slide 47 text

Fábio Lucia Streams of work for 20+ persons a.k.a. Possibly many merge conflicts

Slide 48

Slide 48 text

Fábio Lucia Branch out and branch in small chunks Feature Flags

Slide 49

Slide 49 text

Commit Messages new transaction details NewTransactionsList WIP Linked- Authorising transactions dialog

Slide 50

Slide 50 text

android-machete git:(DES-156-discreet) android-machete git:(develop) git add . git checkout -b DES-156-discreet Switched to a new branch `DES-156-discreet` android-machete git:(DES-156-discreet) git commit -m “add discreet section to glossary” | JIRA ticket 'DES-156' prepended to commit message [DES-156-discreet 6219e9cbd4] DES-156 add discreet section to glossary

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

Modularisation for independence

Slide 54

Slide 54 text

app

Slide 55

Slide 55 text

Oct 14 Jan 2016 Jan 2017 Jan 2018

Slide 56

Slide 56 text

app

Slide 57

Slide 57 text

User app Login

Slide 58

Slide 58 text

app User Login Security

Slide 59

Slide 59 text

app Certification Security User Login Credit

Slide 60

Slide 60 text

app Credit Security User Login Certification

Slide 61

Slide 61 text

app Credit Security User Login Certification

Slide 62

Slide 62 text

app Certification Security User Login Credit Hidden coupling

Slide 63

Slide 63 text

app User Login Certification Security Credit Hidden coupling

Slide 64

Slide 64 text

app User Login Certification Security Credit

Slide 65

Slide 65 text

app User Login Certification Security Credit

Slide 66

Slide 66 text

Transactions

Slide 67

Slide 67 text

:transactions domain :transactions presentation :transactions data

Slide 68

Slide 68 text

:transactions domain :transactions presentation :app :transactions data

Slide 69

Slide 69 text

:spaces data :spaces domain :spaces presentation :moneyBeam data :moneyBeam domain :moneyBeam presentation :transactions presentation :app :transactions domain :transactions data

Slide 70

Slide 70 text

Jan 2019 100 modules Oct 14 Jan 2016 Jan 2017 Jan 2018

Slide 71

Slide 71 text

:transactions data :transactions domain :transactions presentation :app :spaces data :spaces domain :spaces presentation :moneyBeam data :moneyBeam domain :moneyBeam presentation

Slide 72

Slide 72 text

:transactions :app :spaces :moneyBeam

Slide 73

Slide 73 text

:transactions :app :spaces :moneyBeam moneyBeam microservice transactions microservice spaces microservice

Slide 74

Slide 74 text

:transactions :app :spaces :moneyBeam Backend for Frontend service moneyBeam microservice transactions microservice spaces microservice

Slide 75

Slide 75 text

100 modules Jan 2019 Oct 14 Jan 2016 Jan 2017 Jan 2018

Slide 76

Slide 76 text

What about … build times? They are interesting

Slide 77

Slide 77 text

Jan 2019 Oct 14 Jan 2016 Jan 2017 Jan 2018 7m 5m 3m 1.5m Clean Build Times

Slide 78

Slide 78 text

40% of reduction in build times Jan 2019 Oct 14 Jan 2016 Jan 2017 Jan 2018 7m 5m 3m 1.5m Clean Build Times

Slide 79

Slide 79 text

Feature Launcher Apps

Slide 80

Slide 80 text

Credit

Slide 81

Slide 81 text

Credit N26 App

Slide 82

Slide 82 text

N26 App Credit Spaces Overdraft Premium Moneybeam Transactions

Slide 83

Slide 83 text

N26 App Credit Spaces Overdraft Premium MoneyBeam Transactions 1-5mins build time

Slide 84

Slide 84 text

Launcher app Credit N26 App Spaces Overdraft Premium MoneyBeam Transactions 1-5mins build time

Slide 85

Slide 85 text

Go bottom-top, not top-bottom

Slide 86

Slide 86 text

:app

Slide 87

Slide 87 text

AppComponent NetworkModule ApplicationModule SpacesComponent SpacesModule UserComponent User Module Session Module Credit Component CreditModule :app

Slide 88

Slide 88 text

:spaces :credit SpacesComponent SpacesModule Credit Component CreditModule AppComponent NetworkModule ApplicationModule UserComponent User Module Session Module :app

Slide 89

Slide 89 text

:spaces :credit SpacesComponent SpacesModule Credit Component CreditModule AppComponent NetworkModule ApplicationModule UserComponent User Module Session Module :app Where is App/User component??????

Slide 90

Slide 90 text

:spaces :credit :base BaseComponent NetworkModule ApplicationModule Session Module SpacesComponent SpacesModule Credit Component CreditModule :app

Slide 91

Slide 91 text

Why modularize for scale? Independent teams

Slide 92

Slide 92 text

Refactor with more safety Independent teams Why modularize for scale?

Slide 93

Slide 93 text

Independent teams Refactor with more safety Creativity and Innovation Why modularize for scale?

Slide 94

Slide 94 text

Testing to release with trust

Slide 95

Slide 95 text

Oct 14 Jan 2016 Jan 2017

Slide 96

Slide 96 text

Unit Tests Oct 14 Jan 2016 Jan 2017 Easy Safe Refactoring Let you sleep

Slide 97

Slide 97 text

Unit Tests Oct 14 Jan 2016 Jan 2017 Jan 2018 Jan 2019 8000 Unit tests Easy Safe Refactoring Let you sleep

Slide 98

Slide 98 text

Easy Safe Refactoring Let you sleep Unit Tests Oct 14 Jan 2016 Jan 2017 Jan 2018 Jan 2019 8000 Unit tests

Slide 99

Slide 99 text

Oct 14 Jan 2016 Jan 2017 Jan 2018 Jan 2019 8000 Unit tests Unit Tests

Slide 100

Slide 100 text

Unit Tests Oct 14 Jan 2016 Jan 2017 Jan 2018 Jan 2019 8000 Unit tests

Slide 101

Slide 101 text

Unit Tests Oct 14 Jan 2016 Jan 2017 Jan 2018 Jan 2019 8000 Unit tests

Slide 102

Slide 102 text

Unit Tests Oct 14 Jan 2016 Jan 2017 Jan 2018 Jan 2019 8000 Unit tests

Slide 103

Slide 103 text

Unit Tests Functional UI Tests 400 UI Tests Oct 14 Jan 2016 Jan 2017 Jan 2018 Jan 2019 8000 Unit tests

Slide 104

Slide 104 text

Automated Regression 10% 50% Functional UI Tests 400 UI Tests Unit Tests Oct 14 Jan 2016 Jan 2017 Jan 2018 Jan 2019 8000 Unit tests

Slide 105

Slide 105 text

UI Testing Pipeline Slow Most difficult to fix

Slide 106

Slide 106 text

ui-pipeline.sh

Slide 107

Slide 107 text

SpacesViewModel + spaceName.text = “Space” - spaceName.text = space.name ui-pipeline.sh

Slide 108

Slide 108 text

:app :spaces :c :b :a ui-pipeline.sh SpacesViewModel + spaceName.text = “Space” - spaceName.text = space.name

Slide 109

Slide 109 text

:spaces ./run-instrumentation spaces :app :spaces :c :b :a ui-pipeline.sh SpacesViewModel + spaceName.text = “Space” - spaceName.text = space.name

Slide 110

Slide 110 text

30+ minutes UI Testing Pipeline

Slide 111

Slide 111 text

3 min (worst case run) UI Testing Pipeline

Slide 112

Slide 112 text

Build a Design System and bring consistency alongside

Slide 113

Slide 113 text

80 Designers & Engineers 15 Designers & Engineers

Slide 114

Slide 114 text

No content

Slide 115

Slide 115 text

That one “divider grey” Yeah it should be the grey we used in that other screen :) Is this the right grey for the divider? I thought it was this one? Hmm, I was using this to be honest

Slide 116

Slide 116 text

No content

Slide 117

Slide 117 text

System Glossary

Slide 118

Slide 118 text

No content

Slide 119

Slide 119 text

No content

Slide 120

Slide 120 text

No content

Slide 121

Slide 121 text

No content

Slide 122

Slide 122 text

No content

Slide 123

Slide 123 text

No content

Slide 124

Slide 124 text

No content

Slide 125

Slide 125 text

listOf(

Slide 126

Slide 126 text

SectionHeader("Transactions"), listOf(

Slide 127

Slide 127 text

SectionHeader("Transactions"), listOf( SubSectionHeader(“Today"),

Slide 128

Slide 128 text

TransactionContainer( "From Main Account", " to Home", Money(BigDecimal(5), Euro)), TransactionContainer( "From Main Account", "Last one ... ", Money(BigDecimal(4.50), Euro)), TransactionContainer( "From Main Account", "Just one more ", Money(BigDecimal(5), Euro)), TransactionContainer( "From Main Account", "Money for drinks!", Money(BigDecimal(5), Euro)))) SectionHeader("Transactions"), listOf( SubSectionHeader(“Today"),

Slide 129

Slide 129 text

Consistency Speed

Slide 130

Slide 130 text

Discreet Mode

Slide 131

Slide 131 text

Discreet Mode

Slide 132

Slide 132 text

Discreet Mode In a company of 1000+ people, 2 persons were able to develop and drive the launch of this feature QA Design Marketing Product Bank Security

Slide 133

Slide 133 text

QA Design Marketing Product Bank Security Discreet Mode In a company of 1000+ people, 2 persons were able to develop and drive the launch of this feature

Slide 134

Slide 134 text

Discreet Mode In a company of 1000+ people, 2 persons were able to develop and drive the launch of this feature QA Design Marketing Product Bank Security

Slide 135

Slide 135 text

No content

Slide 136

Slide 136 text

Questions? n26.com/careers Berlin Barcelona New York Vienna Follow me: @fabiocarballo