Este artigo foi publicado em 2019. Ferramentas e versões citadas podem ter mudado desde então; a reflexão permanece.
Fala galera! Como citei no artigo sobre DDD comecei a programar em Clipper no inicio dos anos 90. Lá eu guardava os dados dos meus sistemas em tabelas dBase, um arquivo por tabela, e seus respectivos índices, um arquivo por índice. Havia uma quantidade mínima de tipo de dados, e principalmente uma limitação no tamanho dos discos. Existia uma forma peculiar de relacionamento, que auxiliava apenas nas buscas de dados relacionados por um índice, mas nada de integridade referencial. E cometiamos um erro, que muitos sistemas cometem até hoje, de destuir a informação anterior em detrimento de mante-la atualizada. O que quero dizer com isto? No meu sistema de vendas o produto de código A00931 foi cadastrado inicialmente com a descrição de Pão de Forma sem casca. A tabela de vendas tinha apenas uma referencia a partir do código, o valor unitário, a quantidade. Um belo dia o produto deixava de ser vendido, e para reaproveitar o código ele era substituído por Suco de maracujá. O que acontecia se eu pedisse um relatório de vendas? Pareceria que eu havia vendido inúmeros sucos, sendo que o produto acabou de chegar. Muitossistemas fazem iso até hoje. Colocam que em segurança dos dados por guardar um log de auditoria com a data e hora do que foi alterado. Mas como eu consulto a informação dentro da linha do tempo? Como ei qual o produto mais vendido, independnete das atualizações que este cadastro sofreu? Justifiquei meu erro da época pela tecnologia e limite limitações da época, aliadas a minha pouca experiencia. Mas o que nos faz continuar errando até hoje? As pessoas não aprenderam nem a importancia dos dados, e levam as formas normais ao extremo. Bancos de dados ‘relacionais muito úteis, e que terão uma longa vida pela frente, é usado como um paradigma mais seguro. Mas como sempre não existe bala de prata. Quando comecie a ver bancos de dados NoSQL em um primeiro momento todas as preocupações e questionamentos me vieram a cabeça. Mas como? Mas e a chave estrangeira? Mas e a consistencia? Fui estudando cada vez mais e me apaixonando pelo que cada tipo de banco de dados faz de melhor, e como o ermo pesistencia poliglota faz sentido e que quem não entendeu isto ainda esta fadado a não só tr um produto de menor qualidade, mas de estar desperdiçando dados importantes para o negócio do seu cliente. E a persistencia poliglota eu extendo não só ao fato de usar diferentes tecnologias d bancos. Cada vez mais precisamos que nossos micro servi;ços, eles aqui novamente, tenham independencia, seus próprios dados, e mecanismos robustos de sincronização, mas com total entendimento e tolerancia a ocasionais inconsistencia. O resultado? Um mar de dados para ser navegado pelos analistas e cientistas, um emaranhado de bits e bytes que ‘Machine Learning transformam em decisões conscientes e negócios sendo mais acertivos e reduzino drasticamente seus custos. Se isto não é uma revolução, preciso de mais dados para descobrir oque é! Até amanhã!Autor: magoolation
-
O green field de cada dia nos dai hoje!
Este artigo foi publicado em 2019. Ferramentas e versões citadas podem ter mudado desde então; a reflexão permanece.
Fala galera! Você foi alocado para um novo projeto e quando se depara com o código, que tem alguns débitos técnicos, qual sua primeira reaçao? Sem sombra de duvidas vvocêvai pensar que se você estivesse lá desde o começo teria feito tudo diferente, a arquitetura estaria melhor, o código melhor implementado seguindo as boas práticas, tudo aquilo que manda as boas práticas que estudamos todos os dias. Já parou par para pensar que esta situação pode ser a mesma para quem herdar seu projeto atual? Muitas vezes temos a sensação que se pudessemos voltar no tempo fariamos tudo diferente. E provavelmente com o conhecimento do que houve, caso as teorias de que não é possível se mudar a linha do tempo, e acabariamos na mesma situação. Ok! Mas então onde você quer chegar com este post? Você está se perguntando. Simplesmente porque, lembrando de uma palestra do meu amigo Eric Lemes, no TDC acho que em 2014, ele falou exatamente sobre isto. Por que ao invés de reclamarmos dasituação atual não tentamos melhorá-la? Por que não topar o desafio de refatorar o código, matar os débitos técnicos e manter tudo funcionando, e quem sabe deixar algo melhor pro próximo amigo que herdar o projeto? Pareceu interessante? Se sim, acredito que você deveria tomar algumas providencias: Utilizar alguma ferramenta de análise estática, Sonarqube por exemplo, para que os problemas sejam catalogados e vocêpossa acompanhar a evolução. Lógico que você já faz testes automatizados, e eles estão rodando sem erros, mas no caso disto não estar acontecendo ainda é uma boa oportunidade. Escreva o teste para a funcionalidade, faça as alteraç oes e confirme que ela continuará funcionando. Colocado isto em prática, caso você não faça isto ainda, coloque estes passos como parte da sua integração contínua. Ter este feedback a cada push é muito ”util e ajuda bastante o code review e a cadencia do projeto. Faça a experiencia e depois me diga se não é tão reconfortante quanto a da construção de um bom projeto do zero? PS: Saiba que o código que voc escreveu ontem já é legado. Se você não pratica as técnicas que cito aqui, provavelmente me pouco tempo você estará na situação inicial do post. Até amanhã! -
Continuando o papo sobre hype
Este artigo foi publicado em 2019. Ferramentas e versões citadas podem ter mudado desde então; a reflexão permanece.
Fala galera! Continuando os desabafos do post de ontem gostaria de esclarecer que o título, propositalmente polemico, reflete o que eu penso das tecnologias que citei dentro do artigo. As discussões no Twitter foram bem interessantes e lá coloquei outros pontos que também irei colocar aqui. Em primeiro lugar sou tão contra o over engineering quanto ao, como chamei no Twitter, “meter o loco” e ver no que vai dar. Infelizmente tudo é questão de interpretação e as pessoas nem sempre tem o bom senso de entender que um MVP, uma primeira versão de um produto, não tem necessariamente de ser uma versão final, mas tem de sr algo que quando entregue tenha toda a qualidade. Ninguém fará o teste do seu produto por você se encontrar bugs, ningu’m voltará a seu site se ao entrar no lin kde convite ou de uma divulgação em rede social o servidor cair. Somos responsáveis não só por realizarmos o sonho de nosso clinet de entregar algo funcionando e atendendo ao negócio, somos responsáveis pela continuidade deste negócio com base na qualidade de nossas entregas. E não vejo nenhuma das siglas e práticas sendo utilizadas de forma isoladas. DDD me dará a melhor forma de modelar o negócio para um produto digital, onde conhecerei os processos e os mapiarei da melhor forma dentro dos bounded contexts. Estes bounded contexts podem estar na mesma aplicação ou dividiso em serviços menores, ou seja, bounded contexts é uma técnica maravilhosa de discovery e implementação de micro serviços. Só conseguirei ter isto tudo funcionando a pleno vapor se utilizar uma boa estratégiade testes, preferencialmente automatizados e desde o início, o TDD, e como me comunicarei com meus usuários, terei muito material para escrever testes de aceitação com BDD. Juntando todas estas peças em uma esteira de etrega contínua, automação, infra como código e tudo mais, encontramos o DEVOPS. A única coisa que não concordo, e por favor se vocêfaz isto pare agora, é achar que todo o novo projeto que vvocêvai começar já tem de ter isto. Se vocêsabe que precisará de tudo isto, em uma equipe madura e que já tem experiencia, parabéms, mas caso contrário pense: vvocêseria cliente de um médico com uma ‘nova técnica que ele aprendeu em um congresso? Se vocênão arriscaria sua vida nesta experiencia, por que cargas d’água o seu cliente tem de pagar pelo seu teste de experiencia do hype no projeto dele? Vamos ser mais conscientes, vamos entregar mais valo em nossas aplicações, vamos estudar e entender as tendencias do mercado, e vamos aplicar de forma mais efetiva aquilo que aprendemos. Até amanhã! -
O problema não é e nunca foi do DDD
Este artigo foi publicado em 2019. Ferramentas e versões citadas podem ter mudado desde então; a reflexão permanece.
Fala galera! Quando Evans cunhou o termo Domain Driven Design, escreveu aquele livro super dificil de se ler, tenho total certeza de que ele não imaginava a revolução, e a confusão, que ele estava criando. Nossa área é muito movida pelo hype e os desenvolvedores tendem a achar que uma nova tecnologia, metodologia, técnica ou framework vem para substituir o que existia e não paa complementá-las. Hoje é dificil pedir em uma entrevista para o candidato fazer uma simples tela de soma de dois valores simplesmente porque em um projeto, que não dev3ria ter mais do que 00 linhas vamos encontrar misturados DDD, CQRS, Event Sourcing e por muito pouco isto não estará sendo construído em cima de um cluster kubernets na nuvem. Isto porque é legal. Isto é porque a internet está cheia de palestras e artigos dizendo como os sistemas deveriam se modelados e entregues. Isto porque os casos de sucesso de Amazon, Facebook, NetFlix e Uber tem de ser replicados por todos os cantos. Pera lá! Comecei minha carreira desenvolvendo em Clipper. Atendi desde de lojas de bairo até as finadas locadoras. Máquinas físicas, o hardware mais modesto que conseguia montar com o orçamento que tinha, backups em disquete, os quais provavelmente não iriam funcionar. Sabe por que? Era o que atendia ó negócio. Um dos maiores defeitos de nossa área é nosso ego. Sim TI deixou de ser uma área utilitária para ser estratégico, em muitos casos o core do negócio. Mas vejam só, se somo o core do negóio, o que é mais importante? Isto aí o negócio. Fazemos muito over engineering. Achamos que o sistem que estamos iniciiando hoje já tem de sair de fábrica atendendo um bilhão de requisições. Apesar de estarmos fazendo o CRUD das primeiras tabelas j’temos de pensar em como distribuir isto em micro serviços, e daqui a 3 meses quando o dinheiro que o tio do CEO da startup que nos contratou falar que não vai conseguir mais dar dinheiro porque até o momento não viu uma tela vamos achar que ele éstá errado em não acreditar, o pir não nos negócios, mas em nosso sistema. Cansei de ver em foruns a pergunta: mas em DDD onde eu coloco tal dependencia. Em micro serviços como faço sei lá o que. Amigos, se vocênão conseguem sozinhos responder estas perguntas, você conseguem me jurar queo problema é o DDD ou o micro serviço? Vamos começar menos e entregar mais ao invés de comecár mais e entregar menos. Aprenda a fazer um código limpo, aprenda a fazer uma arquitetura desacoplada, aprenda a tirar o mair proveito do framework que está a sua disposi’~ao, automatize a entrega, tenha bos práticas de code review, versionamento. Saiba como realmente funciona o banco de dados que vvocê. Isto sem duvidas vai te guiar aquilo que DDD micro serviços, 12 factors app e tudo mais te diz pra fazer. Até amanhã! -
Aversátil classe Convert
Fala galera!
É muito comum que durante nosso desenvolvimeno tenhamos de fazer conversão de tipos.
Seja converter de uma string que veio do input de usuário para tipos como int, float ou decimal, seja convertendo de um tipo de dados que veio de uma API interna ou externa.
Para a mioria destas conversõs podemos utilizar a classe Convert e seus métodos específicos:
ToInt32, ToDouble, ToLong, etc.
Mas há conversões ainda mais avançadas e que pouco utilizamos, apesar de serem bem úteis.
Temos o Convert.ToBase64String e Convert.FromBase64String que faz a vpnersão de um objeto para uma presentação em Base64 muito útil para ser enviada através da Web e outros protocolos de comunicaÇão baseados em texto onde caracteres especiais podem ser rejeitados.
Mas o método mais poderoso é o ChangeType. Ele recebe dois parametros onde o primeiro é o objeto a ser convertido e o segundo o tipo para o qual ele deve ser convertido.
Ainda não me deparei com o código fonte deste método, mas ele tem sido particularmente útil em desenvolvimento Xamarin na conversão em APIs que retornam java.lang.object.
Em breve publico aqui um exemplo mais comncreto, mas conhecer bem o framework ajuda demais a resolver problemas que parecem complexos com algo que já está lá pronto esperando pra ser usado.
Até amanhã!
-
Evitando o uso de async void
Fala galera!
Para quem escreve muitos códigos paralelos em .NET estamos devidamente educados a utilizar Task e async await.
Mas quando nos deparamos com delegates e event handlers que são void cometemos o crime de usar async void.
Isto gera alguns problemas pois o método não pode ser devidamente aguardado, afinal ele não tem uma Task que poderá ser monitorada, e o código é executado de forma paralela mas sem nenuma obseva’~ao.
Isto nos leva a unhandled exceptions dentro deste processo, causando erros estranhos ou até mesmo a finalização por completo da nossa áplicação.
E isto mesmo s colocando blocos try catch dentro do método void.
Como então devemos tratar estes casos?
Temos duas oluções:
A primeira é usamos este método void apenas para dar um await em um oputro método, este sim retornando uma Task e com seu devido código de tratamento de erro.
O segundo, e no qual achei a solução mais interessante é a de ~criação de um método de extensão para Task que faz o tratamento da exceção.
Deixo aqui o repositório como a minha tentativa de implementação, e como sempre
conto com os comentários de vocês.
https://github.com/magoolation/no-async-void
Até amanhã! -
Inicializando repositórios git
Fala galera!
Bem sumido daqui. Em breve irei escrever sobre o quanto está sendo dificil manter a rotina de escrever diariamente, das minhas tentativas e quais meus planos para conseguir atingir a meta, que a esta hora já se tornou ter 365 posts até o fim do ano e não mais um post postado diariamente.
Enfim indo direto ao ponto do post de hoje as vezes nicializamos um repositório git localmente e logo antes de enviarmos para o github criamos o repositório remoto.
Como fazemos então para sincronizar os dois?
No repositório local dispare o comando:
git fetch origin master
Faça suas alterações e conclua com um git push -u origin master
Pela segunda vez fiquei preso nesta situação hoje, e espero que como eu vocêambém tenha pensado que é simples demais para gente tr perdido temo com isto.
Até amanhã! -
Async x Reactive: A experiencia
Fala galera!
Desculpem postergar tanto a postagem deste código mas as coisas estiveram bem corridas pelo lado de cá, tanto que postei anteriormente uma solução importante com Polly que estava tirando meu sono.
O código deste experimento está em: https://github.com/magoolation/Async-x-Reactive.
Agradeceria comentários e sugestões de melhoria. Comecei a ler online o livro Rx.NET in Action, onde irei aprender um pouco mais sobre RX e com certeza revisitarei diversas vezes estes repositórios.
Não me prolongando muito tentei comparar os seguintes cenários:
Chamadas async consecutivas;
Chamadas async concorrentes;
Chamadas reativas;
Conversão de chamadas reativas em async;
Os resultados foram interessantes. Logicamente chamadas concorrentes são mais rápidas, mas nem sempre as chamadas reativas os ão, apesar de serem mais legívies, e no caso de chamadas Http serem mais rápidas.
Mas como disse é um experimento a ser melhorado.
Até amanhã!
-
Implementando o pattern Circuit Breaker com C# usando Polly
Fala galera!
Dando uma pausa nos posts sobre programação reativa, que voltarei na próxima postagem, tive de fazer uma correção em um código meu pois minha implementaÇão com Polly não estava adequada.
Bom para quem não conhece o padrão pense no Circuit Breaker como os dijuntores de sua humilde residencia.
Quando o circuito está fechado a energia passa tranquilamente. Este é o modo de operação normal.
Quando há algum problema em seu sistema elétrico, melhor dizendo no da sua caa, os circuitos se abrem e a energia para de passar.
Vocêdoe verificar o problema, fechar apenas um circuito, verificar que está ok e fechar os demais, ou constatar que o problema persiste e mante-los abertos.
A mesma coisa acontece com o padrão Circuit Breaker. Vocêmonitora a ocorrencia de erros, após um limite vocêbre o circuito por um tempo de terminado e após este tempo é feita uma nov nova tentativa, e caso seja positiva o circuito é fechado novamente.
Em resumo monitoramos um número de ocorrencias e caso o circuito abre retornamos uma excessão imediatamente não fazendo o cliente aguardar toda verificação de que o serviço consultado caiu.
Pooly é uma bblioteca de resiliencia que permite criar diversos tipos de política como Retry, Circuit Breaker, Throtling entre outras.
Seu uso é muito simples e demonstro isto no repositório: https://github.com/magoolation/Polly-CircuitBreaker
O código é simples e auto explicativo por isto nÃo me prolongarei aqui, mas caso precisem de algum auxílio ou tenha sugestão de melhorias é só entrar em contato.
PS: Para que o circuit breaker funcione adequeadamente é necessário que tenhamos uma instancia única da política e que façamos com que ela trate apenas as ecessões e casos que estejamos interessados, e esta foi minha falha na outra implementação.
Até amanhã!
-
Um pouco mais sobre programação reativa em .NET
Fala galera!
Antes de compartilhar meu experimento achei válido compartilhar algumas coisas com você.
Em primeiro lugar a documentação atualizada. Aqui é a classe Observable que é um ponto de partida para o estudo da programação reativa: https://docs.microsoft.com/en-us/previous-versions/dotnet/reactive-extensions/hh244252%28v%3dvs.103%29.
Lembrando que o padrão Observer é um design pattern já conhecido e as Reactive Extensions, implementadas praticamente em qualquer linguagem moderna hoje, é uma abstração sobre este pattern d forma a tronar a criação, composição e consumo de fluxo de dados ainda mais fácil e elegante.
Neste padrão temos dois atores, os Observables que são os fluxos de dados em si e fornecem as informções quedevem ser processadas, e os Observers que reagem aos fluxos de dados e executam as regras de negócio.
Im Observer implementa um método OnNext que ;é chamado para cada elemento do Observable. Caso ocorra um erro é chamado o método OnError passando-se a excessão disparada. Já ao terminar o fluxo é chamado o OnCompleted.
É realmente muito interessante o quanto o padrão, tão antigo e simples, trouxe para nós uma facilidade tão grande nos dias de hoj.
Bons estudos.
Até amanhã!