Pular para o conteúdo
Todos os case studies

Case study · Fintech

Pagamentos Pix na escala de um superapp

Construção e evolução dos módulos de pagamento Pix de um superapp de alto tráfego usado por milhões de pessoas, com Coroutines, Flow e Clean Architecture.

Cargo
Engenheiro Android III → Engenheiro Android Sênior
Empresa
Zup Innovation
Período
set 2023 – Atual

Contexto

A Zup Innovation é uma empresa brasileira de tecnologia que constrói produtos digitais para grandes clientes. Eu trabalho no app Android nativo de um superapp de alto tráfego do setor financeiro, em que o Pix é uma das funcionalidades mais usadas. Milhões de usuários ativos dependem dele para movimentar dinheiro todos os dias.

Entrei em setembro de 2023 como Engenheiro Android III e fui promovido a Engenheiro Android Sênior em dezembro de 2024.

Desafio

Pagamento deixa pouca margem para erro. Cada mudança precisa se sustentar em quatro frentes ao mesmo tempo:

  • Segurança e corretude. Cada fluxo conversa com APIs REST de alta segurança e precisa lidar com timeouts e falhas sem deixar o usuário em dúvida se o dinheiro saiu ou não.
  • Performance em escala. Com milhões de usuários em todo tipo de aparelho, pequenas regressões de renderização ou de threading viram chamados de suporte rapidamente.
  • Vários squads, um app. As features precisam de fronteiras claras para que vários times entreguem em paralelo sem atrapalhar uns aos outros.
  • Ritmo de release. Um superapp publica versões com frequência, então o pipeline precisa ser rápido e confiável.

Abordagem

Features de pagamento modulares. Liderei o desenvolvimento de features nativas centrais como módulos independentes, com dependências explícitas, o que melhorou a modularidade e o reuso de código entre os fluxos.

Clean Architecture com MVVM. A UI é feita em Jetpack Compose e só renderiza estado. Os ViewModels transformam as intenções do usuário nesse estado, os use cases concentram as regras de negócio e os repositórios escondem de onde os dados vêm. Cada camada pode ser testada isoladamente.

Coroutines e Flow de ponta a ponta. A concorrência estruturada mantém o trabalho de rede e de disco fora da main thread e o cancela quando o usuário sai da tela. O estado da tela é um único StateFlow, então a UI não fica dessincronizada do que o app sabe.

PixViewModel.kt
@HiltViewModel
class PixViewModel @Inject constructor(
    private val sendPix: SendPixUseCase,
) : ViewModel() {

    private val _uiState = MutableStateFlow<PixUiState>(PixUiState.Editing())
    val uiState: StateFlow<PixUiState> = _uiState.asStateFlow()

    fun authorize(request: PixRequest) {
        // A payment must never be submitted twice.
        if (_uiState.value is PixUiState.Processing) return
        _uiState.value = PixUiState.Processing

        viewModelScope.launch {
            _uiState.value = sendPix(request).fold(
                onSuccess = { receipt -> PixUiState.Success(receipt) },
                onFailure = { error -> PixUiState.Failure(error.toPixError()) },
            )
        }
    }
}

Integração segura com APIs. Trabalho junto com os times de produto e backend na integração de APIs REST de alta segurança para fluxos financeiros digitais.

CI/CD no Jenkins. Ajudo a manter os pipelines que fazem o build, os testes e a publicação do app. Automação confiável é o que torna seguros os releases frequentes.

Mentoria. Também sou mentor de devs juniores em boas práticas de Kotlin, arquitetura MVVM e testes unitários.

Arquitetura

grafo de módulos:appHilt · navigation:feature:pixpagamentos:feature:…outros squads:core:networkRetrofit · TLS:core:uiCompose:feature:pix · Clean ArchitectureUI · Jetpack ComposePixTransferScreenViewModelStateFlow<PixUiState>Use casesSendPixUseCase · suspendRepositoryCoroutines · Flow · RoomHTTPSAPIs de pagamento PixREST · alta segurançaJenkins CI/CDbuild · testes unitários · release
Simplificado e ilustrativo. Os nomes reais de módulos e APIs estão sob NDA.

Nesta visão simplificada, os módulos de feature dependem dos módulos core, mas não uns dos outros, e o módulo do app conecta tudo com o Hilt. Dentro de uma feature, as dependências apontam para dentro: a UI conhece o ViewModel, o ViewModel conhece os use cases, e só a camada de dados conhece o Retrofit e o Room.

Resultados

  • Módulos de pagamento escaláveis atendendo um superapp usado por milhões de usuários ativos.
  • Mais performance e estabilidade, com Coroutines, Flow e padrões de Clean Architecture.
  • Ciclos de release mais rápidos, sustentados por pipelines de CI/CD robustos no Jenkins.
  • Promoção de Engenheiro Android III para Engenheiro Android Sênior em dezembro de 2024.

Stack

As ferramentas por trás desse trabalho, todas usadas em produção:

  • Kotlin
  • Jetpack Compose
  • Coroutines
  • Flow
  • Hilt
  • Retrofit
  • Jenkins

Os detalhes foram simplificados e os nomes de clientes omitidos para respeitar a confidencialidade.