<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Isac Canedo</title>
    <description>The latest articles on Forem by Isac Canedo (@isac_canedo).</description>
    <link>https://forem.com/isac_canedo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3821169%2F7e05b1a4-0ff5-460b-9a79-2c089543a730.jpeg</url>
      <title>Forem: Isac Canedo</title>
      <link>https://forem.com/isac_canedo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/isac_canedo"/>
    <language>en</language>
    <item>
      <title>Pare de usar isEmpty() e isBlank() em seus Controllers Spring Boot</title>
      <dc:creator>Isac Canedo</dc:creator>
      <pubDate>Fri, 13 Mar 2026 13:21:20 +0000</pubDate>
      <link>https://forem.com/isac_canedo/pare-de-usar-isempty-e-isblank-em-seus-controllers-spring-boot-2ack</link>
      <guid>https://forem.com/isac_canedo/pare-de-usar-isempty-e-isblank-em-seus-controllers-spring-boot-2ack</guid>
      <description>&lt;p&gt;É comum encontrarmos em projetos Spring Boot validações como isEmpty(), != null ou isBlank() aplicadas diretamente nos métodos dos Controllers. Embora pareça uma solução rápida, essa prática é um code smell que compromete a escalabilidade e a manutenção do software.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02ny15wfagdzl6rbdapm.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02ny15wfagdzl6rbdapm.jpeg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos entender por que você deve evitar essa abordagem e quais são as alternativas alinhadas às boas práticas de engenharia de software.&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema da lógica no Controller
&lt;/h2&gt;

&lt;p&gt;O papel fundamental de um Controller, seguindo princípios de &lt;strong&gt;Clean Architecture&lt;/strong&gt; e &lt;strong&gt;MVC&lt;/strong&gt;, é a orquestração: receber a requisição, realizar o unmarshalling dos dados e delegar a execução para a camada de serviço ou domínio.&lt;/p&gt;

&lt;p&gt;Quando inserimos verificações manuais de strings ou nulidade no Controller, ferimos diversos princípios:&lt;/p&gt;

&lt;p&gt;1 - &lt;strong&gt;Violação do SRP (Single Responsibility Principle)&lt;/strong&gt;: O Controller passa a acumular responsabilidades de validação e decisão que não lhe pertencem.&lt;br&gt;
2 - &lt;strong&gt;Acoplamento e Repetição&lt;/strong&gt;: Validações feitas no Controller não são reaproveitáveis por outros pontos de entrada (como jobs batch ou consumidores de mensageria).&lt;br&gt;
3 - &lt;strong&gt;Dificuldade em Testes de Unidade&lt;/strong&gt;: Testar a lógica de negócio exige subir o contexto do Spring MVC ou mockar objetos de requisição desnecessariamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Melhores Práticas e Alternativas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Bean Validation (JSR 380)&lt;/strong&gt;&lt;br&gt;
A forma mais elegante de lidar com validações de entrada no Spring é através das annotations do hibernate-validator. Isso mantém o código limpo e declarativo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Annotations comuns&lt;/strong&gt;: &lt;code&gt;@NotBlank, @NotNull, @Size, @Min, @Email.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Validação Customizada&lt;/strong&gt;&lt;br&gt;
Para regras que dependem de condições específicas, prefira criar &lt;code&gt;Validators&lt;/code&gt; customizados ou utilizar a camada de Service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo Prático&lt;/strong&gt;&lt;br&gt;
❌ &lt;strong&gt;Abordagem Incorreta (Anti-pattern)&lt;/strong&gt;&lt;br&gt;
Neste cenário, o Controller está "poluído" com verificações manuais de estado.&lt;br&gt;
&lt;code&gt;@GetMapping("/{id}")&lt;br&gt;
public ResponseEntity&amp;lt;?&amp;gt; get(@PathVariable String id) {&lt;br&gt;
    if (id == null || id.isBlank()) {&lt;br&gt;
        return ResponseEntity.badRequest().body("ID inválido");&lt;br&gt;
    }&lt;br&gt;
    return ResponseEntity.ok(service.findById(id));&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Abordagem Recomendada&lt;/strong&gt;&lt;br&gt;
Utilizando as facilidades do ecossistema Spring para manter o método enxuto e focado.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@GetMapping("/{id}")&lt;br&gt;
public ResponseEntity&amp;lt;?&amp;gt; get(@PathVariable @NotBlank(message = "O ID é obrigatório") String id) {&lt;br&gt;
    return ResponseEntity.ok(service.findById(id));&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Para que as annotations funcionem em parâmetros de &lt;code&gt;@PathVariable&lt;/code&gt; ou &lt;code&gt;@RequestParam&lt;/code&gt;, lembre-se de adicionar a anotação &lt;code&gt;@Validated&lt;/code&gt; no nível da classe Controller.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;br&gt;
Tratar o Controller como uma camada de passagem e delegar as validações para os locais corretos (DTOs com Bean Validation ou Service Layer para regras complexas) resulta em um código:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mais legível;&lt;/li&gt;
&lt;li&gt;Fácil de testar;&lt;/li&gt;
&lt;li&gt;Alinhado aos padrões de mercado (Clean Code).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E você, como tem estruturado as validações nos seus projetos Spring? Deixe seu comentário abaixo!&lt;/p&gt;

&lt;h1&gt;
  
  
  java #springboot #backend #cleancode #architecture
&lt;/h1&gt;

</description>
      <category>java</category>
      <category>springboot</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🔐 Por que a AWS exige chmod 400 ao usar sua chave .pem?</title>
      <dc:creator>Isac Canedo</dc:creator>
      <pubDate>Thu, 12 Mar 2026 23:47:05 +0000</pubDate>
      <link>https://forem.com/isac_canedo/por-que-a-aws-exige-chmod-400-ao-usar-sua-chave-pem-3nk7</link>
      <guid>https://forem.com/isac_canedo/por-que-a-aws-exige-chmod-400-ao-usar-sua-chave-pem-3nk7</guid>
      <description>&lt;p&gt;⚠️ Esqueceu o chmod 400? Sua conexão SSH pode estar em risco!&lt;/p&gt;

&lt;p&gt;Se você já criou uma instância EC2 na AWS e fez o download da chave privada (.pem), com certeza se deparou com a orientação:&lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;
[ chmod 400 sua-chave.pem ]&lt;/p&gt;

&lt;p&gt;🤔 Mas afinal, por que isso é tão importante? O que o chmod 400 faz?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6tsxp2uhe03uaprw3fh.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6tsxp2uhe03uaprw3fh.jpeg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse comando define as permissões da chave .pem para que somente o dono do arquivo possa lê-lo. Ou seja, impede que outras pessoas ou processos do sistema tenham qualquer acesso.&lt;/p&gt;

&lt;p&gt;📌 Detalhadamente:&lt;br&gt;
4 = Permissão de leitura para o dono&lt;br&gt;
0 = Nenhuma permissão para grupo ou outros usuários&lt;/p&gt;

&lt;p&gt;🚨 E se você não fizer isso?&lt;br&gt;
Se a sua chave .pem estiver com permissões mais amplas (por exemplo, leitura para todos), o OpenSSH recusa a conexão por considerar a chave insegura.&lt;/p&gt;

&lt;p&gt;Resultado:&lt;br&gt;
❌ “Permissions are too open”&lt;br&gt;
❌ “Unprotected private key file”&lt;/p&gt;

&lt;p&gt;Isso acontece porque a segurança da conexão SSH depende da exclusividade do acesso à chave privada.&lt;/p&gt;

&lt;p&gt;Permissões incorretas representam uma ameaça real à integridade do seu ambiente de nuvem.&lt;/p&gt;

&lt;p&gt;🛡️ Segurança não é detalhe&lt;/p&gt;

&lt;p&gt;Esse pequeno comando protege você contra:&lt;br&gt;
✔️ Acesso não autorizado&lt;br&gt;
✔️ Vazamentos acidentais&lt;br&gt;
✔️ Configurações inseguras&lt;/p&gt;

&lt;p&gt;💡 Dica para quem usa Windows + WSL ou Git Bash:&lt;br&gt;
Você pode precisar navegar até o diretório da chave e rodar:&lt;br&gt;
bash&lt;br&gt;
[ chmod 400 caminho/sua-chave.pem ]&lt;/p&gt;

&lt;p&gt;Ou, no Windows, configurar as permissões de leitura via interface gráfica clicando com o botão direito &amp;gt; Propriedades &amp;gt; Segurança.&lt;/p&gt;

&lt;p&gt;🔁 Automatize boas práticas de segurança desde o primeiro provisionamento.&lt;/p&gt;

&lt;p&gt;🧠 Lembre-se: a segurança começa nos detalhes e o [ chmod 400 ] é um deles!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ssh</category>
      <category>pem</category>
      <category>chmod</category>
    </item>
    <item>
      <title>Clean Architecture: criando sistemas robustos, flexíveis e testáveis</title>
      <dc:creator>Isac Canedo</dc:creator>
      <pubDate>Thu, 12 Mar 2026 23:35:09 +0000</pubDate>
      <link>https://forem.com/isac_canedo/clean-architecture-criando-sistemas-robustos-flexiveis-e-testaveis-3f0b</link>
      <guid>https://forem.com/isac_canedo/clean-architecture-criando-sistemas-robustos-flexiveis-e-testaveis-3f0b</guid>
      <description>&lt;p&gt;A Clean Architecture, ou Arquitetura Limpa, é uma abordagem de design de software que busca criar sistemas independentes de frameworks, bancos de dados, interfaces de usuário e detalhes de infraestrutura.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuutxlzdpsrw8y9qkyvo2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuutxlzdpsrw8y9qkyvo2.jpeg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Popularizada por Robert C. Martin (Uncle Bob), essa arquitetura protege a lógica de negócio das mudanças externas, seguindo a Regra da Dependência:&lt;/p&gt;

&lt;p&gt;🔁 as dependências do código devem sempre apontar para o centro da arquitetura.&lt;/p&gt;

&lt;p&gt;Camadas da Clean Architecture (representadas por círculos concêntricos):&lt;/p&gt;

&lt;p&gt;1️⃣ Entidades (Entities)&lt;br&gt;
 🔹 Camada mais interna, responsável pelas regras de negócio da empresa.&lt;br&gt;
 🔹 Exemplo: uma classe Pedido com métodos como calcularValorTotal() ou adicionarItem().&lt;/p&gt;

&lt;p&gt;2️⃣ Casos de Uso (Use Cases)&lt;br&gt;
 🔹Define o fluxo da aplicação e orquestra entidades.&lt;br&gt;
 🔹 Exemplo: CriarPedidoUseCase que valida dados, instancia um pedido e salva no repositório.&lt;/p&gt;

&lt;p&gt;3️⃣ Adaptadores de Interface (Interface Adapters) - Faz a ponte entre camadas internas e externas.&lt;br&gt;
 Inclui:&lt;br&gt;
🔹Controladores (ex: REST controllers)&lt;br&gt;
🔹Apresentadores (ex: formatadores para UI)&lt;br&gt;
🔹Gateways (ex: repositórios para banco de dados)&lt;/p&gt;

&lt;p&gt;4️⃣ Frameworks e Drivers&lt;br&gt;
Camada mais externa, contendo:&lt;br&gt;
🔹Frameworks Web (Spring, .NET)&lt;br&gt;
🔹Bancos de dados (PostgreSQL, MongoDB)&lt;br&gt;
🔹Interfaces de usuário (Angular, React) &lt;br&gt;
Essa camada pode ser substituída sem afetar a lógica central.&lt;/p&gt;

&lt;p&gt;Benefícios da Clean Architecture:&lt;/p&gt;

&lt;p&gt;✅ Independência&lt;br&gt;
 Troque banco de dados, framework ou UI sem reescrever regras de negócio.&lt;/p&gt;

&lt;p&gt;✅ Testabilidade&lt;br&gt;
 Teste regras isoladamente, sem necessidade de banco real ou interface gráfica.&lt;/p&gt;

&lt;p&gt;✅ Manutenibilidade&lt;br&gt;
 Código mais limpo, organizado e fácil de evoluir.&lt;/p&gt;

&lt;p&gt;✅ Flexibilidade&lt;br&gt;
 Mudanças de requisitos têm impacto mínimo no core do sistema.&lt;/p&gt;

&lt;p&gt;📌 A Clean Architecture não é só uma moda. É uma forma sólida e disciplinada de construir software duradouro, escalável e com foco no domínio do negócio.&lt;/p&gt;

&lt;p&gt;🚀 Ideal para projetos complexos que precisam sobreviver ao tempo e à mudança.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>"Ownership" é um conceito que vai além da posse legal...</title>
      <dc:creator>Isac Canedo</dc:creator>
      <pubDate>Thu, 12 Mar 2026 23:32:53 +0000</pubDate>
      <link>https://forem.com/isac_canedo/ownership-e-um-conceito-que-vai-alem-da-posse-legal-101</link>
      <guid>https://forem.com/isac_canedo/ownership-e-um-conceito-que-vai-alem-da-posse-legal-101</guid>
      <description>&lt;p&gt;"Ownership" é um conceito que vai além da posse legal e refere-se principalmente ao "sentimento de dono" ou "mentalidade de dono".&lt;/p&gt;

&lt;p&gt;Muitos profissionais são responsáveis, mas poucos demonstram a verdadeira hashtag#AtitudeDeDono. E é justamente nessa lacuna que a hashtag#Liderança e o crescimento de carreira acontecem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxxspr9ank2mx0yk1arp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxxspr9ank2mx0yk1arp.jpeg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você quer sair da mentalidade de executor e se tornar um agente de impacto, foque nestes 4 Pilares de Ownership que realmente fazem a diferença em equipes de alta performance:&lt;/p&gt;

&lt;p&gt;1️⃣ Troque o “Eu fui cobrado” pelo “Eu me antecipei.” O profissional com ownership não espera o alerta vermelho do gestor, ele cria seus próprios dashboards de risco, prevê gargalos e inicia a mitigação antes do problema se tornar crítico. Ele é a fonte da solução, não a vítima da circunstância;&lt;br&gt;
2️⃣ Foque no resultado de negócio, não na task list. Não basta dizer: “A API foi entregue.” Pergunte: “Essa API reduziu a latência para o cliente final? Aumentou a conversão? Economizou recursos da empresa?”&lt;br&gt;
Conecte cada entrega técnica a um valor de negócio tangível;&lt;br&gt;
3️⃣ Não jogue para a cultura do “Não é minha área.” Em sistemas complexos como os de hashtag#Integração ou hashtag#Cloud é fácil apontar o dedo para a dependência vizinha. O engenheiro ou arquiteto com ownership assume a responsabilidade de coordenar a solução ponta a ponta, mesmo que não codifique tudo. Ele resolve o problema, não o repassa;&lt;br&gt;
4️⃣ Trate o orçamento da empresa como o seu próprio.&lt;br&gt;
Isso significa questionar o uso de recursos caros, propor soluções mais eficientes e buscar reuso. Cada decisão técnica da escolha de um serviço em cloud a um padrão de desenvolvimento deve refletir visão de custo-benefício e escalabilidade a longo prazo.&lt;/p&gt;

&lt;p&gt;💡 O crescimento de carreira acontece no espaço entre o seu job description e sua hashtag#Ownership.&lt;/p&gt;

&lt;p&gt;👉 Qual desses pilares você tem praticado mais ativamente?&lt;/p&gt;

</description>
      <category>leadership</category>
      <category>management</category>
      <category>productivity</category>
      <category>owner</category>
    </item>
    <item>
      <title>Amazon Q: Revolucionando a Produtividade e a Inovação Empresarial</title>
      <dc:creator>Isac Canedo</dc:creator>
      <pubDate>Thu, 12 Mar 2026 23:29:46 +0000</pubDate>
      <link>https://forem.com/isac_canedo/amazon-q-revolucionando-a-produtividade-e-a-inovacao-empresarial-533b</link>
      <guid>https://forem.com/isac_canedo/amazon-q-revolucionando-a-produtividade-e-a-inovacao-empresarial-533b</guid>
      <description>&lt;p&gt;O Amazon Q representa uma nova era na integração entre IA generativa e operações corporativas, redefinindo a forma como times técnicos e de negócios interagem com dados, sistemas e processos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1tqr8qw5tltg4651ddjh.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1tqr8qw5tltg4651ddjh.jpeg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 Para Desenvolvedores&lt;br&gt;
O Amazon Q atua como um copiloto técnico completo:&lt;br&gt;
🔹Gera e revisa código em múltiplas linguagens;&lt;br&gt;
🔹Realiza testes automatizados e detecção de vulnerabilidades;&lt;br&gt;
🔹Analisa dependências e propõe otimizações de arquitetura;&lt;br&gt;
🔹Explica erros e aplica correções contextuais diretamente no repositório.&lt;br&gt;
Tudo isso integrado ao ecossistema AWS, acelerando o DevCycle com segurança e consistência.&lt;/p&gt;

&lt;p&gt;🧠 Para Usuários de Negócios&lt;br&gt;
Através de linguagem natural, o Amazon Q permite que profissionais não técnicos consultem dados empresariais, criem relatórios e automatizem fluxos de trabalho sem precisar de conhecimento em código.&lt;br&gt;
Imagine um analista pedindo: “Crie um dashboard com as vendas do último trimestre e destaque variações anormais por região” e o Amazon Q entrega a análise pronta em minutos.&lt;/p&gt;

&lt;p&gt;🔍 Poder e Contexto Unificados&lt;br&gt;
O Amazon Q conecta-se aos repositórios corporativos (documentação interna, políticas, código-fonte, produtos, entre outros), aplicando indexação semântica e resumo inteligente para fornecer respostas contextualizadas e acionáveis.&lt;/p&gt;

&lt;p&gt;🛡️ Segurança e Governança Avançadas&lt;br&gt;
Construído sobre o Amazon Bedrock, o Amazon Q utiliza roteamento inteligente para selecionar o foundation model (FM) ideal para cada tarefa equilibrando custo, desempenho e precisão.&lt;br&gt;
Além disso, herda toda a camada de segurança, controle de acesso e compliance do Bedrock:&lt;/p&gt;

&lt;p&gt;➡️ Se o usuário não tem permissão fora do Amazon Q, ele também não terá dentro.&lt;/p&gt;

&lt;p&gt;⚙️ Inovação com Escalabilidade&lt;br&gt;
Com o Amazon Q, sua empresa pode desenvolver aplicações generativas sob medida, automatizando funções críticas e liberando tempo das equipes para atividades de maior valor estratégico.&lt;/p&gt;

&lt;p&gt;A IA generativa finalmente chega ao ambiente corporativo com governança, privacidade e eficiência em escala.&lt;/p&gt;

&lt;p&gt;💬 Como você enxerga o impacto do Amazon Q na sua operação?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
