I recently watched an experienced programmer build software live, and I was impressed by how comfortably he reasoned through problems, used compiler errors, consulted documentation when necessary, and kept moving without relying on step-by-step tutorials. I'd like to develop that kind of understanding over time. I'm still relatively early in my programming journey, so I'm not expecting quick results. What should I focus on to build a strong foundation: books, courses, personal projects, open-source work, algorithms, computer science fundamentals, or lower-level languages such as C and C++? How can I practice effectively without getting stuck in an endless cycle of copying tutorials?
5 Answers
The biggest factor is sustained practice. Read about a concept, then write code using it instead of merely watching someone else do it. Build projects that are slightly beyond your current ability, and resist searching for a tutorial as soon as you get stuck. Read compiler errors, manuals, and library documentation, experiment, fail, and fix the problem. That process gradually removes the need for hand-holding.
Break large problems into smaller ones until each step can be expressed as a manageable function or experiment. Start with simple projects and gradually attempt more demanding work, such as a small compiler, interpreter, linker, game, or command-line tool. Projects like these force you to combine algorithms, debugging, language features, documentation, and system concepts in a way that passive study usually doesn’t.
Deep knowledge usually comes from years of consistent exposure, not one particular course or language. Work on many projects, revisit ideas at increasing levels of difficulty, and spend time understanding how your tools and libraries actually work. A computer science degree can provide structure and fundamentals, but self-study is also possible if you create that structure yourself and keep practicing for the long term.
It’s completely possible to become self-taught, even without industry experience, but you’ll need deliberate feedback. Read source code from mature projects, use code reviews when available, write tests, refactor older projects, and compare multiple solutions to the same problem. You won’t avoid mistakes; the goal is to notice them, understand why they matter, and improve over time.
You don’t need to learn C or C++ specifically to become a strong programmer, but C can be valuable if you want to understand memory, pointers, data representation, compilation, and operating-system interfaces. Choose a language that lets you build things, then study lower-level topics when your projects give you a reason to understand them. The important part is learning the fundamentals behind the language rather than collecting languages.

It’s still useful to compare your approach with experienced developers’ code. Reading well-written production projects, reviewing your own work later, and getting feedback can show you better designs without replacing the struggle of solving problems yourself.