MFormations
Modern Java Engineering

Chapitre 22

22 - Interviews

> 60 questions d'entretien (30 comportementales + 30 techniques) pour préparer vos entretiens Java

Chapitre 22 — Interviews

60 questions d'entretien (30 comportementales + 30 techniques) pour preparer vos entretiens Java


Partie A : Questions comportementales (30)

Leadership & Collaboration (Q1-Q8)

Q1 — Decrivez une situation ou vous avez du convaincre votre equipe d'adopter une nouvelle technologie.

Structure de reponse (STAR) :

  • Situation : Equipe utilisait Java 8, besoin de virtual threads
  • Tache : Convaincre de migrer vers Java 21
  • Action : POC demontrant les gains de performance, benchmarks, article de blog interne
  • Resultat : Migration en 2 sprints, 40% de reduction des erreurs de concurrence

Conseil : Montrez que vous etes pragmatique, pas un "technology evangelist" aveugle.

Q2 — Comment gerer un conflit technique au sein de l'equipe ?

Approche :

  1. Separer les personnes du probleme
  2. Demander des faits et des donnees (benchmarks)
  3. POC de chaque approche
  4. Decision collective avec quorum
  5. Documenter et passer a autre chose

Exemple : Desaccord Spring Boot vs Quarkus. Benchmarks sur le projet reel, cout de migration, ecosysteme. Decision = Spring Boot (ecosysteme large).

Q3 — Decrivez votre plus grand echec technique. Qu'en avez-vous appris ?

Modele : Echec reel + lessons learned + application ulterieure

Exemple : Deploiement vendredi soir sans rollback automatique → 3h d'incident. Lecon : deploiement progressif, canary release, runbooks. Desormais systematique.

Q4 — Comment abordez-vous le mentoring d'un developpeur junior ?

Approche :

  • Pair programming les 2 premieres semaines
  • Code review constructive (critiquer le code, pas la personne)
  • Petites tasks progressives
  • Revue de code en direct
  • Retrospective des PRs

Q5 — Decrivez un projet complexe que vous avez mene de A a Z.

Structure : Contexte metier → Architecture → Implementation → Tests → MEP → Retour

Exemple : Migration monolithe → microservices. 12 services, 8 equipes, 6 mois. API-first, CI/CD, tests de contrat.

Q6 — Comment priorisez-vous la dette technique ?

Quadrant :

Urgent/ImportantImportant/Pas Urgent
Bug de securiteRefactoring majeur
Perf degradationMigration tech

Reponse : La dette technique est un investissement. On la priorise comme les features. Roadmap technique dediee (20% du temps).

Q7 — Comment donnez-vous du feedback negatif a un collegue ?

Methode SBI :

  • Situation : "Hier pendant la revue de code..."
  • Behavior : "...tu as approuve une PR avec des bugs"
  • Impact : "...ce qui a cause un incident en prod"

Conseil : Feedback prive, specifique, oriente solution.

Q8 — Que faites-vous si vous n'etes pas d'accord avec la decision de votre manager ?

Approche :

  1. Comprendre les contraintes du manager
  2. Proposer des alternatives
  3. Accepter la decision si elle est prise (disagree and commit)
  4. Documenter les risques

Resolution de problemes (Q9-Q16)

Q9 — Decrivez un bug complexe que vous avez resolu.

Exemple : Fuite memoire en production. Heap dump analysis → ThreadLocal non nettoye dans un pool de threads → objets retenus. Solution : try-finally avec remove().

Q10 — Comment diagnostiquez-vous un probleme de performance ?

Approche :

  1. Definir le SLO (p95 latency, throughput)
  2. Profiling CPU (async profiler)
  3. Profiling allocation
  4. JFR recording
  5. GC logs analysis
  6. Database query analysis
  7. Reseau/latency

Q11 — Comment gerer un incident de production ?

Runbook :

  1. Stop the bleeding (rollback, feature flag)
  2. Diagnose (logs, metrics, traces)
  3. Fix or workaround
  4. Post-mortem (blameless)
  5. Action items

Q12 — Comment testez-vous un systeme distribue ?

Approche :

  • Unit tests (JUnit 5, Mockito)
  • Integration tests (Testcontainers)
  • Contract tests (Pact)
  • End-to-end tests
  • Chaos engineering
  • Performance/load tests

Q13 — Quelle est votre approche pour optimiser une requete JPA lente ?

Processus :

  1. Activer SQL logging et slow query log
  2. Analyser le plan d'execution
  3. Verifier les indexes
  4. Chercher N+1 (JOIN FETCH)
  5. Pagination
  6. Cache (L2 cache, Redis)
  7. Requete native si necessaire

Q14 — Comment assurez-vous la securite d'une API REST ?

Checklist :

  • HTTPS only
  • Authentication (JWT/OAuth2)
  • Authorization (@PreAuthorize)
  • Input validation (@Valid)
  • Rate limiting
  • CORS configure
  • CSRF protection
  • Security headers
  • Audit logging

Q15 — Comment gerer le passage a l'echelle d'une application ?

Axes :

  • Vertical : Plus de CPU/RAM (limite)
  • Horizontal : Plus d'instances (load balancer)
  • Cache : Redis, CDN
  • Async : Queue, events
  • Database : Read replicas, sharding
  • Microservices : Decoupage

Q16 — Quelle est votre experience avec CI/CD ?

Pipeline type :

  1. Build (Maven/Gradle)
  2. Tests unitaires
  3. Analyse SonarQube
  4. Tests integration (Testcontainers)
  5. Build image Docker
  6. Scan de securite (Trivy)
  7. Deploiement staging
  8. Tests E2E
  9. Deploiement production (canary/blue-green)
  10. Monitoring

Gestion d'echecs et conflits (Q17-Q22)

Q17 — Racontez un moment ou vous avez manque un deadline.

Approche honnete :

  • Communication precoce du risque
  • Proposition de perimetre reduit
  • Plan de rattrapage
  • Lecon : mieux estimer, buffer temps

Q18 — Comment reagissez-vous a un code review tres critique ?

Attitude :

  • Remercier le reviewer
  • Comprendre chaque point
  • Ne pas prendre personnellement
  • Ameliorer le code
  • Proposer des standards d'equipe

Q19 — Que faites-vous si un membre de l'equipe ne contribue pas ?

Approche :

  1. Check-in prive pour comprendre (charge de travail, probleme perso, skills)
  2. Offrir du support / pair programming
  3. Ajuster les taches si necessaire
  4. Escalader si persiste

Q20 — Decrivez une situation de mise en production difficile.

Exemple : Migration DB avec downtime zero. Schema changes progressifs, dual writes, feature flags, rollback plan. 4h de fenetre, 2h effectives.

Q21 — Comment gerer la pression d'un incident critique ?

Techniques :

  • Respiration, focus
  • Delegation (chacun son role)
  • Communication transparente
  • Blameless culture
  • Post-mortem structure

Q22 — Que faites-vous si on vous demande l'impossible ?

Reponse : Expliquer pourquoi c'est impossible, proposer des alternatives realistes, demander des compromis (scope/time/quality triangle).


Communication technique (Q23-Q27)

Q23 — Comment expliquez-vous un concept complexe a un non-technique ?

Exemple : "Le microservice, c'est comme une equipe specialisee : chaque equipe fait un travail precis et communique via des emails (APIs)."

Q24 — Comment rediger une documentation technique efficace ?

Principes :

  • README : pourquoi, comment demarrer
  • Architecture : ADR, diagrammes C4
  • API : OpenAPI/Swagger
  • Operations : Runbook, playbook
  • Garder a jour (docs as code)

Q25 — Comment mener une retrospective efficace ?

Format :

  • Start/Stop/Continue
  • Action items (SMART)
  • Blameless
  • Rotating facilitator
  • Max 1h

Q26 — Comment donner une presentation technique convaincante ?

Structure :

  • Problem statement
  • Solution (code, demo)
  • Benchmarks / results
  • Lessons learned
  • Q&A

Q27 — Comment gerez-vous les questions pendant une presentation ?

Conseils :

  • "Bonne question, je note et j'y reviens"
  • Parking lot pour les hors-sujet
  • Prendre le temps de reflechir
  • "Je ne sais pas, je vais verifier"

Vision produit et technique (Q28-Q30)

Q28 — Comment equilibrez-vous qualite et velocite ?

Reponse : La qualite n'est pas optionnelle. TDD, code review, CI/CD sont des accelerateurs, pas des freins. La dette technique se paye avec interet.

Q29 — Comment restez-vous a jour techniquement ?

Veille :

  • Baeldung, Inside Java newsletter
  • Conference Devoxx (annuel)
  • JEPs tracking
  • Petits projets perso
  • Contribution open source

Q30 — Quelle est votre vision de l'architecture logicielle dans 5 ans ?

Tendances :

  • Virtual threads comme norme
  • Native compilation (GraalVM, Leyden)
  • AI-assisted development
  • Platform engineering
  • Event-driven architecture
  • Cloud-native par defaut

Partie B : Questions techniques (30)

Java Core (Q1-Q8)

Q1 — Quelle est la difference entre un record et une classe ?

Reponse : Les records sont des classes transport implicites (final, equals/hashCode/toString generes automatiquement). Champs : composants du record. Pas d'heritage. Ideaux pour les DTOs, Value Objects.

Q2 — Expliquez le modele memoire Java (JMM).

Points cles :

  • Happens-before : ordre partiel des operations
  • Volatile : visibilite garantie
  • Synchronized : mutual exclusion + visibilite
  • Atomicity : operations atomiques
  • Reordering : le compilateur peut reordonner

Q3 — Comment fonctionne le garbage collection ? Comparez G1, ZGC, Shenandoah.

GCPauseThroughputHeap
G1~50msEleve4-64 Go
ZGC<10msMoyen512Go+
Shenandoah<10msMoyenGrand

G1 : Region-based, concurrent marking, compaction partielle ZGC : Colored pointers, load barriers, concurrent compaction Shenandoah : Forwarding pointers, Brooks pointers

Q4 — Expliquez les virtual threads (Project Loom).

Concepts :

  • Threads legers, millions par application
  • Mount/unmount sur les platform threads (carrier threads)
  • Pas de pool, creation/destruction quasi-gratuite
  • Compatibles avec synchronized (pinning)
  • Structured concurrency pour la gestion de cycle de vie
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
    Future<String> user = scope.fork(() -> fetchUser());
    Future<Integer> orders = scope.fork(() -> fetchOrders());
    scope.join();
    return new Result(user.resultNow(), orders.resultNow());
}

Q5 — Quelle est la difference entre synchronized et ReentrantLock ?

synchronized : implicite, bloc, ne peut pas etre interrompu ReentrantLock : explicite, tryLock(timeout), lockInterruptibly(), fair ou non

Q6 — Comment fonctionne ConcurrentHashMap ?

  • Segments internes (Java 7) → Node arrays (Java 8+)
  • Lock striping : verrouillage fin par bucket
  • CAS pour les operations non-contentieuses
  • computeIfAbsent atomique
  • Iterateurs faiblement consistants

Q7 — Expliquez le pattern matching en Java 21.

switch (obj) {
    case String s when s.length() > 5 -> "Long string: " + s;
    case String s -> "Short string";
    case Integer i -> "Number: " + i;
    case null -> "Null";
    default -> "Unknown";
}
  • Type patterns, guarded patterns
  • Record patterns : case Point(int x, int y) -> ...
  • null support depuis Java 21

Q8 — Que sont les Sealed Classes et les Permits ?

public sealed class Vehicle permits Car, Truck, Motorcycle {}
  • Hierarchie controlee
  • Pattern matching exhaustif (pas de default necessaire si tous les cas couverts)
  • permits liste les sous-classes autorisees
  • Les sous-classes doivent etre final, sealed, ou non-sealed

Spring / Spring Boot (Q9-Q14)

Q9 — Expliquez le cycle de vie d'un bean Spring.

  1. Bean definition (parsing XML/annotations/@Bean)
  2. Instantiation
  3. Dependency injection (constructor/setter/field)
  4. Initialization (@PostConstruct, InitializingBean)
  5. Proxy (AOP, transaction)
  6. Ready
  7. Destruction (@PreDestroy, DisposableBean)

Q10 — Quelle est la difference entre @Component, @Service, @Repository, @Controller ?

  • @Component : stereotype generique
  • @Service : service metier
  • @Repository : DAO avec traduction des exceptions JPA
  • @Controller : MVC controller
  • Tous sont des @Component avec des semantiques differentes

Q11 — Comment fonctionne l'auto-configuration Spring Boot ?

  • @EnableAutoConfiguration importe AutoConfigurationImportSelector
  • Lecture de spring.factories / META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  • Conditions (@ConditionalOnClass, @ConditionalOnProperty, @ConditionalOnMissingBean)
  • ApplicationContext rafraichi avec les beans conditionnellement crees

Q12 — Comment gerer les transactions en Spring ?

  • @Transactional sur methode publique
  • Propagation : REQUIRED, REQUIRES_NEW, NESTED, SUPPORTS, NOT_SUPPORTED, NEVER, MANDATORY
  • Isolation : DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
  • Rollback : @Transactional(rollbackFor = Exception.class, noRollbackFor = SomeException.class)
  • AOP proxy : appelle la methode sur le proxy, pas sur this

Q13 — Expliquez Spring Security 6.0 SecurityFilterChain.

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/api/public/**").permitAll()
            .requestMatchers("/api/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated())
        .oauth2ResourceServer(oauth2 -> oauth2.jwt())
        .csrf(csrf -> csrf.disable());
    return http.build();
}
  • Remplace WebSecurityConfigurerAdapter (deprecated)
  • Lambda DSL
  • Multiple SecurityFilterChain beans via @Order ou @ConditionalOnMissingBean

Q14 — Quelle est la difference entre Spring MVC et WebFlux ?

Spring MVCSpring WebFlux
Servlet APIReactive (Reactor)
Thread per requestEvent loop
Blocking I/ONon-blocking
Tomcat, JettyNetty, Undertow
ImperatifDeclaratif (Mono/Flux)

JPA / Hibernate (Q15-Q18)

Q15 — Expliquez le probleme N+1 et ses solutions.

Probleme : 1 requete pour la liste + N requetes pour chaque association. Solutions :

  • JOIN FETCH en JPQL
  • @EntityGraph(attributePaths = {"association"})
  • @BatchSize(size = 20)
  • Appel explicite (HINT PASS_DISTINCT_THROUGH)

Q16 — Quelle est la difference entre FetchType.EAGER et FetchType.LAZY ?

EAGER : chargement immediat (JOIN ou requete supplementaire). Defaut pour @*ToOne. Risque N+1 ou produit cartesien. LAZY : proxy cree, charge a l'acces. Defaut pour @*ToMany. Probleme si acces hors transaction (LazyInitializationException).

Q17 — Comment fonctionne le cache Hibernate ?

  • L1 cache : Session, toujours actif, invisible
  • L2 cache : SessionFactory (Hazelcast, Redis, EHCache)
  • Query cache : caches les resultats de requetes
  • Cache region : par entite, collection, requete
  • @Cacheable, @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

Q18 -- Expliquez l'Optimistic Locking vs Pessimistic Locking.

Optimistic : @Version (timestamp ou long). Check au flush. ObjectOptimisticLockingFailureException. Pessimistic : LockModeType.PESSIMISTIC_WRITE. SELECT ... FOR UPDATE. Verrouillage DB.


Architecture et System Design (Q19-Q23)

Q19 — Concevez un systeme de URL shortener (tinyurl).

Composants :

  • API Gateway
  • Service de generation (base62, ID generator)
  • Cache Redis (hot URLs)
  • Database (read replicas)
  • CDN pour les redirects

Flow :

  1. POST /shorten → genere ID → stocke en DB → retourne short URL
  2. GET /{shortId} → check Redis → redirect 301 → log analytics async

Scale : Bloom filter pour les IDs deja utilises, consistent hashing pour le cache.

Q20 — Concevez un systeme de paiement.

Composants :

  • Payment Service (orchestration)
  • Gateway Adapters (Stripe, PayPal)
  • Fraud Detection Service
  • Ledger Service (comptable)
  • Notification Service
  • Dead Letter Queue

Flow :

  1. Validate order
  2. Reserve payment (2-phase)
  3. Process payment
  4. Update ledger
  5. Notify
  6. Handle failures (retry, DLQ, reconciliation)

Q21 — Expliquez l'architecture hexagonale (ports/adapters).

[Controllers] → [Application] → [Domain] ← [Repository Interfaces]
     ↓                                 ↓
[DTOs]                          [Domain Entities]
     ↓                                 ↓
[Web Adapter]                   [JPA Adapter]
  • Domain : pur Java, aucune infrastructure
  • Ports : interfaces dans le domaine
  • Adapters : implementation des ports (REST, JPA, Kafka)
  • Dependances : tout pointe vers le domaine

Q22 — CQRS et Event Sourcing : quand et pourquoi ?

CQRS : Separation lecture/ecriture. Utile quand les models de lecture et ecriture sont differents. Event Sourcing : Stocke les evenements, derive l'etat. Utile pour audit, temporal queries, complexite du domaine.

Quand : Domaines complexes (finance, assurance, e-commerce), audit obligatoire. Quand pas : CRUD simple, reporting standard.

Q23 — Comment passer du monolithe aux microservices ?

Strategie Strangler Fig :

  1. Identifier les bounded contexts
  2. Extraire un service a la fois
  3. Feature flags pour le basculement
  4. Anti-corruption layer
  5. Database per service (eventuellement)
  6. Observabilite (tracing, metrics, logs)

Coding Challenges (Q24-Q27)

Q24 — Implementez une fonction qui verifie si une chaine est un palindrome.

boolean isPalindrome(String s) {
    if (s == null) return false;
    String cleaned = s.toLowerCase().replaceAll("[^a-z0-9]", "");
    return cleaned.equals(new StringBuilder(cleaned).reverse().toString());
}

Q25 — Trouvez le premier caractere non-repetitif dans une chaine.

Optional<Character> firstNonRepeating(String s) {
    var counts = new LinkedHashMap<Character, Integer>();
    s.chars().forEach(c -> counts.merge((char) c, 1, Integer::sum));
    return counts.entrySet().stream()
        .filter(e -> e.getValue() == 1)
        .map(Map.Entry::getKey)
        .findFirst();
}

Q26 — Implementez une file d'attente avec deux stacks.

class QueueWithStacks<T> {
    private final Stack<T> in = new Stack<>();
    private final Stack<T> out = new Stack<>();

    public void enqueue(T item) { in.push(item); }

    public T dequeue() {
        if (out.isEmpty()) {
            while (!in.isEmpty()) out.push(in.pop());
        }
        return out.pop();
    }

    public boolean isEmpty() { return in.isEmpty() && out.isEmpty(); }
}

Q27 — Inversez un arbre binaire (invert binary tree).

TreeNode invertTree(TreeNode root) {
    if (root == null) return null;
    var temp = root.left;
    root.left = invertTree(root.right);
    root.right = invertTree(temp);
    return root;
}

System Design approfondi (Q28-Q30)

Q28 — Concevez un systeme de chat en temps reel.

Composants :

  • WebSocket Gateway (Spring WebFlux)
  • Redis Pub/Sub (distribution)
  • Cassandra pour l'historique
  • Kafka pour les evenements
  • CDN pour les fichiers/media

Scale : Horizontal scaling des WebSocket connections, consistent hashing pour le routing.

Q29 — Concevez un systeme de recommandations.

Composants :

  • User profile service
  • Item catalog service
  • Recommendation engine (collaborative filtering, ML)
  • Cache Redis (hot recommendations)
  • Batch processing (Spark)
  • Online serving (low latency)

Architecture : Lambda architecture (batch + speed layer).

Q30 — Concevez une plateforme de streaming video (Netflix-like).

Composants :

  • CDN (video chunks)
  • Encoding pipeline (FFmpeg, parallel)
  • Catalog service
  • User service
  • Recommendation service
  • Analytics pipeline

Encoding : Multiple bitrates (HLS/DASH), adaptive streaming, hot content caching.


Preparation finale

Semaine avant l'entretien

  • Revoir les fondamentaux Java (JMM, GC, concurrency)
  • Spring Boot auto-configuration
  • Design patterns (Strategy, Factory, Observer)
  • Algorithmes (1-2 problemes LeetCode par jour)
  • System design (1-2 designs)

Pendant l'entretien

  • Pensez a voix haute
  • Clarifiez les exigences
  • Commencez simple, optimisez apres
  • Testez mentalement votre solution
  • Discutez des trade-offs

Questions a poser au recruteur

  • Stack technique actuelle ?
  • Process CI/CD ?
  • Dette technique connue ?
  • Onboarding process ?
  • Bilan de l'equipe (seniors/juniors) ?