I'm starting my programming journey with the long-term goal of working in computing, particularly programming and offensive security. My current plan is to study Portuguese-style pseudocode, assembly, and then C as my main language for at least a year. I want to use books such as K&R, C Programming: A Modern Approach, Expert C Programming, and Modern C, while also building projects with Raylib and SDL2, studying some computer science fundamentals, and eventually working through larger exercises and open-source projects.
My general philosophy is to understand concepts independently of programming languages. For example, I would implement a dynamic array, queue, graph search, or heap in C, visualize the data structures with graphics, and then compare those implementations with equivalent features in languages such as Python or Rust. I'm especially interested in understanding pointers, memory, algorithms, invariants, and how software interacts with the machine rather than merely memorizing syntax.
I'm considering delaying a career change into IT until I have a stronger foundation. In the meantime, I could work in another field, automate tasks when useful, and continue studying programming on my own. Later, I might move toward C, C++, security, systems programming, or another area depending on what interests me and what opportunities are available.
Does this approach make sense, or am I overplanning and delaying practical experience? Would I learn more by getting a job or building real projects earlier, even if my theoretical foundation is weaker at first? Would you change the order, languages, or balance between books, projects, school, and work?
5 Answers
A strong foundation helps, especially early in your career, but professional experience and knowledge of a real problem domain become increasingly important. You don’t need to understand every layer before applying for work. Hands-on projects and work expose you to debugging, requirements, maintenance, collaboration, and trade-offs that books cannot fully reproduce. Studying and working are not opposing choices; the strongest approach is usually to do both.
If you can attend a good computer science program, that may provide structure, feedback, algorithms, systems knowledge, and contact with other learners. If school is not practical, you can still build a solid foundation independently, but you’ll need to create your own feedback loop through projects, code reviews, documentation, and collaboration. For security in particular, focus on legal labs and systems you own or have permission to test; offensive security is generally about simulating attacks so defenses can be improved, not simply writing exploits.
The biggest issue is spending a year studying C before building substantial projects. Theory is useful, but you’ll learn faster by combining it with practice from the beginning. Pick a manageable project, learn the concepts it requires, and expand it over time. A terminal tool, small game, parser, database-backed site, or simple server can teach you far more than following a rigid schedule. Adjust the roadmap as you discover what you actually enjoy and need.
Try not to worry about preventing another language from becoming your ‘language of thought.’ Programming concepts are not owned by the language where you first encounter them. C is excellent for learning memory, pointers, data representation, and low-level behavior, but it is not the origin of every important idea. Python, Java, Rust, and other languages offer useful perspectives too. Choose a language that lets you make the projects you care about, then learn other languages when they solve a different problem.
Your plan sounds more like preparation than a roadmap. Reading several hundred pages and planning every stage can become a form of procrastination or burnout. Keep the core ideas, but make the process more flexible: learn basic C, build something, read enough to solve the next problem, test your understanding, and repeat. Let your interests guide some of the projects; a compiler, game, visualization, or small operating-system experiment may motivate you more than implementing data structures in isolation.

That makes sense. I’m probably treating the roadmap as more fixed than it needs to be, and I should start building while learning instead of waiting until I feel prepared.