Skip to content

Instantly share code, notes, and snippets.

@seropian
Last active December 4, 2025 09:48
Show Gist options
  • Select an option

  • Save seropian/4956d50ddf5383dd171634941d3560ae to your computer and use it in GitHub Desktop.

Select an option

Save seropian/4956d50ddf5383dd171634941d3560ae to your computer and use it in GitHub Desktop.
Learn Java by doing

Practical Learning By Doing

by Dikran Seropian @ Adobe

Share on Share on LinkedIn

Java Mastery: From Fundamentals to Cloud-Native Enterprise Systems

To become proficient in Java, a student needs a structured path from basic syntax to enterprise-level concepts. Below are 10 Java projects with increasing complexity, culminating in a robust cloud-native application.


⚠️ Important: How to Learn Effectively

Use AI Assistants Wisely

Modern developers have powerful AI tools at their disposal, and you should absolutely use themβ€”but use them correctly to maximize your learning:

βœ… DO use AI assistants to:

  • Explain concepts you don't understand
  • Review your code and suggest improvements
  • Debug errors and understand error messages
  • Get unstuck when you're facing difficult problems
  • Learn best practices and design patterns
  • Understand how different parts of the code work together

❌ DON'T let AI assistants:

  • Write all the code for you from scratch
  • Complete entire projects without your active participation
  • Prevent you from struggling with problems (struggle is where learning happens)

The Golden Rule: Write the Code Yourself

You must type every line of code yourself to truly understand and learn. Even if an AI assistant suggests a solution, don't just copy-paste it. Instead:

  1. Read and understand the suggested solution
  2. Close or minimize the AI's response
  3. Type the code yourself from memory and understanding
  4. If you get stuck, refer back to the explanation, then try again

Why This Matters: The act of typing code yourself forces your brain to process each line, understand the syntax, and internalize the patterns. Copy-pasting bypasses this crucial learning process. Professional developers don't just know what code to writeβ€”they understand why it works and can adapt it to new situations. That understanding only comes from hands-on practice.

Think of AI as Your Mentor, Not Your Ghost Writer: A good mentor explains concepts, reviews your work, and helps when you're stuckβ€”but they don't do the work for you. Use AI assistants the same way. The goal is to build your own skills and understanding, not to have a perfect project written by someone (or something) else.


1. Console-Based Calculator πŸ”’

Description

This is the foundational project to master basic Java syntax, control flow (if/else, switch), and user input (Scanner). The program should accept two numbers and an operator ($+$, $-$, $*$, $/$) from the console and display the result. It should include basic error handling for non-numeric input and division by zero.

Design Diagram (Mermaid)

graph TD
    A[Start] --> B{User Input: Num1, Operator, Num2};
    B --> C{Validate Input};
    C -- Valid --> D{Perform Calculation};
    C -- Invalid --> E[Display Error & Restart];
    D -- Division by Zero --> F[Display Error: Division by Zero];
    D --> G[Display Result];
    G --> H[End];
    F --> H;
    E --> B;
Loading

2. Text-Based Adventure Game (Zork-like) πŸ—ΊοΈ

Description

This project introduces Object-Oriented Programming (OOP) core principles: Classes, Objects, Inheritance, and Encapsulation. The game defines Rooms, Items, and a Player class. The student will use Java Collections (like HashMap for room exits and ArrayList for inventory) and file handling (reading from a text file to define the game world).

Design Diagram (Mermaid)

classDiagram
    class Player {
        -String name
        -ArrayList~Item~ inventory
        +void move(Room newRoom)
        +void pickUp(Item item)
        +void useItem(Item item)
    }
    class Room {
        -String description
        -HashMap~String, Room~ exits
        -ArrayList~Item~ items
        +Room getExit(String direction)
    }
    class Item {
        -String name
        -String description
        +void inspect()
    }
    Room "1" -- "*" Item : contains
    Player "1" -- "1" Room : current location
    Player "1" -- "*" Item : has
Loading

3. Simple Banking Application (ATM Simulator) 🏦

Description

This moves into intermediate OOP and focuses on creating a multi-class system with a clear separation of concerns. It uses classes for Account, Customer, and the main ATM simulator. It enforces data security (passwords) and uses exception handling for scenarios like insufficient funds or incorrect PIN. A basic persistence mechanism, like writing account data to a file, should be implemented.

Design Diagram (Mermaid)

classDiagram
    class Customer {
        -int customerId
        -String name
        -String pin
        -Account account
        +boolean authenticate(String pin)
    }
    class Account {
        -String accountNumber
        -double balance
        +void deposit(double amount)
        +boolean withdraw(double amount)
        +double getBalance()
    }
    class ATMSimulator {
        -HashMap~int, Customer~ customers
        +void start()
        +void processTransaction(Customer c)
    }
    ATMSimulator "1" -- "*" Customer : manages
    Customer "1" -- "1" Account : holds
Loading

4. Library Management System with JDBC πŸ“š

Description

This project is the student's first encounter with database integration using Java Database Connectivity (JDBC). It will connect to a relational database (MySQL or PostgreSQL) to perform CRUD (Create, Read, Update, Delete) operations on two main tables: Books and Members. A basic GUI using Swing or JavaFX is highly recommended to visualize the data and transactions (e.g., Book Issue/Return). This reinforces the use of the DAO (Data Access Object) pattern.

Design Diagram (Mermaid)

graph TD
    A["GUI/Console Interface"] --> B["Controller/Service Layer"];
    B --> C["DAO - Data Access Object"];
    C --> D["JDBC Driver"];
    D --> E["Database - MySQL/PostgreSQL"];
    E --> C;
    C --> B;
    B --> A;

    subgraph Database_Schema["Database Schema"]
        Book["Book: id, title, author, isbn, is_issued"]
        Member["Member: id, name, contact"]
        Trans["Transaction: id, book_id, member_id, issue_date, return_date"]
        Book -.-> Trans
        Member -.-> Trans
    end
Loading

5. Multi-Threaded Chat Application πŸ’¬

Description

This project introduces Networking and Concurrency (multi-threading), a major step in complexity. The application uses Java Sockets (client-server model) to allow multiple clients to connect to a central server and exchange messages in real-time. The server must be able to handle multiple client connections concurrently, requiring the use of Threads or Executors to manage each client session. This is excellent practice for handling asynchronous communication.

Design Diagram (Mermaid)

graph TD
    subgraph Client_N["Client N"]
        N1[Client Input/Output] --> N2(Client Socket)
    end
    subgraph Client_2["Client 2"]
        C1[Client Input/Output] --> C2(Client Socket)
    end
    subgraph Client_1["Client 1"]
        A1[Client Input/Output] --> A2(Client Socket)
    end

    subgraph Server
        S[Server Socket Listener]
        S_Handler[Thread per Client]
        S_Comm[Broadcast/Direct Message]
    end

    A2 --> S
    C2 --> S
    N2 --> S
    S --> S_Handler
    S_Handler --> S_Comm
    S_Comm --> B2(Client Socket)
    S_Comm --> D2(Client Socket)
    S_Comm --> F2(Client Socket)
Loading

6. RESTful To-Do List Service (Spring Boot/JAX-RS) πŸ“

Description

This marks the transition to enterprise development using a major framework like Spring Boot or Quarkus to build a RESTful API. The project involves defining endpoints for managing a To-Do list (tasks), including creating, retrieving, updating, and deleting tasks (the CRUD operations). This introduces concepts like Dependency Injection, MVC (Model-View-Controller) or Layered Architecture, and using JPA/Hibernate for persistent data storage in a database.

Design Diagram (Mermaid)

graph LR
    A["HTTP Client/Frontend"] --> B["REST Controller"];
    B --> C["Service Layer"];
    C --> D["Repository/DAO - Spring Data JPA"];
    D --> E["Relational Database"];

    subgraph Spring_Boot_Application["Spring Boot Application"]
        B
        C
        D
    end

    style A fill:#f9f,stroke:#333
    style E fill:#ccf,stroke:#333
Loading

7. Simple E-commerce Backend with Authentication (Spring Security) πŸ›οΈ

Description

Building on the RESTful service, this project introduces User Management and Security using Spring Security (or equivalent). The backend should handle User Registration, Login (JWT/OAuth2 is a stretch goal), Role-Based Access Control (RBAC) (e.g., Admin vs. Customer), and secure endpoints. It will feature core e-commerce entities like Product, User, and Order, demonstrating secure API design and database transactions.

Design Diagram (Mermaid)

graph TD
    A["User Browser/Mobile"] -- Login --> B["Authentication Filter"];
    B -- "Valid Credentials" --> C["Spring Security Context"];
    C -- "Token/Session" --> D["REST Controller"];
    D -- "Check Roles" --> E{"Authorization Guard"};
    E -- Allowed --> F["Service Layer"];
    E -- Denied --> G["401/403 Error"];
    F --> H["Product/Order Repository"];
    H --> I["Database"];

    subgraph Spring_Boot_App["Spring Boot App"]
        B
        C
        D
        E
        F
        H
    end
Loading

8. Asynchronous Processing with Messaging (Kafka/RabbitMQ) πŸ“§

Description

The complexity escalates with the introduction of Asynchronous Messaging. The e-commerce backend needs a feature like "Order Confirmation Email". Instead of sending the email directly (which is slow), the ordering service should publish an Order Placed Event to a message queue (Apache Kafka or RabbitMQ). A separate, dedicated Email Service will then consume the message and send the email. This demonstrates decoupling services and handling event-driven architecture.

Design Diagram (Mermaid)

graph TD
    A["E-commerce Service Producer"] --> B["Message Broker - Kafka/RabbitMQ"];
    B --> C["Email Service Consumer"];
    B --> D["Inventory Service Consumer"];
    A -- "1. Order Placed" --> B;
    C -- "2. Send Confirmation Email" --> E["Email Provider"];
    D -- "2. Update Stock" --> F["Database/Inventory"];

    subgraph Decoupled_Services["Decoupled Services"]
        A
        C
        D
    end
Loading

9. Monolith to Microservices Refactoring βš™οΈ

Description

This project takes the e-commerce application from Project 7 and splits it into at least three separate, independently deployable Microservices: User Service, Product Catalog Service, and Order Service. The student will implement Service Discovery (Eureka or Consul), and Inter-Service Communication (using REST/Feign or Async Messaging from Project 8). This is an exercise in managing a distributed system and handling new challenges like data consistency and network latency.

Design Diagram (Mermaid)

graph LR
    A[API Gateway/Load Balancer] --> B(User Service)
    A --> C(Product Service)
    A --> D(Order Service)
    B -- REST/RPC --> E(Database 1 - Users)
    C -- REST/RPC --> F(Database 2 - Products)
    D -- REST/RPC --> G(Database 3 - Orders)

    subgraph Service_Discovery["Service Discovery"]
        E_Reg[Eureka/Consul]
    end

    B --> E_Reg
    C --> E_Reg
    D --> E_Reg
Loading

10. Cloud-Native E-commerce Platform with Observability (The Complete Project) ☁️

Description

This is the ultimate capstone project, leveraging the microservices architecture from Project 9 and implementing the critical aspects of a modern cloud-native application:

  • Containers: Containerize all microservices using Docker and define deployment using Docker Compose (local) or Kubernetes (cloud).

  • Cloud Deployment: Deploy the containerized services to a public cloud (AWS ECS/EKS, Azure AKS, Google Cloud GKE).

  • Database: Use a managed database service (e.g., AWS RDS/PostgreSQL).

  • Messaging: Continue using Kafka for critical event communication.

  • Security: Use OAuth 2.0/OpenID Connect for authentication, implement API Gateway for centralized security, and ensure secure configuration (e.g., using Vault or a cloud secret manager).

  • Observability: Implement Logging (centralized logs with ELK Stack/Loki), Metrics/Monitoring (Prometheus & Grafana), and Distributed Tracing (Zipkin/Jaeger) to monitor the health and performance of all services.

  • What Else is Important: Implement Configuration Management (Spring Cloud Config), Health Checks, and Auto-Scaling.

Design Diagram (Mermaid)

graph TD
    subgraph Frontend
        FE["Web/Mobile App"]
    end
    subgraph Cloud_Platform["Cloud Platform - Kubernetes/AWS"]
        subgraph Networking_Security["Networking & Security"]
            A["Cloud Load Balancer"] --> B["API Gateway/Proxy"];
        end
        subgraph Core_Microservices["Core Microservices - Docker Containers"]
            B --> C["Auth/User Service"];
            B --> D["Product Catalog Service"];
            B --> E["Order Service"];
            E --> F["Inventory Service - Async"];
        end
        subgraph Data_Messaging["Data & Messaging"]
            C --> DB_U["Database PostgreSQL"];
            D --> DB_P["Database MongoDB/PostgreSQL"];
            E --> M["Kafka/Message Queue"];
            F --> DB_I["Database PostgreSQL"];
            M --> F;
        end
        subgraph Operations_Observability["Operations & Observability"]
            L["Logging ELK Stack/Loki"]
            M_P["Monitoring Prometheus"]
            T["Tracing Jaeger/Zipkin"]
            L_A["Service Logs"]
            M_A["Service Metrics"]
            T_A["Service Traces"]

            C --> L_A & M_A & T_A;
            D --> L_A & M_A & T_A;
            E --> L_A & M_A & T_A;
            F --> L_A & M_A & T_A;
        end

        FE --> A;
        L_A --> L;
        M_A --> M_P;
        T_A --> T;
    end
Loading

Share on Share on LinkedIn

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment