Esta é uma entrevista com Anton Batiaev do Deutsche Bank Technology Center. Falaremos sobre o que os matemáticos financeiros fazem, de onde vêm os dados dos bancos, como são processados e otimizados. Sobre a complexidade de entrar no setor financeiro, negociar na bolsa e a necessidade geral de bancos.

O que e como eles contam no banco?
- Apresente-se, por favor: diga-me quem você é, o que faz.
Mudei para o Deutsche Bank TechCenter no início de janeiro deste ano e agora estou desenvolvendo o servidor em um projeto que considera vários tipos de riscos de instrumentos financeiros para muitos traders diferentes ao redor do mundo e outras equipes que precisam desses dados.
O projeto construiu uma infraestrutura bastante extensa que usa muitas estruturas padrão populares, bancos de dados não relacionais, trabalha com big data no Kafka. Também trabalhamos com uma grade para dezenas de milhares de CPUs, usamos vários projetos personalizados, otimizamos o trabalho com o protobuf, implementamos cálculos em matemática financeira,
Como parte da infraestrutura, há várias otimizações e chips adicionais. Talvez isso seja óbvio, mas é extremamente difícil contar de forma consistente e lógica o que está acontecendo no banco. Dois por cento investiram e obtiveram recursos financeiros - isso é matemática complicada, algoritmos e grandes infraestruturas, tarefas técnicas e de otimização.
- Venha em ordem. Você disse que no TechCenter você está fazendo cálculos para a plataforma bancária global. E o que pode ser considerado no banco?
Com base na minha experiência, no âmbito das atividades de investimento, são considerados os preços e vários outros indicadores de vários instrumentos. Se falamos de ações, tudo fica claro: uma cotação é o seu preço. Para títulos, será uma porcentagem do valor nominal.
Se falamos de derivativos (instrumentos financeiros derivativos), aí o preço é o tamanho do prêmio que deve ser pago por esse instrumento. É calculado por muitas fórmulas diferentes. Existe uma fórmula de Black-Scholes que estima o valor das opções - essa é uma função que depende da função da cotação atual, do ativo subjacente, da volatilidade, do tempo de vencimento e de muitos outros fatores.
Existem modelos que permitem calcular o valor do portfólio do trader. Um departamento ou empresa possui um conjunto de transações, instrumentos financeiros derivativos em um portfólio e você precisa calcular quanto custam atualmente. Separadamente, pode haver um preço, mas agregado - eles podem, de alguma forma, se correlacionar, dar descontos e assim por diante. Por exemplo, posições sintéticas: como criar uma opção equivalente a futuros a partir de opções. Isso é adequado, por exemplo, para ativos não lineares, como opções, mas não necessariamente verdadeiro para todos os tipos de derivativos. A avaliação é baseada na cotação do ativo subjacente no qual o derivado é construído. Por exemplo, a cotação de um ou mais pares de moedas. Os derivativos podem ser construídos sobre diferentes ativos subjacentes: para moeda, os ativos subjacentes serão euro, dólar e assim por diante; para derivados de commodities - petróleo, ouro, trigo; para spot - várias ações e títulos.
Além de avaliar os derivativos, os riscos também são considerados - o que acontecerá se os preços no mercado sofrerem uma tempestade mais forte (a volatilidade muda). Ou o que acontecerá se o dólar não valer 60, mas 100 rublos em relação a uma ou a todas as outras moedas. O que acontecerá com um instrumento específico, portfólio.
Você precisa calcular isso em tempo real e também aproximar o estado atual do portfólio a vários resultados adversos dos movimentos de preços para cada uma das moedas, mudanças na volatilidade do mercado. Para isso, estamos construindo uma matriz de todas as mudanças possíveis, que mostram o que é agora, o que acontecerá amanhã e o que acontecerá se ocorrer uma crise de mercado.
Isso é necessário para avaliar o que comprar e vender no momento atual e quais são os riscos. E, inclusive, avalie o que acontecerá no futuro, avalie estratégias de negociação e responda com mais precisão às mudanças do mercado. Por exemplo, um dos quanta criou um novo algoritmo para calcular riscos - você precisa verificar dados históricos, dirigir, por exemplo, todas as informações de troca por décadas e ver o que acontece.
Para essas necessidades, há infraestrutura conectada a várias plataformas de câmbio que nos transmitem dados de mercado. Como nossa empresa possui muitos dados em todo o mundo, precisamos armazenar e criar pré-agregados de alguma forma para processá-los rapidamente.
- Antes de passarmos para a parte de infraestrutura, gostaria de perguntar sobre o que você já disse. Você falou sobre vários tipos de algoritmos de análise, de onde eles vêm? Isso é algum tipo de conhecimento de livro ou suas melhores práticas?
Existem alguns pontos. Primeiramente, são adotadas fórmulas conhecidas, algoritmos inventados por matemáticos. Por exemplo, o modelo de precificação de opção geralmente aceito é a fórmula de Black-Scholes. Mas, além disso, há melhorias internas: em particular, usamos outras leis de distribuição de preços, distorcemos os coeficientes nessas fórmulas. A fórmula para a curva de distribuição de preços, negócios e outros indicadores pode ser muito diferente.
Se falamos de otimização, essas já são melhorias internas. Por exemplo, os desenvolvedores podem, em vez de calcular indicadores em cada ponto, calcular valores-chave e fazer aproximações, o que custará 20 vezes menos tempo no computador, mas, ao mesmo tempo, fornecer uma precisão aceitável e suficiente.
Todos os dados estão mudando constantemente, e isso é importante para nós, não apenas para relatórios, mas também para fornecer aos traders uma imagem atualizada do estado do mercado.
- Essa é uma informação bastante complicada e provavelmente é muito difícil transferir de pessoa para pessoa. Qual é o tamanho da sua equipe e como você transfere conhecimento entre vocês?
Nosso projeto em Moscou emprega 35 pessoas. Existem várias equipes que lidam com certas partes da funcionalidade: interface do usuário, back-end, infraestrutura, matemática financeira. Cada uma dessas equipes possui profunda experiência na funcionalidade de um módulo específico. Mas além dessas pessoas, há tantas pessoas envolvidas em sistemas relacionados ao nosso projeto.
Todas as informações sobre o nosso projeto são descritas por analistas da Confluence e também estão contidas nas descrições de tarefas no JIRA, onde há links para mecanismos padrão e fórmulas públicas. Exemplos de uso da funcionalidade podem ser encontrados em testes. Bem, a comunicação humana não foi cancelada.
- Matemáticos financeiros: quantos existem e quem são eles? Algum cientista importante?
Sim, são principalmente especialistas (quanta) que trabalham em Londres e constroem modelos financeiros de como o mercado funciona. Na maioria das vezes, eles têm doutorado em finanças ou matemática. Eles sabem como o mercado funciona, o que os comerciantes precisam e podem criar algum tipo de modelo matemático que descreva o estado do mercado, algoritmos de cálculo de risco e avaliação correta de derivativos.
Por exemplo, meu colega Alexander escreveu um artigo sobre Habré , onde ele já mencionou a experiência com quantum.
- Os desenvolvedores comuns podem se comunicar com eles? Como está indo essa comunicação? De fato, a matemática e o desenvolvimento convencional têm mundos completamente diferentes.
Eles podem se comunicar e se comunicar: é claro que algumas tarefas e conceitos de negócios de nível superior são discutidos com os líderes, mas, no âmbito de cálculos de riscos específicos ou outros indicadores, o desenvolvedor se comunica diretamente com o comerciante ou quantum que construiu esse modelo.
Mas, na realidade, esse é um processo mútuo de interação, pois o algoritmo teórico nem sempre é implementado na prática. Portanto, os desenvolvedores podem propor alterações no modelo para que ele repouse na arquitetura atual do aplicativo.
Há muitas maneiras de interagir - o mesmo Skype, telefone, todas as ferramentas de comunicação padrão.
- O software que sai como resultado é automático? Existem robôs ou existe algo para os traders envolvidos em análises técnicas - gráficos ou algo mais?
Existem várias opções para o uso de software: o primeiro é automático, ou seja, robôs de negociação, o segundo é um assistente do comerciante, que mostra o estado atual do portfólio, detalhando os riscos em vários indicadores, as opções de negociação que ele pode fazer agora, bem como o estado futuro do portfólio e os riscos com base nos resultados dessas operações. Também existem indicadores para traders, cálculo de risco e dados sobre o status das carteiras.
- Outra métrica é a frequência da análise dos dados, com que frequência você faz isso? Por um lado, como eu o entendo, alguns microssegundos e, por outro, a análise de big data que pode levar semanas.
Dependendo da complexidade e importância dos indicadores, esses podem ser indicadores ativos, que são recalculados para cada marca e, em seguida, o cálculo é em milissegundos. E se calcularmos o custo dos portfólios, as atualizações ocorrerão uma vez por segundo, para que o olho humano tenha tempo para percebê-lo.
Se você descrever cálculos longos (por exemplo, alguns riscos complexos), os dados necessários durante o dia, as tarefas serão enviadas para a grade, o cenário de alteração das cotações da moeda será considerado. O mecanismo geral é o seguinte: você considera todas as novas transações dentro de um determinado ciclo e executa uma tarefa difícil na grade para recalcular os indicadores para todo o conjunto de transações no estado atual do mercado.
Essas tarefas podem ser atualizadas uma vez por hora. Se você precisar afastar as estratégias de negociação - essa é uma tarefa longa, elas são descartadas e, por várias horas, são consideradas, dependendo da complexidade e da quantidade de dados. As tarefas na grade podem ser muito pequenas, por exemplo, calcular uma fórmula e fornecer um resultado, ou grandes, por exemplo, para tabelas nas quais é necessário calcular as correlações de todos os cenários de risco possíveis e fornecer o resultado combinado.
Aqui aparece a tarefa de otimizar a carga da grade e prever o tempo de cálculo da tarefa, dependendo do tipo de ferramenta, da quantidade de dados e de outros indicadores para carregá-la ao máximo. Porque, se você executar uma grande tarefa, todo mundo espera na fila, embora durante esse tempo você possa contar outra coisa.
Em geral, a tarefa de uma mochila e outras otimizações. Quando o ping na grade for maior que o tempo de cálculo, faremos isso no back-end, onde um mini cluster já foi implantado para tarefas tão pequenas.
- Posso de alguma forma colocá-lo em algum tipo de estrutura? Tanto quanto eu entendo, diferentes métodos de otimização são aplicados, dependendo do volume de tarefas. Em tarefas pequenas, faz sentido otimizar o compilador JIT e em tarefas grandes, algo mais. Diga-me quais são as áreas do problema e quais métodos são usados para acelerar e otimizar.
Um exemplo de uma grande tarefa é calcular todos os instrumentos e riscos financeiros ao alterar as cotações de cada moeda em 1-2-3-10%. Nesse caso, a otimização consistirá no agrupamento de transações em pacotes configuráveis, para que, dentro de um pacote, existam transações para um tipo de portfólio ou uma moeda.
Para que não haja muitos cálculos de risco para cada transação, apresentamos-os como uma transação para um grande volume e depois dividimos os resultados proporcionalmente. Assim, reduzimos o número de cálculos necessários.
Outro exemplo de otimização é desta vez com pares de moedas. Digamos que existem dois pares de "rublo-dólar" e "rublo-euro". No primeiro par, você pode imaginar que o rublo está caindo, mas é possível que o dólar esteja crescendo. De fato, este é o mesmo. O mesmo vale para o par rublo-euro. Dessa forma, podemos considerar pares que são diferentes à primeira vista em um pacote, com base no fato de o rublo mudar nos dois casos.
O número de cálculos é reduzido e o resultado é acelerado. Parece ter mudado uma moeda (no nosso exemplo, o rublo), mas, na verdade, calculamos os riscos de ativos heterogêneos.
- E você pode resolver o problema de frente e transformá-lo em um cluster enorme e enorme?
Existe um cluster desse tipo, mas ele já está carregado com muitos cálculos. O cluster não é de borracha, apesar das dezenas de milhares de CPUs atualmente existentes.
- E do ponto de vista do software, DataGrid na memória ou Hadoop?
Sim, existe o Hadoop e o Kafka para processar tudo isso e o banco de dados ClickHouse para otimizar o trabalho com big data. Em termos de empilhamento de dados, é claro que dirigir JSONs é, para dizer o mínimo, ineficiente. Nesse sentido, há momentos de otimização com o Protobuf. É importante para nós não apenas colocar dados binários, mas ao mesmo tempo fazê-lo da maneira mais rigorosa possível, usando dicionários.
Neles, armazenaremos, por exemplo, especificações de contrato do mesmo tipo para todas as transações. Devido a essa otimização com dicionários, um colega economizou 30% da memória ocupada.
- Esses dicionários estão em nós específicos e estão duplicados ou localizados em uma base central?
De diferentes maneiras. Principalmente em uma base central. E existem dicionários que você transfere para a grade com vários cálculos. Ela quer ser o mais compacta possível para não arrastar muitos dados, pois os canais da Internet não são de borracha.
Como isso funciona? Você envia a tarefa de cálculo para a grade com todas as informações necessárias, que são agrupadas em dicionários para evitar duplicatas. Por dentro, já haverá todo o conteúdo e você não precisa ir para repositórios adicionais. Isso economiza o tráfego da rede e reduz a latência nos cálculos.
- Até onde eu sei, os bancos têm uma análise de dados históricos, que é um enorme pacote de dados por gigabyte-terabytes. E a abordagem com um único banco de dados não funciona? Você pode colocar 2 TB na chave, mas não é bom.
Sim, esses momentos são decididos por porções. Você terá caches locais por país, espalhados por informações de troca, porque o envio de informações sobre todas as transações de Nova York a Cingapura consome muitos recursos. É claro que aqui a divisão por país é lógica: por exemplo, as transações nos Estados Unidos serão colocadas em data centers americanos. Uma situação semelhante com aspas - você precisa criar um roteamento e determinar que tipo de transação é, em que região pertence, para entender onde estão os caches, enviá-lo para os armazenamentos e bancos de dados necessários e não para perseguir os dados novamente.
- E acontece que você precisa juntar dados de diferentes regiões?
Sim, é verdade, e é uma tarefa difícil. É claro que não extrairemos terabytes de dados de todas as regiões para obter resultados agregados. Provavelmente, em cada região, você calculará o agregado local dessa região e coletará todos esses resultados para obter dados resumidos.
- Provavelmente, existem dados externos, por exemplo, histórico de trocas. E como lidar com eles? Você se espelha por dentro ou há maneiras de processá-los?
Existem protocolos e conexões com provedores de dados padrão: Reuters, Bloomberg, que fornecem informações de troca. Armazenamos os dados necessários em armazenamentos internos, mas algumas coisas podem ser solicitadas novamente ao provedor de dados. Novamente, por região, para não direcionar tráfego.
É claro que eles também implantaram servidores em todo o mundo para garantir velocidade e desempenho.
- E os dados para leitura ou leitura / escrita? Se o registro não for assustador para rolar esses volumes?
Basicamente, para a leitura, a escrita segue o registro de informações sobre transações e outras informações exigidas pelos reguladores. Basicamente, cálculos para necessidades domésticas: riscos, valor das carteiras e assim por diante. Esta é uma cozinha interna, você entrega os dados de alguma região ou data center, sem enviá-los para fora.
- Se uma peça rompe a lua e voa para um data center, o que acontecerá? Está tudo acabado?
Os dados nos datacenters são espelhados. É claro que, na região, os dados não estão em um disco rígido em um data center. Caso contrário, como nessa bicicleta, qualquer faxineira poderia acidentalmente cortar o servidor. Tudo é copiado on-line: há um fluxo de dados nas duas direções, você lê no espelho mais próximo e sincroniza com a gravação para garantir consistência.
Mas, como regra, muito menos informações estão disponíveis para gravação, porque precisam ser exibidas ao usuário. Se ele vê a recontagem não agora, mas 2 segundos depois de outra fonte, é triste, mas você pode viver. É claro que os dados necessários para reguladores, profissionais de marketing externos e participantes do mercado são duplicados e sincronizados em várias fontes, para não perder nada.
Como o Tech Center Deutsche Bank prepara dados e coleta lixo

- Pergunta sobre preparação de dados. Tanto quanto eu entendo, cada fonte tem seu próprio formato, e convertê-las instantaneamente não é uma boa ideia. De alguma forma, você os prepara previamente para os cálculos?
Existe um formato único interno. É claro que é mais conveniente trabalhar com os mesmos dados, mas isso se traduz na necessidade de convertê-los. Existem fluxos de dados e equipes responsáveis pela troca de informações, conectando-se aos fornecedores. Eles formam e enriquecem dados em nosso único formato. Para resolver problemas de desempenho, haverá dois fluxos de dados, um deles é um ciclo rápido que fornecerá informações provenientes do fluxo de dados do Exchange. Devido a isso, é menos necessário acessar vários armazenamentos e formar uma estrutura padrão. Nele você pode calcular os indicadores necessários em tempo real.
E há um ciclo mais lento que processa o mesmo fluxo, mas com todo o conjunto de campos necessário, em nosso formato. Ele executa cálculos cada vez mais lentos, que exigem um monte de informações adicionais, campos e tudo mais.
- Como é o ponto de vista do desenvolvedor? Você sempre sabe qual área do banco de dados é afetada por cálculos pesados?
Um evento chega até você, os campos nos quais podem ser preenchidos 100% e apenas parcialmente. Em eventos rápidos, você conta indicadores que são recontados on-line rapidamente. Em um ciclo longo e mais lento com um conjunto completo de dados, você reconta tarefas que exigem todos os indicadores. Isso é se você não for fundo, pois tudo depende das especificidades das tarefas.
- E os dados são armazenados em quê? HDD, SSD, RAM, inteiramente na RAM?
Principalmente na memória. Trabalhamos com grandes volumes de dados em back-end que consomem e armazenam dados em estruturas padrão em Java ou em alguma grade de dados na memória, dependendo da rapidez e da proximidade dos dados necessários. É claro que os dados históricos dos últimos dias serão armazenados em SSDs e discos. Mas o que é necessário ou pode ser necessário para os cálculos será carregado no cache, na memória.
- É possível fazer algo sem armazenar em cache, mas com a perda de informações, usando cálculos imprecisos?
Sim Mencionei um pouco que, às vezes, é necessário calcular o risco na cadeia de alterações de um ativo de 0 a 100%, conforme os indicadores foram alterados. O gráfico de distribuição é construído como uma porcentagem, de acordo com uma fórmula ou um relacionamento linear. Você constrói pontos-chave e faz aproximações. Os resultados aproximados são obtidos, que não coincidirão com o valor real em 100% se contamos em cada ponto específico do gráfico, mas seriam suficientes para trabalhar com esses dados.
Essa abordagem é frequentemente usada porque permite, por exemplo, não fazer todos os cálculos ao alterar o valor de cada moeda em relação a todas as outras moedas, em incrementos de um centavo. Você calcula o movimento com uma etapa rara ou a seleção de alguns pontos específicos e interpola o restante. Valores de precisão serão suficientes.
- É sempre um grande aquecimento em Java ou está tudo fora do quadril?
Principalmente encontra-se no quadril.
- Como você luta com a coleta de lixo?
Além do monitoramento padrão de alocações e da frequência do coletor de lixo, você começa a ajustar algumas coisas, como páginas enormes, fazendo várias coisas, como escolher o coletor de lixo certo e assim por diante. Por exemplo, você pode tentar usar Shenandoah. Alguns componentes são criados e ajustados com base na falta de um GC completo como um fenômeno.
Este é um processo iterativo: todos os dias você coleta um gráfico de chama ao vivo, observa quem usa os recursos e onde, observa a frequência das alocações e o que eles eliminam e começa a reescrever algoritmos quentes no código para os mais ideais ou otimizar o cálculo como um todo.
- E como você coleta métricas, como constrói um gráfico de chama?
, - Java-, , . ELK-, GC- , , . 150 — , . , 150 . , .
— Java GC ?
Java 8, 11- . . , , G1.
— ?
, . JVM.
— , , . - , ?
, . , . . ( UAT — user acceptance testing ) — , . , , . 2 , — 3 , , .
. , , , . , .
— , - , , ? ?
. : , GC, live set . - . — . , . , .
-, - . , . , JSON diff. JSON .
, . , , . .
— , , ?
, , . 100 «», . , . .
master, , , . , , , , . .
, , , , . , , . CI, .
— ?
. — , , . , , , , . - , .
— , .
— , , . , , , , - .
, - , — - , UI, . , , , , UI.
— ? «» Spring?
Spring, Java, MongoDB Protobuf, dependency injection. UI React, gRPC , .
— Mongo, Oracle. - ?
, , . . - , JDBC . - SpringData , JDBC. , , , .
— - CQRS?
, , .
— ? , …
.
— ? , .
, . , , ++ . GNU/Linux, Java. -, . , . , , , . .
, .
— ?
, «» . , , - , - . , , - «» . , , , , , .
— ?
-, , .
: , , . . , , , . , .
, 150 , . - . , .
, , , . , , , — . , , .
-

— - , , , ?
, — . , - , - . , . , 4, .
, - . — . , .
, , . , .
— - - , ?
« ». — , — , .
- - , , - . , , .
, . , , . — . - , . , -.
, , . , , - ( -, - ).
— ?
. , . , , .
— , , , - . , — , .
. , : , - , .
, , - , , . , , , , — . , , , .
( , )
— , ? ?
, , Java. dependency injection, , , — , . , . . : , - .
, . , , , , happens-before. , , .
Como você sabe, coisas como IntStream#distinct
envolvem IntStream#distinct
primitivas em tipos Java e, posteriormente, a operação reversa. Parece não muito assustador, mas em grandes quantidades de dados será notável o boxe em massa e o anboxing, a memória será usada em vão. Você precisa entender as entranhas do próprio Java, porque em pequenas coisas como o boxe, você pode gerar um monte de alocações adicionais que não são necessárias. E para perceber isso a tempo, você precisa usar ferramentas para avaliar o desempenho, coletar métricas e entender outras coisas padrão.
- Você precisa conhecer as especificidades do banco?
Não, basicamente. Todos entendemos que as pessoas que conhecem as especificidades do banco já estão trabalhando nos bancos. Quando você vem de outra esfera, provavelmente não a conhece. No início, você pode estudar os documentos sobre pontos gerais: o que são futuros, o que é uma opção, como eles diferem, quais são os riscos. E você simplesmente mergulha e começa a entender as especificidades do negócio.
Mas, no entanto, é importante. Inicialmente, você pode simplesmente implementar funcionalidades que não estão vinculadas a uma especificidade comercial específica, mas gradualmente aprender coisas mais complexas e específicas de assuntos. O que está aqui, o que estava no último local de trabalho (quando eu, como chefe do departamento, contratou funcionários) - você percebe que se em cada dez pessoas pelo menos uma entende o que são futuros, isso já é bom.
Se você tem conhecimento de algoritmos, multithreading e Java em geral, não será difícil estudar as especificações comerciais. Acontece quando você mergulha nesse ambiente, lê documentos e entende.
- Como você vai testar um conhecimento tão profundo de Java na entrevista? Isso é real?
É claro que você provavelmente não os verificará. Mas existem tarefas padrão em lógica, algoritmos, entendimento de estruturas internas. Esta é uma tarefa de teste e codificação do quadro branco. Por exemplo, uma tarefa para implementar um cache em uma fila que permita entender se um candidato entende multithreading - raças, deadlocks e tudo mais. Ao longo do caminho, você pode fazer perguntas sobre a quantidade de memória que consome, por que o TreeMap, não o HashMap. Assim, resolvendo um problema geral, você pode analisar os momentos de diferentes detalhes. Aqui, antes, a prática pela qual certas nuances são calculadas.
- O que você acha que precisa ser feito para se tornar melhor como programador?
Evoluir! Codificando e observando o que são tecnologias e algoritmos, quais novas linguagens, resolvendo problemas algorítmicos. De fato, muito depende da experiência. Se você resolveu muitos problemas em algoritmos, poderá encontrar algo semelhante em tarefas anteriores em um novo desconhecido. É necessário desenvolver o pensamento, a capacidade de encontrar respostas rapidamente. A capacidade de pesquisar e encontrar soluções no StackOverflow é muito útil. Se você não sabe algo, mas sabe onde encontrá-lo, esse é o caminho para o sucesso.
Idiomas estão mudando, tecnologias e estruturas estão sendo transformadas. Novos padrões surgem, mas ainda existem alguns que todos usam. As conferências Java sem relatórios sobre o Reactive Streams e as conversas sobre o Kotlin não são mais aprovadas. Sentar-se em um casulo e não entender que agora a fonte de eventos, em certo sentido, está gradualmente dominando o mundo, é estranho.
É necessário desenvolver um plano de fundo. Por exemplo, os livros de Knut ainda são relevantes. Base mais novas tecnologias. E você precisa saber onde e o que pesquisar no Google.
- Qual foi a última coisa que ele entendeu?
Em Kotlin Coroutines. Legal, eu gosto disso. Tanto na sintaxe quanto na lógica. Eu vejo como trabalhar nele com multithreading e assincronia. Anteriormente, eu tinha que usar muito pouco o Kotlin. Agora estou estudando ativamente, alguns projetos já estão explorando. Ele ainda existe em alguns pequenos módulos no prod.
