Refactoring (2nd edition), de Martin Fowler, é a nova versão para um clássico absoluto. A obra original influenciou, de forma definitiva, a forma como escrevemos código e nossos critérios de qualidade. Nessa nova edição, Fowler optou – com razão, em nossa opinião – por utilizar Javascript como linguagem de programação para os exemplos (a original […]
Sobre a importância de definir, explicitar e obedecer princípios arquiteturais
Desenvolver software implica em fazer escolhas todos os dias. Muitas vezes, todas opções disponíveis fazem sentido. Além disso, com frequência, os “campeões” de cada ideia são passionais em suas defesas e fica a sensação de que alguém não ficará satisfeito no final. Mais que isso, escolhas mal gerenciadas colocam o projeto em risco. É fundamental […]
Macros declarativas em Rust (macro_rules!)
Quem programou com C/C++, com certeza, em algum momento, se deparou com a necessidade/possibilidade de escrever macros. Trata-se de um recurso útil mas que em C/C++, frequentemente, se converte em “dor de cabeça”. A linguagem Rust incentiva a criação de macros (rotinas executadas durante a compilação) como forma de melhorar ainda mais a performance de […]
C# in Depth (4th edition)
C# in Depth (4th edition), de Jon Skeet, é o melhor livro que conheço sobre a linguagem para não iniciantes. Jon Skeet é uma lenda. É quase impossível procurar alguma coisa com relação a C# no StackOverflow e não encontrar uma resposta dele. Se não bastasse isso, ele trabalha na Google! C# in Depth é […]
Lidando com recursos gerenciados e não gerenciados em .NET
Podemos classificar os recursos utizados em .NET em duas categorias: gerenciados e não gerenciados. Recursos gerenciados são desalocados automaticamente. Por outro lado, recursos não gerenciados dependem de uma estratégia adequada de desalocação explícita, geralmente implementada através do Dispose Pattern. IMPORTANTE: É comum, entre os programadores .NET, associar do método Dispose()com liberação de memória. Entretanto, é […]
O que são “Spans” e por que são importantes?
Nos posts anteriores, definimos “distributed tracing“. Depois, apresentamos o padrão OpenTracing e uma de suas implementações (Jaeger). Nesse post, iremos discutir o conceito de Span (no contexto de tracing distribuído) O que são Spans? Citando a documentação do OpenTracing: The “span” is the primary building block of a distributed trace, representing an individual unit of work […]
Designing Data-Intensive Applications
Designing Data-Intensive Applications, de Martin Kleppman, ajuda, em termos simples, a entender as vantagens e desvantagens das diversas tecnologias para processar e armazenar dados. Sabemos que software avança, mas os princípios fundamentais permanecem os mesmos. Este livro é sobre esses princípios. O conhecimento contido nesse livro ajudará seus leitores a fazer escolhas mais conscientes e, […]
Criando um serviço windows usando Topshelf
Criar serviços Windows pode ser uma tarefa complicada. Depurar problemas pode ser difícil e o deploy costuma ser uma dor de cabeça. Topshelf simplifica todas essas atividades. Por que criar um serviço Windows? Quando desejamos que nossa aplicação seja executada em background, de maneira contínua, sem se preocupar com qual usuário está logado ou mesmo […]
Task vs ValueTask
A classe Task/Task<T> simplificou consideravelmente a programação assíncrona com .NET. Entretanto, sendo uma classe, tem suas instâncias alocadas na heap e pode sobrecarregar o Garbage Collector em cenários onde é utilizada no caminho crítico. Daí, o surgimento da estrutura ValueTask/ValueTask<T>. Entendendo o problema que motivou ValueTask<T> O uso mais comum para a classe Task é […]
Explain the Cloud Like I’m 10
O livro “Explain the Cloud Like I’m 10”, de Todd Hoff é espetacular. Ele explica diversos conceitos complexos sobre nuvem de forma muito didática. O texto engana, no início, por sua aparente simplicidade. Os temas parecem básicos, mas, ao longo que o livro avança, percebemos que não são. No final, o livro faz […]