Back to Blog
MentoringTeachingReact.NETCareer

Mentoring Junior Developers: What I Learned Teaching React and .NET

Umut Korkmaz2025-01-107 min read

Mentoring junior developers is not about giving motivational speeches. It is about shortening the distance between “I can follow tutorials” and “I can contribute safely in a real codebase.” That gap is where most engineering growth actually happens.

The most effective mentoring I have done in React and .NET teams has always been concrete. Juniors improve faster when the feedback is tied to a real diff, a real bug, or a real design tradeoff instead of vague advice like “write cleaner code.”

The First Goal: Make Thinking Visible

A lot of junior mistakes are not knowledge problems. They are hidden-thinking problems. The engineer writes code, but their assumptions are invisible.

That is why I often ask for a tiny implementation note before a change:

md
What changed:
- added search debounce

Why:
- avoid duplicate requests while typing

Risk:
- search results may feel delayed if debounce is too high

Verification:
- type quickly in search input and confirm only one request fires after pause

Once juniors can explain intent, review quality gets much better.

React Mentoring Worked Best With Before-and-After Refactors

In frontend work, juniors often overfit to whatever they saw in the last tutorial. A common example is putting too much derived state into useState instead of computing it from props or source data.

tsx
// before
const [total, setTotal] = useState(0)

useEffect(() => {
  setTotal(items.reduce((sum, item) => sum + item.price * item.quantity, 0))
}, [items])

// after
const total = items.reduce((sum, item) => sum + item.price * item.quantity, 0)

This kind of refactor is small, but it teaches an important lesson: not every changing value needs to be stored as state.

Backend Mentoring Needed Guardrails Around Validation

In .NET code, a common beginner problem is mixing validation, orchestration, and persistence in one handler or controller action. I try to show a cleaner split early.

csharp
public sealed record CreateCustomerCommand(string Name, string Email);

public sealed class CreateCustomerValidator : AbstractValidator<CreateCustomerCommand>
{
    public CreateCustomerValidator()
    {
        RuleFor(x => x.Name).NotEmpty();
        RuleFor(x => x.Email).NotEmpty().EmailAddress();
    }
}

That example is less about FluentValidation specifically and more about teaching boundaries. Validation should be obvious and easy to test. It should not be hidden halfway through a database workflow.

Review Comments Should Tell the Junior What to Reuse

The best code review comments usually point to an existing pattern instead of just flagging a problem.

md
This works, but it duplicates the request state handling from `useCustomerSearch`.
Please align this with that hook so loading, error, and empty states stay consistent.

That kind of comment teaches the codebase, not just the syntax.

Debugging Was a Skill I Had to Teach Explicitly

Many juniors assume debugging means staring at code until the bug becomes obvious. In practice, debugging is a process of reducing uncertainty.

The checklist I teach is simple:

  1. reproduce the issue consistently
  2. identify where the expected value diverges from the actual value
  3. add the smallest logging or breakpoint needed to isolate the step
  4. verify the fix with the original reproduction path

That process is more valuable long-term than the individual fix.

Mentoring at Scale Needed Reusable Checklists

One-on-one help is useful, but repeated engineering feedback should eventually become reusable material.

md
PR checklist for junior engineers:
[ ] change is scoped to one behavior
[ ] edge cases are named in the PR description
[ ] validation is explicit
[ ] no duplicated helper was introduced
[ ] verification steps are written down

Once that kind of checklist exists, mentoring becomes more consistent across the whole team.

What I Learned

Junior developers do not need less rigor. They need clearer rigor. The strongest mentoring gives them explicit patterns, visible decision-making, and small examples they can reuse immediately.

That is why I still prefer concrete walkthroughs over abstract theory. A short refactor, a precise review comment, or a clean validation example teaches more than a long lecture about craftsmanship ever will.