anúncios

segunda-feira, 14 de julho de 2025

Depuração de sistemas de forma eficiente

Quando um paciente chega ao consultório com uma dor ou um cliente leva o carro à oficina com um barulho estranho, o médico ou o mecânico não começa a "consertar" imediatamente. Eles ouvem, perguntam, investigam, fazem testes e somente depois aplicam uma solução.

Curiosamente, esse processo é exatamente o que deveria acontecer ao depurar sistemas em produção ou desenvolvimento. No entanto, muitos desenvolvedores, até os mais experientes, pulam etapas cruciais da investigação, o que leva a correções incompletas ou efeitos colaterais indesejados.

No presente artigo, exploramos como aplicar a mentalidade investigativa de médicos e mecânicos no contexto da depuração de software, com exemplos práticos e boas práticas.

Analogia: Médico, Mecânico e Engenheiro de Software

O Médico

Sintoma: "Estou com dor no estômago."

Processo: O médico coleta informações, localização da dor, histórico clínico, alimentação recente, realiza exames.

Diagnóstico: Pode ser gastrite, apendicite ou intoxicação.

Tratamento: Cada causa exige um tratamento diferente. Errar o diagnóstico pode ser fatal.

O Mecânico

Sintoma: "Meu carro está fazendo um barulho ao frear."

Processo: O mecânico verifica os freios, discos, pastilhas, e até a suspensão, se necessário. Pode testar o carro.

Diagnóstico: Pastilhas gastas? Disco empenado? Braço da suspensão solto?

Solução: Substituição de peças específicas.

O Engenheiro de Software

Sintoma: "O relatório financeiro está com valores incorretos."

Processo: O engenheiro de software coleta logs, analisa dados de entrada, reproduz o bug, inspeciona código e dependências.

Diagnóstico: Erro de arredondamento? Consulta SQL mal construída? Falha na atualização de cache?

Correção: Refatoração pontual ou ajuste nos dados.

Etapas da depuração: O processo diagnóstico

A seguir, adaptamos o processo de investigação médica/mecânica para o contexto de sistemas:

  1. Coleta de sintomas (relato do bug)
  2. Escute com atenção o relato do usuário.

    Pergunte: Quando começou? Ocorre sempre? Com que frequência? Em qual ambiente (produção, homologação)?

    Exemplo: Um cliente relata que ao gerar relatório no dia 1º de cada mês, ele mostra dados duplicados.

  3. Reprodução controlada
  4. Tente reproduzir o erro em ambiente de teste, com os mesmos dados e condições.

    Se o bug não for reproduzível, pode haver uma condição de corrida ou dependência externa.

  5. Inspeção de logs e métricas
  6. Logs são o raio-X do software.

    Ferramentas como ELK Stack, Grafana, ou até um simples tail -f ajudam a visualizar eventos relevantes.

    Exemplo: Ao verificar os logs, percebe-se que o sistema gera o relatório duas vezes quando o agendamento cron executa com atraso.

  7. Hipóteses e testes

    strong>Elabore hipóteses: "E se o problema estiver no agendador?" "E se os dados vierem duplicados do banco?"

    Valide cada hipótese isoladamente, como um médico pede exames complementares.

  8. Diagnóstico
  9. Identifique a causa-raiz, e não apenas o efeito.

    Ferramentas úteis: Debuggers, breakpoints, análise estática, cobertura de testes, git blame.

  10. Correção e prevenção
  11. Corrija o problema de forma específica e escreva testes automatizados para cobrir o caso.

    Se possível, implemente alertas ou logs adicionais para prevenir regressões.

O que evitar

  • "Corrigir" o bug sem entender a causa (ex: esconder o erro com um try/catch vazio).
  • Alterar o código em produção com base em achismos.
  • Ignorar os logs e os testes, é como um médico ignorar exames de sangue.

Boas práticas para depuração

  • Mantenha os logs claros e contextuais.
  • Use feature flags para testar correções.
  • Documente o erro e a solução (como um prontuário médico).
  • Utilize versionamento no banco de dados e código-fonte.
  • Tenha testes automatizados de regressão.

Considerações finais

Depurar sistemas não é apenas consertar bugs, é investigar com método, cuidado e lógica. Da mesma forma que um médico salva vidas com um diagnóstico preciso, e um mecânico evita acidentes ao revisar corretamente um freio, o engenheiro de software protege a confiabilidade do sistema ao aplicar a depuração com rigor técnico.

Depurar é diagnosticar. Corrigir é tratar. Testar é prevenir.

Se gostou dessa analogia, compartilhe com sua equipe e comente como você conduz o processo de depuração no seu dia a dia!

Feito!

segunda-feira, 7 de julho de 2025

Entenda o conceito que está revolucionando o desenvolvimento de software

A área de tecnologia está em constante transformação, e um dos conceitos mais importantes da atualidade é o DevOps. Mais do que uma simples combinação entre "Desenvolvimento" e "Operações", o DevOps representa uma mudança cultural e técnica que tem ajudado empresas a entregar software de forma mais rápida, segura e eficiente.

No presente artigo, vamos explorar o que é DevOps, por que ele surgiu, quais são seus principais benefícios e como essa prática tem mudado a forma como times de tecnologia trabalham em conjunto.

Por que surgiu o DevOps?

Durante muito tempo, as áreas de desenvolvimento e infraestrutura (operações) trabalhavam de forma isolada. O time de desenvolvimento era responsável por escrever o código, enquanto o time de operações cuidava da infraestrutura e da publicação do sistema. Essa separação gerava atrasos, conflitos e até falhas em produção, principalmente quando havia mudanças frequentes.

Foi nesse contexto que surgiu o DevOps, como uma resposta à necessidade de melhorar a comunicação entre os times, automatizar processos e garantir entregas mais confiáveis. O termo começou a ganhar força por volta de 2009, a partir de comunidades de tecnologia que buscavam uma cultura mais colaborativa.

O que é DevOps, afinal?

DevOps é um conjunto de práticas, ferramentas e uma cultura organizacional que visa integrar os times de desenvolvimento (Dev) e operações (Ops), promovendo colaboração contínua ao longo de todo o ciclo de vida do software, desde o planejamento e desenvolvimento até a entrega e manutenção em produção.

O foco do DevOps é criar um ambiente onde as equipes possam trabalhar de forma conjunta, entregando valor de forma contínua, ágil e com qualidade.

Quais são os pilares do DevOps?

Para funcionar bem, o DevOps se apoia em alguns pilares fundamentais:

  • Colaboração:
  • Times multidisciplinares que trabalham juntos com objetivos em comum.

  • Automação:
  • Processos como testes, integração contínua, entrega contínua e monitoramento são automatizados.

  • Integração Contínua (CI):
  • Cada alteração de código é integrada ao projeto automaticamente, garantindo testes e feedback rápidos.

  • Entrega Contínua (CD):
  • Novas versões do sistema são entregues com frequência e com menos riscos.

  • Monitoramento e feedback:
  • O sistema é monitorado em tempo real e os times utilizam os dados para melhorar continuamente.

Benefícios do DevOps

Adotar DevOps traz uma série de benefícios para empresas e profissionais de tecnologia. Entre os principais, destacam-se:

  • Entregas mais rápidas e frequentes de software;
  • Maior confiabilidade nas implantações em produção;
  • Redução de erros e falhas;
  • Melhoria na colaboração entre áreas;
  • Maior satisfação do cliente.

Além disso, o DevOps permite uma melhor adaptação a mudanças, essencial em um mercado tão dinâmico como o de tecnologia.

DevOps é só ferramenta?

Embora existam muitas ferramentas que suportam práticas DevOps (como Jenkins, Docker, Kubernetes, GitLab CI/CD, entre outras), é importante entender que DevOps é, antes de tudo, uma mudança de cultura.

Sem colaboração entre os times e comprometimento com a melhoria contínua, nenhuma ferramenta será suficiente para garantir o sucesso da adoção de DevOps.

Considerações finais:

DevOps é uma abordagem que vem transformando a maneira como desenvolvemos e entregamos software. Ao unir desenvolvimento e operações com foco em automação, colaboração e melhoria contínua, as empresas conseguem ser mais ágeis, resilientes e inovadoras.

Se você trabalha com tecnologia, seja como desenvolvedor, administrador de sistemas, QA ou gestor, entender e aplicar os princípios de DevOps pode ser um diferencial importante na sua carreira e nos resultados da sua equipe.

Feito!

quinta-feira, 3 de julho de 2025

Por que você deveria usar Docker no seu projeto?

Se você é desenvolvedor há algum tempo, com certeza já ouviu, ou falou, a famigerada frase: "Ué, na minha máquina funciona!".

Geralmente ela surge naquele momento crítico em que você compartilha seu projeto com alguém da equipe (ou vai subir pro servidor), a pessoa segue a documentação (às vezes até bem feita), instala as dependências, executa o build… e boom!

Erro.

Na sua máquina está tudo liso. Mas do outro lado da tela, tudo quebra.

O culpado? Nem sempre é o código.

Na maioria das vezes, o vilão está escondido em detalhes sutis: a versão do Java instalada, o Node.js diferente, uma lib do sistema que não está presente, ou até o próprio sistema operacional.

É aqui que entra um dos maiores aliados da consistência no desenvolvimento moderno: o Docker.

O que é Docker (de forma simples)?

Docker é uma plataforma que permite "empacotar" uma aplicação com tudo o que ela precisa para executar: sistema, bibliotecas, dependências, ferramentas, versão específica de runtime, tudo mesmo.

Esse "pacote" é chamado de container. Ele roda de forma isolada, como se fosse uma mini-máquina configurada só para a sua aplicação, e que funciona igualzinha em qualquer lugar.

Por que usar Docker no seu projeto?

  1. Ambiente padronizado para todos
  2. Não importa se quem vai executar o projeto usa Windows, Linux ou macOS. Com Docker, o ambiente de execução é exatamente o mesmo.

    O famoso "na minha máquina funciona" vira "funciona igual em qualquer máquina".

  3. Documentação viva
  4. O Dockerfile e docker-compose.yml viram a documentação executável do seu ambiente.

    Em vez de dizer "instale o PostgreSQL 13", "instale o Java 8/11/17", "instale o PHP 8.3", você diz: docker-compose up.

    Simples, direto, sem margem para erro humano.

  5. Facilidade para novos desenvolvedores
  6. Quantas vezes você já perdeu um ou dois dias configurando o ambiente para alguém novo no time?

    Com Docker, isso cai para alguns minutos. A pessoa só precisa ter Docker instalado, clonar o repositório e subir os containers.

  7. Isolamento real
  8. Você pode ter dois projetos rodando com versões completamente diferentes de uma linguagem ou banco de dados, sem conflitos.

    Um usando Node 18, outro executando Python 3.7 com PostgreSQL 9? Sem problema.

  9. Ambiente próximo ao de produção
  10. Se você sobe sua aplicação em produção usando containers, nada mais justo do que desenvolver e testar no mesmo ambiente.

    Menos surpresas, menos bugs de "ambiente".

Mas e o desempenho? Não complica demais?

Essa é uma dúvida legítima. Sim, dependendo do sistema operacional (Windows 😂), o Docker pode consumir mais recursos. Mas nos últimos anos, ele melhorou bastante em desempenho e integração nativa. Graças o suporte de WSL2, que permite instalar o Docker no Ubuntu via WSL, sem precisar do Docker Desktop.

Além disso, com o tempo você percebe que o pequeno custo de performance se paga facilmente pela economia de tempo, confiabilidade e tranquilidade de saber que o projeto vai executar bem onde quer que esteja.

Considerações finais

Docker não é moda. É uma das ferramentas mais poderosas que surgiram para tornar o desenvolvimento mais previsível, colaborativo e escalável.

Se você está cansado de ouvir (ou dizer) "na minha máquina funciona", talvez esteja na hora de subir o seu projeto com docker-compose.yml e entrar de vez no mundo dos containers.

Porque no fim das contas, o que a gente mais quer é isso:

Que funcione. Em todas as máquinas. Sem drama.

Nota final

Docker é uma ferramenta poderosa, mas não é um martelo para todos os pregos.

Projetos que exigem acesso direto a hardware, interfaces gráficas nativas ou virtualização avançada (como emuladores de Android, Arduino, ou dispositivos USB) podem encontrar no Docker mais limitação do que benefício.

E tudo bem.

Isso não é uma falha no seu projeto, é apenas uma questão de usar a tecnologia certa no lugar certo.

Feito!

terça-feira, 1 de julho de 2025

Qual o melhor Sistema Operacional para Desenvolvedores?

Uma visão honesta de quem está há mais de 10 anos no campo de batalha.

Quando alguém me pergunta "qual é o melhor sistema operacional para desenvolvimento?", minha resposta automática costuma ser: depende. E não é uma forma preguiçosa de responder. É porque realmente depende do contexto, da linguagem, do tipo de projeto e até do seu gosto pessoal. Mas depois de mais de uma década mergulhado em código de aplicações web a scripts de automação, de APIs em nuvem a sistemas embarcados, aprendi que cada sistema tem suas vantagens (e dores).

No presente post, vou comentar sobre os quatro principais candidatos: uma distro Linux (como Ubuntu ou Fedora), macOS, FreeBSD e Windows. Spoiler: todos funcionam. Mas uns funcionam melhor dependendo do seu objetivo.

Linux: O queridinho dos devs raiz

Se você trabalha com backend, cloud, containers, automação, DevOps ou simplesmente curte ter o controle do seu ambiente, Linux é quase imbatível. O terminal é poderoso, a performance é sólida e quase tudo que executa em produção na nuvem, executa em Linux.

Vantagens:

  • robusta, personalizável, e amigável a scripts.
  • Integração nativa com ferramentas como Docker, Git, Node, Python, Go etc.
  • É gratuito e leve (especialmente distros como Arch ou Debian).
  • Ideal para quem quer entender o que está acontecendo "por baixo dos panos".

Desvantagens:

  • Pode exigir mais curva de aprendizado para quem vem do Windows.
  • Suporte a hardware (especialmente placas Wi-Fi ou impressoras) ainda pode ser uma dor.
  • Softwares como Adobe, MS Office, etc., não funcionam nativamente.
  • Para quem é: Devs backend, DevOps, SysAdmins, Cientistas de Dados, ou qualquer um que goste de uma abordagem hands-on.

macOS: O equilíbrio entre Unix e usabilidade

Se você desenvolve para iOS/macOS, você precisa de um Mac, ponto. Mas mesmo fora do ecossistema Apple, o macOS é uma ótima escolha para devs que querem a estabilidade e poder do Unix com uma interface polida e um ecossistema de ferramentas premium.

Vantagens:

  • Terminal baseado em Unix (zsh/bash), com boa compatibilidade POSIX.
  • Excelente suporte a linguagens como Python, Ruby, Node.js, embora todas precisem ser instaladas e gerenciadas com ferramentas como pyenv, rbenv e nvm.
  • Interface gráfica polida e integração com o hardware Apple.
  • Ideal para quem quer produtividade em um sistema robusto, mas ainda amigável.

Observações importantes:

O Docker não executa nativamente no macOS. Ele depende de uma máquina virtual leve (HyperKit/AppleHV) para simular o kernel Linux, o que pode impactar desempenho em alguns cenários.

Apesar de o Python vir pré-instalado, costuma ser uma versão desatualizada usada pelo sistema. Desenvolvedores geralmente precisam gerenciar múltiplas versões manualmente.

Desvantagens:

  • Custo elevado.
  • Atualizações podem quebrar ambientes de desenvolvimento se não forem feitas com cautela.
  • Menos liberdade para personalizar o sistema profundamente (em comparação ao Linux).
  • Para quem é: Desenvolvedores iOS, web, front-end, ou quem busca um ambiente Unix-like com visual refinado e conforto no uso diário.

Windows: O mais comum e... agora muito mais útil

Por muito tempo, o Windows foi visto como o pior ambiente para desenvolvimento. Mas isso mudou drasticamente com o WSL (Windows Subsystem for Linux). Hoje é totalmente viável programar em Windows, especialmente se você trabalha com .NET, C#, ou precisa de compatibilidade com softwares corporativos.

Vantagens:

  • Compatibilidade com todos os softwares comerciais.
  • Visual Studio (que ainda é imbatível para C# e C++).
  • WSL2 permite executar Linux dentro do Windows com performance decente.
  • Ideal para ambientes corporativos e desenvolvimento de jogos com DirectX.

Desvantagens:

  • Gerenciamento de dependências e pacotes ainda é mais confuso.
  • O sistema pode ficar instável com muitas customizações.
  • Terminal padrão ainda é inferior (mas o Windows Terminal e o PowerShell melhoraram bastante).
  • Para quem é: Devs C#, .NET, Unity, SQL Server, devs corporativos que precisam de Office, e quem trabalha com automação para Windows.

FreeBSD: Para os corajosos e curiosos

FreeBSD não é mainstream, mas quem já usou sabe: é rápido, seguro e com um sistema de permissões e gerenciamento de rede excelente. Se você é o tipo de dev que gosta de montar servidores otimizados, entender o sistema profundamente ou está buscando estabilidade acima de tudo, vale testar.

    Vantagens:

  • Estabilidade lendária.
  • Sistema de ports eficiente.
  • Ótimo para servidores e redes.

Desvantagens:

  • Curva de aprendizado íngreme.
  • Poucos tutoriais voltados para desenvolvimento moderno.
  • Suporte de ferramentas e IDEs limitado.
  • Para quem é: Devs hardcore, administradores de sistemas, especialistas em redes, ou quem quer aprender além do mainstream.

E no final, qual eu uso?

Hoje, pessoalmente, meu setup principal é o Linux (Ubuntu LTS) no notebook, mas por muitos anos usei o Slackware e o Debian no desktop. Aliás, o Slackware ainda é uma ótima escolha para quem quer aprender Linux no modo raiz, hands-on de verdade. Atualmente, meus servidores executam Debian, pela estabilidade e confiabilidade que oferece. Também já usei Windows por anos. Além disso, aprendi muito explorando o FreeBSD.

No fim das contas, o sistema operacional não faz o desenvolvedor, é apenas uma ferramenta. A melhor escolha é aquela que te permite ser produtivo, feliz e resolver problemas reais.

Dica de ouro: Se você está confortável com um sistema e ele te permite trabalhar bem, continue com ele. Se está te atrapalhando, experimente outro. Nada é definitivo.

E você, qual sistema usa para programar? E por quê?

Deixe nos comentários!

Se você evitar esses deslizes, com certeza terá uma base sólida para crescer na carreira de forma consistente e profissional.

Participe dos nossos grupos no Telegram:

Programadores Brasil Dicas, vagas, tecnologia e networking.

Linux Para Todos Aprendizado e suporte para quem quer migrar ou dominar o Linux no dia a dia do desenvolvimento.

FreeBSD Brasil Aprendizado e suporte para quem quer aprender FreeBSD no dia a dia.

Feito!

quarta-feira, 25 de junho de 2025

Entendendo o Git Flow

No desenvolvimento de software moderno, manter um controle eficiente do código-fonte é essencial para garantir a estabilidade, a organização e a escalabilidade do projeto. Uma das estratégias mais consolidadas para isso é o uso do Git Flow, um modelo de ramificação (branching) que oferece um fluxo de trabalho bem definido para times de desenvolvimento.

No presente artigo, vamos apresentar como o Git Flow organiza o ciclo de vida das branches, além de destacar como essa prática melhora a qualidade e a previsibilidade das entregas em projetos de software.

O que é o Git Flow?

O Git Flow é uma convenção de uso do Git proposta por Vincent Driessen que define uma estrutura clara de branches para apoiar os ciclos de desenvolvimento, testes, homologação e produção. Ele é especialmente útil em times que trabalham com entregas contínuas ou release planejados.

Estrutura de Branches no Git Flow

Veja abaixo como estruturar seu repositório Git usando Git Flow:

  • master/main
  • Contém o código em produção. Deve estar sempre estável, pois representa a versão em uso pelos usuários finais.

  • develop
  • Branch onde ocorre o desenvolvimento contínuo. Serve como base para novas features, e é aqui que as funcionalidades são integradas antes de ir para produção.

    feature/idTask-nome

    Cada nova funcionalidade é desenvolvida em uma branch própria a partir de develop, identificada por um ID de tarefa (como no Jira ou Trello).

    Ex: feature/1234-login-social.

  • hotfix/nome
  • Correções urgentes feitas a partir da main, utilizadas para corrigir bugs críticos em produção. Após o merge, as alterações devem ser integradas também na develop.

  • release/x.y.z
  • Quando as funcionalidades em develop estão prontas, uma branch release é criada para testes finais, ajustes e preparação da versão de produção.

Fluxo Ilustrado

Abaixo está um diagrama simplificado ilustrando esse fluxo de trabalho com base nas boas práticas descritas:

Por que usar Git Flow?

  • Organização:
  • Separação clara entre produção, desenvolvimento e funcionalidades.

  • Segurança:
  • O código em produção (main) permanece sempre confiável.

  • Escalabilidade:
  • Permite que vários desenvolvedores trabalhem paralelamente sem conflitos.

  • Automação e CI/CD:
  • Facilita pipelines de integração e entrega contínua, com regras claras por branch.

  • Facilidade de rollback e hotfixes:
  • Bugs em produção podem ser resolvidos rapidamente e reintegrados ao desenvolvimento.

    Considerações finais

    O uso do Git Flow é uma excelente prática para equipes de desenvolvimento que precisam lidar com múltiplas features, correções e versões simultaneamente. Ele fornece um modelo claro e eficaz para gerenciar o ciclo de vida do código, promovendo estabilidade em produção e agilidade no desenvolvimento.

    Se sua equipe ainda não segue um modelo de branching, o Git Flow é um ótimo ponto de partida para estruturar o controle de versões de forma madura e escalável.

    Referências

    Git Flow – by Vincent Driessen

    Feito!

terça-feira, 24 de junho de 2025

5 Habilidades que valem mais que diploma de curso superior em TI

No mercado de tecnologia atual, ter um diploma de TI já não é garantia de sucesso ou de salários altos. A saturação de profissionais que sabem programar faz com que as empresas busquem algo além do conhecimento técnico tradicional. Elas querem profissionais que dominem habilidades que a faculdade não ensina direito, mas que fazem toda a diferença no dia a dia e na carreira.

Aqui estão as 5 habilidades essenciais que podem transformar sua carreira em TI e te destacar no mercado:

  1. Comunicação Estratégica
  2. Não é só ser comunicativo ou engraçado em reuniões. É a capacidade de traduzir termos técnicos para a linguagem do negócio, explicando para gestores e colegas o valor das suas soluções. Isso gera valor real para a empresa e te torna indispensável.

  3. Mentalidade de Dono
  4. Empresas querem profissionais que vão além do básico, que tomam iniciativa e cuidam dos projetos como se fossem seus. Resolver problemas, sugerir melhorias e entregar resultados sem precisar de supervisão constante é o que diferencia um colaborador comum de um verdadeiro líder.

  5. Marketing Pessoal
  6. Mostrar seu trabalho e construir uma marca pessoal é fundamental. Um diploma fica guardado numa gaveta, mas um perfil otimizado no LinkedIn, portfólio no GitHub e artigos em blogs trabalham por você o tempo todo, atraindo oportunidades.

  7. Visão de Produto
  8. Entender o “porquê” do código que você escreve: quem é o usuário final, qual problema estamos resolvendo e como isso ajuda a empresa a crescer. Profissionais com visão estratégica são vistos como parceiros do negócio e recebem os melhores salários.

  9. Resiliência e Inteligência Emocional
  10. O mundo da tecnologia é cheio de pressão, prazos apertados e críticas constantes. Saber lidar com feedbacks, trabalhar em equipe, controlar o estresse e aprender com os erros é o que mantém você firme e valorizado.

    Considerações finais

    O diploma abre a porta, mas são essas habilidades que fazem você reinar no mercado de TI. Invista nelas para construir uma carreira sólida, lucrativa e à prova do tempo.

    E você, qual habilidade acha que falta no ensino formal e é essencial para um profissional de tecnologia? Deixe seu comentário!

    Feito!

quinta-feira, 19 de junho de 2025

Encriptação de Dados Sensíveis no MySQL

Quando lidamos com dados sensíveis, como CPF, telefone ou informações bancárias de usuários, a segurança da informação torna-se um dos pilares mais importantes de um sistema. Uma prática fundamental é armazenar esses dados de forma encriptada no banco de dados.

Exemplo prático: Encriptação de CPF no MySQL

Considere a seguinte estrutura de tabela:


CREATE TABLE clientes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100),
    cpf VARBINARY(255)
);

Como funciona a encriptação com AES_ENCRYPT

O MySQL oferece a função AES_ENCRYPT(valor, chave) para encriptar dados. Aqui:

  • valor:
  • é o dado sensível que queremos proteger (por exemplo, o CPF).

  • chave:
  • é uma senha secreta utilizada no processo de encriptação e decriptação. Importante: A chave nunca deve ser armazenada dentro da própria base de dados. O ideal é mantê-la em um arquivo de configuração da aplicação ou em um gerenciador de segredos (Vault, AWS Secrets Manager, etc).

  • Recomendações sobre a chave:
  • A chave de encriptação deve ter pelo menos 16 bytes para evitar warnings e garantir maior segurança.

Exemplo de inserção de dados encriptados:


INSERT INTO clientes (nome, cpf) 
      VALUES ('Bjorn', 
             AES_ENCRYPT('123.456.789-00', 
             'chave_secreta_16b'));

Como realizar a decriptação dos dados:

Para visualizar os dados de forma legível, usamos a função AES_DECRYPT(coluna, chave):


SELECT nome, 
       CONVERT(AES_DECRYPT(cpf, 'chave_secreta_16b') 
       USING utf8) AS cpf 
FROM clientes;

Dica:

É recomendado sempre usar o CONVERT(... USING utf8) para transformar o resultado binário em texto legível.

Considerações importantes

Consistência nos dados:

Tentar decriptar dados que não foram previamente encriptados com AES causará erros ou retornará valores nulos. Garanta que todos os dados sensíveis sejam sempre armazenados de forma encriptada.

Conformidade com a LGPD:

A prática de encriptar dados sensíveis está totalmente alinhada com a LGPD (Lei Geral de Proteção de Dados).

Em caso de um eventual vazamento de dados, as informações estarão ilegíveis para qualquer atacante que não possua a chave de encriptação.

Boas práticas de segurança:

Infelizmente, ainda vemos notícias frequentes de vazamentos de bases de dados de órgãos públicos e grandes empresas. Muitas vezes, os dados estavam armazenados de forma simples e sem criptografia.

Uma política mínima de encriptação já evitaria que tais informações pudessem ser lidas por terceiros não autorizados.

Compatibilidade com MariaDB

As funções AES_ENCRYPT() e AES_DECRYPT() também são suportadas pelo MariaDB, garantindo boa compatibilidade com as versões do MySQL até a 5.7.

Porém, vale uma atenção especial para quem trabalha com MySQL 8.x ou superior, pois algumas mudanças foram introduzidas no modo de criptografia padrão (exemplo: modo de padding e modo de operação AES).

Recomendações ao usar entre MySQL e MariaDB:

Teste a criptografia e decriptação em ambos os ambientes.

Utilize sempre chaves com no mínimo 16 bytes.

Valide se o modo de operação AES é o mesmo entre as versões.

Evite migrações diretas de bases encriptadas entre MySQL 8.x e MariaDB sem testes prévios.

Considerações finais

A segurança de dados não deve ser tratada como um recurso opcional. Encriptar informações sensíveis no banco de dados é uma obrigação para qualquer sistema que armazene dados pessoais.

Com poucas alterações na modelagem e nas queries SQL, já é possível implementar uma camada extra de proteção.

Se você ainda não aplica encriptação de dados sensíveis no seu banco de dados no SGBD MySQL ou MariaDB, o momento de começar é agora.

Feito!

quarta-feira, 18 de junho de 2025

10 erros comuns de desenvolvedores

Iniciar a carreira como desenvolvedor pode ser um desafio cheio de aprendizados e armadilhas. Muitos programadores, especialmente os juniores, cometem erros que podem atrasar seu progresso e dificultar o desenvolvimento de habilidades sólidas. No presente artigo, vamos explorar os 10 erros mais comuns que você deve evitar para acelerar sua evolução na programação.

  1. Querer aprender muitas tecnologias ao mesmo tempo
  2. Um dos maiores erros é tentar aprender várias tecnologias simultaneamente, seja por hype, influência de vídeos ou pressão do mercado. Isso dispersa o foco e dificulta a aprendizagem consistente. O ideal é concentrar-se em uma ou duas tecnologias no máximo para assimilar bem os conceitos e práticas.

  3. Ignorar os conceitos fundamentais
  4. Muitos iniciantes pulam os fundamentos da linguagem, como variáveis, funções e classes, buscando resultados rápidos e visíveis. Porém, entender a base é essencial para construir códigos sólidos e resolver problemas complexos no futuro.

  5. Ficar preso em problemas sem pedir ajuda
  6. Sentir-se obrigado a resolver tudo sozinho é um erro. A comunidade de programadores é vasta e cheia de recursos, fóruns e pessoas dispostas a ajudar. Pedir ajuda não é sinal de fraqueza, mas sim de inteligência e colaboração.

  7. Copiar e colar código sem entender
  8. Com a facilidade da Inteligência Artificial (IA) e a abundância de códigos na internet, muitos copiam e colam soluções sem compreender o que estão fazendo. Isso pode gerar problemas futuros, principalmente na hora de corrigir erros ou adaptar o código.

  9. Não usar controle de versionamento
  10. Git é uma ferramenta de versionamento essencial no mercado de trabalho e para projetos pessoais. Não dominar o básico do Git é um erro grave que pode comprometer sua organização e colaboração em equipes.

  11. Consultar muitos tutoriais sem praticar (Tutorial Hell)
  12. Assistir a dezenas de vídeos ou tutoriais sobre o mesmo tema sem colocar a mão na massa é improdutivo. O aprendizado real vem da prática: testar, escrever e refatorar código constantemente.

  13. Ignorar as melhores práticas
  14. Programar "do seu jeito" sem considerar padrões e boas práticas resulta em código bagunçado, difícil de manter e inseguro. Aprender com o trabalho de outros desenvolvedores experientes é fundamental para escrever código limpo e eficiente.

  15. Comparar seu processo de aprendizagem com o dos outros
  16. Cada pessoa tem seu ritmo e estilo de aprendizado. Comparar-se com colegas pode gerar ansiedade e desmotivação. Foque no seu progresso e celebre suas conquistas pessoais.

  17. Desvalorizar a documentação
  18. Criar e manter documentação clara, comentários no código e explicações sobre o funcionamento das aplicações é parte do trabalho do programador. Ignorar isso pode dificultar a manutenção e o trabalho em equipe.

  19. Desistir diante das dificuldades
  20. Programar é resolver problemas diariamente. Se você está travado há dias, a solução não é desistir, mas buscar ajuda, revisar o código e persistir. A resiliência é uma qualidade essencial para qualquer desenvolvedor.

Considerações finais

Errar faz parte do processo de aprendizado, mas reconhecer esses erros e corrigi-los rapidamente é o que diferencia um bom desenvolvedor de alguém que ficará estagnado. Além dos pontos citados, vale reforçar uma observação muito importante: escolher o sistema operacional errado para desenvolver pode limitar seu crescimento técnico.

Muitos iniciantes utilizam o Windows como sistema operacional principal, ignorando que a grande maioria dos ambientes de produção em servidores utiliza Linux. Trabalhar diretamente em um ambiente semelhante ao de produção desde o início vai facilitar a familiarização com o terminal, permissões de arquivo, estrutura de diretórios, deploys e ferramentas amplamente utilizadas no mundo real (como Docker, Git, Nginx, entre outros). Isso não significa que o Windows não seja uma boa estação de trabalho para outras finalidades, mas se o seu objetivo é se tornar um desenvolvedor back-end, DevOps, ou trabalhar com cloud e infraestrutura, não utilizar Linux é um erro estratégico que pode te atrasar muito no mercado de trabalho.

O importante é lembrar que a carreira de desenvolvimento é uma maratona, não uma corrida de 100 metros. Foque no aprendizado constante, evite os erros mais comuns e, principalmente, busque se aproximar ao máximo do ambiente real onde suas aplicações irão executar.

Se você evitar esses deslizes, com certeza terá uma base sólida para crescer na carreira de forma consistente e profissional.

Participe dos nossos grupos no Telegram:

Programadores Brasil Dicas, vagas, tecnologia e networking.

Linux Para Todos Aprendizado e suporte para quem quer migrar ou dominar o Linux no dia a dia do desenvolvimento.

Feito!

sexta-feira, 30 de maio de 2025

O Segredo dos Programadores de Sucesso

Nos últimos anos, a comunidade de programadores tem se concentrado quase exclusivamente nas habilidades técnicas: dominar frameworks modernos, linguagens da moda, arquiteturas complexas e técnicas avançadas. Muitos acreditam que isso é o que diferencia um programador júnior de um pleno ou sênior. No entanto, essa visão é uma armadilha que pode limitar o crescimento profissional.

A Importância das Soft Skills

Apesar de acumular conhecimento técnico por anos, muitos programadores perdem grandes oportunidades para colegas menos técnicos, mas mais habilidosos em habilidades interpessoais, as chamadas Soft Skills. Essas habilidades não técnicas são fundamentais para o sucesso na carreira, especialmente em um mercado onde a Inteligência Artificial (IA) avança rapidamente, automatizando tarefas técnicas.

Enquanto a IA pode gerar código e automatizar processos repetitivos, ela não substitui a capacidade humana de interação, tomada de decisões e influência no ambiente de trabalho. É justamente aí que as soft skills fazem a diferença.

As Três Soft Skills Essenciais para Programadores

  1. Comunicação Persuasiva
  2. Saber comunicar o valor das suas ideias é crucial. Por exemplo, ao propor uma refatoração de código, não adianta focar apenas nos aspectos técnicos. É preciso mostrar para a gestão o impacto positivo que isso terá nos resultados do negócio, usando gatilhos emocionais como:

    Urgência: Mostrar que a inação pode gerar custos maiores e perda de confiança dos clientes.

    Ganância: Demonstrar que o investimento trará maior agilidade e lucro no futuro.

    Essa abordagem conecta a linguagem técnica com a visão estratégica da empresa, aumentando as chances de ser ouvido e ter suas propostas aceitas.

  3. Cuidar da aparência, mesmo no Home Office
  4. A forma como você se apresenta influencia diretamente a percepção das pessoas sobre você e também a sua própria mentalidade. Estudos mostram que pessoas que se vestem melhor têm mais confiança, tomam decisões mais assertivas e são vistas como líderes. Não é necessário usar terno e gravata, mas sim transmitir profissionalismo e preparo, mesmo trabalhando de casa.

  5. Saber lidar com pessoas
  6. A habilidade mais importante de todas é a capacidade de se relacionar bem com colegas, gestores e clientes. Pesquisas indicam que 85% do sucesso profissional está ligado à competência interpessoal, enquanto apenas 15% depende do conhecimento técnico.

    Programadores que dominam essa habilidade conseguem construir relações de confiança, resolver conflitos e influenciar positivamente o ambiente, abrindo portas para promoções e melhores oportunidades.

Considerações finais

Na era da inteligência artificial, o diferencial do programador não está apenas no domínio técnico, mas principalmente nas Soft Skills. Desenvolver comunicação persuasiva, cuidar da aparência e aprender a lidar com pessoas são passos essenciais para se destacar e alcançar o sucesso profissional.

Invista nessas habilidades e veja sua carreira!

Se quiser se aprofundar, recomendo os livros Gatilhos Mentais e Como Fazer Amigos e Influenciar Pessoas para aprimorar sua comunicação e relacionamento interpessoal.

Feito!

sexta-feira, 23 de maio de 2025

Entendendo a anotação @Transient no Hibernate

Se você já trabalhou com Hibernate ou JPA, é provável que tenha se deparado com a anotação @Transient. Embora simples, seu uso adequado evita persistir dados desnecessários e pode te livrar de uma dor de cabeça lá na frente.

No presente artigo, vamos entender o propósito da anotação @Transient, quando e por que usá-la, e ver um exemplo prático com Hibernate.

O que é @Transient?

A anotação @Transient indica que um determinado campo de uma entidade não deve ser persistido no banco de dados. Ou seja, o Hibernate (ou qualquer implementação JPA) irá ignorar esse campo no momento de salvar ou atualizar a entidade.

É equivalente ao uso da palavra-chave transient do Java, mas no contexto da persistência ORM.

Por que usar @Transient

Algumas situações comuns onde @Transient se torna útil:

  • Campos calculados: Você quer exibir um valor derivado de outros campos, mas não precisa armazená-lo no banco.
  • Campos auxiliares: Dados que são úteis apenas em tempo de execução, como flags de controle ou estruturas temporárias.
  • Evitar dados desnecessários: Ajuda a manter seu modelo de dados enxuto e evita redundância.

Exemplo prático

Vamos imaginar uma entidade Produto que calcula seu valor com desconto apenas em tempo de execução:


import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "TB01_PRODUTO")
@Getter
@Setter
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String nome;

    private Double preco;

    private Double desconto;

    @Transient
    private Double precoFinal;

    
    public Double getPrecoFinal() {
        if (preco != null && desconto != null) {
            return preco - (preco * desconto);
        }
        return preco;
    }
}

Nesse exemplo:

  • O campo precoFinal não será criado na tabela produto.
  • Ele é útil apenas para retorno em uma API ou exibição na UI (User Interface).
  • Ele é calculado dinamicamente sempre que for chamado.

Obervações:

  • Se você esquecer o @Transient e o campo não tiver um setter, o Hibernate pode lançar exceções.
  • @Transient é da JPA, não confundir com transient do Java, que é usado para serialização de objetos Java (por exemplo, em Serializable).

Considerações finais:

A anotação @Transient é uma daquelas ferramentas simples que, quando bem usadas, deixam seu modelo limpo, objetivo e mais alinhado com as boas práticas de arquitetura.

Se um campo não precisa ser persistido, não insista em forçar sua presença no banco. Use @Transient e mantenha a clareza do seu modelo.

Feito!

quarta-feira, 21 de maio de 2025

A desculpa perfeita que alimenta o microgerenciamento

Você já participou de uma reunião de planejamento de Sprint e estimou que uma tarefa levaria dois dias para ser concluída, mas, na prática, ela acabou demorando mais? E quando isso acontece, você sente aquela cobrança silenciosa, como se tivesse assumido um compromisso fixo? Se sim, você não está sozinho, essa é uma situação muito comum no desenvolvimento de software.

O Problema das estimativas como prazos fixos

No mundo do desenvolvimento, estimar é tentar prever o futuro, ou seja, chutar quanto tempo ou esforço uma tarefa vai demandar. Por natureza, toda estimativa envolve incerteza e deve ser vista como uma aproximação, não como um compromisso rígido. Porém, muitos gestores e culturas empresariais distorcem esse conceito, tratando estimativas como prazos fixos que precisam ser cumpridos a qualquer custo.

Esse erro gera um ambiente tóxico, onde o time sofre cobranças veladas e o microgerenciamento se instala. A falsa sensação de controle que as estimativas trazem para a gestão acaba prejudicando a produtividade e a qualidade do código produzido.

Por que estimativas de software estão sempre erradas?

  1. Software é intangível e vivo:
  2. Diferente de uma linha de produção industrial, o desenvolvimento de software é um processo dinâmico, cheio de variáveis técnicas, mudanças e imprevistos que não podem ser medidos ou controlados com precisão.

  3. Falácia do planejamento:
  4. Nosso cérebro cria um "filme mental" perfeito da tarefa, ignorando problemas, bugs e interrupções. Isso faz com que a estimativa seja otimista demais, sem considerar os imprevistos reais.

  5. Lei de Hofstadter:
  6. Mesmo quando você tenta ser realista e adiciona uma "gordurinha" no tempo estimado, a tarefa ainda vai levar mais tempo do que o previsto, porque sempre há algo desconhecido que atrasa.

  7. Lei de Parkinson:
  8. O trabalho se expande para preencher todo o tempo disponível. Se você tem cinco dias para uma tarefa que poderia levar dois, é provável que você procrastine ou invista tempo desnecessário, atrasando a entrega.

  9. Lei da trivialidade (Bike Shedding):
  10. As equipes gastam mais tempo discutindo detalhes simples e fáceis do que enfrentando os problemas complexos, o que distorce a estimativa geral e prejudica o andamento da Sprint.

O Triângulo de ferro e a qualidade do software

O triângulo de ferro da gestão de projetos mostra que só é possível fixar duas variáveis entre escopo, prazo e orçamento, a terceira sempre cede. Quando gestores travam todas as três, a qualidade do software é a variável sacrificada, resultando em código ruim, testes negligenciados e sistemas instáveis.

Como se posicionar diante dessa realidade?

  • Reforce que estimativas são aproximações, não compromissos:
  • Use uma linguagem que deixe claro o grau de incerteza.

  • Recuse escopos com prazos fixos sem negociação:
  • Pergunte qual variável do triângulo de ferro será ajustada.

  • Entenda que você não é adivinho:
  • Seu papel é resolver problemas, não prever o futuro.

  • Busque ambientes que valorizem a qualidade e respeitem o time:
  • Não aceite cobranças injustas que prejudiquem seu trabalho e bem-estar.

Se você já passou por situações assim, sabe o quanto é importante mudar essa cultura para garantir entregas mais realistas, menos estresse e software de qualidade. Afinal, estimativas são ferramentas para planejamento, não correntes que prendem o time.

Feito!

quarta-feira, 14 de maio de 2025

Por que fundamentos são essenciais antes de confiar na Inteligência Artificial?

A Inteligência Artificial (IA) tem revolucionado o desenvolvimento de software, oferecendo desde autocompletar de código até geração automática de trechos complexos. Ferramentas como GitHub Copilot, ChatGPT e outras assistentes de programação tornaram-se aliadas para desenvolvedores, aumentando produtividade e criatividade. Porém, há um ponto crucial que muitos iniciantes ignoram: não basta usar IA, é fundamental ter uma base sólida de fundamentos para interpretar e validar as respostas geradas.

Por que o desenvolvedor iniciante não deve depender cegamente da IA?

A IA é uma ferramenta, não uma fonte infalível de verdade. Ela gera respostas com base em padrões e dados que “viu” durante o treinamento, mas não tem consciência, nem entendimento real do código, contexto ou melhores práticas atuais. Para um desenvolvedor que ainda não domina os fundamentos, isso pode ser perigoso por vários motivos:

  • Respostas incorretas ou incompletas: A IA pode sugerir soluções que parecem plausíveis, mas contêm erros sutis, vulnerabilidades de segurança ou práticas ruins.
  • Falta de discernimento: Sem conhecimento técnico, o dev pode aceitar código errado ou ineficiente sem perceber.
  • Dependência excessiva: Usar IA como muleta impede o aprendizado profundo e o desenvolvimento do raciocínio lógico necessário para resolver problemas complexos.
  • Dificuldade em elaborar prompts eficazes: Para extrair o melhor da IA, é preciso saber formular perguntas claras e específicas, algo que só vem com experiência e entendimento do domínio.

A importância da base de fundamentos para usar IA com inteligência

Antes de iniciar no uso de IA para codificação, o desenvolvedor deve investir tempo para:

  • Aprender lógica de programação: Entender estruturas de controle, algoritmos, manipulação de dados.
  • Conhecer a linguagem e o ecossistema: Sintaxe, bibliotecas, frameworks, boas práticas.
  • Estudar arquitetura e design de software: Para avaliar se o código gerado é escalável, modular e sustentável.
  • Testar e debugar: Saber identificar erros, interpretar mensagens de erro e corrigir bugs.
  • Segurança e performance: Ter noções básicas para não aceitar código vulnerável ou ineficiente.

Com essa base, o desenvolvedor consegue analisar criticamente o que a IA sugere, adaptar o código ao contexto real e aprender com as sugestões.

Como elaborar um prompt assertivo para IA no desenvolvimento

Para obter respostas úteis e precisas da IA, o prompt (a pergunta ou comando que você envia) deve ser bem estruturado. Um prompt eficaz deve conter:

  1. Objetivo claro: Explique o que deseja alcançar.
  2. Ação específica: O que quer que a IA faça - gerar código, explicar um conceito, corrigir um erro.
  3. Tecnologias envolvidas: Linguagem de programação, frameworks, bibliotecas, versão, etc.
  4. Contexto: Detalhes do problema, ambiente, restrições.
  5. Exemplo ou formato esperado: Se possível, forneça um exemplo ou descreva o formato da resposta que deseja.
  6. Limitações ou requisitos adicionais: Por exemplo, foco em performance, segurança, legibilidade.

Exemplo de prompt assertivo

Preciso de um código em Python 3.10 que leia um arquivo CSV contendo dados de vendas, filtre apenas as vendas acima de R$ 1000 e gere um relatório em JSON. O código deve usar a biblioteca pandas e ser eficiente para arquivos com até 100 mil linhas.

Esse prompt é claro, específico, define tecnologias e objetivos, facilitando que a IA entregue uma resposta útil.

Considerações finais

A Inteligência Artificial é uma ferramenta transformadora no desenvolvimento de software, mas não substitui o conhecimento fundamental. Para tirar o máximo proveito dela, o desenvolvedor precisa primeiro dominar os conceitos básicos, para saber avaliar a qualidade das respostas e formular prompts claros e objetivos. Assim, a IA deixa de ser uma "caixa preta" e se torna uma parceira poderosa no processo criativo e produtivo do desenvolvimento de software.

Se você está começando, invista tempo nos fundamentos. Use a IA como um complemento, não como um atalho. Essa é a chave para se tornar um desenvolvedor competente e preparado para o futuro.

Feito!

sexta-feira, 9 de maio de 2025

A Importância da cobertura de testes e da integração do SonarQube no ciclo de vida de um projeto

Em projetos de software, a busca por qualidade e confiabilidade deve ser constante. Muitas vezes, o time foca em entregar funcionalidades rapidamente, mas negligencia práticas essenciais que garantem a manutenção saudável do código a médio e longo prazo. Duas dessas práticas são: cobertura de testes automatizados e integração com ferramentas de análise estática como o SonarQube.

Por que se preocupar com cobertura de testes?

Testes automatizados, sejam unitários, de integração ou de ponta a ponta, têm um papel fundamental: garantir que o comportamento esperado da aplicação se mantenha ao longo do tempo. A cobertura de testes, por sua vez, é uma métrica que indica qual parte do código está sendo exercitada pelos testes.

Embora uma cobertura de 100% não signifique código 100% livre de bugs, uma baixa cobertura é um sinal de alerta. Código sem testes está mais propenso a falhas quando sofre alterações, principalmente em times grandes, onde o conhecimento sobre determinadas áreas do sistema nem sempre é compartilhado.

Benefícios diretos da cobertura de testes

  • Redução de regressões: mudanças não quebram funcionalidades existentes.
  • Facilidade de refatoração: refatorar com testes confiáveis é como ter uma rede de segurança.
  • Documentação viva: bons testes explicam como o sistema deve se comportar.
  • Mais confiança na entrega contínua: possibilita integração e deploy frequentes.

SonarQube: seu aliado na saúde do código

O SonarQube é uma ferramenta de análise estática que ajuda a monitorar a qualidade do código-fonte. Ele aponta bugs, code smells, vulnerabilidades e cobertura de testes. Quando integrado a um pipeline de CI/CD (Jenkins, GitHub Actions, GitLab CI, Azure DevOps), ele se torna um gate de qualidade.

Vantagens de integrar o projeto com o SonarQube:

  • Visibilidade clara de pontos fracos no código.
  • Monitoramento da cobertura de testes e da dívida técnica.
  • Padronização de boas práticas e convenções de código.
  • Alertas em tempo real de violações críticas de qualidade.
  • Feedback imediato ao time durante pull requests.

Com o SonarQube, não se trata apenas de "escrever código que funciona", mas sim de escrever código limpo, seguro e sustentável.

Estratégia prática: como começar

  1. Crie uma suíte mínima de testes automatizados: Comece testando as partes críticas da aplicação.
  2. Adote TDD sempre que possível: Isso impulsiona a escrita de código testável.
  3. Integre o SonarQube no seu pipeline (ex: Jenkins, GitHub Actions, GitLab CI).
  4. Defina métricas mínimas aceitáveis de cobertura e qualidade (por exemplo, 40% de cobertura mínima e zero bugs críticos).

Promova uma cultura de qualidade: Revisões de código devem considerar a cobertura e o feedback do SonarQube.

Considerações finais

Desenvolver sem testes é como construir um prédio sem fundações. E seguir sem análise de qualidade contínua é não perceber as rachaduras que surgem no caminho. A integração de testes automatizados com o SonarQube traz uma cultura de qualidade que não só beneficia a equipe de desenvolvimento, mas toda a organização, entregando valor de forma contínua, sustentável e segura.

Testar é responsabilidade de todos os desenvolvedores e QAs. Monitorar a qualidade também.

Feito!

terça-feira, 29 de abril de 2025

O Fim do começo: Como construir sua carreira com desenvolvedor de software

Antes de continuar com este artigo, que tal dar uma passada nos anteriores?

👉 Parte 1: Por onde começar na programação?

👉 Parte 2: O que fazer para evoluir como programador?

Se você já estudou, praticou e está se sentindo mais confiante, este é o momento certo para refletir:

💭 Você já chegou no ponto onde queria como programador iniciante?

Se a resposta for "sim", então bora dar o próximo passo!

Se você chegou até aqui, estudou lógica, aprendeu uma linguagem, praticou, dominou Git, banco de dados, frameworks, construiu projetos e montou seu portfólio. Parabéns! Você já percorreu a trilha que separa o iniciante do programador profissional.

Mas a verdade é: esse é só o fim do começo. A partir daqui, a jornada muda.

Agora não é mais só sobre estudar cursos e fazer exercícios. Agora é sobre construir sua carreira, se desenvolver como profissional e crescer como programador.

Vamos falar sobre os próximos passos que vão fazer a diferença real no seu futuro.

  1. Aprenda a aprender sozinho
  2. A habilidade mais importante a partir daqui não é uma linguagem, um framework ou uma certificação.

    É a capacidade de aprender sozinho.

    Como fazer isso na prática:

    • Leia documentações oficiais (mesmo que no começo pareça difícil).
    • Busque soluções antes de pedir ajuda — pratique o "aprender pesquisando".
    • Entenda que errar faz parte do processo de aprendizado.
    • Siga a filosofia: "não decore, entenda".

    O que muda:

    Você vai parar de depender de cursos mastigados e se tornar capaz de se adaptar a qualquer tecnologia, linguagem ou desafio novo.

  3. Continue evoluindo com projetos mais desafiadores
  4. No início, a maioria dos projetos são clones simples ou listas de tarefas.

    Agora, o desafio é criar projetos mais próximos do mundo real.

    Exemplos de novos projetos:

    • Sistema de autenticação de usuários com login social (Google, Facebook, Instagram, Twitter/X).
    • Dashboard com gráficos dinâmicos consumindo APIs.
    • Aplicativo com persistência offline (por exemplo, PWA).
    • E-commerce completo, com carrinho de compras, pagamento e painel administrativo.

    O que muda:

    Você vai aprender sobre problemas reais: segurança, performance, usabilidade, escalabilidade. Essas experiências contam muito em entrevistas e na prática profissional.

  5. Aprenda sobre boas práticas de código
  6. Agora que você já consegue fazer os projetos funcionarem, o próximo nível é fazer bem feito.

    O que estudar:

    • Clean Code:
    • Escrever código claro e legível.

    • SOLID Principles:
    • Para estruturar sistemas mais robustos e fáceis de manter.

    • Design Patterns:
    • Soluções comuns para problemas recorrentes no desenvolvimento.

    • Arquitetura de Software:
    • MVC, camadas, separação de responsabilidades.

    O que muda:

    Seu código deixa de ser apenas funcional e passa a ser profissional. Isso é o que diferencia júnior de pleno, pleno de sênior.

  7. Comece a estudar testes de software
  8. Poucos iniciantes dão atenção a isso e quem aprende cedo, se destaca muito.

    O que aprender:

    • Testes unitários (testar funções isoladas).
    • Testes de integração (testar diferentes partes do sistema juntas).
    • Testes end-to-end (testar o sistema como o usuário final).

    Ferramentas para começar:

    • Jest (JavaScript)
    • JUnit (Java)
    • PyTest (Python)
    • PHPUnit/Pest (PHP)

    O que muda:

    Além de entregar projetos que funcionam, você entrega projetos confiáveis e com menos bugs.

  9. Desenvolva habilidades além da técnica
  10. Ser um bom programador não é só saber programar.

    É também saber se comunicar, trabalhar em equipe e resolver problemas.

    O que melhorar:

    • Comunicação:
    • Saber explicar seu raciocínio e suas soluções.

    • Trabalho em equipe:
    • Saber colaborar em projetos e respeitar o código dos outros.

    • Gestão de tempo:
    • Saber priorizar e entregar no prazo.

    • Resiliência:
    • Saber lidar com problemas e frustrações sem desistir.

    O que muda:

    Você se torna um profissional completo: O tipo que as empresas procuram e que faz a diferença em projetos de verdade.

  11. Planeje sua carreira (mesmo que pareça cedo)

    Agora é a hora de pensar:

    Quero ser Front-end, Back-end ou Full-Stack?

    Quero focar em mobile, dados, inteligência artificial, jogos?

    Prefiro empresas grandes, startups ou ser freelancer?

    Dicas para se planejar:

    • Estude o mercado (LinkedIn, Glassdoor, Indeed, GeekHunter).
    • Pesquise salários e requisitos para a vaga dos seus sonhos.
    • Trace um plano de curto, médio e longo prazo.
    • Continue se atualizando, porque tecnologia muda o tempo todo.

Considerações finais: Agora é com você

A verdade é que ninguém "termina de aprender programação".

É uma jornada contínua.

Sempre haverá uma nova linguagem, um novo framework, uma nova forma de pensar sistemas.

A diferença agora é que você tem as ferramentas para caminhar sozinho.

Você saiu do "por onde começar", passou por "como evoluir" e agora está pronto para construir uma carreira real em tecnologia.

A partir daqui:

✅ Você já não é mais iniciante.

✅ Você já é um desenvolvedor em construção.

✅ Você tem as bases certas para crescer o quanto quiser.

E lembre-se: a jornada é longa, mas quem continua estudando, praticando e se desafiando, chega lá. Sempre.

Feito!

sexta-feira, 25 de abril de 2025

Já saiu do básico? O que fazer agora para evoluir como programador?

Se você chegou até aqui, parabéns! Muita gente desiste nos primeiros meses, então só de já ter estudado lógica, aprendido uma linguagem e feito alguns projetos, você já está na frente de muita gente.

Mas e agora? Como sair do nível iniciante e começar a programar de verdade?

O próximo passo não é aprender uma nova linguagem aleatória ou decorar frameworks sem necessidade. Agora é hora de consolidar seu conhecimento e se tornar um programador capaz de resolver problemas reais.

Então, bora para o guia prático!

  1. Fortaleça sua base: Estruturas de Dados e Algoritmos
  2. Agora que você já entende o básico de programação, está na hora de se aprofundar em conceitos mais técnicos que fazem diferença de verdade no seu código.

    O que aprender agora?

    • Listas, pilhas e filas
    • Conjuntos e mapas (dicionários)
    • Árvores e grafos (conceitos básicos)
    • Algoritmos de busca e ordenação
    • Complexidade de algoritmos (Big O Notation)

    Por que isso é importante?

    Dominar esses conceitos ajuda a escrever código mais eficiente e te dá uma base forte para resolver problemas, o que é essencial para entrevistas de emprego e desafios reais do dia a dia.

    • LeetCode
    • HackerRank
  3. Aprenda Git e versionamento de código
  4. Se você já fez alguns projetos, agora é a hora de parar de trabalhar sozinho e começar a pensar como um desenvolvedor de verdade.

    O que aprender?

    O básico do Git (commit, branch, merge, pull request)

    Como usar GitHub ou GitLab

    Criar repositórios e contribuir com projetos open source

    Por que isso é importante?

    Porque nenhuma empresa desenvolve software sem controle de versão. Git é um requisito essencial para qualquer programador profissional.

    Onde aprender:

    GitHub Docs
  5. Comece a estudar bancos de dados
  6. A maioria dos sistemas que você usou hoje (seja Instagram, YouTube ou um e-commerce) usa bancos de dados para armazenar informações. Então, se você quer criar algo realmente útil, precisa aprender a lidar com dados.

    O que aprender?

    • SQL: como criar, buscar e modificar dados
    • Diferentes tipos de bancos de dados (relacionais e não relacionais)
    • Como conectar sua aplicação ao banco de dados

    Por que isso é importante?

    Porque qualquer aplicação real precisa armazenar e recuperar informações. Mesmo que você trabalhe só com front-end, entender como os dados são manipulados no back-end vai te tornar um dev muito mais completo.

    Onde estudar:

    Playlist do Curso de Modelagem de Dados da Bóson Treinamentos no Youtube

  7. Domine um framework da sua linguagem
  8. Agora que você já sabe programar, usar um framework pode acelerar seu desenvolvimento e te ajudar a criar aplicações mais robustas.

    Qual framework escolher?

    Depende da sua linguagem e do que você quer fazer:

    • Para web:
    • Python => Django ou Flask

      JavaScript => React (frontend) Angular (frontendp>

      PHP => Laravel

      Java => Spring e/ou Quarkus

    • Para mobile:
    • Flutter (Dart)

      React Native (JavaScript)

    • Para desktop:
    • Electron (JavaScript)

      PyQt (Python)

      Java => JavaFX

    Por que isso é importante?

    Empresas usam frameworks para padronizar o código e acelerar o desenvolvimento. Saber um framework te coloca na frente de muita gente na busca por emprego.

    Onde estudar:

    [Documentação oficial do framework escolhido]

    FreeCodeCamp

  9. Resolva problemas reais (e publique seus projetos)
  10. Agora que você já sabe programar, sua missão é resolver problemas reais.

    O que fazer agora?

    • Construa algo que você realmente usaria
    • Participe de hackathons e desafios de programação
    • Contribua com projetos open source
    • Ajude outras pessoas em fóruns e comunidades

    Por que isso é importante?

    Porque empresas contratam pessoas que sabem resolver problemas, não quem só segue tutoriais. Criar projetos do zero te ensina mais do que qualquer curso.

    Onde encontrar desafios e ideias?

    • Frontend Mentor
    • DevChallenges
    • Awesome Python Projects
  11. Construa seu portfólio e prepare seu LinkedIn
  12. Se o seu objetivo é entrar no mercado de trabalho, chegou a hora de organizar tudo que você aprendeu e mostrar para o mundo.

    O que fazer?

    ✅ Crie um portfólio com seus melhores projetos

    ✅ Deixe seu GitHub bem organizado

    ✅ Atualize seu LinkedIn e conecte-se com outros devs

    ✅ Faça networking e participe de eventos

    Dicas para se destacar:

    • Escreva artigos ou documente seus aprendizados
    • Participe de comunidades no LinkedIn, Twitter, Discord e Programadores Brasil no Telegram
    • Peça feedback sobre seus projetos

Considerações finais: o que fazer agora?

Agora você já tem uma trilha clara para sair do básico e se tornar um programador de verdade:

✅ Aprender Estruturas de Dados e Algoritmos

✅ Usar Git e versionamento de código

✅ Estudar bancos de dados

✅ Aprender um framework da sua linguagem

✅ Criar projetos reais e compartilhar no GitHub

✅ Construir um portfólio e LinkedIn profissional

Se você seguir esse caminho, vai estar muito mais preparado para entrar no mercado de trabalho e crescer como desenvolvedor.

Qual dessas etapas você já começou? Tem alguma dúvida ou quer dicas extras?

Feito!

quarta-feira, 23 de abril de 2025

Por onde começar na programação? Um guia sincero para iniciantes

Se você chegou até aqui, provavelmente já se fez a pergunta que aparece quase todo dia em grupos de programação:

"Quero aprender a programar, mas não sei por onde começar. Me ajuda?"

Antes de tudo: relaxa. Essa dúvida é mais comum do que parece. Todo mundo que hoje trabalha com desenvolvimento de software, inclusive eu, que estou escrevendo este artigo, já esteve exatamente nesse ponto. Com tanta informação espalhada por aí, é fácil se sentir perdido.

Então respira fundo e vem comigo. A ideia aqui não é te dar uma fórmula mágica (porque não existe), mas um norte claro e realista para começar do zero com programação.

  1. Entenda o que é programação (e o que você quer com ela)
  2. Antes de sair estudando qualquer linguagem, vale se perguntar:

    Você quer programar por hobby ou para trabalhar na área?

    Tem interesse por sites, aplicativos, jogos ou automação?

    Gosta mais da parte visual interface gráfica (Frontend) ou da lógica por trás das coisas (Backend)?

    Você não precisa saber tudo agora, mas pensar nisso te ajuda a focar melhor nos primeiros passos.

  3. Comece aprendendo lógica de programação
  4. Lógica é a base de tudo. É onde você vai aprender conceitos como:

    • Variáveis
    • Condições (if, else)
    • Laços de repetição (for, while)
    • Funções
    • Estruturas de dados (listas, arrays, objetos)
    • Ferramentas que ajudam:
    • Visualg (ótimo para quem prefere português)
    • Scratch (visual e divertido)
    • Qualquer linguagem simples como Python ou JavaScript
  5. Escolha sua primeira linguagem de programação
  6. Não existe a “melhor linguagem para começar”, mas algumas são mais amigáveis para quem está começando:

    Python: simples, direta, ótima para aprender lógica e automatizar tarefas.

    JavaScript: essencial se você quer criar sites e trabalhar com web.

    C, PHP, Java: se você pensa em seguir carreira acadêmica, concursos ou áreas como engenharia de software.

    Dica: escolha uma e vá até o fim, pelo menos no básico. Trocar de linguagem a cada semana só atrasa seu progresso.

  7. Entenda o básico de desenvolvimento web (mesmo que você não queira ser Frontend)
  8. Hoje em dia, muita coisa é executada na web. Aprender um pouco de HTML, CSS e JavaScript vai te ajudar a entender melhor como as coisas se conectam.

    Isso te dá uma noção prática de como os sites e sistemas funcionam por trás das cortinas.

  9. Pratique com projetos simples
  10. Programar é como aprender um idioma: você só aprende fazendo.

    Comece com pequenos desafios:

    • Calculadora simples
    • Calculo do Índice de Massa Corporal (I.M.C)
    • To-do list (lista de tarefas)
    • Jogo da adivinhação
    • Conversor de moedas
    • Conversor de temperaturas

    Dica: publique seus projetos no GitHub. Isso mostra sua evolução e te prepara para o mercado.

  11. Use boas fontes de aprendizado
  12. Evite depender só de vídeos aleatórios no YouTube. Escolha um bom curso ou plataforma confiável e siga o conteúdo até o fim.

    Plataformas que valem a pena:

    • Udemy
    • freeCodeCamp
    • AlgaWorks
    • Alura
    • Rocketseat
    • Youtube
  13. Faça parte da comunidade
  14. Perguntar em grupos é ótimo (e se você chegou aqui por isso, parabéns). Mas vá além:

    Programar pode parecer solitário, mas não precisa ser. Estar perto de quem está no mesmo barco ajuda muito.

  15. Aprenda a aprender
  16. Tecnologia muda o tempo todo. Mais importante que decorar comandos é saber onde procurar respostas (spoiler: Google, Stack Overflow, grupos de programação no Telegram).

    Desenvolva o hábito de resolver problemas sozinho, mas não tenha medo de pedir ajuda quando travar.

E por fim… não desista nas primeiras frustrações

Todo mundo trava. Todo mundo já se sentiu burro em algum momento. Mas isso faz parte do processo. Com o tempo, o que parecia impossível começa a fazer sentido.

Comece pequeno. Aprenda todo dia um pouco. E celebre cada conquista, por menor que seja.

Resumo prático para você começar hoje

  • ✅ Entenda o que quer com programação
  • ✅ Aprenda lógica (com ou sem linguagem)
  • ✅ Escolha uma linguagem simples (Python, JS)
  • ✅ Estude HTML/CSS (mesmo que seja por curiosidade)
  • ✅ Faça projetos simples
  • ✅ Pratique e compartilhe no GitHub
  • ✅ Participe da comunidade
  • ✅ Seja curioso e consistente

Se esse post te ajudou, salva aí ou compartilha com alguém que também está começando.

Se tiver dúvidas, manda nos comentários.

Feito!

terça-feira, 22 de abril de 2025

Guia completo de deploy com Docker e Docker Compose

Como containerizar aplicações e orquestrar múltiplos serviços de forma simples e escalável

O que é Docker?

Docker é uma plataforma que permite empacotar sua aplicação e todas as suas dependências em containers. Com ele, conseguimos criar ambientes portáveis, previsíveis e fáceis de replicar em qualquer lugar, seja na máquina do dev, no servidor ou na nuvem.

Pensa no container como uma mini máquina virtual superleve e isolada, rodando apenas o necessário para sua aplicação funcionar.

Por que usar Docker?

Elimina o "na minha máquina funciona"

Padroniza ambientes de desenvolvimento, staging e produção

Facilita o CI/CD

Escala horizontalmente de forma controlada

Dockerizando sua aplicação

Vamos usar um exemplo básico de uma API Node.js + Express.

Pode usar a sua API que você desenvolveu em Node.js com Express

  1. Estrutura de diretórios
  2. /meu-projeto
    │
    ├── Dockerfile
    ├── docker-compose.yml
    ├── package.json
    └── src/
        └── index.js
    
  3. Dockerfile
  4. 
    # Usa uma imagem base
    FROM node:18-alpine
    
    # Cria um diretório de trabalho
    WORKDIR /app
    
    # Copia os arquivos
    COPY package*.json ./
    RUN npm install
    
    COPY . .
    
    # Expõe a porta da aplicação
    EXPOSE 3000
    
    # Comando para iniciar o app
    CMD ["node", "src/index.js"]
    
    
  5. Docker Compose com MongoDB
  6. 
    version: '3.8'
    services:
      app:
        build: .
        ports:
          - "3000:3000"
        volumes:
          - .:/app
        depends_on:
          - mongo
        environment:
          - MONGO_URL=mongodb://mongo:27017/meubanco
    
      mongo:
        image: mongo:6
        container_name: mongodb
        ports:
          - "27017:27017"
        volumes:
          - mongo-data:/data/db
      
      mongo-express:
        image: mongo-express
        container_name: mongo-express
        ports:
          - "8081:8081"
        environment:
          ME_CONFIG_MONGODB_SERVER: mongo
          ME_CONFIG_BASICAUTH_USERNAME: admin
          ME_CONFIG_BASICAUTH_PASSWORD: admin
    
    volumes:
      mongo-data:
    
    
  7. Subindo os serviços
  8. No terminal, dentro do diretório do projeto:

    docker-compose up -d --build

Pronto! Sua API e o Mongo estão executando em containers separados, mas se comunicando em rede.

Testando

Acesse: http://localhost:3000 no Postman ou Insonmia para testar os endpoints da sua API REST com Node.js e Express

e http://localhost:8081 para acessar o Mongo Express, que é o cliente do MongoDB

Dicas de produção

  • Crie um .dockerignore para ignorar node_modules, .git, etc.
  • Use variáveis de ambiente no docker-compose.yml com arquivos .env
  • Utilize healthchecks para garantir que os serviços estejam realmente prontos
  • Adicione nginx como proxy reverso e certbot para HTTPS
  • Faça uso de volumes persistentes para bancos de dados
  • Considere usar Docker Swarm ou Kubernetes em ambientes que exigem alta escalabilidade
.dockerignore
node_modules
npm-debug.log
.git
.env
Dockerfile*
docker-compose*
Dockerfile (Produção)

# Etapa de build
FROM node:18-alpine as builder

WORKDIR /app
COPY package*.json ./
RUN npm install --production

COPY . .

# Etapa final
FROM node:18-alpine

WORKDIR /app

# Copia apenas o que foi instalado/built na etapa anterior
COPY --from=builder /app /app

# Define variáveis de ambiente
ENV NODE_ENV=production

EXPOSE 3000
CMD ["node", "src/index.js"]

docker-compose.prod.yml

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "80:3000"
    env_file:
      - .env
    depends_on:
      - mongo
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000"]
      interval: 30s
      timeout: 10s
      retries: 3
    restart: always
    volumes:
      - .:/app
      - /app/node_modules # evita conflito com o host

  mongo:
    image: mongo:6
    container_name: mongodb
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
    healthcheck:
      test: ["CMD", "mongosh", "--eval", 
             "db.adminCommand('ping')"]
      interval: 30s
      timeout: 10s
      retries: 5

volumes:
  mongo-data:

.env
MONGO_URL=mongodb://mongo:27017/meubanco
PORT=3000
NODE_ENV=production

Considerações finais

Docker e Docker Compose transformaram a forma como lidamos com deploys. Com uma configuração simples, conseguimos orquestrar múltiplos serviços, versionar ambientes, simular produção localmente e escalar nossas aplicações com segurança.

Quer começar? Pegue um projeto seu e faça o primeiro Dockerfile. Depois adicione um banco com docker-compose. Em pouco tempo, isso torna-se parte do seu workflow natural.

Feito!

segunda-feira, 21 de abril de 2025

Boas práticas de banco de dados: Modelagem, Índices e Normalização

Um sistema é tão robusto quanto seu banco de dados permite. Uma modelagem bem pensada, o uso correto de índices e uma normalização equilibrada fazem toda a diferença na performance e na integridade das informações. Neste artigo, vamos explorar boas práticas fundamentais para projetar e manter bancos de dados eficientes, escaláveis e confiáveis.

Modelagem de Dados: O alicerce de um sistema sólido

A modelagem de dados é o ponto de partida. Antes de pensar em tabelas ou código, é crucial entender o domínio do problema, as entidades envolvidas e como elas se relacionam.

Boas práticas:

Conheça os requisitos do negócio: converse com usuários e stakeholders antes de criar diagramas.

Use diagramas ER (Entidade-Relacionamento): ajudam a visualizar entidades, relacionamentos e cardinalidades.

Evite tabelas genéricas demais: tabelas como dados ou informacoes geralmente indicam má modelagem.

Pense na escalabilidade: considere desde o início se seu modelo vai aguentar milhões de registros.

Índices: Acelerando consultas com consciência

Índices são como atalhos para buscas. Quando bem utilizados, aumentam significativamente a performance de consultas. Quando mal utilizados, podem fazer exatamente o oposto.

Tipos comuns:

Índice único: garante unicidade (ex: CPF, e-mail).

Índice composto: abrange múltiplas colunas (ex: estado + cidade).

Índice parcial ou condicional: usado para otimizar queries que filtram por condições específicas.

Boas práticas:

Crie índices para colunas usadas em WHERE, JOIN, ORDER BY.

Evite excesso de índices: cada novo índice impacta na performance de inserções/atualizações.

Monitore com EXPLAIN: use ferramentas como EXPLAIN (MySQL/PostgreSQL) para entender o plano de execução.

Normalização: Estrutura sem Redundância

A normalização organiza os dados para evitar redundâncias e inconsistências. No entanto, o excesso dela pode impactar a performance, exigindo mais JOINs.

    Formas normais:

  • 1ª Forma Normal (1NF):
  • elimina atributos multivalorados.

  • 2ª Forma Normal (2NF):
  • separa dependências parciais (campos que dependem só de parte da chave primária).

  • 3ª Forma Normal (3NF):
  • elimina dependências transitivas (campo que depende de outro campo que depende da chave).

Quando desnormalizar?

Em sistemas de alta leitura (ex: dashboards), uma certa desnormalização pode ser estratégica para performance.

Use views, tabelas materializadas ou caching para evitar penalizar a modelagem principal.

Garantindo integridade dos dados

Integridade não é apenas validar CPF no frontend.

Boas práticas:

Use chaves estrangeiras: evitam registros órfãos.

Defina constraints (NOT NULL, UNIQUE, CHECK) sempre que possível.

Valide também no backend: regras de negócio não devem ficar apenas no banco.

Use transações: especialmente em operações críticas, como transferências bancárias.

Monitoramento e Manutenção

Banco de dados não é algo que se cria e esquece.

Mantenha:

Backups automatizados e testados.

Rotinas de análise e otimização de índices.

Auditoria e logs de alterações críticas.

Alertas de uso de espaço, lentidão de queries, bloqueios.

Considerações finais

Projetar um banco de dados eficiente vai além de criar tabelas. É preciso entender o negócio, antecipar gargalos e adotar práticas que protejam os dados e mantenham o sistema fluído. Uma boa modelagem aliada a índices inteligentes e uma normalização estratégica é a base de qualquer aplicação de sucesso.

Lembre-se: o banco de dados é o coração do seu sistema.

Feito!

domingo, 30 de março de 2025

Instalando o software IRPF 2025 no Linux

Procedimentos de instalação do software IRPF 2025 no Linux (qualquer distro)

Pré-requisitos:

Ter o openJDK 1.8 ou superior configurado no PATH do SO.

Copie a linha seguinte e cole no terminal da distribuição Linux que estiver usando ou clique no link https://www.gov.br/receitafederal/pt-br/centrais-de-conteudo/download/pgd/dirpf

Setar a permissão para execução

$ chmod +x IRPF2025Linux-x86_64v1.1.sh.bin

$ ./IRPF2025Linux-x86_64v1.1.sh.bin

Na primeira tela, clique no botão "Avançar"

Clique no botão "Avançar".

O próximo passo é escolher o diretório de instalação que deseja salvar, clique em "Avançar".

Confirme a instalação no botão "Avançar".

Por fim, clique no botão "Terminar".

Pronto, a instalação do IRPF2025 está concluída, poderá abrir no atalho que foi criado na área de trabalho. Também se preferir abrir o software IRPF2025 pelo terminal.

$ ~/ProgramasRFB/IRPF2025/irpf.jar

Agora, pode fazer a sua declaração do imposto de renda no Linux.

Após fazer a sua declaração e salvar o comprovante que fez a declaração do imposto de renda 2025, se quiser, pode desinstalar o software IRPF 2025.

Execute no terminal.

~/ProgramasRFB/IRPF2025/uninstall

Confirme o tipo de desinstalação (padrão ou completa), clique no botão "Avançar" e confirme.

Feito!

terça-feira, 25 de março de 2025

Comparação entre arquiteturas monolíticas, microsserviços e cliente-servidor: Qual escolher?

Na hora de projetar a arquitetura de um sistema, uma das decisões mais importantes é escolher a abordagem correta. Existem várias opções, mas as três mais comuns são as arquiteturas monolítica, microsserviços e cliente-servidor. Cada uma tem seus próprios benefícios e desafios, e entender suas características pode ajudar a escolher a solução mais adequada para o seu projeto.

Neste artigo, vamos explorar as principais diferenças entre essas arquiteturas, suas vantagens, desvantagens e os casos de uso ideais para cada uma delas.

Visão geral das arquiteturas

Arquitetura Monolítica

Uma arquitetura monolítica é uma abordagem em que todo o sistema (frontend, backend e banco de dados) está agrupado em um único projeto. Isso significa que todas as funcionalidades e componentes do sistema compartilham um mesmo código-base.

Arquitetura de Microsserviços

Em uma arquitetura de microsserviços, o sistema é dividido em serviços pequenos e independentes, cada um com sua própria funcionalidade e banco de dados. Esses serviços se comunicam entre si por meio de APIs (geralmente REST ou gRPC), permitindo que partes do sistema sejam escaladas e desenvolvidas de maneira independente.

Arquitetura Cliente-Servidor

A arquitetura cliente-servidor separa as responsabilidades entre o cliente, que é responsável pela interface e interação com o usuário, e o servidor, que gerencia a lógica de negócios e armazenamento de dados. O cliente se comunica com o servidor por meio de requisições HTTP ou WebSockets, o que permite que o frontend e o backend estejam desacoplados.

Comparação direta: Monolítico vs. Microsserviços vs. Cliente-Servidor



Critério Monolítico Microsserviços Cliente-Servidor
Complexidade de desenvolvimento Baixa, pois tudo está em um único código-base. Alta, pois cada serviço é independente e requer mais integração. Moderada, o backend pode ser desenvolvido separadamente do frontend.
Escalabilidade Escalabilidade limitada, pois a aplicação inteira é escalada como uma unidade. Escalabilidade independente por serviço, cada serviço pode ser escalado conforme a demanda. Escalabilidade do servidor, geralmente simples para sistemas de pequeno porte.
Desempenho Bom desempenho, mas limitações em sistemas maiores. Potencial de alto desempenho, mas pode sofrer com latência devido à comunicação entre serviços. Depende da implementação do servidor, simples de otimizar.
Manutenção Dificuldade crescente à medida que a aplicação cresce, pois tudo está interligado. Facilidade de manutenção, já que cada serviço pode ser atualizado sem afetar os outros. Fácil de manter se os sistemas de backend e frontend forem bem separados.
Testabilidade Mais difícil de testar devido à complexidade de tudo estar no mesmo código-base. Facilita o teste de serviços de maneira isolada. Testes independentes para o cliente e servidor, o que facilita o processo.
Flexibilidade Baixa, alterações exigem modificações em todo o sistema. Alta, cada serviço pode ser desenvolvido com a tecnologia mais adequada. Alta, permite escolher tecnologias diferentes para frontend e backend.
Casos de uso ideais Pequenos sistemas com pouca necessidade de escalabilidade. Grandes sistemas distribuídos, onde cada parte precisa ser escalada e gerida de forma independente. Sistemas com frontend desacoplado, como aplicações web modernas e APIs RESTful.


Vantagens e desafios de cada arquitetura

Monolítica

Vantagens:

  • Simplicidade:
  • Como tudo está em um único projeto, a configuração inicial e o desenvolvimento são mais simples.

  • Facilidade de implementação:
  • Ideal para projetos pequenos ou MVPs, onde a agilidade é mais importante que a escalabilidade.

  • Menos complexidade operacional:
  • Não há a necessidade de gerenciar múltiplos serviços, tornando a infraestrutura mais simples.

Desafios:

  • Escalabilidade limitada:
  • A escalabilidade precisa ser feita como um todo, o que pode ser ineficiente para sistemas maiores.

  • Desempenho:
  • Em sistemas grandes, o desempenho pode cair à medida que a aplicação cresce.

  • Manutenção e atualizações:
  • À medida que a aplicação cresce, fica mais difícil de manter e atualizar, já que mudanças podem afetar o sistema inteiro.

Microsserviços

Vantagens:

  • Escalabilidade:
  • Cada serviço pode ser escalado de forma independente, o que torna a arquitetura ideal para sistemas grandes e complexos.

  • Flexibilidade:
  • Cada microsserviço pode ser desenvolvido usando a melhor tecnologia para o seu propósito.

  • Facilidade de manutenção:
  • Como os microsserviços são independentes, é possível atualizar, corrigir ou melhorar um serviço sem impactar os outros.

Desafios:

  • Complexidade operacional:
  • Exige mais esforço para configurar e monitorar a comunicação entre os serviços.

  • Gerenciamento de estado:
  • Em uma arquitetura de microsserviços, gerenciar o estado global pode ser um desafio, já que cada serviço tem seu próprio banco de dados.

  • Custo:
  • A necessidade de infraestrutura mais complexa e o uso de múltiplas tecnologias podem gerar custos mais altos.

Cliente-Servidor

Vantagens:

  • Desacoplamento:
  • Frontend e Backend são independentes, o que facilita a manutenção e a escalabilidade de cada parte.

  • Tecnologias independentes:
  • Permite o uso de diferentes tecnologias para o frontend e o backend, de acordo com a necessidade de cada parte.

  • Escalabilidade do Backend:
  • O servidor pode ser escalado conforme a demanda, sem afetar a interface do usuário.

Desafios:

  • Dependência de conexão de rede:
  • A comunicação entre o cliente e o servidor depende de uma rede estável, o que pode impactar a performance em alguns cenários.

  • Gerenciamento de sessão:
  • Manter a sessão do usuário entre o cliente e o servidor pode ser desafiador, especialmente em sistemas mais complexos.

Qual escolher?

A escolha da arquitetura depende dos requisitos do seu projeto:

Arquitetura Monolítica é ideal para projetos pequenos, MVPs e equipes com menos experiência em arquiteturas distribuídas. Se a escalabilidade não for um problema imediato, esta abordagem oferece rapidez no desenvolvimento.

Arquitetura de Microsserviços é indicada para sistemas grandes, complexos ou com a necessidade de alta escalabilidade. Se você precisar de flexibilidade tecnológica e agilidade para implementar e manter diferentes partes do sistema de maneira independente, os microsserviços são a melhor opção.

Arquitetura Cliente-Servidor é adequada para sistemas web modernos onde o frontend precisa ser desacoplado do backend. Ideal para aplicações que utilizam APIs RESTful ou GraphQL, com a vantagem de permitir a escolha independente das tecnologias para cada camada do sistema.

Considerações finais

Não existe uma solução única para todos os cenários. Cada arquitetura tem seus pontos fortes e desafios, e a escolha ideal vai depender do tamanho e da complexidade do projeto, da experiência da equipe, e das necessidades de escalabilidade e manutenção do sistema. Ao entender as vantagens e limitações de cada abordagem, você estará mais preparado para tomar a melhor decisão para o seu próximo projeto!

Qual dessas arquiteturas você prefere? Deixe seu comentário abaixo!

Feito!

quarta-feira, 19 de março de 2025

Instruções de entrega do IRPF 2025

O prazo de entrega da Declaração Anual do Imposto de Renda Pessoa Física (IRPF) 2025, ano-calendário 2024, começou nesta segunda-feira, 17 de março, e segue até o próximo dia 30 de maio, às 23h59.

Pessoas físicas que receberam rendimentos tributáveis acima de R$ 33.888, assim como aquelas que obtiveram receita bruta da atividade rural acima de R$ 169.440, são obrigadas a declarar.

A declaração do imposto sobre a renda das pessoas físicas pode ser preenchida de forma online, pelo e-CAC, sem precisar baixar ou instalar nenhum programa. Outra maneira de preencher a declaração é baixando a versão para os SOs Windows, Linux, macOS.

Neste primeiro momento, os contribuintes não terão a declaração pré-preenchida para agilizar a entrega. De acordo com a Receita Federal, em 2025, o preenchimento dos campos do documento estará disponível ao público em 1º de abril. A data é a mesma da liberação do programa de preenchimento e entrega online e por dispositivos móveis pelo aplicativo Meu Imposto de Renda.

DECLARAÇÃO — A expectativa da Receita é alcançar, este ano, 57% das declarações por meio do sistema pré-preenchido. No ano passado, foram 41,2% nessa condição. Desde 2022, para fazer a declaração pré-preenchida, o cidadão precisa de uma conta no portal Gov.br de nível prata ou ouro, com Cadastro de Pessoa Física (CPF) e senha cadastrados. O documento pode ser acessado em qualquer plataforma (online, aplicativo para dispositivos móveis ou Programa Gerador da Declaração. O contribuinte que optar pela declaração pré-preenchida, após 1º de abril, tem prioridade na hora de receber a restituição.

declaração pré-preenchida virá com as seguintes informações:

  • Informações da declaração anterior do contribuinte: identificação, endereço
  • Rendimentos e pagamentos da Dirf, Dimob, DMED e Carnê-Leão
  • Rendimentos isentos em função de moléstia grave e códigos de juros
  • -Rendimentos de restituição recebidas no ano-calendário
  • Contribuições de previdência privada
  • Atualização do saldo de conta bancária e poupança
  • Atualização do saldo de Fundos de investimento
  • Imóveis adquiridos no ano-calendário
  • Doações efetuadas no ano-calendário
  • Informação de Criptoativos
  • Conta bancária/poupança ainda não declarada
  • Fundo de investimento ainda não declarado
  • Contas bancárias no exterior

RENDIMENTOS NO EXTERIOR — A partir deste ano, os dados de contas bancárias no exterior foram incluídos na declaração pré-preenchida, após a legislação determinar a tributação de offshores (empresas de investimentos em outros países) e rendimentos no exterior. Por causa da lei que antecipou a cobrança de Imposto de Renda sobre Fundos Exclusivos e tributou as offshores, os rendimentos no exterior passaram a ser tributados de forma definitiva na declaração de ajuste anual, com alíquota de 15%. Até 2023, o pagamento era feito mensalmente, mas passou a ser feito anualmente. Na declaração, os bens que representem investimentos no exterior passam a permitir a informação do rendimento e do imposto pago, tanto no Brasil como no exterior.

OUTRAS MUDANÇAS — A declaração terá poucas mudanças em relação à do ano passado. As principais são as situações em que o contribuinte está obrigado a entregar o documento, por causa do reajuste da faixa de isenção no ano passado.

Em relação às obrigatoriedades, as mudanças foram as seguintes:

  • Valor de rendimentos tributáveis anuais que obrigam a entrega da declaração subiu de R$ 30.639,90 para R$ 33.888
  • Limite da receita bruta de obrigatoriedade para atividade rural subiu de R$ 153.999,50 para R$ 169.440
  • Quem atualizou valor de bens imóveis e pagou ganho de capital diferenciado em dezembro de 2024 terá de preencher a declaração
  • Quem apurou rendimentos no exterior de aplicações financeiras e de lucros e dividendos passou a declarar anualmente
  • As demais obrigatoriedades foram mantidas.
  • Outra mudança é a maior prioridade para quem simultaneamente utilizou a declaração pré-preenchida e optou pelo recebimento da restituição via Pix. Até o ano passado, a prioridade era definida apenas com base na utilização de uma das duas ferramentas.

Três campos na declaração foram extintos:

  • título de eleitor;
  • consulado/embaixada (para residentes no exterior);
  • número do recibo da declaração anterior (em declarações on-line). MULTA — Quem enviar a declaração fora do prazo deverá pagar multa de 1% sobre imposto devido, com valor mínimo de R$ 165,74, ou de 20% do valor devido, prevalecendo o maior valor.

RESTITUIÇÕES — De acordo com documento publicado no Diário Oficial da União (DOU), as restituições (ano-base 2024) serão efetuadas em cinco lotes, no período de maio a setembro de 2025, conforme as seguintes datas:

  • primeiro lote: 30 de maio
  • segundo lote: 30 de junho
  • terceiro lote: 31 de julho
  • quarto lote: 29 de agosto
  • quinto e último lote: 30 de setembro.

Ao considerar as prioridades determinadas por lei, o pagamento das restituições seguirá a seguinte ordem:

  • idade igual ou superior a 80 anos
  • idade igual ou superior a 60 anos, pessoas com deficiência e pessoas com doença grave
  • pessoas cuja maior fonte de renda seja o magistério
  • pessoas que utilizaram a declaração pré-preenchida e que optaram por receber a restituição por PIX
  • pessoas que utilizaram a declaração pré-preenchida ou optaram por receber a restituição por PIX

MEU INSS — Aposentados, pensionistas e beneficiários de auxílios pagos pelo Instituto Nacional do Seguro Social (INSS) que receberam até R$ 2.824 por mês no ano passado não serão obrigados a entregar a declaração do IRPF 2025. O comprovante de rendimento de beneficiários da Previdência Social está disponível no Meu INSS (aplicativo ou site), pelo telefone 135 ou na rede bancária. O programa para preencher a declaração está disponível no site da Receita Federal. O download do sistema é o primeiro passo para o preenchimento do documento.

Como acessar o documento no Meu INSS

  1. Acesse o site https://meu.inss.gov.br/
  2. Clique em "Entrar com Gov.br"
  3. Insira o CPF para fazer o login ou cadastrar senha
  4. Desça a tela e encontre a aba "Outros Serviços"
  5. Nela, clique em "Ver Mais"
  6. Clique no ícone com a frase "Extrato do Imposto de Renda"
  7. Selecione o ano-calendário 2024
  8. Escolha o extrato que deseja
  9. Salve o documento em PDF
  10. Confira, a seguir, o cronograma completo do IRPF 2025:

Referências

Gov.BR

Feito!