40
Cassio Greco Fundador da Conta Simples

Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Cassio GrecoFundador da Conta Simples

Page 2: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

em serviços financeirosPorquê usar Go

Page 3: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Agenda

1. Uma básica introdução sobre Go

2. Porquê e como usamos Go na Conta Simples

3. Resolvendo problemas complexos em Go

4. Conclusão

Page 4: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

O básico sobre Go

Page 5: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

● Procedural, assim como C

● Possui estruturas normalmente encontradas em OO, i.e. "polimorfismo" (interfaces)

● Possui ponteiros

● Fortemente e estaticamente tipado

● Utiliza garbage collection para livrar memória

● Compila diretamente em código de máquina compatível com vários SOs. Não precisa de VM

● Compilação muito rápida

● Criado para a nova web

● Opinionated, há uma única maneira de se fazer as coisas

● Não há exceptions. Erros são retornados pelas funções

O básico sobre Go

Page 6: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Porque e como usamos Go na Conta Simples

Page 7: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Motivação

● Estamos criando um banco do zero.

● Queremos criar um sistema que possa escalar daqui alguns anos

● Queremos uma linguagem que nasceu pra nova web e que possa se manter moderna nos próximos anos

● Queremos poder contratar desenvolvedores prontos para trabalharem ou que possam aprender e se adaptar rapidamente

● Queremos criar um sistema que seja performante

● Queremos escolher uma linguagem que nos permita ser produtivo

● Queremos uma linguagem que nos permita aproveitar as melhores tecnologias disponíveis hoje para facilitar a nossa vida

Page 8: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Motivação

Precisamos de uma linguagem que nos permite atender a todos os pontos mencionados

Java 8 vs Go

Page 9: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Porque escolhemos Go?

● Go é uma linguagem altamente opinionated. Mais fácil escrever código em Go

● Mais fácil trabalhar com concurrency em Go

● Go é mais rígido com tipos (valores nulos, ponteiros, referência, slices, etc.)

● Go é mais explícito, o que leva a menos bugs

● A compilação do código é muito rápida, especialmente comparada com Java

● Requer menos dependências para se criar um micro serviço e testá-lo

● Não precisa de uma máquina virtual, compila para quase código de máquina

● É muito fácil criar um micro serviço em Go. Ótimo para sistemas distribuídos

Page 10: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Criando um sistema distribuído em Go

Page 11: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

API Gateway

Microservice

gRPC gRPC

gRPC

gRPC

Client

Client

Client Microservice

.

.

.

REST

REST

REST

Page 12: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

● Criado para a nova web => facílimo a criação de servidores REST ou de RPC, precisando de poucas linhas e utilizando somente a standard library de Go

● Biblioteca de networking extensa dentro da biblioteca padrão de Go

● Criação de endpoints e chamadas de APIs não necessitam de bibliotecas de terceiros

Criando um sistema distribuído em Go

Page 13: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Sistemas distribuídos em Go

● Mas também há suporte para os mais diversos frameworks e bibliotecas para o desenvolvimento web em Go, como gRPC, Protocol Buffers, JWT, etc.

Page 14: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Sistemas distribuídos em Go

● Suporte para os mais diversos bancos de dados, queues, etc.○ Nos permite escolher a melhor ferramenta para a tarefa

Microservice

SQS

Microservice

Put Read

Page 15: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Sistemas distribuídos em Go

● O código é compilado para código de máquina compatível com os principais SOs: Linux, Windows e MacOS

○ Não precisa necessariamente de containers, apenas jogue o executável no servidor e rode

○ Não precisa de VM

Page 16: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Concorrência

Page 17: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Concorrência

● Altamente performante e concorrente

○ Compilado em código de máquina => nos permite economizar no número de servidores que usamos

○ Concorrência em Go é feita através de Goroutines○ Use a palavra chave go para executar código de maneira concorrente, e criar uma

nova goroutine

Page 18: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Concorrência● Comunicação entre goroutines através de channels

○ Permite compartilhar dados sem utilizar locks○ É blocking. A execução do programa irá esperar o envio de uma mensagem antes de

continuar

Page 19: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

● Altamente performante e concorrente

Microservice

Processar pagamento

Enviar notificação

Atualizar limite

Concorrência

. . .

Page 20: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

● Altamente performante e concorrente

Microservice

Batch

Gerar relatórios

Enviar relatórios

Concorrência

Page 21: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Produtividade em Go

Page 22: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Produtividade com Go

● Não precisa de um framework. Talvez alguma biblioteca de terceiro como gRPC ou Gorilla (para criação de endpoints). Mas são uma camada fina.

● Mensagens de erro são facilmente entendidas, apesar de não serem tão claras quanto em Elixir

● Go é altamente opinionated○ Há uma forma de se fazer as coisas. Um for loop, um if

● Testes são extremamente fáceis de escrever e rápidos de rodar

● Muito fácil de achar e instalar dependências: github.com/repositorio/biblioteca○ Inclusive dependências em repositórios privados

● Compilação do código muito rápida

Page 23: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

● Bugs são menos comuns e mais facilmente resolvidos

● Código altamente explícito○ Mais boilerplate, menos erros

Produtividade com Go

Page 24: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

● Go é extremamente produtivo

● Possível criar um micro serviço de geração de relatórios ou de notificações totalmente testado, com um único desenvolvedor, em 1 semana

● Extremamente fácil de aprender

● Comunidade enorme. Fácil de achar a resposta de suas dúvidas no StackOverflow ou em blogs

Produtividade com Go

Page 25: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

A comunidade e integrações com Go

● Go foi criado para a nova geração da web

● Possui suporte para os mais diversos frameworks e bibliotecas para o desenvolvimento web

○ i.e. gRPC, JWT, SDKs para o AWS e GCE, Drivers para todos os bancos de dados, etc.

● Comunidade gigante e ativa no nível mundial○ Ainda não muito grande no Brasil, mas crescente

● Algumas das principais ferramentas e banco de dados modernos são escritos em Go

Go Node Python Rust Laravel Ruby

Page 26: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

20172018

Page 27: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Alguns projetos em Go

Page 28: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Resolvendo problemas complexos em Go

Page 29: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Quando usar Go?Go é ideal para:

○ Sistemas web em geral

○ Sistemas distribuídos

○ Sistemas que requerem alta performance e/ou uso intenso de CPU

■ Há uma implementação do TensorFlow para Go■ O serviço com maior QPS, e de maior uso intensivo de CPU no Uber é escrito em

Go■ Background services

○ Sistemas que requerem alta escalabilidade

○ Sistemas financeiros

○ Sistemas que requerem alta concorrência

○ CLIs

Page 30: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Quando não usar Go?

● Protótipos e aplicações bootstrapped○ Go pode ser usado para micro serviços, mas é overkill para protótipos e scripts básicos

● Sistemas simples que não requerem muita performance ou garantias de tipos de dado

● Sistemas que requerem controle maior sobre a memória do sistema, como com Rust ou C

● Sistemas de telecomunicações. Use Erlang ou Elixir

● Se precisar de tipos genéricos

Page 31: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Quem está usando Go?

Page 32: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Go em Serviços Financeiros

Page 33: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Características de Serviços Financeiros

● Serviços financeiros hoje estão marcados por grandes bancos e instituições financeiras que usam tecnologias ultrapassadas

● Um setor que, até recentemente, não inovava há muito tempo

● Altamente regulamentado

● Sistemas que não deveriam cair nunca. É a sua conexão com o mundo

● Sistemas que atendem a milhões de pessoas e empresas

● Base de sustentação da economia

● Não pode falhar. Um zero a mais ou a menos pode causar muitos problemas

Page 34: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Go em Serviços Financeiros

Go nos permite desafiar o status quo, criando um sistema moderno, altamente performante, seguro e escalável e que ao mesmo tempo nos permite inovar de forma constante.

● Nos dá acesso às mais novas tecnologias

● Nos permite criar um sistema que possa ser usado por milhões de pessoas ao mesmo tempo

● Concorrência em Go é muito simples e segura

● Temos segurança aritmética e de tipos de dados (i.e. ints de 64 bits)

● Determinante. Compila para código de máquina e para vários SOs. Nos dá a segurança que o código que roda em nossas máquinas, rodará igual no servidor

● Nos permite testar nosso código de forma constante e de maneira muito rápida

● Nos permite ser altamente produtivos, conseguindo trazer a inovação de forma mais rápida para nossos clientes

Page 35: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Fintechs

Page 36: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Conclusão

Page 37: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Conclusão

Use Go

Page 38: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Conclusão

● Go é uma ótima linguagem para criar serviços web modernos, seguros e performantes

● Go permite a utilização do seu sistema com as mais diversas ferramentas

● Go foi criada para a nova web e é ideal para sistemas distribuídos

● Go também é uma ótima escolha para serviços financeiros pela segurança de tipos de dados, aritmética, velocidade e determinismo

● Go é uma linguagem muito produtiva de se trabalhar e fácil de aprender

● Consegue-se trabalhar com concorrência de uma maneira extremamente fácil com Go: use apenas a palavra-chave go e channels

● A comunidade e a adoção de Go por parte das empresas já está muito alta, incluindo Fintechs

● Go não é a linguagem ideal para algumas circunstâncias, como para a criação de protótipos

Page 39: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Obrigado

Page 40: Cassio Greco - QConSP...Go Node Python Rust Laravel Ruby. 2018 2017. Alguns projetos em Go. Resolvendo problemas complexos em Go. Quando usar Go? Go é ideal para: Sistemas web em

Cassio Grecohttps://contasimples.com

@cassiodgreco

[email protected]