Como se preparar para uma entrevista técnica como Java Developer

entrevista java developer

O processo de recrutamento para posições técnicas na área de Java Development pode ser exigente, sobretudo quando envolve empresas com elevado grau de maturidade tecnológica. Entender a estrutura típica da entrevista e preparar-se adequadamente são passos cruciais para aumentar as suas hipóteses de sucesso.

Em geral, uma entrevista técnica para Java Developer pode incluir:

  • Testes técnicos (por exemplo, em LeetCode ou HackerRank);
  • Discussões sobre código existente ou design de sistemas;
  • Implementação ao vivo de uma solução (pair programming);
  • Perguntas sobre o ecossistema Java: Spring, Hibernate, JVM, etc.

Para além das competências técnicas, muitas entrevistas avaliam também o raciocínio lógico, a capacidade de comunicação, e o alinhamento com as práticas de engenharia de software modernas.

1. Reforce Exaustivamente os Fundamentos Essenciais de Java

A base de qualquer proficiência em Java reside num domínio sólido dos seus conceitos fundamentais. Independentemente do seu nível de experiência, desde Júnior a Arquiteto, entrevistadores experientes frequentemente iniciam a avaliação com perguntas que testam a compreensão destes alicerces. O objetivo não é apenas verificar o conhecimento superficial, mas sim avaliar o seu raciocínio lógico, a sua capacidade de resolver problemas usando as ferramentas básicas da linguagem e a sua familiaridade com os princípios que regem o comportamento do código Java.

Dedicar tempo a revisar e solidificar estes tópicos é um investimento crucial. Os fundamentos atuam como blocos de construção para conceitos mais avançados e frameworks. Uma lacuna nesta área pode comprometer a sua capacidade de discutir design patterns, performance, ou até mesmo depurar problemas complexos.

Tópicos Fundamentais a Dominar:

  • Tipos Primitivos vs. Objetos (Tipos de Referência):

    Entenda a diferença crucial entre int, char, boolean, etc. (tipos primitivos que armazenam o valor diretamente na stack) e Integer, String, classes personalizadas, etc. (objetos que armazenam uma referência na stack para o objeto real na heap). Discuta a alocação de memória, o conceito de null, e o uso de classes wrapper (como Integer, Double) e autoboxing/unboxing.

    • Perguntas Típicas: "Explique a diferença entre int e Integer." "O que é autoboxing e unboxing?" "Qual a diferença de memória e performance?"
  • Controlo de Fluxo e Tomada de Decisão:

    Revise as estruturas de controlo básicas: if, else, else if, switch. Domine os loops: for, while, do-while, e o enhanced for loop (for-each). Entenda o uso de break, continue e return para manipular o fluxo de execução.

    • Perguntas Típicas: Resolver pequenos problemas de lógica usando loops e condicionais. "Quando usar um while em vez de um for?" "Explique o uso de break e continue."
  • Exceções e Tratamento de Erros:

    Compreenda a hierarquia de exceções em Java (Throwable, Error, Exception, RuntimeException). Saiba a diferença entre exceções checked (que precisam ser declaradas ou capturadas) e unchecked (erros de tempo de execução). Domine o bloco try-catch-finally e o uso de throws. Familiarize-se com try-with-resources para gerir recursos automaticamente.

    • Perguntas Típicas: "Qual a diferença entre Exception e RuntimeException?" "Quando usar um bloco finally?" "Explique try-with-resources." "O que acontece se uma exceção for lançada num bloco finally?"
  • Coleções (Java Collections Framework - JCF):

    Este é um tópico vasto e frequentemente abordado. Familiarize-se com as principais interfaces (List, Set, Map, Queue) e as suas implementações comuns (ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, ConcurrentHashMap). Entenda as diferenças de performance (complexidade de tempo O(n)) para operações comuns (inserção, acesso, remoção) em diferentes coleções. Discuta a iteração sobre coleções (Iterators, for-each). Mencione a thread-safety de algumas coleções (como Vector ou ConcurrentHashMap) e as alternativas não seguras (como ArrayList ou HashMap).

    • Perguntas Típicas: "Qual a diferença entre ArrayList e LinkedList?" "Como funciona um HashMap internamente?" "Explique a diferença entre HashSet e TreeSet." "Quando usar um Map em vez de duas listas?" "Quais coleções são thread-safe?"
  • Programação Orientada a Objetos (POO):

    Os quatro pilares da POO são essenciais:

    • Encapsulamento: Ocultar os detalhes internos e expor uma interface pública controlada (getters/setters).
    • Herança: Criar novas classes (subclasses) a partir de classes existentes (superclasses), herdando atributos e comportamentos ("é-um"). Entenda o uso de extends, super, e modificadores de acesso (public, protected, default, private).
    • Polimorfismo: A capacidade de objetos de diferentes classes responderem ao mesmo método de maneiras distintas. Explique polimorfismo em tempo de compilação (overloading) e em tempo de execução (overriding).
    • Abstração: Focar nos aspetos essenciais de um objeto, ignorando detalhes irrelevantes. Discuta o uso de classes abstratas e interfaces.
    • Perguntas Típicas: "Explique os 4 pilares da POO com exemplos em Java." "Qual a diferença entre method overloading e overriding?" "Explique o uso de abstract class vs interface." "O que são modificadores de acesso e como afetam a herança?"
  • Interfaces e Classes Abstratas:

    Aprofunde a diferença entre interfaces (contratos puros, que suportam herança múltipla de tipo) e classes abstratas (que podem ter métodos concretos e abstratos, suportando apenas herança única de implementação). Discuta a introdução de métodos default e static em interfaces a partir do Java 8.

    • Perguntas Típicas: "Quando escolher uma interface vs. uma classe abstrata?" "Uma interface pode ter métodos com corpo?"
  • Strings:

    Entenda que String é imutável em Java. Discuta as diferenças entre String, StringBuilder e StringBuffer e quando usar cada uma (mutabilidade, thread-safety).

    • Perguntas Típicas: "Por que String é imutável em Java?" "Qual a diferença entre StringBuilder e StringBuffer?"
  • Arrays:

    O básico sobre como declarar, inicializar e manipular arrays. Embora as coleções sejam geralmente preferidas, o conhecimento sobre arrays é fundamental.

Como Reforçar:

  • Revise a Documentação Oficial: A documentação da Oracle (docs.oracle.com/en/java) é a fonte mais precisa e completa. Concentre-se nos tutoriais e nas especificações da linguagem.
  • Escreva Código: A teoria sem prática é insuficiente. Escreva pequenos exemplos para cada conceito. Implemente as suas próprias versões simplificadas de estruturas de dados básicas ou resolva problemas simples que exijam o uso destes fundamentos.
  • Resolva Exercícios: Plataformas como LeetCode, HackerRank e Exercism (mencionadas noutros pontos) têm secções dedicadas aos fundamentos que são excelentes para prática.
  • Prepare Explicações Claras: Não basta saber a resposta; é preciso ser capaz de explicar o porquê de forma clara e concisa. Pratique explicar estes conceitos em voz alta.

Dominar estes fundamentos não só o preparará para as perguntas diretas, mas também construirá a base necessária para entender e discutir tópicos mais avançados, como concorrência, padrões de design, funcionamento da JVM, e o ecossistema Spring/Hibernate, que serão abordados em outras etapas da entrevista.

2. Conheça as Versões Recentes da Linguagem

O Java é uma linguagem em constante evolução, com novas funcionalidades e melhorias sendo adicionadas regularmente. Manter-se atualizado com as versões mais recentes, especialmente as versões com suporte a longo prazo (LTS - Long-Term Support), é fundamental para escrever código moderno, eficiente e tirar partido dos recursos mais recentes da plataforma.

Entrevistadores procuram candidatos que demonstrem interesse e conhecimento nas direções que a linguagem tem tomado, pois isso reflete a capacidade de aprender, adaptar-se e aplicar as melhores práticas atuais no desenvolvimento.

O Marco do Java 8: O Início da Modernização

O lançamento do Java 8 em 2014 foi um ponto de viragem significativo, introduzindo elementos de programação funcional e APIs que mudaram a forma como muitos desenvolvedores escrevem código. É crucial ter um entendimento profundo das suas principais funcionalidades:

  • Expressões Lambda:

    Permitem escrever funções anónimas de forma concisa. São a base para a programação funcional em Java e são amplamente usadas com interfaces funcionais (interfaces com um único método abstrato).

    • Perguntas Típicas: "O que é uma expressão lambda e quando a usaria?" "Qual a relação entre lambdas e interfaces funcionais?"
  • Streams API:

    Uma nova forma de processar coleções de dados de maneira declarativa e potencialmente paralela. Permite encadear operações como filter(), map(), reduce(), tornando o código mais legível e eficiente para manipulação de grandes volumes de dados.

    • Perguntas Típicas: "Explique como funciona a Streams API." "Qual a diferença entre operações intermédias e terminais numa stream?" "Quando uma stream pode ser processada em paralelo?"
  • Optional:

    Uma classe container que pode ou não conter um valor não-nulo. Projetada para ajudar a evitar NullPointerException, tornando o código mais robusto e expressivo ao lidar com valores potencialmente ausentes.

    • Perguntas Típicas: "Qual o propósito da classe Optional?" "Como usar Optional para evitar NullPointerException?"
  • Métodos Default e Static em Interfaces:

    Permitem adicionar novos métodos a interfaces sem quebrar as implementações existentes. Essenciais para a evolução das APIs de coleções e outras bibliotecas.

    • Perguntas Típicas: "Por que foram introduzidos métodos default em interfaces?" "Qual a diferença entre um método default e um método static numa interface?"
  • Nova API de Data e Hora (JSR 310):

    Substituiu as antigas e problemáticas classes java.util.Date e java.util.Calendar por um conjunto mais robusto, intuitivo e imutável para trabalhar com datas, horas, fusos horários, etc. (LocalDate, LocalTime, LocalDateTime, ZonedDateTime).

    • Perguntas Típicas: "Quais as vantagens da nova API de Data e Hora sobre a antiga?" "Como representar uma data sem informação de tempo ou fuso horário?"

Foco nas Versões LTS (Java 11, 17, 21) e Principais Features Intermediárias

As versões LTS são cruciais porque são as que as empresas mais adotam em produção devido ao suporte estendido. Estar familiarizado com as principais adições destas versões e de algumas funcionalidades notáveis introduzidas nas versões intermediárias é altamente valorizado:

  • Java 9: Sistema de Módulos (JPMS - Java Platform Module System), que impacta a modularização de grandes aplicações. Métodos private em interfaces.
  • Java 10: Inferência de tipo para variáveis locais (var), que permite declarar variáveis locais sem especificar explicitamente o tipo, tornando o código mais conciso.

    • Perguntas Típicas: "Quando usar var e quais as suas limitações?"
  • Java 11: Cliente HTTP padrão (java.net.http). Capacidade de executar um único arquivo fonte. Melhorias no Garbage Collection.
  • Java 12-16 (Funcionalidades consolidadas no Java 17):

    • Text Blocks: Sintaxe multi-linha para strings, útil para SQL, JSON, HTML.
    • Records: Uma forma concisa de declarar classes imutáveis que atuam como simples agregados de dados. Reduz significativamente o boilerplate code para DTOs (Data Transfer Objects).
    • Sealed Classes: Permitem restringir quais classes ou interfaces podem estender ou implementar uma classe ou interface selada.
    • Pattern Matching for instanceof: Simplifica a verificação e extração de tipos.
    • Perguntas Típicas: "O que são Records e qual a sua vantagem?" "Explique o conceito de Sealed Classes." "Como os Text Blocks melhoram a legibilidade do código?"
  • Java 17: A terceira versão LTS desde o Java 8, consolidando muitas das funcionalidades introduzidas nas versões 9-16. Foco em robustez e performance.
  • Java 21: A mais recente versão LTS. Destaques incluem:

    • Virtual Threads (Project Loom): Uma nova abordagem para concorrência leve que pode simplificar a escrita de aplicações de alta concorrência.
    • Sequenced Collections: Novas interfaces e métodos para trabalhar com coleções com uma ordem de encontro definida.
    • Pattern Matching for Switch: Melhora a expressividade e segurança dos statements switch.
    • Perguntas Típicas: "O que são Virtual Threads e como se comparam com Threads tradicionais?" "Quais as vantagens de usar Pattern Matching em statements switch?"

Como Preparar:

  • Leia as notas de lançamento ou tutoriais específicos para Java 8, 11, 17 e 21.
  • Pratique ativamente a escrita de código utilizando Lambdas, Streams, Optional, var, Records e Text Blocks em problemas práticos.
  • Entenda o porquê destas funcionalidades foram introduzidas e os problemas que elas resolvem.
  • Explore a página oficial do projeto OpenJDK para detalhes técnicos: openjdk.org/projects/jdk.

Demonstrar que acompanha a evolução do Java e compreende as suas novas ferramentas e paradigmas mostra pró-atividade e compromisso com o desenvolvimento moderno.

3. Domine o Ecossistema e as Ferramentas

Para ser um desenvolvedor Java eficaz, é fundamental ir além da linguagem em si e dominar o vasto ecossistema de frameworks, bibliotecas e ferramentas que a rodeiam. Estes componentes padronizados resolvem problemas comuns, aceleram o desenvolvimento e promovem a adoção de boas práticas de engenharia de software. O conhecimento prático destas ferramentas demonstra que o candidato está pronto para integrar equipas e contribuir em projetos reais.

As entrevistas técnicas frequentemente incluem perguntas sobre como usar estas ferramentas para resolver desafios práticos, discutir as suas vantagens/desvantagens, ou explicar conceitos-chave associados a elas.

Frameworks e APIs Fundamentais:

  • Spring / Spring Boot:

    O Spring é o framework de facto para desenvolvimento empresarial em Java. O Spring Boot, em particular, simplifica drasticamente a configuração e o bootstrap de aplicações Spring, permitindo focar na lógica de negócio.

    Conceitos Chave: Injeção de Dependências (DI) / Inversão de Controlo (IoC) e o Contentor Spring; Desenvolvimento de APIs RESTful (@RestController, @RequestMapping); Configuração (application.properties/.yml); Acesso a Dados com Spring Data JPA; Spring Security (conceitos básicos de autenticação e autorização).

    • Perguntas Típicas: "Explique Injeção de Dependências e Contentor IoC no Spring." "Qual a principal diferença entre Spring e Spring Boot?" "Como se configura uma fonte de dados no Spring Boot?" "Como expor um endpoint REST?" "O que são beans Spring e qual o seu ciclo de vida?"
  • Hibernate / JPA:

    JPA (Java Persistence API) é a especificação padrão Java para Mapeamento Objeto-Relacional (ORM), permitindo mapear classes Java para tabelas de base de dados. Hibernate é a implementação de JPA mais popular e robusta.

    Conceitos Chave: Entidades (@Entity, @Id); Mapeamento de Relacionamentos (@OneToOne, @OneToMany, @ManyToMany); JPQL (JPA Query Language); Gestão de Contexto de Persistência (EntityManager); Estratégias de Carregamento (Lazy vs. Eager); Transações.

    • Perguntas Típicas: "O que é um ORM e por que usá-lo?" "Qual a diferença entre JPA e Hibernate?" "Explique as anotações de mapeamento mais comuns." "Qual a diferença entre Lazy e Eager loading e quando usar cada um?"

Ferramentas de Build e Gestão de Dependências:

  • Maven / Gradle:

    Ferramentas essenciais para automatizar o processo de construção de projetos (compilação, testes, packaging) e, crucialmente, gerir as dependências externas do projeto de forma eficiente. Permitem definir o ciclo de vida do projeto e executar tarefas através de plugins.

    Conceitos Chave: Ficheiro de configuração (pom.xml para Maven, build.gradle para Gradle); Gestão de dependências e repositórios; Ciclo de vida do build (compile, test, package, install, deploy); Plugins.

    • Perguntas Típicas: "Qual a diferença entre Maven e Gradle e qual prefere usar?" "Como adicionar uma nova dependência ao seu projeto?" "Explique as fases principais do ciclo de vida do Maven build."

Testes Automatizados:

  • JUnit / Testcontainers:

    A qualidade do software depende fortemente da capacidade de testar automaticamente. suittest é uma ferramenta NoCode para automação de testes com alta performance. JUnit é o framework padrão para testes unitários em Java. Testcontainers é uma biblioteca popular que permite usar containers Docker para fornecer dependências (bases de dados, serviços) para testes de integração.

    Conceitos Chave (JUnit): Anotações de teste (@Test, @BeforeEach, @AfterEach); Asserções; Testes parametrizados. Conceitos Chave (Testcontainers): Instâncias de container descartáveis; Módulos para serviços comuns (PostgreSQL, Kafka, etc.).

    • Perguntas Típicas: "Qual a importância dos testes automatizados?" "Como escrever um teste unitário básico com JUnit?" "Para que serve o Testcontainers e em que cenário o usaria?" "Qual a diferença entre testes unitários e de integração?"
  • Mockito / MockMvc (com Spring):

    Frameworks de mocking e testes de integração Web. Mockito permite criar objetos "mock" e "spy" para isolar a unidade sob teste. MockMvc (parte do Spring Test) permite testar controladores Spring MVC sem a necessidade de iniciar um servidor Web completo.

    Conceitos Chave (Mockito): @Mock, @Spy, when(...).thenReturn(...), verify(...). Conceitos Chave (MockMvc): perform(), andExpect(), andDo().

    • Perguntas Típicas: "Para que serve um mock e quando usar Mockito?" "Como testar um endpoint REST no Spring Boot sem iniciar o servidor Web?"

Containerização:

  • Docker:

    Tornou-se a ferramenta padrão para empacotar aplicações e as suas dependências num formato portátil e consistente (containers). É fundamental para o pipeline de CI/CD e para garantir que a aplicação funciona da mesma forma em diferentes ambientes.

    Conceitos Chave: Imagem Docker; Container; Dockerfile (instruções para construir uma imagem); Docker Compose (orquestração de múltiplos containers).

    • Perguntas Típicas: "Quais as vantagens da containerização com Docker?" "O que é um Dockerfile e quais instruções comuns ele contém?" "Como o Docker facilita a implantação e escalabilidade de aplicações Java?"

Prática e Projetos:

A melhor forma de dominar o ecossistema é através da prática. Desenvolva projetos que integrem estas ferramentas. O repositório Spring PetClinic é um excelente exemplo de uma aplicação que utiliza muitos destes componentes seguindo boas práticas.

Considere criar um projeto pessoal no GitHub que demonstre a sua capacidade de usar Spring Boot, JPA/Hibernate, Maven/Gradle, testes com JUnit/Mockito/Testcontainers e até mesmo um Dockerfile simples. Certifique-se de que o projeto tem um bom README.md explicando como correr e testar.

Como Preparar:

  • Siga tutoriais oficiais e da comunidade para cada framework/ferramenta.
  • Construa projetos de pequena ou média escala que exijam o uso integrado destas tecnologias.
  • Leia sobre as configurações comuns e anotações principais de Spring e JPA.
  • Familiarize-se com os comandos básicos de Maven/Gradle e Docker.
  • Escreva testes (unitários e de integração) para o código que desenvolver.

O domínio destas ferramentas e frameworks é um forte indicador da sua capacidade de ser produtivo e eficaz num ambiente de desenvolvimento Java moderno.

5. Prepare-se para Responder com Clareza

Uma entrevista técnica não avalia apenas o seu conhecimento factual ("sabe a resposta certa?"), mas crucialmente, a sua capacidade de pensar, resolver problemas e comunicar as suas ideias. A forma como articula o seu raciocínio, justifica as suas decisões e discute alternativas pode ser tão ou mais importante quanto o conhecimento técnico puro. É aqui que muitos candidatos podem destacar-se.

A preparação para este aspeto da entrevista envolve desenvolver a habilidade de verbalizar o seu processo mental e de justificar as suas escolhas técnicas de forma lógica e estruturada.

Porquê a Clareza na Comunicação é Crucial:

  • Demonstra Raciocínio Lógico: Os entrevistadores querem ver como aborda um problema, como o decompõe e como chega a uma solução.
  • Revela Consciência Técnica: Justificar escolhas (frameworks, algoritmos, estruturas de dados) mostra que entende as implicações (performance, complexidade, manutenção, escalabilidade).
  • Avalia a Capacidade de Discussão Técnica: Poder discutir prós e contras de diferentes abordagens (trade-offs) é vital no trabalho de equipa. Mostra que considera múltiplas perspetivas.
  • Indica Potencial de Colaboração: A capacidade de explicar ideias complexas de forma compreensível é essencial para trabalhar eficazmente com colegas, incluindo membros de equipa menos técnicos.
  • Gere Expectativas e Ambiguidades: Articular suposições ou incertezas ajuda a esclarecer o problema e a mostrar proatividade.

O Que Significa Concretamente "Responder com Clareza":

  • Verbalize o Seu Processo Mental: Ao abordar um problema (seja código ou design), não mergulhe diretamente na solução. Comece por:

    • Reafirmar o problema na sua própria palavras para garantir que o entendeu.
    • Discutir a sua abordagem inicial e porquê a escolheu.
    • Explicar os passos que pretende seguir.
  • Declare as Suas Suposições: Se o problema for ambíguo, diga explicitamente quaisquer suposições que esteja a fazer. "Vou assumir que a lista de entrada não é nula", "Assumindo que a performance de leitura é mais crítica que a de escrita". Isto evita mal-entendidos e mostra atenção aos detalhes.
  • Explore Alternativas e Trade-offs: Para decisões técnicas importantes (ex: usar um ArrayList vs LinkedList, um HashMap vs TreeMap, uma abordagem síncrona vs assíncrona):

    • Mencione 2-3 opções viáveis, se aplicável.
    • Discuta os prós e contras (trade-offs) de cada opção no contexto específico do problema (ex: complexidade de tempo/espaço, legibilidade, manutenção, escalabilidade, custo).
    • Justifique porquê a opção que escolheu é a melhor para este caso.
  • Faça Perguntas Clarificadoras: Se algo não estiver claro, pergunte! "Existem restrições de memória?", "Qual a escala esperada dos dados?", "Que casos de erro devo considerar?". Isto mostra que pensa criticamente sobre os requisitos.
  • Saiba Como Lidar com o "Não Sei": É perfeitamente aceitável não saber a resposta a tudo. Se não souber:

    • Seja honesto: "Não tenho a certeza sobre este detalhe específico da API/GC/etc."
    • Explique como *procuraria* a resposta: "Consultaria a documentação X", "Pesquisaria por exemplos de código para este padrão", "Perguntaria a um colega com mais experiência nesta área". Demonstra capacidade de aprendizagem e colaboração.

Como Preparar Esta Competência:

  • Pratique a Explicação: Escolha tópicos técnicos que domina (POO, coleções, um padrão de design, um recurso do Spring) e pratique a explicá-los em voz alta, de forma simples e estruturada, como se estivesse a ensinar alguém.
  • Analise o Seu Próprio Código: Pegue num projeto que desenvolveu e pratique a explicar as decisões de design e implementação que tomou, justificando porquê escolheu certas abordagens em vez de outras.
  • Ensaios de Entrevista (Mock Interviews): Se possível, realize simulações de entrevista com colegas ou amigos. Peça feedback específico sobre a clareza da sua comunicação e a forma como justifica as suas respostas.
  • Estude Trade-offs: Ao aprender sobre uma nova tecnologia ou algoritmo, procure ativamente por discussões sobre os seus pontos fortes e fracos e em que cenários é mais (ou menos) adequado.

Desenvolver a capacidade de articular o seu pensamento técnico é uma habilidade que o distinguirá como um candidato forte e um futuro membro de equipa valioso.

A seguir, veja respostas a perguntas frequentes sobre entrevistas técnicas em Java.

Quanto tempo dura geralmente uma entrevista técnica para Java Developer?

A duração pode variar entre 30 minutos a mais de 2 horas, dependendo da senioridade e das etapas envolvidas. Empresas como a Amazon ou a ThoughtWorks aplicam múltiplas rondas técnicas. É comum incluir testes ao vivo, análise de código e design de sistemas.

Devo preparar um projeto de demonstração para a entrevista?

Sim. Um projecto público no GitHub, utilizando Spring Boot, testes JUnit e boas práticas, pode ser decisivo. Inclua um README.md com instruções claras, testes e exemplos de endpoints.

É necessário conhecer todas as versões do Java para a entrevista?

Não. Foque-se nos conceitos fundamentais e nas versões mais recentes com suporte a longo prazo (Java 11, 17, 21). Conhecimentos sobre Streams, lambda e Optional são praticamente obrigatórios.

O que fazer se não souber responder a uma pergunta técnica?

Mantenha a calma, explique como raciocinaria sobre o problema, que recursos consultaria e como estruturaria uma solução. Entrevistadores valorizam a capacidade de aprendizagem e pensamento lógico.

Quais são os erros mais comuns nas entrevistas de Java Developer?

  • Esquecer princípios de POO;
  • Não aplicar testes adequados;
  • Desconhecimento sobre a JVM ou garbage collector;
  • Ignorar boas práticas de arquitectura de software;
  • Respostas vagas sem justificar o raciocínio.