Back to Blog
MentoringTeachingReact.NETCareer

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

Umut Korkmaz2024-11-157 min read

In 2025, I started teaching at GoIT, leading courses on React and .NET for aspiring developers. Combined with my experience mentoring junior engineers at POMETOP (where I led a team of eight-plus), I have spent a significant part of my recent career helping others grow. This post is about what I have learned from that experience -- not about how to teach code, but about how to help people become engineers.

Why I Started Teaching

After more than a decade of building software, I had reached a point where my growth was increasingly about people, not technology. I could learn a new framework in a weekend, but helping a junior developer build confidence and develop good instincts -- that was a deeper challenge.

The opportunity at GoIT came at the right time. I had been informally mentoring developers at POMETOP for years, and formalizing that into a teaching role forced me to be more intentional about how I communicated technical concepts.

The Gap Between Tutorials and Real Work

The single biggest challenge facing junior developers is the gap between tutorials and real-world projects. Tutorials teach syntax and isolated concepts. Real projects require combining dozens of concepts, making trade-off decisions, debugging issues that span multiple systems, and working with imperfect requirements.

I saw this gap clearly in my GoIT classes. Students could follow along with a React tutorial and build a to-do app, but when I asked them to build a feature for a realistic project -- say, a paginated, filterable product listing with API integration -- many struggled. Not because they lacked knowledge, but because they lacked the practice of combining knowledge.

My approach was to bridge this gap gradually. I designed exercises that increased in complexity and ambiguity over time. Early exercises had detailed specifications. Later exercises had intentionally vague requirements, forcing students to ask clarifying questions and make design decisions. By the end of the course, students were working on open-ended projects where they had to choose their own architecture and defend their decisions.

Teaching React: Component Thinking

React was the more popular course, and it attracted a diverse group of students -- some with programming experience, some coming from design backgrounds, and some making complete career changes.

The hardest concept to teach was not hooks or state management or routing. It was component thinking: the ability to look at a UI and break it down into a tree of reusable, composable components. This is second nature to experienced React developers, but it requires a fundamental shift in how you think about interfaces.

I developed an exercise I called "decomposition practice." I would show students a screenshot of a complex web application and ask them to draw boxes around every component they could identify, name each component, and describe its props. We would then compare their decompositions and discuss the trade-offs of different approaches. Was it better to have a generic Card component or specific ProductCard and UserCard components? When should a component manage its own state versus receiving it as props?

These discussions were incredibly valuable because they taught students that there is rarely one "correct" answer in software design. There are trade-offs, and the ability to articulate those trade-offs is what separates a beginner from a professional.

Teaching .NET: Enterprise Patterns

The .NET course attracted a different audience -- typically students interested in enterprise development and backend engineering. Teaching C# and .NET required a different approach because the framework is more opinionated and the ecosystem is larger.

I focused heavily on patterns: dependency injection, repository pattern, unit of work, and CQRS. These patterns can seem like unnecessary abstraction to beginners, so I always started by building something without the pattern, showing the problems that emerged, and then refactoring to use the pattern. This "feel the pain first" approach made the value of each pattern concrete rather than theoretical.

Code reviews were a central part of the .NET course. Students submitted their code via pull requests, and I reviewed them with detailed comments. I treated these reviews as teaching opportunities, explaining not just what to change but why. Over time, students started reviewing each other's code, which was even more valuable because it developed their ability to read and evaluate code critically.

Mentoring at POMETOP: Real-World Context

Teaching at GoIT gave me structured interactions with students, but mentoring at POMETOP was a different experience entirely. Junior developers on a production team face pressures that students do not: deadlines, legacy code, production incidents, and the emotional weight of knowing that their mistakes affect real users.

My mentoring approach at POMETOP was built around three principles. First, pair programming over code reviews. Reviewing code after the fact is useful, but sitting with a junior developer as they work through a problem teaches them how to think, not just what to write. I would let them drive, asking guiding questions rather than dictating solutions.

Second, controlled exposure to complexity. I would assign tasks that were slightly above a junior developer's comfort level -- challenging enough to require growth, but not so difficult that they would feel overwhelmed. As their confidence grew, I would increase the complexity gradually.

Third, normalizing mistakes. I made a point of sharing my own mistakes openly. When I caused a production issue or made a poor architectural decision, I would discuss it with the team. This was not performative humility -- it was a deliberate effort to create an environment where mistakes were treated as learning opportunities rather than failures.

Common Patterns I Observed

After mentoring dozens of junior developers, I noticed recurring patterns. The most common was what I call "tutorial paralysis" -- the tendency to search for a tutorial that matches the exact problem rather than applying general principles to a specific situation. Breaking this habit required practice with novel problems and the confidence that comes from solving them.

Another pattern was over-engineering. Juniors who had read about microservices, event sourcing, or domain-driven design would try to apply these patterns to simple CRUD applications. I would gently redirect them toward simplicity, emphasizing that the best architecture is the simplest one that meets the requirements.

The third pattern was fear of asking questions. Many junior developers were afraid of looking incompetent. I addressed this by asking them questions publicly -- showing that not knowing something is normal and that curiosity is a strength.

What Mentoring Taught Me

Mentoring made me a better engineer. Explaining concepts forced me to understand them more deeply. Reviewing junior developers' code exposed me to fresh perspectives and approaches I had not considered. And watching someone grow from uncertain beginner to confident contributor was deeply rewarding.

The most important lesson was that technical mentoring is inseparable from emotional support. Learning to code professionally is stressful, and the best mentors are the ones who acknowledge that stress while helping people push through it. A well-timed "I struggled with this too when I was starting out" can be more valuable than any technical explanation.

If you are a senior developer who has not tried mentoring, I strongly encourage you to start. You will be surprised by how much you learn in the process.