2. Platéia - Vamos participar?
Alguém aqui…
- Acha que o app Android “builda" rápido?
- Acha que dá pra rodar os testes de UI na própria máquina?
- Já passou alguns dias gastando mais tempo debugando
gradle/test flaky/tentando fazer CI passar…
- Nunca teve que dar “./gradlew clean” pra consertar um
problema de build?
3. Nosso app cresceu…
+/- 1k de UI
Milhares de testes unitários
+/- 10 devs de cada plataform
+/- 20 devs de RN
4. App no início de 2017
- 40~50 min clean build no CI
- ~1h UI tests
- 5~6 min de unit + (rebuild) ~15min (único flavor)
- +- 2h cada run do CI
- Um único projeto
6. Divisão por lógica de negócios
• Cada squad é empoderado a ter sua
própria parte do app
• Priorização decentralizada
• Código desacoplado
• Spikes de novas tecnologias
• Sem dor de projeto grande
16. Schemata
Managers
CoreAnalyticsblocks ui
http
Common Libraries
Nubank Android Core
Help BonafontNuConta Feed
. . .. . .
O que ganhamos?
• Build rápidos - Ao separar cada um em seu
repositório
• Test suits menores
• Felicidade 😁
• Documentação e arquitetura concisa
dentro de um projeto
19. Common Libraries
Nubank Android Core
Schemata
Managers
CoreAnalyticsblocks ui
http
Help BonafontNuConta Feed
. . .. . .
android-app
Downsides
• Mudanças em diversos projetos virou doloroso
• Comunicação cross-squad sobre as mudanças
• Nem todo mundo trabalhando em projeto
novo (build do antigo lento)
20. Common Libraries
Nubank Android Core
Schemata
Managers
CoreAnalyticsblocks ui
http
Help BonafontNuConta Feed
. . .. . .
android-app
foundation
26. Mas e o tempo de build, teste e tudo mais????
Monorepo
27. Nós vivemos no futuro
- Múltiplos Cores
- SSDs
- Muito muito RAM
- Storage é barato
- Trafego da dados é rapido
- Distributed Version Controls Systems
28. Mas nossas ferramentas vivem no passado!
- Baseado em “Tasks"
- Muito mágico
- Difícil de paralelizar
29. O que seria o ideal?
- Conseguir buildar partes pequenas do projeto separadamente
- Grafo de dependencias explicito -> Paralelização
- Rebuildar somente o necessário
30. Arquivo de configuração por package/diretório
- Fácil de compartilhar, buscar e reutilizar código
- Menos boilerplate
31. Build Rules
- Módulo tem conhecimento do que e como buildar
- Dependencias declaradas explicitamente
37. Buck - Alguns aprendizados
Vale a pena para apps modulares
Kotlin (e Swift) não é ABI estable =|
Builds mais reproduzíveis (e menos mágicos)
Kotlin support ainda é bebe
Você vai querer usar o okBuck
38. Dados Buck
Build Dep3
clean build sample staging
gradle -> `BUILD SUCCESSFUL in 3m 13s`
buck -> `Building: finished in 01:55.7 min`
Mudanças em Dep3
gradle `BUILD SUCCESSFUL in 22s`
buck -> `Building: finished in 16.4 sec`
Mudanças em Dep2
gradle -> `BUILD SUCCESSFUL in 30s`
buck -> `Building: finished in 16.3 sec`
(it only needed to recompile dep2 itself and the
sample dexing and packaging stuff)
Mudanças em Dep1
gradle -> `BUILD SUCCESSFUL in 45s`
buck -> `Building: finished in 15.2 sec` (it only
needed to recompile dep1 itself and the sample
dexing and packaging stuff)
Dep1
Dep2
Dep3
42. Problemas a resolver
Pipelines longas, flakness é um problema
Mais caro rodar nossos testes
É necessário um momento de transição
Buck nem tinha suporte a Kotlin
50. Difícil de mudar o processo atual
PRs em dois repositórios
Processo não pode ser gradual
Tabela da verdade está no gradle
Meta git é meio chato de usar
Topics:
2015:
Nubank without squads - prioritization within mobile team -> one PM
More people to attend more demand (from 1 to 3 developers)
Nothing shined on project structure / architecture
Android annotation - Cut
Dagger
Rx
Three flavors -> stag, beta, prod
2016:
Company divided into squads (few at the beginning) - Prioritization within each squad
More two developers in the start of the year
Mobile team splitted - Didn't work out
Code started to smell (needed a convention / architecture)
Kotlin
Study on MVP / MVVM
Came Lego and Managers
Better coding style / project started to feel the same and was easy to maintain
CI took too long, all runs (unit, 19, 22, 25) on the same pipeline
Refactor on CI / split pipelines (explain Gocd)
Build not consistent -> apk that was under test was not the same to go to store - unexpected crashes -> build everything before tests (all three flavors)
More 2 developers
Giant project, slow build time, hard to be incredibly productive
Created more flavors minAPI16, minAPI21 (explain beneficts of minAPI21 at development time)
CI also slower (6 builds, each taking +- 4/5 minutes + test apk)
2017:Microservices for frontend -> Project split - Attend other squad demands - improve build time for new features - More decoupled code - Create low hanging fruits for open source -
Squads could have everything need for their features -> new technologies (RN) -> Another try on mobile split up
In house mini device farm -> STF
A lot of libs (schemata, core, lego, managers, analytics, ui, etc…)
RN libs, integrations -> common bridge -> react-native-central
Bump hell -> version management -> need know how to bump
Foundation
Autobump
TestLab
So why not split the app into those business logic, as well as the company?
So why not split the app into those business logic, as well as the company?
Next: Acquisition
Ganhos:Build de começo de projeto
Desenvolvimento rapido
Boa documentação - Fácil de saber onde procurar coisas
Primeiro erro: Cores dependiam uma das outras
Esperar pelo CI
Possíveis testes falhando
Wait time (integration feedback muito demorado)
Atualizar em todas as outras
Nem todo mundo estaria mexendo com as novas libs
Desenvolvimento no app ficou difícil de ter integration-feedback
Nem todo mundo estaria mexendo com as novas libs
Desenvolvimento no app ficou difícil de ter integration-feedback
Nem todo mundo estaria mexendo com as novas libs
Desenvolvimento no app ficou difícil de ter integration-feedback
NuConta é em ReactNative
Next: Acquisition
Da pra paralelizar tudo
SSD -> Acesso randômico mto mais eficiente do que spinning
RAM -> Carregar bastante coisa de uma vez (arquivo) e uso rápido dele
Storage e networking para persistir os dados
Task Based
- Precisa perguntar pra todas as tasks se tem algo que precisa fazer
- Precisa montar cada task toda vez
Paralelizar
- Mais complicado com make e ant, gradle tem ficado cada vez melhor
M time
- VCS pode complicar bem sua vida (git pull e o build com o timestamp mais novo vai falar que não precisa rebuildar)
E se você conseguisse configurar como bulidar apenas um pedaço do código, sem necessariamente ter que ter `src/main/java`, `src/main/test`, bla bla bla
E se você conseguisse configurar como bulidar apenas um pedaço do código, sem necessariamente ter que ter `src/main/java`, `src/main/test`, bla bla bla
Seu build sabe o que ta buildando, build rules, expressar dependence entre elas
O que nos resulta num DAG
E se você conseguisse configurar como bulidar apenas um pedaço do código, sem necessariamente ter que ter `src/main/java`, `src/main/test`, bla bla bla
Seu build sabe o que ta buildando, build rules, expressar dependence entre elas
O que nos resulta num DAG
Cache local e distribuido super facil
(3%) -> Estudo realizado no facebook
Cache local e distribuido super facil
(3%) -> Estudo realizado no facebook
Cache local e distribuido super facil
(3%) -> Estudo realizado no facebook
Cache local e distribuido super facil
(3%) -> Estudo realizado no facebook
Cache local e distribuido super facil
(3%) -> Estudo realizado no facebook