Yes, a two-week Java internship is enough to explore microservices, as long as “explore” means one clean split of a small monolith into two services with a written API contract, not a full migration. The safest approach is to score the split against a rubric first, build only the seam that survives that scoring, and treat “keep it a modular monolith” as a legitimate finding.
This guide gives you a 14-day scope, a contract template, a scoring rubric for deciding when microservices are not worth the complexity, and a worked illustrative example. It also covers how this kind of exercise fits alongside the final-semester internship rules at IIIT Bangalore.
Why a 14-day Java internship punishes ambitious microservice plans
Microservices add costs that a monolith does not have: network calls that can fail, separate deployments, duplicated configuration, data that no longer lives in one transaction, and debugging across process boundaries. In a fourteen-day window you pay these costs up front and rarely reach the payoff, which is independent scaling and independent team ownership.
The common overreaching patterns look like this:
- Splitting into five or six services because the domain “has” five or six nouns.
- Adding a message broker, a service registry, an API gateway and a tracing stack before two services can talk to each other reliably.
- Sharing one database between the services, which keeps the coupling but adds the network.
- Skipping the written contract and letting the two services agree only through whatever the code happens to do.
- Judging success by the number of services instead of by whether each one can change without breaking the other.
A better target is small and checkable: two services, one contract, one data owner per service, one end-to-end flow that works, and a short written verdict on whether the split was worth it.
Scoring rubric: when microservices are not worth the extra complexity
Run this rubric before writing any new code. Score each row 0, 1 or 2 based on your actual project, not on how the architecture would look in a portfolio. Higher means a stronger case for splitting.
| Criterion | 0 points | 1 point | 2 points |
|---|---|---|---|
| Independent deployment need | Everything ships together anyway | Occasionally one part changes alone | One part changes weekly while the rest is stable |
| Different scaling profile | Uniform load | One part is somewhat heavier | One part needs clearly different resources or instance counts |
| Data separability | Tables are joined everywhere | A few cross-references that could become IDs | The candidate service owns its tables with only ID references outward |
| Team or ownership boundary | One person owns all of it | Two people share the code | Two people or teams genuinely own separate areas |
| Failure isolation value | If one part is down, the whole product is useless anyway | Some degraded behaviour is acceptable | A non-critical part (e.g. notifications) should never block a critical flow |
| Transaction coupling | Operations must commit atomically across the split | Occasional cross-boundary consistency needs | Eventual consistency is acceptable at the boundary |
| Latency tolerance | Calls happen many times per request | One or two calls per request | Calls are asynchronous or rare |
| Operational readiness | No automated build, no logging discipline | Basic build and logs exist | Repeatable builds, health checks and structured logs already exist |
| Test coverage of the seam | No tests around the candidate module | Some unit tests | Tests that describe the behaviour you would expose through the API |
Reading your score for a 14-day scope
- 0-6: Do not split. Refactor into packages or modules with a clear interface inside one deployable. Document the seam so that a later split is cheap.
- 7-11: Build a modular monolith with the contract written as if it were a service. If time remains, run the module as a second process purely as a learning exercise, and label it that way in your write-up.
- 12-18: A two-service split is defensible. Keep it to exactly two services.
Two rows act as veto signals regardless of total. If data separability or transaction coupling scores 0, stop and fix the model first, because splitting across tightly coupled data produces a distributed monolith.
Free 2-Week CareerSwami Internship
Online, 14 days, with a free offer letter and a free completion certificate once you finish the work. Check with your college that it fits your requirement before you enrol.
Choosing the seam in a small monolith
A good first seam has three properties: it does one thing nameable in a sentence, its data can be described without joining to the rest of the schema, and the rest of the application needs only a few of its operations.
Seam-finding steps
- List modules by package. In a typical Spring Boot project this means the controller, service and repository clusters for each business area.
- Draw the dependency arrows. Note which package calls which. A candidate with arrows pointing only inward (others call it, it calls nobody) is the easiest to extract.
- Trace the data. For each candidate, list the tables it reads and writes. Any table touched by both sides is a problem to resolve before extraction.
- Count the operations. If the rest of the app needs more than about five distinct operations from the candidate, the boundary is probably in the wrong place.
- Pick the side-effect-heavy part. Notifications, report generation, file processing and audit logging usually have the cleanest seams because their callers do not need an immediate answer.
A 14-day plan that stays inside two services
| Days | Focus | Deliverable |
|---|---|---|
| 1-2 | Pick or build a small monolith (3-6 entities); map packages and data | Dependency sketch and table-ownership list |
| 3 | Score the rubric honestly | Completed rubric with a one-paragraph decision |
| 4-5 | Refactor inside the monolith: put the candidate behind a Java interface | Monolith still works; the seam is a single interface |
| 6 | Write the API contract first | Contract file reviewed against the interface |
| 7-9 | Extract the second service and give it its own data store or schema | Two runnable processes |
| 10 | Replace the interface implementation with an HTTP client | End-to-end flow works across the boundary |
| 11 | Failure handling: timeouts, a clear error response, one retry rule | Documented behaviour when the second service is down |
| 12 | Contract tests and a short integration test | Tests that fail if the contract drifts |
| 13 | Run both services together, capture logs, compare against the monolith | Short comparison notes |
| 14 | Write the verdict and tidy the README | One-page decision record |
If you are working through the free two-week online internship from CareerSwami, use the same fourteen days and pick the Java track project that fits this scope. Offer letter and completion certificate come with successful completion, but they are separate from your architecture write-up, which is the artefact that shows your thinking.
Writing the API contract before the code
The contract is the main deliverable. It is what lets two services change independently, so write it before extracting anything and keep it short. Cover these elements for every operation:
- Path, method and purpose in one sentence.
- Request fields with types, which are required, and validation limits.
- Response fields and status codes, including every error you intend to return.
- Idempotency: what happens if the caller sends the same request twice.
- Timeout expectation and what the caller should do on failure.
- Versioning rule, such as a
/v1path prefix, and what counts as a breaking change. - Ownership: which service owns which identifier and who may create it.
An illustrative contract fragment in OpenAPI style (not executed or validated, shown only to illustrate structure):
paths:
/v1/notifications:
post:
summary: Queue a notification for a registered user
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [requestId, userId, templateCode]
properties:
requestId: { type: string, description: "Caller-generated; repeat = same result" }
userId: { type: string }
templateCode: { type: string, enum: [REGISTRATION_CONFIRMED, EVENT_REMINDER] }
responses:
"202": { description: Accepted for delivery }
"400": { description: Unknown template or missing field }
"409": { description: requestId already processed }
Note the requestId. It makes the call safe to retry, which matters once a network sits between the two services.
Worked illustration: splitting notifications from a campus event registration app
This example is illustrative, with invented numbers, and no code or tests were run for it.
Imagine a Spring Boot monolith for campus event registration with four areas: Events, Registrations, Users and Notifications. One student built it alone. Notifications sends confirmation emails and reminders, and currently does so inside the registration transaction.
| Rubric row | Score | Reasoning |
|---|---|---|
| Independent deployment need | 1 | Email templates change more often than registration rules |
| Different scaling profile | 0 | Load is tiny and uniform |
| Data separability | 2 | Notifications owns a log table and refers to users only by ID |
| Team or ownership boundary | 0 | One developer |
| Failure isolation value | 2 | A mail failure should not roll back a registration |
| Transaction coupling | 2 | Eventual delivery is fine |
| Latency tolerance | 2 | One asynchronous-style call per registration |
| Operational readiness | 1 | Build exists, logs are unstructured |
| Test coverage of the seam | 1 | A few unit tests on the mail service |
The total is 11, which falls in the modular-monolith band. The honest verdict: the real benefit is failure isolation, not scale or team autonomy. The student therefore extracts Notifications as a learning exercise, labels it as such, and records that for a one-person project with this load, the modular monolith alone would be the production choice. The exercise still produces a contract, a retry rule and a failure test, which is exactly the evidence an interviewer can discuss.
Handling data, failures and testing across the split
Data
- Give each service its own schema or database. Cross-service references are IDs, never foreign keys across the boundary.
- If the notification service needs a user’s email, either pass it in the request or fetch it through a documented endpoint. Do not read the other service’s tables.
Failures
- Set an explicit connection and read timeout on the HTTP client.
- Decide what the caller does when the call fails: queue and retry later, drop with a log entry, or surface an error. Write that decision in the contract.
- Test the failure by stopping the second service and recording what the user sees.
Tests
- A consumer-side test that checks the client sends a request matching the contract.
- A provider-side test that checks the service returns documented status codes.
- One integration test through both processes. Keep it small so that it runs in seconds.
IIIT Bangalore students: placing a short microservices exercise next to your final-semester internship rules
IIIT Bangalore’s formal internship expectations are much larger than a fourteen-day project. The recruiter guidelines for 2026-27 graduates say final-semester students (mid-December to mid-June) complete 16-20 credits through one of four modes: a full-time industry internship, a faculty-supervised thesis, a research project or exchange programme, or a startup under the IIIT-B Innovation Center. The same document treats the internship as equivalent to a thesis in an industry setting, requiring a clear problem description, at least one mid-term report and a final completion certificate in the prescribed format.
The placements overview page adds that at least 5.5 months of the chosen option must be completed by 15 June and that a report and certificate are due by 20 June. This page sits under a test-style path, so check the live version before relying on the dates.
In practice, a two-week exercise is preparation, not a substitute. It will not meet a months-long duration or a prescribed-format certificate. Where it helps is in building a concrete architecture story and a decision record that you can discuss with a prospective host company when internship offers are being made. The placements overview page lists internship-related recruitment months, including September-October for 6-month internships, so a finished write-up is useful before then.
The guidelines also say the problem description must be clear. The scoping habit in this article (one seam, one contract, one verdict) is the same discipline, applied to your own project.
Verification steps for IIIT-B students
- Ask the Placement Office (
iiitb_placement@iiitb.ac.in, the address the guidelines give for recruiters) or your programme office whether any short online internship can count toward anything. Do not assume it earns credit. - Request the current academic regulations for your batch and read the internship and thesis sections for credit and evaluation weightage.
- Confirm the live dates for the mid-term report and the final submission against the current academic calendar.
- Ask your faculty advisor whether an architecture write-up like this one is useful for the final-semester problem description.
- If you plan to mention this exercise to a recruiter, check with your placement representative how the one-job-per-student policy and offer timelines apply to your batch.
The decision record: what to hand in at the end of day 14
A one-page decision record is more convincing than an extra service. Include these headings:
- Context: what the monolith does and its size.
- Rubric result: the table and the band it fell into.
- Decision: what you built and what you chose not to build.
- Contract summary: operations, error codes and versioning rule.
- Failure behaviour: what happens when the second service is down.
- Measured differences: startup time, number of moving parts, lines of configuration, as you actually observed them.
- Would I ship this? A direct answer with reasons, which can be “no”.
Scope cuts that keep the exercise honest
- Skip Kubernetes. Docker Compose, or two plain processes, is enough.
- Skip a service mesh, a gateway and a registry. Hard-code the base URL in configuration.
- Skip a message broker unless the rubric specifically calls for asynchronous delivery; a synchronous call with a timeout teaches the same contract lessons.
- Skip authentication between services unless your project needs it, and note that gap in the decision record.
- Skip a third service. Adding one multiplies integration work without adding new ideas.
Frequently Asked Questions
Can I really learn microservices in 14 days?
You can learn the boundary skills: choosing a seam, writing a contract, handling a failed call and testing across processes. You will not learn operating microservices at scale, which needs sustained production exposure.
Should my project end with two services even if the rubric says not to split?
If the score lands in the lower band, build the modular monolith and write the contract against the in-process interface. If you still extract a second process, label it a learning exercise in your README. Presenting it as the right production design would be misleading.
Is a shared database ever acceptable between two services?
It defeats the main benefit, since a schema change in one service can break the other. For a short exercise it is better to give each service its own schema and pass IDs, even if both schemas sit on one database server.
REST or messaging for the first split?
Use REST with an explicit timeout for the first split because it is easiest to test and debug. Consider messaging only when the rubric shows that the caller must not wait, and keep it to one queue.
Will this internship count for credit at IIIT Bangalore?
The CareerSwami internship is free and gives an offer letter and a completion certificate on successful completion. It is not described as academic credit. The institute’s own credit rules for final-semester options are separate, so ask your programme office about them.
What should I put on my resume from this exercise?
Describe what you actually did: “split a Java monolith into two services with a versioned API contract and contract tests, and documented a rubric-based decision.” Do not claim production usage, scale figures or tools you did not use.
How do I know the monolith is small enough?
If you can describe every package and its tables from memory in five minutes, it is the right size. A few entities and a handful of endpoints are enough to demonstrate the seam.
What if my contract needs to change midway?
Change the contract file first, update both sides and the contract tests, and note the change in the decision record. Practising this loop is part of the learning. If a change is breaking, bump the version path instead of silently altering behaviour.
Related Java & Enterprise Software guides
- Geetanjali University Students: A LinkedIn Update Plan for Your Java Internship
- JSS Science & Technology University: Writing Clean Java Code a Mentor Will Approve
- Al-Karim University Students: Starting a Java Internship With Only Basic English Confidence
- All Java & Enterprise Software internship guides
Ready to put this into practice?
Join the free two-week CareerSwami online internship in Java & Enterprise Software. The internship, the offer letter and the completion certificate are free.




