The path you should take to go from a beginner to an intermediate programmer can be confusing, and I’ll try to make it easier for you.
I’m now finishing my degree in Mathematics – the majority of my programming knowledge is self-taught. I’ve interned at IBM, and a startup backed by Sequoia Capital (top 3 venture capital in the valley). I was going to intern at FAANG this summer but my offer, unfortunately, was rescinded. I don’t consider myself an intermediate in the real world. However, if you tell me to build a Trello/amazon/Instagram/twitter clone, I can do it.
The advice I’m going to give you is what I wish I received when I started coding. I strongly believe people can get to my level in half the time I took. Consistency and intensity >>> years of experience. As a non-coding example, I recently picked up a new hobby, dancing, and freestyling hip-hop/urban. I was able to catch up to dancers who danced for a few years because I was consistent, had intensity, and practiced deliberately.
The DEFINITION of learning is to move from a state of understanding less to understand more. In order to learn, there NEEDS to be an inequality in understanding. If there’s no inequality and you’re agreeing with everything you’re reading/listening/watching to then you’re not learning. So don’t be discouraged if you’re struggling to understand more intermediate resources. That just means you’re learning.
After you know your basic variables, control flow (if statements, loops), functions, gtfo out of the tutorials, and start moving to intermediate concepts. You will 100% struggle, and you might find gaps in your knowledge and foundation. That’s a good thing. You caught it early. Go back to the basics and make sure there are no gaps or false confidence in your understandings.
Don’t make the mistake I did. Move to more complex tutorials, and challenge yourself. Struggle with the material.
Now, the path I’m going to talk about relates to classical engineering and computer science concepts. On top of web/mobile development, it’s important for developers to become comfortable with concepts like object-oriented programming (OOP) and data structures/algorithms (DSA). They round you out as a software engineer.
There is a long journey before knowing how to go from a beginner to an intermediate programmer
You can learn OOP/DSA concept while you’re learning web/mobile dev. They supplement your learning. You’ll also realize that these patterns and algorithms are used in frameworks/libraries like React, Vue, Express, etc. Also, big companies like FAANG interview you on OOP/DSA. These big companies pay big money. Whoever said no to money?
However, if you need learning paths for web development, you can check out these two resources. Save this post for later. These two videos were created by whatsoever. He went through something similar to my experience (dabbling around for 5 years before he got serious). These two videos are some amazing stuff.
If you’re ready to learn about OOP and DSA (data structures and algorithms) I have a channel that will be teaching all these concepts, but more on that later.
Here is the path you should take when learning OOP. I can also create a post that outlines the path for DSA is people are interested.
Here’s how to go from a beginner to an intermediate programmer:
You can choose any language that has support for OOP, it’s your choice. Just make sure to stick with it. Java, C++, Python, Typescript. My advice would be to choose the language you’re creating applications in. If you’re creating web apps with python/flask, choose python.
You need to have a solid foundation of OOP principles before you jump into the advanced concepts.
Learn these concepts
Head First Java: A Brain-Friendly Guide (to learn basics)
Object-Design Style Guide (optional – this teaches best practices you can always come back to this one)
Learning how to write clean and SOLID code is important no matter what paradigm you program in OOP or functional
meaningful variable names
writing pure functions
SOLID CODE Taken from this post
S for the Single Responsibility Principle(SRP), which guides you in creating classes that are responsible for one, and only one actor.
O for the Open/Closed Principle(OCP), which makes your code easy to extend by ensuring that it stays open for extension but closed for modification (this might be the most important of all 5)
L for the Liskov Substitution Principle(LSP), which keeps semantic consistency in complex inheritance hierarchies, making your classes easier to understand and use.
I for the Interface Segregation Principle(ISP), which protects objects from depending on the behavior they don’t really need.
D for the Dependency Inversion Principle(DIP), which controls the direction of dependencies in your code, ensuring that it always flows in the direction of more abstract entities.
This is the bread and butter of object-oriented programming. Design patterns are typical solutions to commonly occurring problems in software design. They are like pre-made blueprints that you can customize to solve a recurring design problem in your code.
Headfirst Design Patterns (classic)
Design Patterns Refactoring Guru Website (They also made a great book, learn more on their website)
When I read, I want to truly understand. I get the best books and read them at the same time (concurrently) instead of a linear fashion. For example, if there’s a chapter about topic X, I will read each book’s chapter X. This way you understand the topic from different perspectives and examples. (IMO take this technique with you in your programming career no matter where you go). You can also go ahead and just pick 1 if you don’t have time, you’ll still be fine.
Apply everything you know back to modern-day web application development with domain-driven design. Domain-Driven Design is the idea that your code is structured, architected, and modeled according to how your business operates, making communication between stakeholders and engineers much cleaner.
The book that everyone recommends is the “Blue Book”.
However, this is getting a bit outdated and hard to read.
I recommend you to read Implementing Domain-Driven Design instead.
There are more advanced concepts, but I haven’t got there myself. Check out this post by Khalil Stemmler for more information.
Conclusion This is going to take a LOT of time to learn. Just because you can read the path/outline in a few minutes doesn’t mean it’s going to be easy. It’s going to take a lot of hard work, and grit. But there is a light at the end of the tunnel. Trust me.