JAVA Contents

Java

Java is a mature platform used in enterprise systems and backend services. Learn JVM fundamentals, concurrency, and scalable applications.

77 lessons · 0 examples

Java Foundations & Tooling(8)

JDK Distributions, Version Strategy
Choose a JDK distribution deliberately and lock a clear version strategy so builds and production runtime stay reproducible across developer machines, CI, and servers.
Maven vs Gradle, Standard Layout
Choose Maven or Gradle based on team constraints, enforce a predictable project layout, and make builds deterministic across laptops and CI to prevent production drift.
Running, Fat JAR, Manifest
Package Java services into a predictable deployable artifact with an explicit entrypoint, sane JVM defaults, and diagnostics that make production failures fast to triage.
SLF4J, Logback, Log Levels
Use SLF4J as a logging facade, configure Logback for safe rotation and predictable formats, and apply log level discipline so production logs stay useful, cheap, and searchable.
Config with Env Vars, Profiles
Manage configuration as deploy-time data: define clear precedence, validate critical settings at startup, avoid dev/prod drift from profiles, and keep secrets out of code and logs.
CLI Args, Exit Codes, Non-zero Failures
Build production-grade Java CLI tools with strict argument parsing, clear exit codes, correct stdout/stderr usage, and failure messages that are actionable for humans and machines.
Timezones, Locale Footguns
Avoid time and locale outages by standardizing on UTC for storage and logs, using java.time types correctly, injecting Clock for testability, and treating formatting/parsing as a boundary concern.
Dependency Pinning, BOMs, Reproducible Builds
Prevent dependency drift and supply-chain surprises by pinning versions, using BOMs or platforms, failing on conflicts, and making builds reproducible across CI and production.

Core Language & Idioms(8)

Types, Nullability, Optional
Design explicit nullability contracts in your APIs, avoid ambiguous null semantics, and use Optional intentionally at boundaries to prevent production NullPointerException cascades.
Exceptions, Wrapping, Cause Chains
Design exception strategies that preserve context, maintain cause chains, avoid double-logging, and clearly separate domain errors from infrastructure failures.
Immutability, Records, Value Objects
Use immutability and value objects to eliminate entire classes of concurrency bugs, simplify reasoning, and make equals/hashCode reliable in production systems.
Encoding, Unicode, Charset Safety
Standardize on UTF-8, never rely on platform default encoding, and treat charset boundaries explicitly to prevent data corruption and production-only Unicode bugs.
java.time, Clock Injection
Use java.time types intentionally, model time as Instants and Durations internally, inject Clock for deterministic tests, and avoid subtle arithmetic and persistence pitfalls that cause production time bugs.
equals/hashCode, Collections Bugs
Implement equals/hashCode correctly to prevent silent collection corruption, avoid mutable equality keys, and ensure predictable behavior and performance in HashMap/HashSet in production.
Streams in Production (when/when not)
Use Streams when they improve clarity without hiding costs; avoid boxing, uncontrolled parallelism, and side effects so production code stays predictable, debuggable, and efficient.
Validation Patterns (DTO vs Domain)
Validate inputs at system boundaries, enforce invariants in the domain model, and return actionable field-level errors so production failures become client-fixable 400s instead of noisy 500s.

OOP, Design & Maintainability(7)

Packages, Modules, Boundaries
Design clear package and module boundaries to prevent cyclic dependencies, protect domain integrity, and keep infrastructure details from leaking into core business logic.
SOLID (Pragmatic), Avoid Overengineering
Apply SOLID principles pragmatically to reduce coupling and increase testability, but avoid premature abstraction, interface explosion, and design complexity that hurts maintainability.
DI Concepts, Constructor Injection
Use dependency inversion and constructor injection to control object graphs, improve testability, prevent hidden coupling, and avoid lifecycle and circular dependency issues in production systems.
Domain Modeling, Aggregates
Model your domain with explicit invariants and aggregate boundaries so business rules live in one place, transactions stay consistent, and production behavior remains predictable under change.
Error Modeling (Result vs Exception)
Model expected domain errors explicitly and reserve exceptions for truly exceptional failures, so your system communicates intent clearly and behaves predictably in production.
API Design, Backward Compatibility
Design public APIs as long-term contracts, evolve them additively, and understand binary compatibility so changes do not silently break downstream systems in production.
Refactoring, Tests as Guardrails
Refactor safely by making small reversible changes, using tests as guardrails, adding characterization coverage for legacy behavior, and deploying with risk controls like feature flags and incremental rollouts.

Collections, Generics & Functional(6)

Concurrency & Performance Basics(6)

I/O, Files, Networking & HTTP Clients(5)

Data Access & Transactions (JDBC + JPA)(5)

Spring Boot Web Services(6)

Testing, Quality Gates & CI(6)

Observability(5)

Security for Web Services(5)

Build, Release & Deployment(5)

Reliability & Incident Playbooks(5)