Slide 1

Slide 1 text

Saúl Díaz González Android Developer @sefford NOIR EDITION

Slide 2

Slide 2 text

Saúl’s Development Agency 21 Jun 2017, 5:29

Slide 3

Slide 3 text

“ Por favor, ayúdame, la aplicación no carga. Es como si no tuviera internet, pero en realidad sí es así”

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

ite Testing + CI TESTING No es perfecto; pero bastante sólida Domain JUnit E2E, ~65% cobertura UI Junit & Robolectric, ~43% cobertura Enfocado a los componentes clave

Slide 6

Slide 6 text

ite Dogfooding & Q&A MANUAL QA & DOGFOODING El equipo prueba la app Lanzamos internamente en una amplia variedad de dispositivos y APIs

Slide 7

Slide 7 text

Deployment STAGED ROLLOUTS Al menos 24 horas en staged rollout con monitorización constante antes de ir a full CONTINOUS DELIVERY Releasear es nuestro punto fuerte

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Heisenbug En argot de desarrolladores, un Heisenbug es un bug del software que desaparece o cambia su comportamiento cuando se intenta estudiarlo

Slide 11

Slide 11 text

Los informantes Mr. Fabric Mr. Gmail Ms. Panel

Slide 12

Slide 12 text

Place your screenshot here NETWORKING OkHttp + Retrofit USE CASES Covered by tests PRESENTATION Bus-backed UI ProgressSwitcher

Slide 13

Slide 13 text

Place your screenshot here PRESENTATION Bus-backed UI ProgressSwitcher

Slide 14

Slide 14 text

Principales zonas de afectación de Heisenbug BRASIL COLOMBIA MÉXICO ITALIA

Slide 15

Slide 15 text

“Porque la única manera de luchar contra un Heisenbug es estar allí cuando ataque”

Slide 16

Slide 16 text

Oct 12 08:21:15 android INFO MainActivity [Data successful] hello world!_ userId: sefford, installation:1234512345 Samsung Sm-j700f 6.0.1(api 23) build:110105_ date logtag comp. info user id installation id device info API level build nº

Slide 17

Slide 17 text

Jul 03 17:31:25 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 17:42:38 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 17:54:44 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 18:02:56 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 18:04:11 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 18:09:21 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 18:23:57 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 18:37:33 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 18:38:03 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 18:45:38 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Jul 03 18:54:49 android: ERROR MainActivity [ProgressSwitcher] feed arrived successfully with 0 elements Build:109402 Build:109402

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

REMOTE DEVICES PROXIES

Slide 21

Slide 21 text

--- a/app/src/main/java/com/chicisimo/common/injection/ApiModule.java +++ b/app/src/main/java/com/chicisimo/common/injection/ApiModule.java @@ -104,7 +104,7 @@ public class ApiModule { .addNetworkInterceptor(responseInterceptor) - .connectTimeout(60, TimeUnit.SECONDS) + .connectTimeout(00, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS); }

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

Mejorando la batería de tests ▣ Pasar de usar mocks a usar llamadas reales a la API con MockWebServer. ▣ Segmentar errores de conexión con timeouts, errores en los handshake de SSL, etc... ▣ Mejor comprensión de cómo se comporta la app en relación con la red.

Slide 24

Slide 24 text

Place your screenshot here BACKEND No error reported INFRASTRUCTURE Amazon WS NETWORKING OkHttp + Retrofit

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

VYSOR.IO “Ójala hubiera una manera de ir hasta Brasil, conectarme a sus teléfonos y debugarlos como dios manda”

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

ERR: connection from chicisimo.api failed:SocketTimeoutException: closed after 120000ms ERR: connection from chicisimo.api failed:SocketTimeoutException: closed after 120000ms ERR: connection from chicisimo.api failed:SocketTimeoutException: closed after 60000ms ERR: connection from chicisimo.api failed:SocketTimeoutException: closed after 60000ms ERR: connection from chicisimo.api failed:SocketTimeoutException: closed after 40000ms ERR: connection from chicisimo.api failed:SocketTimeoutException: closed after 40000ms ERR: connection from chicisimo.api failed:SocketTimeoutException: closed after 20000ms ERR: connection from chicisimo.api failed:SocketTimeoutException: closed after 20000ms

Slide 29

Slide 29 text

Mejorando la Infrastructura SAO PAULO OREGÓN IRLANDA

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

Especialistas Dr. Stetho Mr. Firebase Performance Mr. Papertrail

Slide 32

Slide 32 text

# NumSamples = 453938; Min = 0.00; Max = 97885.00 # Mean = 1642.091535; Variance = 18645635.742440; SD = 4318.059256; Median 765.000000 # each ∎ represents a count of 5360 0 - 2000 [402006]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎ (88.56%) 2000 - 3000 [ 21361]: ∎∎∎ (4.71%) 3000 - 4000 [ 5650]: ∎ (1.24%) 4000 - 5000 [ 2682]: (0.59%) 5000 - 6000 [ 1575]: (0.35%) 6000 - 7000 [ 1514]: (0.33%) 7000 - 8000 [ 931]: (0.21%) 8000 - 9000 [ 620]: (0.14%) 9000 - 10000 [ 356]: (0.08%) 10000 - 20000 [ 1678]: (0.37%) 20000 - 97885 [ 15565]: ∎∎ (3.43%) https://github.com/bitly/data_hacks

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

Preparando la trampa https://github.com/square/okhttp/issues/270 ▣ API oculta hasta OkHttp 3.8.0 ▣ En debate desde 2013 ▣ Disponible a partir de la 3.9.0

Slide 36

Slide 36 text

Jul 17 18:21:48 android chicisimo: INFO [Network] get '/albums/82603' server:10.0.0.255_ dns:253ms ssl:752ms connection:670ms installation:1234512345 user:sefford endpoint server DNS SSL connection

Slide 37

Slide 37 text

Una víctima inesperada “Esta aplicación va como la m****a tío, todo tarda en cargar un siglo” -J. Barroso, diseñador

Slide 38

Slide 38 text

WiFi 3G Josue’s Phone Emulators My phones Tethering

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

Server IPv4 First Server IPv6 First

Slide 41

Slide 41 text

public class IpV4PriorizerDns implements Dns { public static final Comparator INET_ADDRESS_COMPARATOR = new Comparator() { @Override public int compare(InetAddress left, InetAddress right) { if (left instanceof Inet4Address) { return -1; } else if (right instanceof Inet4Address) { return 1; } return 0; } }; @Override public List lookup(String hostname) throws UnknownHostException { if (hostname == null) { throw new UnknownHostException( "hostname == null"); } else { final List inetAddresses = new ArrayList<>( Arrays.asList(InetAddress.getAllByName(hostname))); Collections. sort(inetAddresses, INET_ADDRESS_COMPARATOR); return inetAddresses; } } } El fix de cliente

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

4 semanas de trabajo Eso es un montón de pasta... 0.03 de rating perdido Todavía nos quedan 0.009 por recuperar! 15.656 users menos … y un montón de usuarios

Slide 44

Slide 44 text

Mejoramos los test ¡Y nuestra UX! Aprendimos un h**vo Comprendemos mucho mejor esa parte y somos mas eficaces Muchas herramientas Incrementamos mucho las estrategias que podemos utilizar

Slide 45

Slide 45 text

Moraleja ▣ Los bugs son como escenas del crimen ▣ Resolver un bug es como una partida de ajedrez ▣ Mantén la calma y usa el método científico

Slide 46

Slide 46 text

The End?

Slide 47

Slide 47 text

¡gracias! ¿Alguna pregunta? @sefford [email protected] https://speakerdeck.com/sefford/breaking-bug-noir-edition

Slide 48

Slide 48 text

Credits Special thanks to all the people who made and released these awesome resources for free: ▣ Presentation template by SlidesCarnival ▣ http://y2u.be/bKJnbqYHMPs ▣ All the people from the community who helped over this endeavor