I'm learning C++ because I'm interested in robotics and game development, and I'll also need it for college. I've previously made small projects in Java, Python, C#, and GDScript, and I generally felt comfortable experimenting and fixing problems as they came up. C++ feels completely different: I constantly worry about whether I should use a regular variable, a reference, a pointer, or something else. Memory management, new and delete, smart pointers, modern language features, outdated practices, and performance considerations all make me hesitate before I even start writing code. I know I should build something imperfectly before optimizing it, but I'm worried that I'll create such a mess that I won't be able to improve it later. For anyone who struggled with learning C++, how did you get past this paralysis and become more comfortable writing code?
3 Answers
Feeling overwhelmed is a normal part of learning a language with more visible control over memory and object lifetimes. Keep your projects deliberately small and accept that early code will be rough. Over time, patterns that currently seem mysterious will become familiar, and you’ll recognize which choices actually matter. A year from now, many of today’s intimidating examples will probably look routine. Keep practicing, ask focused questions when you get stuck, and don’t interpret confusion as proof that you can’t learn the language.
The best way through this is to make small programs and keep typing code even when it feels uncomfortable. C++ is still a programming language, so start with a tiny goal, get it working, and then improve it one issue at a time. Don’t try to memorize the entire language or predict every future refactor. Most of the advice about performance and modern practices only matters in particular situations; for beginner projects, clear and working code is far more valuable than perfect optimization.
Start by treating C++ like a language you’re allowed to use imperfectly. For ordinary local values, begin with regular variables. Use a reference when a function should work with an existing object without copying it, and use a pointer when “no object” is a meaningful possibility or when you specifically need pointer semantics. You don’t need to make every advanced design decision before writing the first version. In modern C++, prefer automatic storage and standard containers, and let smart pointers handle ownership when you actually need dynamic lifetime management. You can learn the more complicated cases as your projects require them.
That gives me a much simpler starting point. I think I was trying to understand every possible choice before writing anything at all.

Exactly. You can’t make useful design decisions about performance until you have a working program and a real problem to measure.